master
codeskyblue 8 years ago
parent 199e4acb81
commit 9d642f8b9f

@ -99,9 +99,9 @@ type Program struct {
Command string `yaml:"command" json:"command"`
Environ []string `yaml:"environ" json:"environ"`
Dir string `yaml:"directory" json:"directory"`
AutoStart bool `yaml:"autostart" json:"autostart"` // change to *bool, which support unexpected
StartRetries int `yaml:"startretries" json:"startretries"`
StartSeconds int `yaml:"startsecs" json:"startsecs"`
StartAuto bool `yaml:"start_auto" json:"startAuto"` // change to *bool, which support unexpected
StartRetries int `yaml:"start_retries" json:"startRetries"`
StartSeconds int `yaml:"start_seconds" json:"startSeconds"`
// LogDir string `yaml:"logdir"`
}

@ -26,11 +26,11 @@
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-2">
<ul class="nav navbar-nav">
<li class="hidden-xs">
<!-- <li class="hidden-xs">
<a>
<span class="glyphicon glyphicon-qrcode"></span>
</a>
</li>
</li> -->
</ul>
<ul id="nav-right-bar" class="nav navbar-nav navbar-right">
</ul>

@ -15,18 +15,20 @@ function getQueryString(name) {
var ws;
var wsProtocol = location.protocol == "https:" ? "wss" : "ws";
var testPrograms = [{
program: {
name: "gggg",
command: "",
dir: "",
autoStart: true,
},
status: "running",
}];
var vm = new Vue({
el: "#app",
data: {
programs: [{
program: {
name: "gggg",
command: "",
dir: "",
autoStart: true,
},
status: "running",
}],
programs: [],
},
methods: {
addNewProgram: function() {

@ -26,7 +26,7 @@ type Supervisor struct {
pgs []*Program
pgMap map[string]*Program
procMap map[string]*Process
eventCs []chan string // channels
eventCs map[chan string]bool
mu sync.Mutex
}
@ -38,7 +38,7 @@ func (s *Supervisor) newProcess(pg Program) *Process {
p := NewProcess(pg)
origFunc := p.StateChange
p.StateChange = func(oldState, newState FSMState) {
s.broadcastEvent(string(newState))
s.broadcastEvent(fmt.Sprintf("%s state: %s -> %s", p.Name, string(oldState), string(newState)))
origFunc(oldState, newState)
}
return p
@ -47,20 +47,24 @@ func (s *Supervisor) newProcess(pg Program) *Process {
func (s *Supervisor) broadcastEvent(event string) {
s.mu.Lock()
defer s.mu.Unlock()
validEventCs := make([]chan string, 0, len(s.eventCs))
for _, c := range s.eventCs {
for c := range s.eventCs {
select {
case c <- event:
validEventCs = append(validEventCs, c)
case <-time.After(500 * time.Millisecond):
log.Println("Chan closed, remove from queue")
delete(s.eventCs, c)
}
}
s.eventCs = validEventCs
}
func (s *Supervisor) addStatusChangeListener(c chan string) {
s.mu.Lock()
defer s.mu.Unlock()
s.eventCs[c] = true
}
func (s *Supervisor) addOrUpdateProgram(pg Program) error {
defer s.broadcastEvent("add or update")
defer s.broadcastEvent(pg.Name + " add or update")
origPg, ok := s.pgMap[pg.Name]
if ok {
@ -156,7 +160,7 @@ func (s *Supervisor) saveDB() error {
func (s *Supervisor) renderHTML(w http.ResponseWriter, name string, data interface{}) {
baseName := filepath.Base(name)
t := template.Must(template.New("t").ParseFiles(name))
t := template.Must(template.New("t").ParseFiles(name)).Delims("[[", "]]")
t.ExecuteTemplate(w, baseName, data)
}
@ -192,7 +196,7 @@ func (s *Supervisor) hAddProgram(w http.ResponseWriter, r *http.Request) {
Name: r.FormValue("name"),
Command: r.FormValue("command"),
Dir: r.FormValue("dir"),
AutoStart: r.FormValue("autostart") == "on",
StartAuto: r.FormValue("autostart") == "on",
StartRetries: retries,
// TODO: missing other values
}
@ -275,7 +279,9 @@ func (s *Supervisor) wsEvents(w http.ResponseWriter, r *http.Request) {
defer c.Close()
ch := make(chan string, 0)
s.eventCs = append(s.eventCs, ch)
s.addStatusChangeListener(ch)
// s.eventCs[ch] = true
// s.eventCs = append(s.eventCs, ch)
go func() {
for message := range ch {
// Question: type 1 ?
@ -312,12 +318,14 @@ func (s *Supervisor) catchExitSignal() {
}()
}
var defaultConfigDir = filepath.Join(UserHomeDir(), ".gosuv")
func init() {
suv := &Supervisor{
ConfigDir: filepath.Join(UserHomeDir(), ".gosuv"),
ConfigDir: defaultConfigDir,
pgMap: make(map[string]*Program, 0),
procMap: make(map[string]*Process, 0),
eventCs: make([]chan string, 0),
eventCs: make(map[chan string]bool),
}
if err := suv.loadDB(); err != nil {
log.Fatal(err)

Loading…
Cancel
Save