github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/diffFilterInImages.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "os" 9 "os/exec" 10 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 ) 13 14 func diffFilterInImagesSubcommand(args []string, 15 logger log.DebugLogger) error { 16 err := diffFilterInImages(args[0], args[1], args[2]) 17 if err != nil { 18 return fmt.Errorf("error diffing filters: %s", err) 19 } 20 return nil 21 } 22 23 func diffFilterInImages(tool, leftName, rightName string) error { 24 leftFilter, err := getTypedImageFilter(leftName) 25 if err != nil { 26 return err 27 } 28 rightFilter, err := getTypedImageFilter(rightName) 29 if err != nil { 30 return err 31 } 32 leftFile, err := writeToTempfile(leftFilter.Write) 33 if err != nil { 34 return err 35 } 36 defer os.Remove(leftFile) 37 rightFile, err := writeToTempfile(rightFilter.Write) 38 if err != nil { 39 return err 40 } 41 defer os.Remove(rightFile) 42 cmd := exec.Command(tool, leftFile, rightFile) 43 cmd.Stdout = os.Stdout 44 return cmd.Run() 45 } 46 47 func writeToTempfile(writerFunc func(io.Writer) error) (string, error) { 48 file, err := ioutil.TempFile("", "imagetool-diff") 49 if err != nil { 50 return "", err 51 } 52 doCleanup := true 53 defer func() { 54 if doCleanup { 55 os.Remove(file.Name()) 56 file.Close() 57 } 58 }() 59 writer := bufio.NewWriter(file) 60 defer writer.Flush() 61 if err := writerFunc(writer); err != nil { 62 return "", err 63 } 64 doCleanup = false 65 return file.Name(), nil 66 }