mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-26 01:04:06 +08:00
add cli.daemon
Change-Id: I0de2701f6e6fe33c0b7049a66ce49e49e47432a1
This commit is contained in:
parent
4b7153a9fe
commit
70e0a730d5
@ -113,10 +113,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
":": []string{"command"},
|
||||
"::": []string{"command", "list"},
|
||||
|
||||
"pwd": []string{"nfs.pwd"},
|
||||
"path": []string{"nfs.path"},
|
||||
"dir": []string{"nfs.dir"},
|
||||
"git": []string{"nfs.git"},
|
||||
// "pwd": []string{"nfs.pwd"},
|
||||
// "path": []string{"nfs.path"},
|
||||
// "dir": []string{"nfs.dir"},
|
||||
// "git": []string{"nfs.git"},
|
||||
"brow": []string{"web.brow"},
|
||||
"ifconfig": []string{"tcp.ifconfig"},
|
||||
}, Help: "启动脚本"},
|
||||
@ -132,6 +132,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
"top": map[string]interface{}{"active": true},
|
||||
"ls": map[string]interface{}{"arg": []interface{}{"-l"}},
|
||||
}, Help: "系统命令配置, active: 交互方式, cmd: 命令映射, arg: 命令参数, args: 子命令参数, path: 命令目录, env: 环境变量, dir: 工作目录"},
|
||||
"daemon": &ctx.Config{Name: "daemon", Value: map[string]interface{}{}, Help: "系统命令超时"},
|
||||
|
||||
"timer": &ctx.Config{Name: "timer", Value: map[string]interface{}{}, Help: "定时器"},
|
||||
"timer_next": &ctx.Config{Name: "timer_next", Value: "", Help: "定时器"},
|
||||
@ -154,6 +155,12 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
})
|
||||
return
|
||||
}},
|
||||
"exit": &ctx.Command{Name: "exit", Help: "解析脚本, script: 脚本文件, stdio: 命令终端, snippet: 代码片段", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
|
||||
m.Confm("daemon", func(key string, info map[string]interface{}) {
|
||||
m.Cmd("cli.system", key, "stop")
|
||||
})
|
||||
return
|
||||
}},
|
||||
"source": &ctx.Command{Name: "source [script|stdio|snippet]", Help: "解析脚本, script: 脚本文件, stdio: 命令终端, snippet: 代码片段", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
|
||||
if len(arg) == 0 {
|
||||
m.Cmdy("dir", "", "dir_deep", "dir_reg", ".*\\.(sh|shy|py)$")
|
||||
@ -196,8 +203,40 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
}},
|
||||
"system": &ctx.Command{Name: "system word...", Help: []string{"调用系统命令, word: 命令",
|
||||
"cmd_active(true/false): 是否交互", "cmd_timeout: 命令超时", "cmd_env: 环境变量", "cmd_dir: 工作目录"},
|
||||
Form: map[string]int{"cmd_active": 1, "cmd_timeout": 1, "cmd_env": 2, "cmd_dir": 1, "cmd_error": 0, "cmd_parse": 1, "cmd_temp": -1},
|
||||
Form: map[string]int{"cmd_active": 1, "cmd_timeout": 1, "cmd_env": 2, "cmd_dir": 1, "cmd_error": 0, "cmd_parse": 1, "cmd_temp": -1, "cmd_log": 1},
|
||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
|
||||
if len(arg) == 0 {
|
||||
m.Confm("daemon", func(key string, info map[string]interface{}) {
|
||||
if cmd, ok := info["cmd"].(*exec.Cmd); ok {
|
||||
m.Add("append", "key", key)
|
||||
m.Add("append", "create_time", info["create_time"])
|
||||
m.Add("append", "cmd", kit.Select(cmd.Args[0], cmd.Args, 1))
|
||||
m.Add("append", "log", info["log"])
|
||||
m.Add("append", "pid", cmd.Process.Pid)
|
||||
m.Add("append", "finish_time", info["finish_time"])
|
||||
if cmd.ProcessState == nil {
|
||||
m.Add("append", "str", "")
|
||||
} else {
|
||||
m.Add("append", "str", cmd.ProcessState.String())
|
||||
}
|
||||
}
|
||||
})
|
||||
m.Table()
|
||||
return
|
||||
}
|
||||
if m.Confm("daemon", arg[0], func(daemon map[string]interface{}) {
|
||||
if cmd, ok := daemon["cmd"].(*exec.Cmd); ok {
|
||||
switch arg[1] {
|
||||
case "stop":
|
||||
cmd.Process.Kill()
|
||||
default:
|
||||
m.Echo("%v", cmd)
|
||||
}
|
||||
}
|
||||
}) != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, v := range m.Meta["result"] {
|
||||
if strings.TrimSpace(v) != "" {
|
||||
arg = append(arg, v)
|
||||
@ -231,13 +270,14 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", k, m.Parse(v)))
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < len(m.Meta["cmd_env"])-1; i += 2 {
|
||||
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", m.Meta["cmd_env"][i], m.Parse(m.Meta["cmd_env"][i+1])))
|
||||
}
|
||||
m.Log("info", "cmd.env %v", cmd.Env)
|
||||
for _, v := range os.Environ() {
|
||||
cmd.Env = append(cmd.Env, v)
|
||||
}
|
||||
// for _, v := range os.Environ() {
|
||||
// cmd.Env = append(cmd.Env, v)
|
||||
// }
|
||||
|
||||
if m.Options("cmd_dir") {
|
||||
cmd.Dir = m.Option("cmd_dir")
|
||||
@ -253,6 +293,27 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
} else if e := cmd.Wait(); e != nil {
|
||||
m.Echo("error: ").Echo("%s\n", e)
|
||||
}
|
||||
} else if m.Options("cmd_log") {
|
||||
|
||||
l, e := os.Create(m.Option("cmd_log"))
|
||||
m.Assert(e)
|
||||
cmd.Stdin, cmd.Stdout, cmd.Stderr = nil, l, l
|
||||
|
||||
h, _ := kit.Hash("uniq")
|
||||
m.Conf("daemon", h, map[string]interface{}{
|
||||
"create_time": m.Time(), "cmd": cmd, "log": m.Option("cmd_log"),
|
||||
})
|
||||
m.Echo(h)
|
||||
|
||||
m.GoFunc(m, func(m *ctx.Message) {
|
||||
if e := cmd.Start(); e != nil {
|
||||
m.Echo("error: ").Echo("%s\n", e)
|
||||
} else if e := cmd.Wait(); e != nil {
|
||||
m.Echo("error: ").Echo("%s\n", e)
|
||||
}
|
||||
m.Conf("daemon", []string{h, "finish_time"}, time.Now().Format(m.Conf("time_format")))
|
||||
})
|
||||
|
||||
} else {
|
||||
wait := make(chan bool, 1)
|
||||
m.GoFunc(m, func(m *ctx.Message) {
|
||||
@ -314,7 +375,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||
}
|
||||
return
|
||||
}},
|
||||
"exit": &ctx.Command{Name: "exit code", Help: "停止服务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
|
||||
"quit": &ctx.Command{Name: "quit code", Help: "停止服务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
|
||||
m.Cmd("cli.source", m.Conf("runtime", "script.exit"))
|
||||
go func() {
|
||||
time.Sleep(time.Second * 3)
|
||||
|
@ -45,7 +45,7 @@ func (ctx *CTX) Start(m *Message, arg ...string) bool {
|
||||
} else {
|
||||
m.Cmd("cli.source", arg)
|
||||
}
|
||||
|
||||
m.Cmd("ctx.exit")
|
||||
return true
|
||||
}
|
||||
func (ctx *CTX) Close(m *Message, arg ...string) bool {
|
||||
@ -68,6 +68,10 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{},
|
||||
"auto_make": &Config{Name: "auto_make(true/false)", Value: "true", Help: "调试模式,on:打印,off:不打印)"},
|
||||
"debug": &Config{Name: "debug(on/off)", Value: "on", Help: "调试模式,on:打印,off:不打印)"},
|
||||
|
||||
"search": &Config{Name: "search", Value: map[string]interface{}{
|
||||
"context": []interface{}{"nfs", "web.code"},
|
||||
}, Help: "搜索引擎"},
|
||||
|
||||
"search_method": &Config{Name: "search_method(find/search)", Value: "search", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"},
|
||||
"search_choice": &Config{Name: "search_choice(first/last/rand/magics)", Value: "magics", Help: "搜索匹配, first: 匹配第一个模块, last: 匹配最后一个模块, rand: 随机选择, magics: 加权选择"},
|
||||
"search_action": &Config{Name: "search_action(list/switch)", Value: "switch", Help: "搜索操作, list: 输出模块列表, switch: 模块切换"},
|
||||
@ -96,6 +100,12 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{},
|
||||
}
|
||||
return
|
||||
}},
|
||||
"exit": &Command{Name: "exit", Help: "启动", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) {
|
||||
for _, x := range []string{"cli"} {
|
||||
m.Cmd(x + ".exit")
|
||||
}
|
||||
return
|
||||
}},
|
||||
"help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) {
|
||||
if len(arg) == 0 {
|
||||
m.Echo("usage: help context [module [command|config|cache name]]\n")
|
||||
|
@ -228,6 +228,9 @@ func (c *Context) Sub(key string) *Context {
|
||||
return c.contexts[key]
|
||||
}
|
||||
func (c *Context) Travel(m *Message, hand func(m *Message, n int) (stop bool)) *Context {
|
||||
if c == nil {
|
||||
return nil
|
||||
}
|
||||
target := m.target
|
||||
|
||||
cs := []*Context{c}
|
||||
@ -1205,6 +1208,12 @@ func (m *Message) Find(name string, root ...bool) *Message {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
if len(root) > 1 && root[1] {
|
||||
m.target = target
|
||||
return m
|
||||
}
|
||||
|
||||
return m.Spawn(target)
|
||||
}
|
||||
func (m *Message) Search(key string, root ...bool) []*Message {
|
||||
@ -1307,6 +1316,17 @@ func (m *Message) Match(key string, spawn bool, hand func(m *Message, s *Context
|
||||
context = append(context, msg.target)
|
||||
}
|
||||
}
|
||||
// if m.target.root != nil && m.target.root.Configs != nil && m.target.root.Configs["search"] != nil && m.target.root.Configs["search"].Value != nil {
|
||||
// target := m.target
|
||||
// for _, v := range kit.Trans(kit.Chain(m.target.root.Configs["search"].Value, "context")) {
|
||||
// if t := m.Find(v, true, true); t != nil {
|
||||
// kit.Log("error", "%v", t)
|
||||
// // // context = append(context, t.target)
|
||||
// }
|
||||
// }
|
||||
// m.target = target
|
||||
// }
|
||||
|
||||
context = append(context, m.source)
|
||||
|
||||
for _, s := range context {
|
||||
|
@ -289,7 +289,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
|
||||
}
|
||||
|
||||
if restart {
|
||||
m.Cmd("cli.exit", 1)
|
||||
m.Cmd("cli.quit", 1)
|
||||
}
|
||||
return
|
||||
}},
|
||||
|
@ -32,6 +32,11 @@ function set_layout() {
|
||||
} else {
|
||||
nav.className = ""
|
||||
article.style.width = ""
|
||||
|
||||
var space = wiki.layout.article.width - article.style.maxWidth
|
||||
if (space > 0) {
|
||||
article.style.marginRight = space / 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user