mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-09-27 20:52:29 +08:00
Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
eac623639d |
37
main.go
37
main.go
@@ -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()
|
||||
|
@@ -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
2
pm/dist/index.html
vendored
@@ -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
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
1
pm/dist/js/app.c617bcf5.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
2
pm/dist/js/app.fd72a180.js
vendored
2
pm/dist/js/app.fd72a180.js
vendored
File diff suppressed because one or more lines are too long
1
pm/dist/js/app.fd72a180.js.map
vendored
1
pm/dist/js/app.fd72a180.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
Reference in New Issue
Block a user