1
0
forked from x/ContextOS

mix branch 'master' of github.com:shylinux/context

This commit is contained in:
shylinux 2019-03-02 11:18:55 +08:00
commit c2be0a0321
6 changed files with 110 additions and 15 deletions

View File

@ -113,10 +113,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
":": []string{"command"}, ":": []string{"command"},
"::": []string{"command", "list"}, "::": []string{"command", "list"},
"pwd": []string{"nfs.pwd"}, // "pwd": []string{"nfs.pwd"},
"path": []string{"nfs.path"}, // "path": []string{"nfs.path"},
"dir": []string{"nfs.dir"}, // "dir": []string{"nfs.dir"},
"git": []string{"nfs.git"}, // "git": []string{"nfs.git"},
"brow": []string{"web.brow"}, "brow": []string{"web.brow"},
"ifconfig": []string{"tcp.ifconfig"}, "ifconfig": []string{"tcp.ifconfig"},
}, Help: "启动脚本"}, }, Help: "启动脚本"},
@ -132,6 +132,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
"top": map[string]interface{}{"active": true}, "top": map[string]interface{}{"active": true},
"ls": map[string]interface{}{"arg": []interface{}{"-l"}}, "ls": map[string]interface{}{"arg": []interface{}{"-l"}},
}, Help: "系统命令配置, active: 交互方式, cmd: 命令映射, arg: 命令参数, args: 子命令参数, path: 命令目录, env: 环境变量, dir: 工作目录"}, }, 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": &ctx.Config{Name: "timer", Value: map[string]interface{}{}, Help: "定时器"},
"timer_next": &ctx.Config{Name: "timer_next", Value: "", Help: "定时器"}, "timer_next": &ctx.Config{Name: "timer_next", Value: "", Help: "定时器"},
@ -154,6 +155,12 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
}) })
return 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) { "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 { if len(arg) == 0 {
m.Cmdy("dir", "", "dir_deep", "dir_reg", ".*\\.(sh|shy|py)$") 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: 命令", "system": &ctx.Command{Name: "system word...", Help: []string{"调用系统命令, word: 命令",
"cmd_active(true/false): 是否交互", "cmd_timeout: 命令超时", "cmd_env: 环境变量", "cmd_dir: 工作目录"}, "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) { 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"] { for _, v := range m.Meta["result"] {
if strings.TrimSpace(v) != "" { if strings.TrimSpace(v) != "" {
arg = append(arg, 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))) 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 { 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]))) 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) m.Log("info", "cmd.env %v", cmd.Env)
for _, v := range os.Environ() { // for _, v := range os.Environ() {
cmd.Env = append(cmd.Env, v) // cmd.Env = append(cmd.Env, v)
} // }
if m.Options("cmd_dir") { if m.Options("cmd_dir") {
cmd.Dir = m.Option("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 { } else if e := cmd.Wait(); e != nil {
m.Echo("error: ").Echo("%s\n", e) 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 { } else {
wait := make(chan bool, 1) wait := make(chan bool, 1)
m.GoFunc(m, func(m *ctx.Message) { m.GoFunc(m, func(m *ctx.Message) {
@ -314,7 +375,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
} }
return 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")) m.Cmd("cli.source", m.Conf("runtime", "script.exit"))
go func() { go func() {
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)

View File

@ -45,7 +45,7 @@ func (ctx *CTX) Start(m *Message, arg ...string) bool {
} else { } else {
m.Cmd("cli.source", arg) m.Cmd("cli.source", arg)
} }
m.Cmd("ctx.exit")
return true return true
} }
func (ctx *CTX) Close(m *Message, arg ...string) bool { 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:不打印)"}, "auto_make": &Config{Name: "auto_make(true/false)", Value: "true", Help: "调试模式on:打印off:不打印)"},
"debug": &Config{Name: "debug(on/off)", Value: "on", 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_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_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: 模块切换"}, "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 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) { "help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) {
if len(arg) == 0 { if len(arg) == 0 {
m.Echo("usage: help context [module [command|config|cache name]]\n") m.Echo("usage: help context [module [command|config|cache name]]\n")

View File

@ -228,6 +228,9 @@ func (c *Context) Sub(key string) *Context {
return c.contexts[key] return c.contexts[key]
} }
func (c *Context) Travel(m *Message, hand func(m *Message, n int) (stop bool)) *Context { func (c *Context) Travel(m *Message, hand func(m *Message, n int) (stop bool)) *Context {
if c == nil {
return nil
}
target := m.target target := m.target
cs := []*Context{c} cs := []*Context{c}
@ -1205,6 +1208,12 @@ func (m *Message) Find(name string, root ...bool) *Message {
return nil return nil
} }
} }
if len(root) > 1 && root[1] {
m.target = target
return m
}
return m.Spawn(target) return m.Spawn(target)
} }
func (m *Message) Search(key string, root ...bool) []*Message { 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) 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) context = append(context, m.source)
for _, s := range context { for _, s := range context {

View File

@ -441,11 +441,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Cmd("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3]) m.Cmd("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3])
case "cookie", "header": case "cookie", "header":
if len(arg) == 3 { if len(arg) > 3 {
m.Cmdy("ctx.config", "spide", strings.Join(arg[:3], ".")) m.Cmd("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3])
break
} }
m.Cmdy("ctx.config", "spide", strings.Join(arg[:3], "."), arg[3]) m.Cmdy("ctx.config", "spide", strings.Join(arg[:3], "."))
default: default:
m.Cmd("ctx.config", "spide", strings.Join(arg[:2], "."), arg[2]) m.Cmd("ctx.config", "spide", strings.Join(arg[:2], "."), arg[2])
} }

View File

@ -289,7 +289,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
} }
if restart { if restart {
m.Cmd("cli.exit", 1) m.Cmd("cli.quit", 1)
} }
return return
}}, }},

View File

@ -36,6 +36,11 @@ function set_layout() {
} else { } else {
nav.className = "" nav.className = ""
article.style.width = "" article.style.width = ""
var space = wiki.layout.article.width - article.style.maxWidth
if (space > 0) {
article.style.marginRight = space / 2
}
} }
} }