|
|
@ -33,13 +33,28 @@ func init() {
|
|
|
|
|
|
|
|
|
|
|
|
type Supervisor struct {
|
|
|
|
type Supervisor struct {
|
|
|
|
ConfigDir string
|
|
|
|
ConfigDir string
|
|
|
|
pgs []*Program
|
|
|
|
|
|
|
|
pgMap map[string]*Program
|
|
|
|
|
|
|
|
procMap map[string]*Process
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mu sync.Mutex
|
|
|
|
names []string
|
|
|
|
eventB *WriteBroadcaster
|
|
|
|
pgMap map[string]Program
|
|
|
|
// eventB *BroadcastString
|
|
|
|
procMap map[string]*Process
|
|
|
|
|
|
|
|
mu sync.Mutex
|
|
|
|
|
|
|
|
eventB *WriteBroadcaster
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Supervisor) programs() []Program {
|
|
|
|
|
|
|
|
pgs := make([]Program, 0, len(s.names))
|
|
|
|
|
|
|
|
for _, name := range s.names {
|
|
|
|
|
|
|
|
pgs = append(pgs, s.pgMap[name])
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return pgs
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Supervisor) procs() []*Process {
|
|
|
|
|
|
|
|
ps := make([]*Process, 0, len(s.names))
|
|
|
|
|
|
|
|
for _, name := range s.names {
|
|
|
|
|
|
|
|
ps = append(ps, s.procMap[name])
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return ps
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Supervisor) programPath() string {
|
|
|
|
func (s *Supervisor) programPath() string {
|
|
|
@ -102,7 +117,7 @@ func (s *Supervisor) addOrUpdateProgram(pg Program) error {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
origPg, ok := s.pgMap[pg.Name]
|
|
|
|
origPg, ok := s.pgMap[pg.Name]
|
|
|
|
if ok {
|
|
|
|
if ok {
|
|
|
|
if reflect.DeepEqual(origPg, &pg) {
|
|
|
|
if reflect.DeepEqual(origPg, pg) {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s.broadcastEvent(pg.Name + " update")
|
|
|
|
s.broadcastEvent(pg.Name + " update")
|
|
|
@ -114,14 +129,15 @@ func (s *Supervisor) addOrUpdateProgram(pg Program) error {
|
|
|
|
|
|
|
|
|
|
|
|
newProc := s.newProcess(pg)
|
|
|
|
newProc := s.newProcess(pg)
|
|
|
|
s.procMap[pg.Name] = newProc
|
|
|
|
s.procMap[pg.Name] = newProc
|
|
|
|
*s.pgMap[pg.Name] = pg // update origin
|
|
|
|
s.pgMap[pg.Name] = pg // update origin
|
|
|
|
if isRunning {
|
|
|
|
if isRunning {
|
|
|
|
newProc.Operate(StartEvent)
|
|
|
|
newProc.Operate(StartEvent)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}()
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
s.pgs = append(s.pgs, &pg)
|
|
|
|
// s.pgs = append(s.pgs, &pg)
|
|
|
|
s.pgMap[pg.Name] = &pg
|
|
|
|
s.names = append(s.names, pg.Name)
|
|
|
|
|
|
|
|
s.pgMap[pg.Name] = pg
|
|
|
|
s.procMap[pg.Name] = s.newProcess(pg)
|
|
|
|
s.procMap[pg.Name] = s.newProcess(pg)
|
|
|
|
s.broadcastEvent(pg.Name + " added")
|
|
|
|
s.broadcastEvent(pg.Name + " added")
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -159,12 +175,15 @@ func (s *Supervisor) loadDB() error {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// add or update program
|
|
|
|
// add or update program
|
|
|
|
visited := map[string]bool{}
|
|
|
|
visited := map[string]bool{}
|
|
|
|
|
|
|
|
names := make([]string, 0, len(pgs))
|
|
|
|
for _, pg := range pgs {
|
|
|
|
for _, pg := range pgs {
|
|
|
|
|
|
|
|
names = append(names, pg.Name)
|
|
|
|
visited[pg.Name] = true
|
|
|
|
visited[pg.Name] = true
|
|
|
|
s.addOrUpdateProgram(pg)
|
|
|
|
s.addOrUpdateProgram(pg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s.names = names
|
|
|
|
// delete not exists program
|
|
|
|
// delete not exists program
|
|
|
|
for _, pg := range s.pgs {
|
|
|
|
for _, pg := range s.pgMap {
|
|
|
|
if visited[pg.Name] {
|
|
|
|
if visited[pg.Name] {
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -173,6 +192,7 @@ func (s *Supervisor) loadDB() error {
|
|
|
|
s.stopAndWait(name)
|
|
|
|
s.stopAndWait(name)
|
|
|
|
delete(s.procMap, name)
|
|
|
|
delete(s.procMap, name)
|
|
|
|
delete(s.pgMap, name)
|
|
|
|
delete(s.pgMap, name)
|
|
|
|
|
|
|
|
s.broadcastEvent(pg.Name + " deleted")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -180,7 +200,7 @@ func (s *Supervisor) loadDB() error {
|
|
|
|
func (s *Supervisor) saveDB() error {
|
|
|
|
func (s *Supervisor) saveDB() error {
|
|
|
|
s.mu.Lock()
|
|
|
|
s.mu.Lock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
defer s.mu.Unlock()
|
|
|
|
data, err := yaml.Marshal(s.pgs)
|
|
|
|
data, err := yaml.Marshal(s.programs())
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -263,11 +283,7 @@ func (s *Supervisor) hReload(w http.ResponseWriter, r *http.Request) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Supervisor) hGetProgram(w http.ResponseWriter, r *http.Request) {
|
|
|
|
func (s *Supervisor) hGetProgram(w http.ResponseWriter, r *http.Request) {
|
|
|
|
procs := make([]*Process, 0, len(s.pgs))
|
|
|
|
data, err := json.Marshal(s.procs())
|
|
|
|
for _, pg := range s.pgs {
|
|
|
|
|
|
|
|
procs = append(procs, s.procMap[pg.Name])
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
data, err := json.Marshal(procs)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
return
|
|
|
@ -446,7 +462,7 @@ func (s *Supervisor) catchExitSignal() {
|
|
|
|
func newSupervisorHandler() (hdlr http.Handler, err error) {
|
|
|
|
func newSupervisorHandler() (hdlr http.Handler, err error) {
|
|
|
|
suv := &Supervisor{
|
|
|
|
suv := &Supervisor{
|
|
|
|
ConfigDir: defaultConfigDir,
|
|
|
|
ConfigDir: defaultConfigDir,
|
|
|
|
pgMap: make(map[string]*Program, 0),
|
|
|
|
pgMap: make(map[string]Program, 0),
|
|
|
|
procMap: make(map[string]*Process, 0),
|
|
|
|
procMap: make(map[string]*Process, 0),
|
|
|
|
eventB: NewWriteBroadcaster(4 * 1024),
|
|
|
|
eventB: NewWriteBroadcaster(4 * 1024),
|
|
|
|
}
|
|
|
|
}
|
|
|
|