github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/imagetool/getImageArchiveData.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "encoding/gob" 6 "encoding/json" 7 "fmt" 8 "os" 9 "path/filepath" 10 11 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 12 "github.com/Cloud-Foundations/Dominator/lib/log" 13 "github.com/Cloud-Foundations/Dominator/lib/srpc" 14 "github.com/Cloud-Foundations/Dominator/proto/imageserver" 15 ) 16 17 func getImageArchiveDataSubcommand(args []string, 18 logger log.DebugLogger) error { 19 imageClient, _ := getClients() 20 err := getImageArchiveDataAndWrite(imageClient, args[0], args[1]) 21 if err != nil { 22 return fmt.Errorf("Error getting image: %s", err) 23 } 24 return nil 25 } 26 27 func getImageArchiveDataAndWrite(imageClient *srpc.Client, name, 28 outputFilename string) error { 29 request := imageserver.GetImageRequest{ 30 ImageName: name, 31 IgnoreFilesystem: true, 32 Timeout: *timeout, 33 } 34 var reply imageserver.GetImageResponse 35 err := imageClient.RequestReply("ImageServer.GetImage", request, &reply) 36 if err != nil { 37 return err 38 } 39 img := reply.Image 40 img.Filter = nil 41 img.Triggers = nil 42 var encoder srpc.Encoder 43 if outputFilename == "-" { 44 e := json.NewEncoder(os.Stdout) 45 e.SetIndent("", " ") 46 encoder = e 47 } else { 48 file, err := fsutil.CreateRenamingWriter(outputFilename, 49 fsutil.PublicFilePerms) 50 if err != nil { 51 return err 52 } 53 defer file.Close() 54 writer := bufio.NewWriter(file) 55 defer writer.Flush() 56 if filepath.Ext(outputFilename) == ".json" { 57 e := json.NewEncoder(writer) 58 e.SetIndent("", " ") 59 encoder = e 60 } else { 61 encoder = gob.NewEncoder(writer) 62 } 63 } 64 return encoder.Encode(img) 65 }