github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/makeRawImage.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/filesystem/util" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client" 13 ) 14 15 const filePerms = syscall.S_IRUSR | syscall.S_IWUSR | syscall.S_IRGRP | 16 syscall.S_IROTH 17 18 func makeRawImageSubcommand(args []string, logger log.DebugLogger) error { 19 _, objectClient := getClients() 20 if err := makeRawImage(objectClient, args[0], args[1]); err != nil { 21 return fmt.Errorf("error making raw image: %s", err) 22 } 23 return nil 24 } 25 26 func loadOverlayFiles() (map[string][]byte, error) { 27 if *overlayDirectory == "" { 28 return nil, nil 29 } 30 overlayFiles := make(map[string][]byte) 31 err := filepath.Walk(*overlayDirectory, 32 func(path string, info os.FileInfo, err error) error { 33 if err != nil { 34 return err 35 } 36 if info.IsDir() { 37 return nil 38 } 39 data, err := ioutil.ReadFile(path) 40 if err != nil { 41 return err 42 } 43 overlayFiles[path[len(*overlayDirectory):]] = data 44 return nil 45 }) 46 return overlayFiles, err 47 } 48 49 func makeRawImage(objectClient *objectclient.ObjectClient, name, 50 rawFilename string) error { 51 fs, objectsGetter, err := getImageForUnpack(objectClient, name) 52 if err != nil { 53 return err 54 } 55 options := util.WriteRawOptions{ 56 AllocateBlocks: *allocateBlocks, 57 InitialImageName: name, 58 InstallBootloader: *makeBootable, 59 MinimumFreeBytes: *minFreeBytes, 60 WriteFstab: *makeBootable, 61 RootLabel: *rootLabel, 62 RoundupPower: *roundupPower, 63 } 64 if overlayFiles, err := loadOverlayFiles(); err != nil { 65 return err 66 } else { 67 options.OverlayFiles = overlayFiles 68 } 69 return util.WriteRawWithOptions(fs, objectsGetter, rawFilename, filePerms, 70 tableType, options, logger) 71 }