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  }