// Copyright 2015 Daniel Theophanes. // Use of this source code is governed by a zlib-style // license that can be found in the LICENSE file. // +build linux darwin package service import ( "fmt" "io/ioutil" "log/syslog" "os/exec" ) func newSysLogger(name string, errs chan<- error) (Logger, error) { w, err := syslog.New(syslog.LOG_INFO, name) if err != nil { return nil, err } return sysLogger{w, errs}, nil } type sysLogger struct { *syslog.Writer errs chan<- error } func (s sysLogger) send(err error) error { if err != nil && s.errs != nil { s.errs <- err } return err } func (s sysLogger) Error(v ...interface{}) error { return s.send(s.Writer.Err(fmt.Sprint(v...))) } func (s sysLogger) Warning(v ...interface{}) error { return s.send(s.Writer.Warning(fmt.Sprint(v...))) } func (s sysLogger) Info(v ...interface{}) error { return s.send(s.Writer.Info(fmt.Sprint(v...))) } func (s sysLogger) Errorf(format string, a ...interface{}) error { return s.send(s.Writer.Err(fmt.Sprintf(format, a...))) } func (s sysLogger) Warningf(format string, a ...interface{}) error { return s.send(s.Writer.Warning(fmt.Sprintf(format, a...))) } func (s sysLogger) Infof(format string, a ...interface{}) error { return s.send(s.Writer.Info(fmt.Sprintf(format, a...))) } func run(command string, arguments ...string) error { cmd := exec.Command(command, arguments...) // Connect pipe to read Stderr stderr, err := cmd.StderrPipe() if err != nil { // Failed to connect pipe return fmt.Errorf("%q failed to connect stderr pipe: %v", command, err) } // Do not use cmd.Run() if err := cmd.Start(); err != nil { // Problem while copying stdin, stdout, or stderr return fmt.Errorf("%q failed: %v", command, err) } // Zero exit status // Darwin: launchctl can fail with a zero exit status, // so check for emtpy stderr if command == "launchctl" { slurp, _ := ioutil.ReadAll(stderr) if len(slurp) > 0 { return fmt.Errorf("%q failed with stderr: %s", command, slurp) } } if err := cmd.Wait(); err != nil { // Command didn't exit with a zero exit status. return fmt.Errorf("%q failed: %v", command, err) } return nil }