You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.0 KiB
108 lines
2.0 KiB
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"os/exec"
|
|
"time"
|
|
|
|
"github.com/lunny/tango"
|
|
"github.com/lunny/log"
|
|
)
|
|
|
|
type JSONResponse struct {
|
|
Code int `json:"code"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
func renderJSON(w http.ResponseWriter, v interface{}) {
|
|
w.Header().Add("Content-Type", "json")
|
|
json.NewEncoder(w).Encode(v)
|
|
}
|
|
|
|
func versionHandler(w http.ResponseWriter, r *http.Request) {
|
|
renderJSON(w, &JSONResponse{
|
|
Code: 200,
|
|
Message: GOSUV_VERSION,
|
|
})
|
|
}
|
|
|
|
func buildProgram(pinfo *ProgramInfo) (*Program, error) {
|
|
// init cmd
|
|
cmd := exec.Command(pinfo.Command[0], pinfo.Command[1:]...)
|
|
cmd.Dir = pinfo.Dir
|
|
cmd.Env = append(os.Environ(), pinfo.Environ...)
|
|
program := NewProgram(cmd, pinfo)
|
|
|
|
// set output
|
|
return program, nil
|
|
}
|
|
|
|
func statusHandler(w http.ResponseWriter, r *http.Request) {
|
|
prms := programTable.Programs()
|
|
renderJSON(w, prms)
|
|
}
|
|
|
|
func addHandler(w http.ResponseWriter, r *http.Request) {
|
|
pinfo := new(ProgramInfo)
|
|
err := json.NewDecoder(r.Body).Decode(pinfo)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), 502)
|
|
return
|
|
}
|
|
log.Printf("add: %#v", pinfo)
|
|
|
|
program, err := buildProgram(pinfo)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), 502)
|
|
return
|
|
}
|
|
if err = programTable.AddProgram(program); err != nil {
|
|
http.Error(w, err.Error(), 503)
|
|
return
|
|
}
|
|
go program.Run()
|
|
/*
|
|
if err = program.Start(); err != nil {
|
|
http.Error(w, err.Error(), 503)
|
|
return
|
|
}
|
|
|
|
go program.Wait()
|
|
*/
|
|
|
|
renderJSON(w, &JSONResponse{
|
|
Code: 200,
|
|
Message: "program add success",
|
|
})
|
|
}
|
|
|
|
func shutdownHandler(w http.ResponseWriter, r *http.Request) {
|
|
go func() {
|
|
time.Sleep(50 * time.Millisecond)
|
|
os.Exit(2)
|
|
}()
|
|
renderJSON(w, &JSONResponse{
|
|
Code: 200,
|
|
Message: "not implement",
|
|
})
|
|
}
|
|
|
|
func ServeAddr(host string, port int) error {
|
|
InitServer()
|
|
|
|
t := tango.New()
|
|
|
|
t.Group("/api", func(g *tango.Group) {
|
|
g.Get("/version", versionHandler)
|
|
g.Post("/shutdown", shutdownHandler)
|
|
g.Post("/programs", addHandler)
|
|
g.Get("/programs", statusHandler)
|
|
})
|
|
|
|
t.Run(fmt.Sprintf("%s:%d", host, port))
|
|
return nil
|
|
}
|