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.
gosuv/web.go

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
}