github.com/nginxinc/kubernetes-ingress@v1.12.5/internal/nginx/utils.go (about) 1 package nginx 2 3 import ( 4 "bytes" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "os/exec" 9 "path" 10 11 "github.com/golang/glog" 12 ) 13 14 func shellOut(cmd string) (err error) { 15 var stdout bytes.Buffer 16 var stderr bytes.Buffer 17 18 glog.V(3).Infof("executing %s", cmd) 19 20 command := exec.Command("sh", "-c", cmd) 21 command.Stdout = &stdout 22 command.Stderr = &stderr 23 24 err = command.Start() 25 if err != nil { 26 return fmt.Errorf("Failed to execute %v, err: %w", cmd, err) 27 } 28 29 err = command.Wait() 30 if err != nil { 31 return fmt.Errorf("Command %v stdout: %q\nstderr: %q\nfinished with error: %w", cmd, 32 stdout.String(), stderr.String(), err) 33 } 34 return nil 35 } 36 37 func createFileAndWrite(name string, b []byte) error { 38 w, err := os.Create(name) 39 if err != nil { 40 return fmt.Errorf("Failed to open %v: %w", name, err) 41 } 42 43 defer w.Close() 44 45 _, err = w.Write(b) 46 if err != nil { 47 return fmt.Errorf("Failed to write to %v: %w", name, err) 48 } 49 50 return nil 51 } 52 53 func createFileAndWriteAtomically(filename string, tempPath string, mode os.FileMode, content []byte) { 54 file, err := ioutil.TempFile(tempPath, path.Base(filename)) 55 if err != nil { 56 glog.Fatalf("Couldn't create a temp file for the file %v: %v", filename, err) 57 } 58 59 err = file.Chmod(mode) 60 if err != nil { 61 glog.Fatalf("Couldn't change the mode of the temp file %v: %v", file.Name(), err) 62 } 63 64 _, err = file.Write(content) 65 if err != nil { 66 glog.Fatalf("Couldn't write to the temp file %v: %v", file.Name(), err) 67 } 68 69 err = file.Close() 70 if err != nil { 71 glog.Fatalf("Couldn't close the temp file %v: %v", file.Name(), err) 72 } 73 74 err = os.Rename(file.Name(), filename) 75 if err != nil { 76 glog.Fatalf("Couldn't rename the temp file %v to %v: %v", file.Name(), filename, err) 77 } 78 }