From 9ce8e0acf8e6285ab33409ba8f4e81acc05e1240 Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Sun, 20 May 2018 09:22:16 -0400 Subject: [PATCH 1/5] Print layers --- tar-read.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tar-read.go b/tar-read.go index 5c917d9..acc9d4f 100644 --- a/tar-read.go +++ b/tar-read.go @@ -2,6 +2,7 @@ package main import ( "archive/tar" + "encoding/json" "fmt" "io" "os" @@ -22,7 +23,8 @@ func main() { // } tarReader := tar.NewReader(f) - + targetName := "manifest.json" + var m Manifest for { header, err := tarReader.Next() @@ -36,6 +38,9 @@ func main() { } name := header.Name + if name == targetName { + m = handleManifest(tarReader, header) + } switch header.Typeflag { case tar.TypeDir: @@ -53,4 +58,26 @@ func main() { ) } } + fmt.Printf("%+v\n", m) +} + +type Manifest struct { + Config string + RepoTags []string + Layers []string +} + +func handleManifest(r *tar.Reader, header *tar.Header) Manifest { + size := header.Size + manifestBytes := make([]byte, size) + _, err := r.Read(manifestBytes) + if err != nil { + panic(err) + } + var m [1]Manifest + err = json.Unmarshal(manifestBytes, &m) + if err != nil { + panic(err) + } + return m[0] } From 2ab60618ff1dc0c3a67ca680f2fd819fba3f66e8 Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Sun, 20 May 2018 09:50:36 -0400 Subject: [PATCH 2/5] print contents down one level --- tar-read.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tar-read.go b/tar-read.go index acc9d4f..004759a 100644 --- a/tar-read.go +++ b/tar-read.go @@ -2,10 +2,12 @@ package main import ( "archive/tar" + "bytes" "encoding/json" "fmt" "io" "os" + "strings" ) func main() { @@ -47,6 +49,10 @@ func main() { continue case tar.TypeReg: fmt.Println("File: ", name) + if strings.HasSuffix(name, "layer.tar") { + fmt.Println("Containing:") + printFilesInTar(tarReader, header) + } // show the contents // io.Copy(os.Stdout, tarReader) default: @@ -61,6 +67,49 @@ func main() { fmt.Printf("%+v\n", m) } +func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { + size := h.Size + tarredBytes := make([]byte, size) + _, err := parentReader.Read(tarredBytes) + if err != nil { + panic(err) + } + r := bytes.NewReader(tarredBytes) + tarReader := tar.NewReader(r) + for { + header, err := tarReader.Next() + + if err == io.EOF { + break + } + + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + name := header.Name + + switch header.Typeflag { + case tar.TypeDir: + continue + case tar.TypeReg: + fmt.Println(" File: ", name) + // show the contents + // io.Copy(os.Stdout, tarReader) + case tar.TypeSymlink: + fmt.Println(" SymLink", name) + default: + fmt.Printf("%s : %c %s %s\n", + "hmmm?", + header.Typeflag, + "in file", + name, + ) + } + } +} + type Manifest struct { Config string RepoTags []string From f91fb4c6ebfaac1e45286108bb17d9ef69e9d56e Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Sun, 20 May 2018 10:41:36 -0400 Subject: [PATCH 3/5] start parsing each layer --- tar-read.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tar-read.go b/tar-read.go index 004759a..4e984c7 100644 --- a/tar-read.go +++ b/tar-read.go @@ -3,6 +3,7 @@ package main import ( "archive/tar" "bytes" + "crypto/md5" "encoding/json" "fmt" "io" @@ -68,6 +69,7 @@ func main() { } func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { + hasher := md5.New size := h.Size tarredBytes := make([]byte, size) _, err := parentReader.Read(tarredBytes) @@ -92,6 +94,7 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { switch header.Typeflag { case tar.TypeDir: + fmt.Println(" Directory: ", name) continue case tar.TypeReg: fmt.Println(" File: ", name) @@ -110,6 +113,15 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { } } +func makeEntry(r *tar.Reader, h *tar.Header) { + +} + +type FileChangeInfo struct { + typeflag int + md5sum [16]byte +} + type Manifest struct { Config string RepoTags []string From ea888928392b5d8741152f0adc388faca4fa6f76 Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Thu, 24 May 2018 19:41:03 -0400 Subject: [PATCH 4/5] WIP --- tar-read.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tar-read.go b/tar-read.go index 4e984c7..ac20b1d 100644 --- a/tar-read.go +++ b/tar-read.go @@ -6,6 +6,7 @@ import ( "crypto/md5" "encoding/json" "fmt" + "hash" "io" "os" "strings" @@ -113,11 +114,13 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { } } -func makeEntry(r *tar.Reader, h *tar.Header) { +func makeEntry(r *tar.Reader, h *tar.Header, hasher *hash.Hash) FileChangeInfo { + fileBytes := make([]byte, h.Size) } type FileChangeInfo struct { + fileName string typeflag int md5sum [16]byte } From 8794f159de255bb0705bf9bf2167bd4428c39d5b Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Thu, 24 May 2018 20:44:08 -0400 Subject: [PATCH 5/5] print trees in order --- tar-read.go | 56 +++++++++++++++++++++++++++++++++++++---------------- tree.go | 1 + 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/tar-read.go b/tar-read.go index ac20b1d..98b5333 100644 --- a/tar-read.go +++ b/tar-read.go @@ -6,7 +6,6 @@ import ( "crypto/md5" "encoding/json" "fmt" - "hash" "io" "os" "strings" @@ -29,6 +28,7 @@ func main() { tarReader := tar.NewReader(f) targetName := "manifest.json" var m Manifest + var trees []*Tree for { header, err := tarReader.Next() @@ -50,13 +50,17 @@ func main() { case tar.TypeDir: continue case tar.TypeReg: - fmt.Println("File: ", name) + //fmt.Println("File: ", name) if strings.HasSuffix(name, "layer.tar") { fmt.Println("Containing:") - printFilesInTar(tarReader, header) + tree := NewTree() + tree.name = strings.TrimSuffix(name, "layer.tar") + fileInfos := getFileList(tarReader, header) + for _, element := range fileInfos { + tree.AddPath(element.path, element) + } + trees = append(trees, tree) } - // show the contents - // io.Copy(os.Stdout, tarReader) default: fmt.Printf("%s : %c %s %s\n", "hmmm?", @@ -67,10 +71,11 @@ func main() { } } fmt.Printf("%+v\n", m) + fmt.Printf("%+v\n", trees) } -func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { - hasher := md5.New +func getFileList(parentReader *tar.Reader, h *tar.Header) []FileChangeInfo { + var files []FileChangeInfo size := h.Size tarredBytes := make([]byte, size) _, err := parentReader.Read(tarredBytes) @@ -95,14 +100,12 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { switch header.Typeflag { case tar.TypeDir: - fmt.Println(" Directory: ", name) - continue + files = append(files, makeEntry(tarReader, header, name)) case tar.TypeReg: - fmt.Println(" File: ", name) - // show the contents - // io.Copy(os.Stdout, tarReader) + files = append(files, makeEntry(tarReader, header, name)) + continue case tar.TypeSymlink: - fmt.Println(" SymLink", name) + files = append(files, makeEntry(tarReader, header, name)) default: fmt.Printf("%s : %c %s %s\n", "hmmm?", @@ -112,16 +115,35 @@ func printFilesInTar(parentReader *tar.Reader, h *tar.Header) { ) } } + return files } -func makeEntry(r *tar.Reader, h *tar.Header, hasher *hash.Hash) FileChangeInfo { +func makeEntry(r *tar.Reader, h *tar.Header, path string) FileChangeInfo { + if h.Typeflag == tar.TypeDir { + return FileChangeInfo{ + path: path, + typeflag: h.Typeflag, + md5sum: zeros, + } + } fileBytes := make([]byte, h.Size) - + _, err := r.Read(fileBytes) + if err != nil && err != io.EOF { + panic(err) + } + hash := md5.Sum(fileBytes) + return FileChangeInfo{ + path: path, + typeflag: h.Typeflag, + md5sum: hash, + } } +var zeros = [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + type FileChangeInfo struct { - fileName string - typeflag int + path string + typeflag byte md5sum [16]byte } diff --git a/tree.go b/tree.go index 4a2e005..584f803 100644 --- a/tree.go +++ b/tree.go @@ -16,6 +16,7 @@ const ( type Tree struct { root Node size int + name string } type Node struct {