From ca308ededed65c534f90243db586835e56a6c925 Mon Sep 17 00:00:00 2001 From: codeskyblue Date: Tue, 23 Aug 2016 14:19:07 +0800 Subject: [PATCH] add conftest --- res/js/index.js | 23 +++++------------------ web.go | 44 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/res/js/index.js b/res/js/index.js index b038e77..93b85f2 100644 --- a/res/js/index.js +++ b/res/js/index.js @@ -80,7 +80,11 @@ $(function() { data: data, success: function(data) { console.log(data); - $("#newProgram").modal('hide'); + if (data.status === 0) { + $("#newProgram").modal('hide'); + } else { + window.alert(data.error); + } }, error: function(err) { console.log(err.responseText); @@ -88,22 +92,5 @@ $(function() { }) e.preventDefault() }); - // $("#formNewProgram").ajaxForm(function(e) { - // alert("Thanks"); - // e.preventDefault() - // }); - // var clipboard = new Clipboard('.btn'); - // clipboard.on('success', function(e) { - // console.info('Action:', e.action); - // console.info('Text:', e.text); - // console.info('Trigger:', e.trigger); - // $(e.trigger) - // .tooltip('show') - // .mouseleave(function() { - // $(this).tooltip('hide'); - // }) - - // e.clearSelection(); - // }); }); diff --git a/web.go b/web.go index 6c8037d..0fe50d2 100644 --- a/web.go +++ b/web.go @@ -2,11 +2,14 @@ package main import ( "encoding/json" + "fmt" "html/template" "io/ioutil" "net/http" + "os" "path/filepath" "reflect" + "strconv" "time" "github.com/go-yaml/yaml" @@ -28,6 +31,7 @@ func (s *Supervisor) programPath() string { func (s *Supervisor) addOrUpdateProgram(pg Program) error { origPg, ok := s.pgMap[pg.Name] if ok { + log.Println("Orig:", origPg, "Curr:", pg) if !reflect.DeepEqual(origPg, &pg) { log.Println("Update:", pg.Name) origProc := s.procMap[pg.Name] @@ -54,23 +58,37 @@ func (s *Supervisor) addOrUpdateProgram(pg Program) error { return s.saveDB() } -func (s *Supervisor) loadDB() error { +// Check +// - Yaml format +// - Duplicated program +func (s *Supervisor) readConfigFromDB() (pgs []Program, err error) { data, err := ioutil.ReadFile(s.programPath()) if err != nil { data = []byte("") } - pgs := make([]Program, 0) - if err = yaml.Unmarshal(data, pgs); err != nil { - return err + pgs = make([]Program, 0) + if err = yaml.Unmarshal(data, &pgs); err != nil { + return nil, err } - // add or update program visited := map[string]bool{} for _, pg := range pgs { if visited[pg.Name] { - log.Warnf("Duplicated program name: %s", pg.Name) - continue + return nil, fmt.Errorf("Duplicated program name: %s", pg.Name) } visited[pg.Name] = true + } + return +} + +func (s *Supervisor) loadDB() error { + pgs, err := s.readConfigFromDB() + if err != nil { + return err + } + // add or update program + visited := map[string]bool{} + for _, pg := range pgs { + visited[pg.Name] = true s.addOrUpdateProgram(pg) } // delete not exists program @@ -92,6 +110,11 @@ func (s *Supervisor) loadDB() error { } func (s *Supervisor) saveDB() error { + dir := filepath.Dir(s.programPath()) + if !IsDir(dir) { + os.MkdirAll(dir, 0755) + } + data, err := yaml.Marshal(s.pgs) if err != nil { return err @@ -112,7 +135,6 @@ func (s *Supervisor) hAddProgram(w http.ResponseWriter, r *http.Request) { AutoStart: r.FormValue("autostart") == "on", // TODO: missing other values } - log.Println(r.FormValue("autostart")) if pg.Dir == "" { pg.Dir = "/" } @@ -126,6 +148,7 @@ func (s *Supervisor) hAddProgram(w http.ResponseWriter, r *http.Request) { if _, ok := s.pgMap[pg.Name]; ok { data, _ = json.Marshal(map[string]interface{}{ "status": 1, + "error": fmt.Sprintf("Program %s already exists", strconv.Quote(pg.Name)), }) } else { if err := s.addOrUpdateProgram(pg); err != nil { @@ -144,10 +167,13 @@ func (s *Supervisor) hAddProgram(w http.ResponseWriter, r *http.Request) { func init() { suv := &Supervisor{ - ConfigDir: UserHomeDir(), + ConfigDir: filepath.Join(UserHomeDir(), ".gosuv"), pgMap: make(map[string]*Program, 0), procMap: make(map[string]*Process, 0), } + if err := suv.loadDB(); err != nil { + log.Fatal(err) + } r := mux.NewRouter() r.HandleFunc("/", suv.hIndex) r.HandleFunc("/api/programs", suv.hAddProgram).Methods("POST")