github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/scanFilteredFiles.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "syscall" 9 10 "github.com/Cloud-Foundations/Dominator/lib/filter" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 "github.com/Cloud-Foundations/Dominator/lib/wsyscall" 13 ) 14 15 func scanFilteredFilesSubcommand(args []string, logger log.DebugLogger) error { 16 if err := scanFilteredFiles(args[0], args[1], logger); err != nil { 17 return fmt.Errorf("error scanning filtered files: %s", err) 18 } 19 return nil 20 } 21 22 func scanFilteredFiles(imageName, dirName string, 23 logger log.DebugLogger) error { 24 scanFilter, err := filter.New(scanExcludeList) 25 if err != nil { 26 return err 27 } 28 img, err := getTypedImageMetadata(imageName) 29 if err != nil { 30 return err 31 } 32 rootDir, err := ioutil.TempDir("", "") 33 if err != nil { 34 return err 35 } 36 defer os.Remove(rootDir) 37 errorChannel := make(chan error) 38 go func() { 39 errorChannel <- scanFilteredRoot(scanFilter, img.Filter, dirName, 40 rootDir, logger) 41 }() 42 return <-errorChannel 43 } 44 45 func scanFilteredRoot(scanFilter, imageFilter *filter.Filter, 46 dirName, rootDir string, logger log.DebugLogger) error { 47 return walkFilteredRoot(scanFilter, imageFilter, dirName, rootDir, 48 func(path string, fi os.FileInfo) error { 49 fmt.Println(path) 50 return nil 51 }, 52 logger) 53 } 54 55 func walkFilteredRoot(scanFilter, imageFilter *filter.Filter, 56 dirName, rootDir string, 57 walkFunc func(path string, fi os.FileInfo) error, 58 logger log.DebugLogger) error { 59 if err := wsyscall.UnshareMountNamespace(); err != nil { 60 return fmt.Errorf("unable to unshare mount namesace: %s", err) 61 } 62 syscall.Unmount(rootDir, 0) 63 err := wsyscall.Mount(dirName, rootDir, "", wsyscall.MS_BIND, "") 64 if err != nil { 65 return fmt.Errorf("unable to bind mount %s to %s: %s", 66 dirName, rootDir, err) 67 } 68 logger.Debugf(0, "scanning directory: %s\n", dirName) 69 startPos := len(rootDir) 70 return filepath.Walk(rootDir, 71 func(path string, fi os.FileInfo, err error) error { 72 if err != nil { 73 return err 74 } 75 path = path[startPos:] 76 if scanFilter.Match(path) { 77 return nil 78 } 79 if imageFilter.Match(path) { 80 if err := walkFunc(path, fi); err != nil { 81 return err 82 } 83 } 84 return nil 85 }) 86 }