diff --git a/base/ssh/ssh.go b/base/ssh/ssh.go index 4a23060d..d9f4ca9e 100644 --- a/base/ssh/ssh.go +++ b/base/ssh/ssh.go @@ -76,6 +76,11 @@ func _ssh_script(m *ice.Message, name string) io.Reader { if s, e := os.Open(name); e == nil { return s } + switch strings.Split(name, "/")[0] { + case "etc", "var": + m.Warn(true, ice.ErrNotFound) + return nil + } if msg := m.Cmd("web.spide", "dev", "GET", path.Join("/share/local/", name)); msg.Result(0) != ice.ErrWarn { bio := bytes.NewBuffer([]byte(msg.Result())) @@ -337,6 +342,9 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { } s := _ssh_script(m, arg[0]) + if s == nil { + return true + } buf := bytes.NewBuffer(make([]byte, 0, 4096)) defer func() { m.Echo(buf.String()) }() diff --git a/base/web/dream.go b/base/web/dream.go index 3e9e1b42..dd1dc8dc 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -23,9 +23,7 @@ func _dream_list(m *ice.Message) { m.Push(kit.MDB_TYPE, "none") m.Push(kit.MDB_STATUS, gdb.STOP) } - for _, k := range []string{"start", "stop", "restart"} { - m.Push(k, m.Cmdx("_render", RENDER.Button, k)) - } + m.PushRender("action", "button", "start,stop,restart") }) m.Sort(kit.MDB_NAME) } diff --git a/base/web/route.go b/base/web/route.go index 60f35e6b..be0db322 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -4,84 +4,91 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/cli" - "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" + + "strings" ) +func _route_travel(m *ice.Message, route string) { + if route == "" { + m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { + switch val[kit.MDB_TYPE] { + case SERVER: + if val[kit.MDB_NAME] == cli.NodeName { + // 避免循环 + return + } + + // 远程查询 + m.Cmd(SPACE, val[kit.MDB_NAME], ROUTE).Table(func(index int, value map[string]string, head []string) { + m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) + m.Push(kit.MDB_ROUTE, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_ROUTE])) + }) + fallthrough + case WORKER: + // 本机查询 + m.Push(kit.MDB_TYPE, val[kit.MDB_TYPE]) + m.Push(kit.MDB_ROUTE, val[kit.MDB_NAME]) + } + }) + } else { + m.Cmd(SPACE, route, ROUTE).Table(func(index int, value map[string]string, head []string) { + m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) + m.Push(kit.MDB_ROUTE, kit.Keys(route, value[kit.MDB_ROUTE])) + }) + } +} + const ROUTE = "route" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - ROUTE: {Name: ROUTE, Help: "路由", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)}, + ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)}, }, Commands: map[string]*ice.Command{ - ROUTE: {Name: "route route auto 启动 创建 邀请", Help: "路由", Action: map[string]*ice.Action{ - "create": {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("web.code.install", "contexts", kit.Select("base", m.Option("type"))) + ROUTE: {Name: "route route=auto cmd=@key auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{ + "invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy("web.code.install", "contexts", "tmux") + m.Cmdy("web.code.install", "contexts", "base") }}, - "start": {Name: "start type=server,worker name@key", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if p := m.Option("route"); p != "" { - m.Option("route", "") - m.Cmdy(SPACE, p, "route", "create", arg) - return + "inputs": {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case "cmd": + m.Cmdy(SPACE, m.Option("route"), "command") + default: + m.Cmdy(SPACE, m.Option("route"), "dream") } - m.Cmdy("dream", "start", m.Option("name")) + }}, + "start": {Name: "start type=worker,server name=hi@key", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SPACE, m.Option("route"), "dream", "start", arg) m.Sleep("3s") }}, "stop": {Name: "stop", Help: "结束", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SPACE, m.Option("route"), "exit") - }}, - "inputs": {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(SPACE, m.Option("route"), "dream") - }}, - "invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER))) + m.Sleep("3s") }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 { - m.Cmd(SPACE, arg[0], ROUTE).Table(func(index int, value map[string]string, head []string) { - m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) - m.Push(kit.MDB_ROUTE, kit.Keys(arg[0], value[kit.MDB_ROUTE])) - }) + if len(arg) > 1 && arg[0] != "" { + m.Cmdy(SPACE, arg[0], kit.Split(strings.Join(arg[1:], " "))) return } - m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { - switch val[kit.MDB_TYPE] { - case SERVER: - if val[kit.MDB_NAME] == cli.NodeName { - // 避免循环 - return - } - - // 远程查询 - m.Cmd(SPACE, val[kit.MDB_NAME], ROUTE).Table(func(index int, value map[string]string, head []string) { - m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) - m.Push(kit.MDB_ROUTE, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_ROUTE])) - }) - fallthrough - case WORKER: - // 本机查询 - m.Push(kit.MDB_TYPE, val[kit.MDB_TYPE]) - m.Push(kit.MDB_ROUTE, val[kit.MDB_NAME]) - } - }) - if m.W == nil { + if _route_travel(m, kit.Select("", arg, 0)); m.W == nil { return } m.Table(func(index int, value map[string]string, field []string) { - m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, RENDER.A, value[kit.MDB_ROUTE], - kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", value[kit.MDB_ROUTE]))) + m.PushRender(kit.MDB_LINK, "a", value[kit.MDB_ROUTE], + kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod", value[kit.MDB_ROUTE])))) switch value[kit.MDB_TYPE] { case SERVER: - m.Push("action", m.Cmdx(mdb.RENDER, RENDER.Button, "启动")) + m.PushRender("action", "button", "启动") case WORKER: - m.Push("action", m.Cmdx(mdb.RENDER, RENDER.Button, "结束")) + m.PushRender("action", "button", "结束") } }) - m.Sort("route") + m.Sort(kit.MDB_ROUTE) }}, "/route/": {Name: "/route/", Help: "路由器", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[0] { diff --git a/base/web/space.go b/base/web/space.go index ddfb8120..b9d5994f 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -21,7 +21,7 @@ func _space_list(m *ice.Message, space string) { if space == "" { m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT}) - m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, RENDER.A, value[kit.MDB_NAME], kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME])))) + m.PushRender(kit.MDB_LINK, "a", kit.Format(value[kit.MDB_NAME]), kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME]))) }) m.Sort(kit.MDB_NAME) return @@ -30,7 +30,7 @@ func _space_list(m *ice.Message, space string) { m.Richs(SPACE, nil, space, func(key string, value map[string]interface{}) { m.Push("detail", value) m.Push(kit.MDB_KEY, kit.MDB_LINK) - m.Push(kit.MDB_VALUE, kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME]))) + m.PushRender(kit.MDB_VALUE, "a", kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME]))) }) } func _space_dial(m *ice.Message, dev, name string, arg ...string) { @@ -138,11 +138,11 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w if len(target) == 0 { if msg.Option(ice.MSG_USERROLE, aaa.UserRole(msg, msg.Option(ice.MSG_USERNAME))) == aaa.VOID { - role := msg.Cmdx(SPIDE, SPIDE_DEV, SPIDE_MSG, SPIDE_GET, "/chat/header", "_action", aaa.USERROLE, "who", msg.Option(ice.MSG_USERNAME)) + role := msg.Cmdx(SPIDE, SPIDE_DEV, SPIDE_MSG, SPIDE_GET, "/chat/header", "cmds", aaa.USERROLE, "who", msg.Option(ice.MSG_USERNAME)) msg.Option(ice.MSG_USERROLE, kit.Select(role, aaa.TECH, role == aaa.ROOT)) } + msg.Log_AUTH(aaa.USERROLE, msg.Option(ice.MSG_USERROLE), aaa.USERNAME, msg.Option(ice.MSG_USERNAME)) - msg.Log_AUTH(aaa.USERNAME, msg.Option(ice.MSG_USERNAME), aaa.USERROLE, msg.Option(ice.MSG_USERROLE)) if msg.Optionv(ice.MSG_HANDLE, "true"); !msg.Warn(!safe, ice.ErrNotAuth) { // 本地执行 msg.Option("_dev", name) @@ -197,8 +197,6 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) { }) } -const SPACE = "space" - const ( MASTER = "master" SERVER = "server" @@ -206,10 +204,12 @@ const ( BETTER = "better" ) +const SPACE = "space" + func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - SPACE: {Name: "space", Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, + SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, "redial", kit.Dict("a", 3000, "b", 1000, "c", 1000, "r", 4096, "w", 4096), "timeout", kit.Dict("c", "180s"), )}, diff --git a/base/web/spide.go b/base/web/spide.go index ea82ac30..f715fc20 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -348,7 +348,7 @@ func init() { case SPIDE_MSG: var data map[string][]string m.Assert(json.NewDecoder(res.Body).Decode(&data)) - m.Info("res: %s", kit.Formats(data)) + m.Info("res: %s", kit.Format(data)) for _, k := range data[ice.MSG_APPEND] { for i := range data[k] { m.Push(k, data[k][i]) diff --git a/core/code/install.go b/core/code/install.go index 1a6203da..ab2640b8 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -23,8 +23,12 @@ func init() { INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data( kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install", "contexts", kit.Dict( + "tmux", `yum install -y tmux +curl -o tmux.conf {{.Option "httphost"}}/publish/tmux.conf +tmux -f tmux.conf`, "base", `mkdir contexts; cd contexts -export ctx_dev={{.Option "httphost"}}; (curl $ctx_dev/publish/ice.sh || wget -O - $ctx_dev/publish/ice.sh) | sh +export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; curl $ctx_dev/publish/ice.sh |sh +export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; wget -O - $ctx_dev/publish/ice.sh | sh bin/ice.sh`, "miss", ` yum install -y git vim make go diff --git a/misc.go b/misc.go index 2da1103f..92f3ea4c 100644 --- a/misc.go +++ b/misc.go @@ -62,6 +62,23 @@ func (m *Message) AddCmd(cmd *Command) string { return kit.Keys(m.target.Cap(CTX_FOLLOW), name) } +func (m *Message) PushRender(key, view, name string, arg ...string) *Message { + switch view { + case "button": + list := []string{} + for _, k := range kit.Split(name) { + list = append(list, fmt.Sprintf(``, k)) + } + m.Push(key, strings.Join(list, "")) + case "a": + if m.W != nil { + m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), name)) + } + default: + m.Push(key, name) + } + return m +} func (m *Message) PushAction(list ...interface{}) { m.Table(func(index int, value map[string]string, head []string) { action := []string{} diff --git a/misc/tmux/tmux.go b/misc/tmux/tmux.go index 1e70c80d..ec9f7242 100644 --- a/misc/tmux/tmux.go +++ b/misc/tmux/tmux.go @@ -76,14 +76,17 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台", m.Cmdy(code.INSTALL, path.Base(m.Conf(TMUX, kit.META_SOURCE)), arg) }}, - TEXT: {Name: "text 保存:button 清空:button text:textarea", Help: "文本", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 && arg[0] != "" { - m.Cmd(_tmux, "set-buffer", arg[0]) - } + TEXT: {Name: "text auto 保存:button 清空:button text:textarea", Help: "文本", Action: map[string]*ice.Action{ + "save": {Name: "save", Help: "保存", Hand: func(m *ice.Message, arg ...string) { + if len(arg) > 0 && arg[0] != "" { + m.Cmd(_tmux, "set-buffer", arg[0]) + } - text := m.Cmdx(_tmux, "show-buffer") - m.Cmdy("web.wiki.image", "qrcode", text) - m.Echo("\n%s", text).Render("") + text := m.Cmdx(_tmux, "show-buffer") + m.Cmdy("web.wiki.image", "qrcode", text) + m.Echo("\n%s", text).Render("") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }}, BUFFER: {Name: "buffer [buffer=auto [value]] auto", Help: "缓存", Action: map[string]*ice.Action{ mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { diff --git a/type.go b/type.go index 6eee454a..91b39b07 100644 --- a/type.go +++ b/type.go @@ -161,7 +161,7 @@ func (c *Context) Merge(s *Context, x Server) *Context { list := []interface{}{} for _, v := range kit.Split(kit.Select(k, a.Name), " ", " ")[1:] { item := kit.Dict(kit.MDB_INPUT, "text", kit.MDB_VALUE, "@key") - ls := kit.Split(v, " ", ":=@") + ls, value := kit.Split(v, " ", ":=@"), "" kit.Value(item, kit.MDB_NAME, ls[0]) for i := 1; i < len(ls); i += 2 { switch ls[i] { @@ -173,9 +173,10 @@ func (c *Context) Merge(s *Context, x Server) *Context { kit.Value(item, "values", strings.Split(ls[i+1], ",")) } else { kit.Value(item, kit.MDB_VALUE, ls[i+1]) + value = ls[i+1] } case "@": - kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"=") + kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"="+value) } } list = append(list, item)