github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/builder-tool/manifest.go (about) 1 // +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/fsutil" 13 "github.com/Cloud-Foundations/Dominator/lib/log" 14 ) 15 16 const filePerms = syscall.S_IRUSR | syscall.S_IRGRP | syscall.S_IROTH 17 18 type logWriterType struct { 19 buffer bytes.Buffer 20 } 21 22 func buildFromManifestSubcommand(args []string, logger log.DebugLogger) error { 23 srpcClient := getImageServerClient() 24 logWriter := &logWriterType{} 25 if *alwaysShowBuildLog { 26 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 27 } 28 name, err := builder.BuildImageFromManifest(srpcClient, args[0], args[1], 29 *expiresIn, bindMounts, logWriter, logger) 30 if err != nil { 31 if !*alwaysShowBuildLog { 32 fmt.Fprintln(os.Stderr, 33 "Start of build log ==========================") 34 os.Stderr.Write(logWriter.Bytes()) 35 } 36 fmt.Fprintln(os.Stderr, "End of build log ============================") 37 return fmt.Errorf("Error processing manifest: %s", err) 38 } 39 if *alwaysShowBuildLog { 40 fmt.Fprintln(os.Stderr, "End of build log ============================") 41 } else { 42 err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer, 43 uint64(logWriter.buffer.Len())) 44 if err != nil { 45 return fmt.Errorf("Error writing build log: %s", err) 46 } 47 } 48 fmt.Println(name) 49 return nil 50 } 51 52 func buildTreeFromManifestSubcommand(args []string, 53 logger log.DebugLogger) error { 54 srpcClient := getImageServerClient() 55 logWriter := &logWriterType{} 56 if *alwaysShowBuildLog { 57 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 58 } 59 rootDir, err := builder.BuildTreeFromManifest(srpcClient, args[0], 60 bindMounts, logWriter, logger) 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(rootDir) 80 return nil 81 } 82 83 func processManifestSubcommand(args []string, logger log.DebugLogger) error { 84 logWriter := &logWriterType{} 85 if *alwaysShowBuildLog { 86 fmt.Fprintln(os.Stderr, "Start of build log ==========================") 87 } 88 err := builder.ProcessManifest(args[0], args[1], bindMounts, logWriter) 89 if err != nil { 90 if !*alwaysShowBuildLog { 91 fmt.Fprintln(os.Stderr, 92 "Start of build log ==========================") 93 os.Stderr.Write(logWriter.Bytes()) 94 } 95 fmt.Fprintln(os.Stderr, "End of build log ============================") 96 return fmt.Errorf("Error processing manifest: %s", err) 97 } 98 if *alwaysShowBuildLog { 99 fmt.Fprintln(os.Stderr, "End of build log ============================") 100 } else { 101 err := fsutil.CopyToFile("build.log", filePerms, &logWriter.buffer, 102 uint64(logWriter.buffer.Len())) 103 if err != nil { 104 return fmt.Errorf("Error writing build log: %s", err) 105 } 106 } 107 return nil 108 } 109 110 func (w *logWriterType) Bytes() []byte { 111 return w.buffer.Bytes() 112 } 113 114 func (w *logWriterType) Write(p []byte) (int, error) { 115 if *alwaysShowBuildLog { 116 os.Stderr.Write(p) 117 } 118 return w.buffer.Write(p) 119 }