delete support

master
codeskyblue 8 years ago
parent f00268de0f
commit 5e14107315

@ -33,3 +33,7 @@ body {
small.user {
color: #cccccc;
}
.color-red {
color: red;
}

@ -79,14 +79,17 @@
<span class="glyphicon glyphicon-stop"></span> Stop
</button>
<button class="btn btn-default btn-xs" v-on:click="cmdTail(p.program.name)">
<span class="glyphicon glyphicon-text-size"></span> Tail
<span class="fa fa-file-text-o"></span> Log
</button>
<a href="/settings/{{p.program.name}}" class="btn btn-default btn-xs">
<span class="glyphicon glyphicon-cog"></span> More
<span class="fa fa-bar-chart"></span> Profiles
</a>
<button class="btn btn-default btn-xs" data-toggle="tooltip" title="{{p.program.command}}" >
<button class="btn btn-default btn-xs" data-toggle="tooltip" title="{{p.program.command}}">
<span class="glyphicon glyphicon-info-sign"></span> Info
</button>
<button class="btn btn-default btn-xs" v-on:click="cmdDelete(p.program.name)">
<span class="color-red glyphicon glyphicon-trash"></span> Delete
</button>
</td>
</tr>
<!-- <tr class="success">
@ -124,7 +127,9 @@
<div class="modal-content">
<form id="formNewProgram" action="/api/programs" method="post">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">New program</h4>
</div>
<div class="modal-body">
@ -167,7 +172,9 @@
<div class="modal-content">
<form id="formNewProgram" action="/api/programs" method="post">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">Tail</h4>
</div>
<div class="modal-body">

@ -59,7 +59,7 @@ var vm = new Vue({
url: "/api/programs",
success: function(data) {
vm.programs = data;
Vue.nextTick(function(){
Vue.nextTick(function() {
$('[data-toggle="tooltip"]').tooltip()
})
}
@ -131,6 +131,18 @@ var vm = new Vue({
// backdrop: 'static',
})
},
cmdDelete: function(name) {
if (!confirm("Confirm delete \"" + name + "\"")) {
return
}
$.ajax({
url: "/api/programs/" + name,
method: 'delete',
success: function(data) {
console.log(data);
}
})
},
canStop: function(status) {
switch (status) {
case "running":

@ -37,7 +37,7 @@ func init() {
type Supervisor struct {
ConfigDir string
names []string
names []string // order of programs
pgMap map[string]Program
procMap map[string]*Process
mu sync.Mutex
@ -138,7 +138,6 @@ func (s *Supervisor) addOrUpdateProgram(pg Program) error {
}
}()
} else {
// s.pgs = append(s.pgs, &pg)
s.names = append(s.names, pg.Name)
s.pgMap[pg.Name] = pg
s.procMap[pg.Name] = s.newProcess(pg)
@ -190,12 +189,13 @@ func (s *Supervisor) loadDB() error {
if visited[pg.Name] {
continue
}
name := pg.Name
log.Printf("stop before delete program: %s", name)
s.stopAndWait(name)
delete(s.procMap, name)
delete(s.pgMap, name)
s.broadcastEvent(pg.Name + " deleted")
s.removeProgram(pg.Name)
// name := pg.Name
// log.Printf("stop before delete program: %s", name)
// s.stopAndWait(name)
// delete(s.procMap, name)
// delete(s.pgMap, name)
// s.broadcastEvent(name + " deleted")
}
return nil
}
@ -210,6 +210,22 @@ func (s *Supervisor) saveDB() error {
return ioutil.WriteFile(s.programPath(), data, 0644)
}
func (s *Supervisor) removeProgram(name string) {
names := make([]string, 0, len(s.names))
for _, pName := range s.names {
if pName == name {
continue
}
names = append(names, pName)
}
s.names = names
log.Printf("stop before delete program: %s", name)
s.stopAndWait(name)
delete(s.procMap, name)
delete(s.pgMap, name)
s.broadcastEvent(name + " deleted")
}
type WebConfig struct {
User string
Version string
@ -360,6 +376,26 @@ func (s *Supervisor) hAddProgram(w http.ResponseWriter, r *http.Request) {
w.Write(data)
}
func (s *Supervisor) hDelProgram(w http.ResponseWriter, r *http.Request) {
name := mux.Vars(r)["name"]
w.Header().Set("Content-Type", "application/json")
var data []byte
if _, ok := s.pgMap[name]; !ok {
data, _ = json.Marshal(map[string]interface{}{
"status": 1,
"error": fmt.Sprintf("Program %s not exists", strconv.Quote(name)),
})
} else {
s.removeProgram(name)
s.saveDB()
data, _ = json.Marshal(map[string]interface{}{
"status": 0,
})
}
w.Write(data)
}
func (s *Supervisor) hStartProgram(w http.ResponseWriter, r *http.Request) {
name := mux.Vars(r)["name"]
proc, ok := s.procMap[name]
@ -593,6 +629,7 @@ func newSupervisorHandler() (suv *Supervisor, hdlr http.Handler, err error) {
r.HandleFunc("/api/programs", suv.hGetProgramList).Methods("GET")
r.HandleFunc("/api/programs/{name}", suv.hGetProgram).Methods("GET")
r.HandleFunc("/api/programs/{name}", suv.hDelProgram).Methods("DELETE")
r.HandleFunc("/api/programs", suv.hAddProgram).Methods("POST")
r.HandleFunc("/api/programs/{name}/start", suv.hStartProgram).Methods("POST")
r.HandleFunc("/api/programs/{name}/stop", suv.hStopProgram).Methods("POST")

Loading…
Cancel
Save