github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/imagetool/getFileInImage.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 8 "github.com/Cloud-Foundations/Dominator/lib/filesystem" 9 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 10 "github.com/Cloud-Foundations/Dominator/lib/log" 11 objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client" 12 ) 13 14 func getFileInImageSubcommand(args []string, logger log.DebugLogger) error { 15 _, objectClient := getClients() 16 var outFileName string 17 if len(args) > 2 { 18 outFileName = args[2] 19 } 20 err := getFileInImage(objectClient, args[0], args[1], outFileName) 21 if err != nil { 22 return fmt.Errorf("Error getting file in image: %s", err) 23 } 24 return nil 25 } 26 27 func getFileInImage(objectClient *objectclient.ObjectClient, imageName, 28 imageFile, outFileName string) error { 29 fs, err := getTypedImage(imageName) 30 if err != nil { 31 return err 32 } 33 filenameToInodeTable := fs.FilenameToInodeTable() 34 if inum, ok := filenameToInodeTable[imageFile]; !ok { 35 return fmt.Errorf("file: \"%s\" not present in image", imageFile) 36 } else if inode, ok := fs.InodeTable[inum]; !ok { 37 return fmt.Errorf("inode: %d not present in image", inum) 38 } else if inode, ok := inode.(*filesystem.RegularInode); !ok { 39 return fmt.Errorf("file: \"%s\" is not a regular file", imageFile) 40 } else { 41 size, reader, err := objectClient.GetObject(inode.Hash) 42 if err != nil { 43 return err 44 } 45 defer reader.Close() 46 if outFileName == "" { 47 _, err := io.Copy(os.Stdout, reader) 48 return err 49 } else { 50 return fsutil.CopyToFile(outFileName, filePerms, reader, size) 51 } 52 } 53 }