github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/builder-tool/manifest.go (about) 1 //go:build linux 2 3 package main 4 5 import ( 6 "bytes" 7 "fmt" 8 "os" 9 "syscall" 10 11 "github.com/Cloud-Foundations/Dominator/imagebuilder/builder" 12 "github.com/Cloud-Foundations/Dominator/lib/decoders" 13 "github.com/Cloud-Foundations/Dominator/lib/filter" 14 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 15 "github.com/Cloud-Foundations/Dominator/lib/log" 16 ) 17 18 const filePerms = syscall.S_IRUSR | syscall.S_IRGRP | syscall.S_IROTH 19 20 type logWriterType struct { 21 buffer bytes.Buffer 22 } 23 24 func buildFromManifestSubcommand(args []string, logger log.DebugLogger) error { 25 return buildFromManifest(args[0], args[1], logger) 26 } 27 28 func buildFromManifest(manifestDirectory, streamName string, 29 logger log.DebugLogger) error { 30 srpcClient := getImageServerClient() 31 logWriter := &logWriterType{} 32 if *alwaysShowBuildLog { 33 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 34 } 35 var mtimesCopyFilter *filter.Filter 36 if *mtimesCopyFilterFile != "" { 37 var err error 38 mtimesCopyFilter, err = filter.Load(*mtimesCopyFilterFile) 39 if err != nil { 40 return err 41 } 42 } 43 var variables map[string]string 44 if *variablesFilename != "" { 45 err := decoders.DecodeFile(*variablesFilename, &variables) 46 if err != nil { 47 return err 48 } 49 } 50 name, err := builder.BuildImageFromManifestWithOptions( 51 srpcClient, 52 builder.BuildLocalOptions{ 53 BindMounts: bindMounts, 54 ManifestDirectory: manifestDirectory, 55 MtimesCopyFilter: mtimesCopyFilter, 56 Variables: variables, 57 }, 58 streamName, 59 *expiresIn, 60 logWriter) 61 if err != nil { 62 if !*alwaysShowBuildLog { 63 fmt.Fprintln(os.Stderr, 64 "Start of build log ==========================") 65 os.Stderr.Write(logWriter.Bytes()) 66 } 67 fmt.Fprintln(os.Stderr, "End of build log ============================") 68 return fmt.Errorf("error processing manifest: %s", err) 69 } 70 if *alwaysShowBuildLog { 71 fmt.Fprintln(os.Stderr, "End of build log ============================") 72 } else { 73 err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer, 74 uint64(logWriter.buffer.Len())) 75 if err != nil { 76 return fmt.Errorf("error writing build log: %s", err) 77 } 78 } 79 fmt.Println(name) 80 return nil 81 } 82 83 func buildTreeFromManifestSubcommand(args []string, 84 logger log.DebugLogger) error { 85 srpcClient := getImageServerClient() 86 logWriter := &logWriterType{} 87 if *alwaysShowBuildLog { 88 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 89 } 90 var variables map[string]string 91 if *variablesFilename != "" { 92 err := decoders.DecodeFile(*variablesFilename, &variables) 93 if err != nil { 94 return err 95 } 96 } 97 rootDir, err := builder.BuildTreeFromManifestWithOptions( 98 srpcClient, 99 builder.BuildLocalOptions{ 100 BindMounts: bindMounts, 101 ManifestDirectory: args[0], 102 Variables: variables, 103 }, 104 logWriter) 105 if err != nil { 106 if !*alwaysShowBuildLog { 107 fmt.Fprintln(os.Stderr, 108 "Start of build log ==========================") 109 os.Stderr.Write(logWriter.Bytes()) 110 } 111 fmt.Fprintln(os.Stderr, "End of build log ============================") 112 return fmt.Errorf("error processing manifest: %s", err) 113 } 114 if *alwaysShowBuildLog { 115 fmt.Fprintln(os.Stderr, "End of build log ============================") 116 } else { 117 err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer, 118 uint64(logWriter.buffer.Len())) 119 if err != nil { 120 return fmt.Errorf("error writing build log: %s", err) 121 } 122 } 123 fmt.Println(rootDir) 124 return nil 125 } 126 127 func processManifestSubcommand(args []string, logger log.DebugLogger) error { 128 logWriter := &logWriterType{} 129 if *alwaysShowBuildLog { 130 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 131 } 132 var variables map[string]string 133 if *variablesFilename != "" { 134 err := decoders.DecodeFile(*variablesFilename, &variables) 135 if err != nil { 136 return err 137 } 138 } 139 err := builder.ProcessManifestWithOptions( 140 builder.BuildLocalOptions{ 141 BindMounts: bindMounts, 142 ManifestDirectory: args[0], 143 Variables: variables, 144 }, 145 args[1], logWriter) 146 if err != nil { 147 if !*alwaysShowBuildLog { 148 fmt.Fprintln(os.Stderr, 149 "Start of build log ==========================") 150 os.Stderr.Write(logWriter.Bytes()) 151 } 152 fmt.Fprintln(os.Stderr, "End of build log ============================") 153 return fmt.Errorf("error processing manifest: %s", err) 154 } 155 if *alwaysShowBuildLog { 156 fmt.Fprintln(os.Stderr, "End of build log ============================") 157 } else { 158 err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer, 159 uint64(logWriter.buffer.Len())) 160 if err != nil { 161 return fmt.Errorf("error writing build log: %s", err) 162 } 163 } 164 return nil 165 } 166 167 func (w *logWriterType) Bytes() []byte { 168 return w.buffer.Bytes() 169 } 170 171 func (w *logWriterType) Write(p []byte) (int, error) { 172 if *alwaysShowBuildLog { 173 os.Stderr.Write(p) 174 } 175 return w.buffer.Write(p) 176 }