github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/imagetool/tarImage.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "compress/gzip" 6 "fmt" 7 "io" 8 "os" 9 10 "github.com/Cloud-Foundations/Dominator/lib/filesystem/tar" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client" 13 ) 14 15 func tarImageSubcommand(args []string, logger log.DebugLogger) error { 16 _, objectClient := getClients() 17 outputFilename := "" 18 if len(args) > 1 { 19 outputFilename = args[1] 20 } 21 err := tarImageAndWrite(objectClient, args[0], outputFilename) 22 if err != nil { 23 return fmt.Errorf("Error taring image: %s", err) 24 } 25 return nil 26 } 27 28 func tarImageAndWrite(objectClient *objectclient.ObjectClient, imageName, 29 outputFilename string) error { 30 fs, objectsGetter, err := getImageForUnpack(objectClient, imageName) 31 if err != nil { 32 return err 33 } 34 deleteOutfile := true 35 output := io.Writer(os.Stdout) 36 if outputFilename != "" { 37 var err error 38 file, err := os.Create(outputFilename) 39 if err != nil { 40 return err 41 } 42 writer := bufio.NewWriter(file) 43 output = writer 44 defer func() { 45 writer.Flush() 46 file.Close() 47 if deleteOutfile { 48 os.Remove(outputFilename) 49 } 50 }() 51 } 52 if *compress { 53 zWriter := gzip.NewWriter(output) 54 defer zWriter.Close() 55 output = zWriter 56 } 57 if err := tar.Write(output, fs, objectsGetter); err != nil { 58 return err 59 } 60 deleteOutfile = false 61 return nil 62 }