diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index fb876d61..37c5e3fe 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -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) diff --git a/src/contexts/ctx/ctx_init.go b/src/contexts/ctx/ctx_init.go index 527cfa56..0a12ad1a 100644 --- a/src/contexts/ctx/ctx_init.go +++ b/src/contexts/ctx/ctx_init.go @@ -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") diff --git a/src/contexts/ctx/ctx_type.go b/src/contexts/ctx/ctx_type.go index 12598afe..7b234d40 100644 --- a/src/contexts/ctx/ctx_type.go +++ b/src/contexts/ctx/ctx_type.go @@ -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 { diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index eab47307..095b0444 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -441,11 +441,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", m.Cmd("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3]) case "cookie", "header": - if len(arg) == 3 { - m.Cmdy("ctx.config", "spide", strings.Join(arg[:3], ".")) - break + if len(arg) > 3 { + m.Cmd("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3]) } - m.Cmdy("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3]) + m.Cmdy("ctx.config", "spide", strings.Join(arg[:3], ".")) default: m.Cmd("ctx.config", "spide", strings.Join(arg[:2], "."), arg[2]) } diff --git a/src/examples/code/code.go b/src/examples/code/code.go index 239e8093..34ce5cce 100644 --- a/src/examples/code/code.go +++ b/src/examples/code/code.go @@ -289,7 +289,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } if restart { - m.Cmd("cli.exit", 1) + m.Cmd("cli.quit", 1) } return }}, diff --git a/usr/librarys/wiki.js b/usr/librarys/wiki.js index 5f929a9f..0920f280 100644 --- a/usr/librarys/wiki.js +++ b/usr/librarys/wiki.js @@ -36,6 +36,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 + } } }