Compare commits

..

1 Commits

Author SHA1 Message Date
langhuihui
eac623639d 界面增加重启和升级 2020-02-11 21:59:31 +08:00
9 changed files with 108 additions and 53 deletions

37
main.go
View File

@@ -29,7 +29,7 @@ type InstanceDesc struct {
Config string
}
var instances map[string]*InstanceDesc
var instances = make(map[string]*InstanceDesc)
var instancesDir string
func main() {
@@ -142,24 +142,28 @@ func initInstance(w http.ResponseWriter, r *http.Request) {
}
func upgradeEngine(w http.ResponseWriter, r *http.Request) {
sse := util.NewSSE(w, r.Context())
cmd := exec.Command("go", "get", "-u", "github.com/langhuihui/monibuca/monica")
instanceName := r.URL.Query().Get("instance")
cmd.Dir = instances[instanceName].Path
err := sse.WriteExec(cmd)
if err != nil {
sse.Write([]byte(err.Error()))
if instance, ok := instances[instanceName]; ok {
if err := instance.writeExecSSE(sse, exec.Command("go", "get", "-u", "github.com/langhuihui/monibuca/monica")); err != nil {
sse.WriteEvent("failed", []byte(err.Error()))
} else {
sse.Write([]byte("success"))
}
} else {
sse.WriteEvent("failed", []byte("no such instance"))
}
}
func restartInstance(w http.ResponseWriter, r *http.Request) {
sse := util.NewSSE(w, r.Context())
instanceName := r.URL.Query().Get("instance")
cmd := exec.Command("sh", "restart.sh")
cmd.Dir = path.Join(instancesDir, instanceName)
cmd.Stderr = sse
cmd.Stdout = sse
err := cmd.Start()
if err != nil {
sse.Write([]byte(err.Error()))
if instance, ok := instances[instanceName]; ok {
if err := instance.writeExecSSE(sse, exec.Command("sh", "restart.sh")); err != nil {
sse.WriteEvent("failed", []byte(err.Error()))
} else {
sse.Write([]byte("success"))
}
} else {
sse.WriteEvent("failed", []byte("no such instance"))
}
}
func (p *InstanceDesc) writeExecSSE(sse *util.SSE, cmd *exec.Cmd) error {
@@ -220,12 +224,7 @@ func main(){
if err != nil {
return
}
cmd := exec.Command("sh", "restart.sh")
cmd.Dir = p.Path
cmd.Stderr = sse
cmd.Stdout = sse
err = cmd.Start()
return
return p.writeExecSSE(sse, exec.Command("sh", "restart.sh"))
}
func Home() (string, error) {
user, err := user.Current()

View File

@@ -9,7 +9,7 @@ import (
)
var ConfigRaw []byte
var Version = "0.2.1"
var Version = "0.2.2"
func Run(configFile string) (err error) {
log.Printf("start monibuca version:%s", Version)

2
pm/dist/index.html vendored
View File

@@ -1 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>Monibuca Instance Manager</title><script src=ajax.js></script><link href=/css/app.200d2f8f.css rel=preload as=style><link href=/css/chunk-vendors.22ebf426.css rel=preload as=style><link href=/js/app.fd72a180.js rel=preload as=script><link href=/js/chunk-vendors.6b87e1b5.js rel=preload as=script><link href=/css/chunk-vendors.22ebf426.css rel=stylesheet><link href=/css/app.200d2f8f.css rel=stylesheet></head><body><noscript><strong>We're sorry but pm doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.6b87e1b5.js></script><script src=/js/app.fd72a180.js></script></body></html>
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>Monibuca Instance Manager</title><script src=ajax.js></script><link href=/css/app.200d2f8f.css rel=preload as=style><link href=/css/chunk-vendors.22ebf426.css rel=preload as=style><link href=/js/app.c617bcf5.js rel=preload as=script><link href=/js/chunk-vendors.6b87e1b5.js rel=preload as=script><link href=/css/chunk-vendors.22ebf426.css rel=stylesheet><link href=/css/app.200d2f8f.css rel=stylesheet></head><body><noscript><strong>We're sorry but pm doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.6b87e1b5.js></script><script src=/js/app.c617bcf5.js></script></body></html>

2
pm/dist/js/app.c617bcf5.js vendored Normal file

File diff suppressed because one or more lines are too long

1
pm/dist/js/app.c617bcf5.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -14,8 +14,7 @@
</div>
<div slot="footer">
<Checkbox v-model="clearDir">安装前清空目录</Checkbox>
<Button type="primary" @click="start">开始</Button>
<Button type="success" @click="close" v-if="status=='finish'">完成</Button>
<Button type="primary" @click="start" :loading="status=='process'">开始</Button>
</div>
</Modal>
</template>
@@ -27,36 +26,37 @@ export default {
props: {
info: Object
},
methods:{
start(){
eventSource = new EventSource(
"/create?info=" + JSON.stringify(this.info)+(this.clearDir?"&clear=true":"")
);
eventSource.onopen = () => (this.log = "");
eventSource.onmessage = evt => {
this.log += evt.data + "\n";
if (evt.data == "success") {
this.status = "finish";
eventSource.close();
}
};
eventSource.addEventListener("exception", evt => {
this.log += evt.data + "\n";
this.status = "error";
methods: {
start() {
this.status = "process";
eventSource = new EventSource(
"/create?info=" +
JSON.stringify(this.info) +
(this.clearDir ? "&clear=true" : "")
);
eventSource.onopen = () => (this.log = "");
eventSource.onmessage = evt => {
this.log += evt.data + "\n";
if (evt.data == "success") {
this.status = "finish";
eventSource.close();
});
eventSource.addEventListener("step", evt => {
let [step, msg] = evt.data.split(":");
this.currentStep = step | 0;
this.log += msg + "\n";
});
},close(){
this.$Modal.remove()
}
}
};
eventSource.addEventListener("exception", evt => {
this.log += evt.data + "\n";
this.status = "error";
eventSource.close();
});
eventSource.addEventListener("step", evt => {
let [step, msg] = evt.data.split(":");
this.currentStep = step | 0;
this.log += msg + "\n";
});
},
},
data() {
return { clearDir: true, currentStep: 0, log: "", status: "process" };
return { clearDir: true, currentStep: 0, log: "", status: "wait" };
}
};
</script>

View File

@@ -7,6 +7,14 @@
<List border>
<ListItem v-for="item in instances" :key="item.Name">
<ListItemMeta :title="item.Name" :description="item.Path"></ListItemMeta>
<template slot="action">
<li @click="restart(item)">
<Icon type="ios-refresh" />重启
</li>
<li @click="upgrade(item)">
<Icon type="ios-sync" />升级引擎
</li>
</template>
</ListItem>
</List>
</TabPane>
@@ -217,6 +225,54 @@ ${x.Config || ""}`
this.formPlugin.Path = item;
this.formPlugin.Config = this.defaultConfig[name];
this.showBuiltinPlugin = false;
},
restart(item){
const msg = this.$Message.loading({
content: 'restart '+item.Name+'...',
duration: 0
});
var es = new EventSource("/restart/instance?instance="+item.Name)
es.onmessage = evt => {
if(evt.data=="success"){
this.$Message.success("重启成功!")
msg()
}else{
this.$Message.info(evt.data)
}
}
es.addEventListener("failed",evt=>{
this.$Message.error(evt.data)
msg()
})
es.onerror = e => {
this.$Message.error(e);
msg()
es.close()
}
},
upgrade(item){
const msg = this.$Message.loading({
content: 'upgrade '+item.Name+'...',
duration: 0
});
var es = new EventSource("/upgrade/engine?instance="+item.Name)
es.onmessage = evt => {
if(evt.data=="success"){
this.$Message.success("更新完毕")
msg()
}else{
this.$Message.info(evt.data)
}
}
es.addEventListener("failed",evt=>{
this.$Message.error(evt.data)
msg()
})
es.onerror = e => {
this.$Message.error(e);
msg()
es.close()
}
}
}
};