func startDaemon() { var out io.Writer = os.Stdout if !log.IsTerminal() { logFile, logFileErr := util.LogFile("rexray.log") failOnError(logFileErr) out = io.MultiWriter(os.Stdout, logFile) } log.SetOutput(out) fmt.Fprintf(out, "%s\n", rexRayLogoASCII) util.PrintVersion(out) fmt.Fprintln(out) var success []byte var failure []byte var conn net.Conn if !fg { success = []byte{0} failure = []byte{1} var dialErr error log.Printf("dialing %s", client) conn, dialErr = net.Dial("unix", client) if dialErr != nil { panic(dialErr) } } writePidErr := util.WritePidFile(-1) if writePidErr != nil { if conn != nil { conn.Write(failure) } panic(writePidErr) } defer func() { r := recover() os.Remove(util.PidFilePath()) if r != nil { panic(r) } }() log.Printf("created pid file, pid=%d", os.Getpid()) init := make(chan error) sigc := make(chan os.Signal, 1) stop := make(chan os.Signal) signal.Notify(sigc, syscall.SIGKILL, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go func() { rrdaemon.Start(r.Config.Host, init, stop) }() var initErrors []error for initErr := range init { initErrors = append(initErrors, initErr) log.Println(initErr) } if conn != nil { if len(initErrors) == 0 { conn.Write(success) } else { conn.Write(failure) } conn.Close() } if len(initErrors) > 0 { return } sigv := <-sigc log.Printf("received shutdown signal %v", sigv) stop <- sigv }
func tryToStartDaemon() { _, _, thisAbsPath := util.GetThisPathParts() fmt.Print("Starting REX-Ray...") signal := make(chan byte) client := fmt.Sprintf("%s/%s.sock", os.TempDir(), util.RandomString(32)) log.WithField("client", client).Debug("trying to start service") l, lErr := net.Listen("unix", client) failOnError(lErr) go func() { conn, acceptErr := l.Accept() if acceptErr != nil { fmt.Printf("FAILED!\n %v\n", acceptErr) panic(acceptErr) } defer conn.Close() defer os.Remove(client) log.Debug("accepted connection") buff := make([]byte, 1) conn.Read(buff) log.Debug("received data") signal <- buff[0] }() cmdArgs := []string{ "start", fmt.Sprintf("--client=%s", client), fmt.Sprintf("--logLevel=%v", c.LogLevel)} if c.Host != "" { cmdArgs = append(cmdArgs, fmt.Sprintf("--host=%s", c.Host)) } cmd := exec.Command(thisAbsPath, cmdArgs...) logFile, logFileErr := os.OpenFile(util.LogFile(), os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) failOnError(logFileErr) cmd.Stdout = logFile cmd.Stderr = logFile cmdErr := cmd.Start() failOnError(cmdErr) sigVal := <-signal if sigVal != 0 { fmt.Println("FAILED!") panic(1) } pid, _ := util.ReadPidFile() fmt.Printf("SUCESS!\n\n") fmt.Printf(" The REX-Ray daemon is now running at PID %d. To\n", pid) fmt.Printf(" shutdown the daemon execute the following command:\n\n") fmt.Printf(" sudo %s stop\n\n", thisAbsPath) }