Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

Commit

Permalink
add reload support
Browse files Browse the repository at this point in the history
  • Loading branch information
codeskyblue committed Sep 1, 2016
1 parent 63b0d33 commit ff66abe
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 16 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -9,7 +9,7 @@ Features
* [x] Realtime log view
* [x] Web control page

* [x] Start, Stop, Tail
* [x] Start, Stop, Tail, Reload
* [x] Add program support
* [ ] Edit support
* [ ] Delete support
Expand Down
32 changes: 28 additions & 4 deletions gosuv.go
Expand Up @@ -4,7 +4,6 @@ import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
Expand All @@ -14,6 +13,7 @@ import (

"github.com/equinox-io/equinox"
"github.com/goji/httpauth"
"github.com/qiniu/log"
"github.com/urfave/cli"
)

Expand Down Expand Up @@ -84,15 +84,15 @@ func actionStartServer(c *cli.Context) error {

addr := cfg.Server.Addr
if c.Bool("foreground") {
fmt.Println("added serv: ", addr)
log.Printf("server listen on %v", addr)
log.Fatal(http.ListenAndServe(addr, nil))
} else {
if checkServerStatus() == nil {
fmt.Println("server is already running")
return nil
}
logPath := filepath.Join(defaultConfigDir, "gosuv.log")
logFd, err := os.Create(logPath)
logFd, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatalf("create file %s failed: %v", logPath, err)
}
Expand Down Expand Up @@ -153,7 +153,26 @@ func actionShutdown(c *cli.Context) error {
if restart {
log.Fatal("Restart not implemented.")
}
resp, err := http.Get(cfg.Client.ServerURL + "/api/shutdown")
resp, err := http.Post(cfg.Client.ServerURL+"/api/shutdown", "application/x-www-form-urlencoded", nil)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
var ret JSONResponse
err = json.Unmarshal(body, &ret)
if err != nil {
log.Fatal(err)
}
fmt.Println(ret.Value)
return nil
}

func actionReload(c *cli.Context) error {
resp, err := http.Post(cfg.Client.ServerURL+"/api/reload", "application/x-www-form-urlencoded", nil)
if err != nil {
log.Fatal(err)
}
Expand Down Expand Up @@ -240,6 +259,11 @@ func main() {
Usage: "Show program status",
Action: actionStatus,
},
{
Name: "reload",
Usage: "Reload config file",
Action: actionReload,
},
{
Name: "shutdown",
Usage: "Shutdown server",
Expand Down
3 changes: 3 additions & 0 deletions res/index.html
Expand Up @@ -51,6 +51,9 @@
<button class="btn btn-default btn-sm" v-on:click="refresh">
<span class="glyphicon glyphicon-refresh"></span> Refresh
</button>
<button class="btn btn-default btn-sm" v-on:click="reload">
<span class="glyphicon glyphicon-repeat"></span> Reload
</button>
<button class="btn btn-default btn-sm" v-on:click="test">
<span class="glyphicon glyphicon-glass"></span> Test
</button>
Expand Down
13 changes: 13 additions & 0 deletions res/js/index.js
Expand Up @@ -95,6 +95,19 @@ var vm = new Vue({
}
});
},
reload: function() {
$.ajax({
url: "/api/reload",
method: "POST",
success: function(data) {
if (data.status == 0) {
alert("reload success");
} else {
alert(data.value);
}
}
});
},
test: function() {
console.log("test");
},
Expand Down
42 changes: 31 additions & 11 deletions web.go
Expand Up @@ -105,6 +105,7 @@ func (s *Supervisor) addOrUpdateProgram(pg Program) error {

newProc := s.newProcess(pg)
s.procMap[pg.Name] = newProc
*s.pgMap[pg.Name] = pg // update origin
if isRunning {
newProc.Operate(StartEvent)
}
Expand All @@ -114,9 +115,8 @@ 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)
}
return nil // s.saveDB()
return nil
}

// Check
Expand All @@ -142,6 +142,8 @@ func (s *Supervisor) readConfigFromDB() (pgs []Program, err error) {
}

func (s *Supervisor) loadDB() error {
s.mu.Lock()
defer s.mu.Unlock()
pgs, err := s.readConfigFromDB()
if err != nil {
return err
Expand All @@ -158,19 +160,17 @@ func (s *Supervisor) loadDB() error {
continue
}
name := pg.Name
s.procMap[name].Operate(StopEvent)
log.Printf("stop before delete program: %s", name)
s.stopAndWait(name)
delete(s.procMap, name)
delete(s.pgMap, name)
}
// update programs (because of delete)
s.pgs = make([]*Program, 0, len(s.pgMap))
for _, pg := range s.pgMap {
s.pgs = append(s.pgs, pg)
}
return nil
}

func (s *Supervisor) saveDB() error {
s.mu.Lock()
defer s.mu.Unlock()
data, err := yaml.Marshal(s.pgs)
if err != nil {
return err
Expand Down Expand Up @@ -237,6 +237,22 @@ func (s *Supervisor) hShutdown(w http.ResponseWriter, r *http.Request) {
}()
}

func (s *Supervisor) hReload(w http.ResponseWriter, r *http.Request) {
err := s.loadDB()
log.Println("reload config file")
if err == nil {
s.renderJSON(w, JSONResponse{
Status: 0,
Value: "load config success",
})
} else {
s.renderJSON(w, JSONResponse{
Status: 1,
Value: err.Error(),
})
}
}

func (s *Supervisor) hGetProgram(w http.ResponseWriter, r *http.Request) {
procs := make([]*Process, 0, len(s.pgs))
for _, pg := range s.pgs {
Expand Down Expand Up @@ -394,7 +410,7 @@ func (s *Supervisor) Close() {
for _, proc := range s.procMap {
s.stopAndWait(proc.Name)
}
fmt.Println("Supervisor closed")
log.Println("server closed")
}

func (s *Supervisor) catchExitSignal() {
Expand All @@ -406,7 +422,7 @@ func (s *Supervisor) catchExitSignal() {
log.Println("Receive SIGHUP, just ignore")
continue
}
fmt.Printf("Got signal: %v, stopping all running process\n", sig)
log.Printf("Got signal: %v, stopping all running process\n", sig)
s.Close()
break
}
Expand All @@ -430,12 +446,16 @@ func newSupervisorHandler() (hdlr http.Handler, err error) {
r := mux.NewRouter()
r.HandleFunc("/", suv.hIndex)
r.HandleFunc("/settings/{name}", suv.hSetting)

r.HandleFunc("/api/status", suv.hStatus)
r.HandleFunc("/api/shutdown", suv.hShutdown)
r.HandleFunc("/api/shutdown", suv.hShutdown).Methods("POST")
r.HandleFunc("/api/reload", suv.hReload).Methods("POST")

r.HandleFunc("/api/programs", suv.hGetProgram).Methods("GET")
r.HandleFunc("/api/programs", suv.hAddProgram).Methods("POST")
r.HandleFunc("/api/programs/{name}/start", suv.hStartProgram).Methods("POST")
r.HandleFunc("/api/programs/{name}/stop", suv.hStopProgram).Methods("POST")

r.HandleFunc("/ws/events", suv.wsEvents)
r.HandleFunc("/ws/logs/{name}", suv.wsLog)

Expand Down

0 comments on commit ff66abe

Please sign in to comment.