github.com/dustinrc/deis@v1.10.1-0.20150917223407-0894a5fb979e/mesos/pkg/os/os.go (about) 1 package os 2 3 import ( 4 "crypto/rand" 5 "errors" 6 "fmt" 7 "io/ioutil" 8 "os" 9 "os/exec" 10 "strings" 11 "syscall" 12 13 logger "github.com/deis/deis/mesos/pkg/log" 14 basher "github.com/progrium/go-basher" 15 ) 16 17 const ( 18 alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 19 ) 20 21 var log = logger.New() 22 23 // Getopt return the value of and environment variable or a default 24 func Getopt(name, dfault string) string { 25 value := os.Getenv(name) 26 if value == "" { 27 log.Debugf("returning default value \"%s\" for key \"%s\"", dfault, name) 28 value = dfault 29 } 30 return value 31 } 32 33 // RunProcessAsDaemon start a child process that will run indefinitely 34 func RunProcessAsDaemon(signalChan chan os.Signal, command string, args []string) { 35 cmd := exec.Command(command, args...) 36 cmd.Stdout = os.Stdout 37 cmd.Stderr = os.Stderr 38 39 err := cmd.Start() 40 if err != nil { 41 log.Errorf("an error ocurred executing command: [%s params %v], %v", command, args, err) 42 signalChan <- syscall.SIGKILL 43 } 44 45 err = cmd.Wait() 46 log.Errorf("command finished with error: %v", err) 47 signalChan <- syscall.SIGKILL 48 } 49 50 // RunScript run a shell script using go-basher and if it returns an error 51 // send a signal to terminate the execution 52 func RunScript(script string, params map[string]string, loader func(string) ([]byte, error)) error { 53 log.Debugf("running script %v", script) 54 bash, _ := basher.NewContext("/bin/bash", log.Level.String() == "debug") 55 bash.Source(script, loader) 56 if params != nil { 57 for key, value := range params { 58 bash.Export(key, value) 59 } 60 } 61 62 status, err := bash.Run("main", []string{}) 63 if err != nil { 64 return err 65 } 66 if status != 0 { 67 return fmt.Errorf("invalid exit code running script [%v]", status) 68 } 69 70 return nil 71 } 72 73 // RunCommand run a command and return. 74 func RunCommand(command string, args []string) error { 75 cmd := exec.Command(command, args...) 76 cmd.Stdout = os.Stdout 77 cmd.Stderr = os.Stderr 78 79 err := cmd.Run() 80 if err != nil { 81 return err 82 } 83 84 return nil 85 } 86 87 // BuildCommandFromString parses a string containing a command and multiple 88 // arguments and returns a valid tuple to pass to exec.Command 89 func BuildCommandFromString(input string) (string, []string) { 90 command := strings.Split(input, " ") 91 92 if len(command) > 1 { 93 return command[0], command[1:] 94 } 95 96 return command[0], []string{} 97 } 98 99 // Random return a random string 100 func Random(size int) (string, error) { 101 if size <= 0 { 102 return "", errors.New("invalid size. It must be bigger or equal to 1") 103 } 104 105 var bytes = make([]byte, size) 106 rand.Read(bytes) 107 for i, b := range bytes { 108 bytes[i] = alphanum[b%byte(len(alphanum))] 109 } 110 return string(bytes), nil 111 } 112 113 // Hostname returns the host name reported by the kernel. 114 func Hostname() (name string, err error) { 115 return os.Hostname() 116 } 117 118 // CopyFile copies a source file to a destination. 119 func CopyFile(src string, dst string) error { 120 data, err := ioutil.ReadFile(src) 121 if err != nil { 122 return err 123 } 124 125 err = ioutil.WriteFile(dst, data, 0644) 126 if err != nil { 127 return err 128 } 129 130 return nil 131 }