From 30c0fc2e134897c27b90ebe77547d072adc45e3d Mon Sep 17 00:00:00 2001 From: codeskyblue Date: Wed, 31 Aug 2016 22:56:59 +0800 Subject: [PATCH] add server log, fix shutdown, check server status before start server, close #2 --- gosuv.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++--------- web.go | 4 ++-- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/gosuv.go b/gosuv.go index fb1df1a..fec4c0c 100644 --- a/gosuv.go +++ b/gosuv.go @@ -9,6 +9,8 @@ import ( "os" "os/exec" "path/filepath" + "strings" + "time" "github.com/equinox-io/equinox" "github.com/goji/httpauth" @@ -85,37 +87,73 @@ func actionStartServer(c *cli.Context) error { fmt.Println("added serv: ", addr) log.Fatal(http.ListenAndServe(addr, nil)) } else { - err := exec.Command(os.Args[0], "start-server", "-f").Start() + if checkServerStatus() == nil { + fmt.Println("server is already running") + return nil + } + logPath := filepath.Join(defaultConfigDir, "gosuv.log") + logFd, err := os.Create(logPath) + if err != nil { + log.Fatalf("create file %s failed: %v", logPath, err) + } + cmd := exec.Command(os.Args[0], "start-server", "-f") + cmd.Stdout = logFd + cmd.Stderr = logFd + err = cmd.Start() if err != nil { log.Fatal(err) - } else { - log.Printf("Server started, address %s", addr) + } + select { + case err = <-GoFunc(cmd.Wait): + log.Fatalf("server started failed, %v", err) + case <-time.After(200 * time.Millisecond): + showAddr := addr + if strings.HasPrefix(addr, ":") { + showAddr = "0.0.0.0" + addr + } + fmt.Printf("server started, listening on %s\n", showAddr) } } return nil } -func actionStatus(c *cli.Context) error { +func checkServerStatus() error { resp, err := http.Get(cfg.Client.ServerURL + "/api/status") if err != nil { - log.Fatal(err) + return err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { - log.Fatal(err) + return err } var ret JSONResponse err = json.Unmarshal(body, &ret) + if err != nil { + return err + } + if ret.Status != 0 { + return fmt.Errorf("%v", ret.Value) + } + return nil +} + +func actionStatus(c *cli.Context) error { + err := checkServerStatus() if err != nil { log.Fatal(err) + } else { + log.Println("Server is running, OK.") } - fmt.Println(ret.Value) return nil } func actionShutdown(c *cli.Context) error { - resp, err := http.Get(cfg.Client.ServerURL + "/api/status") + restart := c.Bool("restart") + if restart { + log.Fatal("Restart not implemented.") + } + resp, err := http.Get(cfg.Client.ServerURL + "/api/shutdown") if err != nil { log.Fatal(err) } @@ -203,8 +241,14 @@ func main() { Action: actionStatus, }, { - Name: "shutdown", - Usage: "Shutdown server", + Name: "shutdown", + Usage: "Shutdown server", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "restart, r", + Usage: "restart server(todo)", + }, + }, Action: actionShutdown, }, { diff --git a/web.go b/web.go index a0889ec..aa75cf4 100644 --- a/web.go +++ b/web.go @@ -114,7 +114,7 @@ func (s *Supervisor) addOrUpdateProgram(pg Program) error { s.pgs = append(s.pgs, &pg) s.pgMap[pg.Name] = &pg s.procMap[pg.Name] = s.newProcess(pg) - log.Println("Add:", pg.Name) + // log.Println("Add:", pg.Name) } return nil // s.saveDB() } @@ -229,7 +229,7 @@ func (s *Supervisor) hShutdown(w http.ResponseWriter, r *http.Request) { s.Close() s.renderJSON(w, JSONResponse{ Status: 0, - Value: "gosuv has been shutdown", + Value: "gosuv server has been shutdown", }) go func() { time.Sleep(500 * time.Millisecond)