From 3a4480bb372f84920379ef93373c5ae343bb6642 Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 8 Oct 2020 07:57:42 +0800 Subject: [PATCH] opt base --- base/aaa/aaa.go | 22 +- base/aaa/aaa.shy | 5 + base/aaa/role.go | 24 +- base/aaa/sess.go | 42 +-- base/aaa/user.go | 63 ++-- base/cli/cli.go | 117 +------ base/cli/cli.shy | 9 + base/cli/daemon.go | 114 ++++--- base/cli/output.go | 63 ++++ base/cli/proc.go | 37 +++ base/cli/python.go | 39 +-- base/cli/runtime.go | 73 +++++ base/cli/system.go | 105 +++--- base/ctx/{cmd.go => command.go} | 18 +- base/ctx/{conf.go => config.go} | 18 +- base/ctx/context.go | 39 +++ base/ctx/ctx.go | 57 +--- base/ctx/ctx.shy | 6 + base/gdb/event.go | 2 +- base/lex/lex.go | 1 - base/mdb/mdb.go | 29 +- base/ssh/_trash.go | 71 ---- base/ssh/channel.go | 2 +- base/ssh/connect.go | 2 +- base/ssh/scripts.go | 4 +- base/ssh/service.go | 18 +- base/ssh/ssh.go | 2 +- base/tcp/client.go | 9 +- base/tcp/host.go | 4 + base/tcp/server.go | 11 +- base/web/cache.go | 66 ++-- base/web/dream.go | 67 ++-- base/web/render.go | 85 +---- base/web/route.go | 146 ++++----- base/web/serve.go | 310 +++++++++--------- base/web/share.go | 4 +- base/web/space.go | 106 +++--- base/web/spide.go | 171 +++------- base/web/story.go | 4 +- base/web/web.go | 61 ++-- base/web/web.shy | 13 + base/yac/yac.go | 6 +- core/chat/chat.go | 5 +- core/chat/location.go | 7 +- core/chat/meet.go | 7 +- core/chat/river.go | 2 - core/code/bench.go | 5 +- core/code/install.go | 57 +++- core/code/pack.go | 5 +- core/code/pprof.go | 5 +- core/wiki/word.go | 8 +- exec.go | 7 +- go.sum | 1 + init.go | 16 + logs.go | 12 +- meta.go | 33 +- misc.go | 3 - misc/git/repos.go | 10 +- misc/lark/lark.go | 6 +- {base => misc/trash}/web/_favor.go | 0 {base => misc/trash}/web/_group.go | 0 {base => misc/trash}/web/_label.go | 0 base/web/proxy.go => misc/trash/web/_proxy.go | 0 {base => misc/trash}/web/_share.go | 0 {base => misc/trash}/web/template.go | 0 misc/vim/sess.go | 5 +- misc/zsh/download.go | 4 +- misc/zsh/sess.go | 5 +- misc/zsh/sync.go | 3 +- type.go | 6 +- 70 files changed, 1064 insertions(+), 1193 deletions(-) create mode 100644 base/aaa/aaa.shy create mode 100644 base/cli/cli.shy create mode 100644 base/cli/output.go create mode 100644 base/cli/proc.go create mode 100644 base/cli/runtime.go rename base/ctx/{cmd.go => command.go} (65%) rename base/ctx/{conf.go => config.go} (90%) create mode 100644 base/ctx/context.go create mode 100644 base/ctx/ctx.shy delete mode 100644 base/ssh/_trash.go create mode 100644 base/web/web.shy rename {base => misc/trash}/web/_favor.go (100%) rename {base => misc/trash}/web/_group.go (100%) rename {base => misc/trash}/web/_label.go (100%) rename base/web/proxy.go => misc/trash/web/_proxy.go (100%) rename {base => misc/trash}/web/_share.go (100%) rename {base => misc/trash}/web/template.go (100%) diff --git a/base/aaa/aaa.go b/base/aaa/aaa.go index 8517be05..150144e1 100644 --- a/base/aaa/aaa.go +++ b/base/aaa/aaa.go @@ -2,6 +2,7 @@ package aaa import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" ) @@ -9,27 +10,28 @@ const ( ErrNotAuth = "not auth: " ) const ( - USERZONE = "userzone" - USERNICK = "usernick" - USERNAME = "username" - HOSTNAME = "hostname" - PASSWORD = "password" + IP = "ip" + UA = "ua" + USERROLE = "userrole" - USERNODE = "usernode" - HOSTPORT = "hostport" + USERNAME = "username" + PASSWORD = "password" + USERNICK = "usernick" + USERZONE = "userzone" SESSID = "sessid" ) +const AAA = "aaa" -var Index = &ice.Context{Name: "aaa", Help: "认证模块", Commands: map[string]*ice.Command{ +var Index = &ice.Context{Name: AAA, Help: "认证模块", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Rich(ROLE, nil, kit.Dict(kit.MDB_NAME, VOID, White, kit.Dict(), Black, kit.Dict())) m.Rich(ROLE, nil, kit.Dict(kit.MDB_NAME, TECH, Black, kit.Dict(), White, kit.Dict())) m.Load() - m.Cmd("mdb.search", "create", "user", "user", "aaa") + m.Cmd(mdb.SEARCH, mdb.CREATE, USER, USER, AAA) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save(USER, SESS, ROLE) + m.Save() }}, }} diff --git a/base/aaa/aaa.shy b/base/aaa/aaa.shy new file mode 100644 index 00000000..cbd8e872 --- /dev/null +++ b/base/aaa/aaa.shy @@ -0,0 +1,5 @@ +chapter "aaa" + +field "用户" user +field "会话" sess +field "角色" role diff --git a/base/aaa/role.go b/base/aaa/role.go index fbada273..86dbc22c 100644 --- a/base/aaa/role.go +++ b/base/aaa/role.go @@ -2,6 +2,7 @@ package aaa import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" "strings" @@ -16,6 +17,9 @@ const ( // 角色操作 White = "white" Black = "black" Right = "right" + + WHITE = "white" + BLACK = "black" ) const ( // 返回结果 OK = "ok" @@ -103,10 +107,10 @@ const ROLE = "role" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, + ROLE: {Name: ROLE, Help: "角色", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, }, Commands: map[string]*ice.Command{ - ROLE: {Name: "role [role [user...]]", Help: "角色", Action: map[string]*ice.Action{ + ROLE: {Name: "role role auto 添加", Help: "角色", Action: map[string]*ice.Action{ White: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) { _role_white(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", "."), true) }}, @@ -118,11 +122,27 @@ func init() { m.Echo(OK) } }}, + mdb.CREATE: {Name: "create zone=white,black role=void@key key=", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Richs(ROLE, nil, m.Option(ROLE), func(key string, value map[string]interface{}) { + list := value[m.Option(kit.MDB_ZONE)].(map[string]interface{}) + m.Log_CREATE(ROLE, m.Option(ROLE), list[m.Option(kit.MDB_KEY)]) + list[m.Option(kit.MDB_KEY)] = true + }) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Richs(ROLE, nil, m.Option(ROLE), func(key string, value map[string]interface{}) { + list := value[m.Option(kit.MDB_ZONE)].(map[string]interface{}) + m.Log_REMOVE(ROLE, m.Option(ROLE), list[m.Option(kit.MDB_KEY)]) + delete(list, m.Option(kit.MDB_KEY)) + }) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 1 { _role_user(m, arg[0], arg[1:]...) } + _role_list(m, kit.Select("", arg, 0)) + m.PushAction(mdb.REMOVE) }}, }, }, nil) diff --git a/base/aaa/sess.go b/base/aaa/sess.go index 9b264904..43762758 100644 --- a/base/aaa/sess.go +++ b/base/aaa/sess.go @@ -6,14 +6,9 @@ import ( kit "github.com/shylinux/toolkits" ) -func _sess_list(m *ice.Message) { - m.Richs(SESS, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_KEY, USERNAME, USERROLE}) - }) -} func _sess_auth(m *ice.Message, sessid string, username string, userrole string) { m.Richs(SESS, nil, sessid, func(value map[string]interface{}) { - if m.Option(ice.MSG_USERROLE) == ROOT { + if value = kit.GetMeta(value); m.Option(ice.MSG_USERROLE) == ROOT { value[USERROLE] = userrole } else if m.Option(ice.MSG_USERROLE) == TECH && userrole != ROOT { value[USERROLE] = userrole @@ -26,7 +21,10 @@ func _sess_auth(m *ice.Message, sessid string, username string, userrole string) } func _sess_check(m *ice.Message, sessid string) { m.Richs(SESS, nil, sessid, func(value map[string]interface{}) { + value = kit.GetMeta(value) m.Richs(USER, nil, value[USERNAME], func(value map[string]interface{}) { + value = kit.GetMeta(value) + if m.Option(ice.MSG_USERNICK, value[USERNICK]) == "" { if name := kit.Format(value[USERNAME]); len(name) > 10 { m.Option(ice.MSG_USERNICK, name[:10]) @@ -46,13 +44,14 @@ func _sess_create(m *ice.Message, username string) string { if m.Richs(USER, nil, username, nil) == nil { _user_create(m, username, "") } - h := m.Rich(SESS, nil, kit.Dict( - kit.MDB_TIME, m.Time(m.Conf(SESS, "meta.expire")), + + m.Cmdy(mdb.INSERT, SESS, "", mdb.HASH, USERNAME, username, "from", m.Option(ice.MSG_SESSID), - )) - m.Log_CREATE(SESSID, h, USERNAME, username) - m.Echo(h) - return h + kit.MDB_TIME, m.Time(m.Conf(SESS, "meta.expire")), + "agent", m.Option(ice.MSG_USERUA), + "ip", m.Option(ice.MSG_USERIP), + ) + return m.Result() } func SessCheck(m *ice.Message, sessid string) *ice.Message { @@ -69,22 +68,27 @@ const SESS = "sess" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - SESS: {Name: "sess", Help: "会话", Value: kit.Data( + SESS: {Name: SESS, Help: "会话", Value: kit.Data( kit.MDB_SHORT, "uniq", "expire", "720h", )}, }, Commands: map[string]*ice.Command{ - SESS: {Name: "sess", Help: "会话", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create [username]", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - _sess_create(m, kit.Select("", arg, 0)) + SESS: {Name: "sess hash auto", Help: "会话", Action: map[string]*ice.Action{ + "auth": {Name: "auth sessid username [userrole]", Help: "授权", Hand: func(m *ice.Message, arg ...string) { + _sess_auth(m, arg[0], arg[1], kit.Select("", arg, 2)) }}, "check": {Name: "check sessid", Help: "校验", Hand: func(m *ice.Message, arg ...string) { _sess_check(m, arg[0]) }}, - "auth": {Name: "auth sessid username [userrole]", Help: "授权", Hand: func(m *ice.Message, arg ...string) { - _sess_auth(m, arg[0], arg[1], kit.Select("", arg, 2)) + + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, SESS, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _sess_list(m) }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, kit.Select("time,hash,username,userrole", mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, SESS, "", mdb.HASH, kit.MDB_HASH, arg) + m.PushAction(mdb.REMOVE) + }}, }, }, nil) } diff --git a/base/aaa/user.go b/base/aaa/user.go index 25f617d4..ee09d0b6 100644 --- a/base/aaa/user.go +++ b/base/aaa/user.go @@ -2,23 +2,12 @@ package aaa import ( ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" "strings" ) -const ( - USER_CREATE = "user.create" -) - -func _user_list(m *ice.Message) { - m.Richs(USER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - m.Push(key, value, []string{kit.MDB_TIME, USERZONE, USERNICK, USERNAME}) - }) - m.Sort(USERNAME) -} func _user_login(m *ice.Message, name, word string) (ok bool) { if m.Richs(USER, nil, name, nil) == nil { _user_create(m, name, "") @@ -33,24 +22,10 @@ func _user_login(m *ice.Message, name, word string) (ok bool) { }) return ok } -func _user_modify(m *ice.Message, name string, arg ...string) { - if m.Richs(USER, nil, name, nil) == nil { - _user_create(m, name, "") - } - - m.Log_MODIFY(USERNAME, name, arg) - m.Richs(USER, nil, name, func(key string, value map[string]interface{}) { - for i := 0; i < len(arg)-1; i += 2 { - kit.Value(value, arg[i], arg[i+1]) - } - }) -} func _user_create(m *ice.Message, name, word string) { h := m.Rich(USER, nil, kit.Dict( USERNAME, name, PASSWORD, word, - USERNICK, name, USERNODE, cli.NodeName, - USERZONE, m.Option(ice.MSG_USERZONE), - USERNODE, cli.NodeName, + USERNICK, name, USERZONE, m.Option(ice.MSG_USERZONE), )) m.Log_CREATE(USERNAME, name, "hash", h) m.Event(USER_CREATE, name) @@ -72,27 +47,30 @@ func _user_search(m *ice.Message, kind, name, text string, arg ...string) { } func UserRoot(m *ice.Message) { - cli.PassWord = kit.Hashs("uniq") - cli.PassWord = cli.UserName - _user_create(m, cli.UserName, cli.PassWord) + ice.Info.PassWord = kit.Hashs("uniq") + ice.Info.PassWord = ice.Info.UserName + _user_create(m, ice.Info.UserName, ice.Info.PassWord) } func UserNick(m *ice.Message, username interface{}) (nick string) { m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) nick = kit.Format(value[USERNICK]) }) return } func UserZone(m *ice.Message, username interface{}) (zone string) { m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) zone = kit.Format(value[USERZONE]) }) return } func UserRole(m *ice.Message, username interface{}) (role string) { - if role = VOID; username == cli.UserName { + if role = VOID; username == ice.Info.UserName { return ROOT } m.Richs(ROLE, nil, TECH, func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) if kit.Value(value, kit.Keys(USER, username)) == true { role = TECH } @@ -109,28 +87,33 @@ func UserLogin(m *ice.Message, username, password string) bool { return false } +const ( + USER_CREATE = "user.create" +) + const USER = "user" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - USER: {Name: "user", Help: "用户", Value: kit.Data(kit.MDB_SHORT, USERNAME)}, + USER: {Name: USER, Help: "用户", Value: kit.Data(kit.MDB_SHORT, USERNAME)}, }, Commands: map[string]*ice.Command{ - USER: {Name: "user", Help: "用户", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create username [password]", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - _user_create(m, arg[0], kit.Select("", arg, 1)) + USER: {Name: "user username auto", Help: "用户", Action: map[string]*ice.Action{ + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, USER, "", mdb.HASH, USERNAME, m.Option(USERNAME), arg) }}, - mdb.MODIFY: {Name: "modify [key value]...", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - _user_modify(m, m.Option(USERNAME), arg...) + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.REMOVE, USER, "", mdb.HASH, USERNAME, m.Option(USERNAME)) }}, mdb.SEARCH: {Name: "search type name text arg...", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { _user_search(m, arg[0], arg[1], kit.Select("", arg, 2)) }}, - "login": {Name: "login username password", Help: "登录", Hand: func(m *ice.Message, arg ...string) { - _user_login(m, arg[0], arg[1]) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _user_list(m) }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, kit.Select("time,userzone,usernick,username", mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, USER, "", mdb.HASH, USERNAME, arg) + m.PushAction(mdb.REMOVE) + }}, }, }, nil) } diff --git a/base/cli/cli.go b/base/cli/cli.go index dde8168e..efcb1bf9 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -2,12 +2,8 @@ package cli import ( ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/ctx" - "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" - "bytes" - "io/ioutil" "os" "os/user" "path" @@ -15,27 +11,15 @@ import ( "strings" ) -var UserName = "" -var PassWord = "" -var HostName = "" -var PathName = "" -var NodeName = "" -var NodeType = "" - func NodeInfo(m *ice.Message, kind, name string) { name = strings.ReplaceAll(name, ".", "_") m.Conf(RUNTIME, "node.type", kind) m.Conf(RUNTIME, "node.name", name) - NodeName = name - NodeType = kind + ice.Info.NodeName = name + ice.Info.NodeType = kind } -const RUNTIME = "runtime" - var Index = &ice.Context{Name: "cli", Help: "命令模块", - Configs: map[string]*ice.Config{ - RUNTIME: {Name: "runtime", Help: "运行环境", Value: kit.Dict()}, - }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() @@ -46,7 +30,6 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", m.Conf(RUNTIME, "conf.ctx_shy", os.Getenv("ctx_shy")) m.Conf(RUNTIME, "conf.ctx_pid", os.Getenv("ctx_pid")) m.Conf(RUNTIME, "conf.ctx_user", os.Getenv("ctx_user")) - m.Conf(RUNTIME, "conf.ctx_pod", os.Getenv("ctx_pod")) // 主机信息 m.Conf(RUNTIME, "host.GOARCH", runtime.GOARCH) @@ -54,11 +37,6 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", m.Conf(RUNTIME, "host.pid", os.Getpid()) // 启动信息 - if m.Conf(RUNTIME, "boot.username", kit.Select(os.Getenv("USER"), os.Getenv("ctx_user"))) == "" { - if user, e := user.Current(); e == nil && user.Name != "" { - m.Conf(RUNTIME, "boot.username", kit.Select(user.Name, os.Getenv("ctx_user"))) - } - } if name, e := os.Hostname(); e == nil { m.Conf(RUNTIME, "boot.hostname", kit.Select(name, os.Getenv("HOSTNAME"))) } @@ -70,9 +48,14 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", name = ls[len(ls)-1] m.Conf(RUNTIME, "boot.pathname", name) } - UserName = m.Conf(RUNTIME, "boot.username") - HostName = m.Conf(RUNTIME, "boot.hostname") - PathName = m.Conf(RUNTIME, "boot.pathname") + if m.Conf(RUNTIME, "boot.username", kit.Select(os.Getenv("USER"), os.Getenv("ctx_user"))) == "" { + if user, e := user.Current(); e == nil && user.Name != "" { + m.Conf(RUNTIME, "boot.username", kit.Select(user.Name, os.Getenv("ctx_user"))) + } + } + ice.Info.HostName = m.Conf(RUNTIME, "boot.hostname") + ice.Info.PathName = m.Conf(RUNTIME, "boot.pathname") + ice.Info.UserName = m.Conf(RUNTIME, "boot.username") // 启动记录 count := kit.Int(m.Conf(RUNTIME, "boot.count")) + 1 @@ -83,84 +66,20 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", NodeInfo(m, "worker", m.Conf(RUNTIME, "boot.pathname")) m.Info("runtime %v", kit.Formats(m.Confv(RUNTIME))) - n := kit.Int(kit.Select("20", m.Conf(RUNTIME, "host.GOMAXPROCS"))) + n := kit.Int(kit.Select("1", m.Conf(RUNTIME, "host.GOMAXPROCS"))) m.Logs("host", "gomaxprocs", n) runtime.GOMAXPROCS(n) - m.Cmdy(mdb.ENGINE, mdb.CREATE, "shell", m.AddCmd(&ice.Command{Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(SYSTEM, arg[2]) - }})) + // 版本信息 + m.Conf(RUNTIME, "build.time", ice.Info.Build.Time) + m.Conf(RUNTIME, "build.version", ice.Info.Build.Version) + m.Conf(RUNTIME, "build.hostname", ice.Info.Build.HostName) + m.Conf(RUNTIME, "build.username", ice.Info.Build.UserName) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save(RUNTIME, SYSTEM, DAEMON) - }}, - - "proc": {Name: "proc name=auto PID=auto auto", Help: "进程管理", Action: map[string]*ice.Action{ - "kill": {Name: "kill", Help: "结束", Hand: func(m *ice.Message, arg ...string) { - if p, e := os.FindProcess(kit.Int(m.Option("PID"))); m.Assert(e) { - m.Assert(p.Kill()) - } - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - msg := m.Spawn() - msg.Split(m.Cmdx(SYSTEM, "ps", "ux"), "", " ", "\n") - msg.Table(func(index int, value map[string]string, head []string) { - if m.Appendv(ice.MSG_APPEND, "action", head); len(arg) == 2 && value["PID"] == arg[1] { - m.PushRender("action", "button", "结束") - m.Push("", value) - return - } - if len(arg) == 0 || len(arg) == 1 && strings.Contains(value["COMMAND"], arg[0]) { - m.PushRender("action", "button", "结束") - m.Push("", value) - } - }) - }}, - RUNTIME: {Name: "runtime name auto", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - switch kit.Select("", arg, 0) { - case "procinfo": - m.Split(m.Cmdx(SYSTEM, "ps", "u"), "", " ", "\n") - - case "hostinfo": - if f, e := os.Open("/proc/cpuinfo"); e == nil { - defer f.Close() - if b, e := ioutil.ReadAll(f); e == nil { - m.Push("nCPU", bytes.Count(b, []byte("processor"))) - } - } - if f, e := os.Open("/proc/meminfo"); e == nil { - defer f.Close() - if b, e := ioutil.ReadAll(f); e == nil { - for i, ls := range strings.Split(string(b), "\n") { - vs := kit.Split(ls, ": ") - m.Push(strings.TrimSpace(vs[0]), kit.FmtSize(kit.Int64(strings.TrimSpace(vs[1]))*1024)) - if i > 1 { - break - } - } - } - } - m.Push("uptime", kit.Split(m.Cmdx(SYSTEM, "uptime"), ",")[0]) - case "diskinfo": - m.Spawn().Split(m.Cmdx(SYSTEM, "df", "-h"), "", " ", "\n").Table(func(index int, value map[string]string, head []string) { - if strings.HasPrefix(value["Filesystem"], "/dev") { - m.Push("", value, head) - } - }) - case "ifconfig": - m.Cmdy("tcp.host") - case "userinfo": - m.Split(m.Cmdx(SYSTEM, "who"), "user term time", " ", "\n") - - case "hostname": - m.Conf(RUNTIME, "boot.hostname", arg[1]) - HostName = arg[1] - m.Echo(HostName) - default: - m.Cmdy(ctx.CONFIG, RUNTIME, arg) - } + m.Save() }}, }, } -func init() { ice.Index.Register(Index, nil, RUNTIME, SYSTEM, DAEMON, PYTHON) } +func init() { ice.Index.Register(Index, nil, RUNTIME, SYSTEM, DAEMON, PYTHON, OUTPUT) } diff --git a/base/cli/cli.shy b/base/cli/cli.shy new file mode 100644 index 00000000..4b31e58f --- /dev/null +++ b/base/cli/cli.shy @@ -0,0 +1,9 @@ +chapter "cli" + +field "命令" system +field "输出" output +field "守护" daemon +field "脚本" python + +field "环境" runtime +field "进程" cli.proc diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 14dcf1d1..d6b599d8 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -2,6 +2,8 @@ package cli import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" + "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" "fmt" @@ -10,15 +12,6 @@ import ( "strings" ) -const ( - ErrStart = "daemon start: " -) -const ( - StatusError = "error" - StatusStart = "start" - StatusClose = "close" -) - func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) { if f, p, e := kit.Create(out); m.Assert(e) { m.Log_EXPORT(kit.MDB_META, DAEMON, CMD_STDOUT, p) @@ -35,30 +28,40 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) { return } - h := m.Rich(DAEMON, nil, kit.Dict( - kit.MDB_TYPE, "shell", kit.MDB_NAME, strings.Join(cmd.Args, " "), - kit.SSH_DIR, cmd.Dir, kit.SSH_PID, cmd.Process.Pid, kit.MDB_STATUS, StatusStart, - kit.MDB_EXTRA, kit.Dict(CMD_STDOUT, out, CMD_STDERR, err), - )) - m.Log_EXPORT(kit.MDB_META, DAEMON, kit.MDB_KEY, h, kit.SSH_PID, cmd.Process.Pid) + h := m.Cmdx(mdb.INSERT, DAEMON, "", mdb.HASH, + kit.MDB_STATUS, Status.Start, kit.SSH_CMD, strings.Join(cmd.Args, " "), + kit.SSH_DIR, cmd.Dir, kit.SSH_ENV, cmd.Env, kit.SSH_PID, cmd.Process.Pid, + CMD_STDOUT, out, CMD_STDERR, err, + aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE), + aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA), + ) m.Echo("%d", cmd.Process.Pid) - m.Gos(m, func(m *ice.Message) { - if e := cmd.Wait(); e != nil { - m.Warn(e != nil, ErrStart, cmd.Args, " ", e) - m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) { - kit.Value(value, kit.MDB_STATUS, StatusError) - kit.Value(value, kit.Keys(kit.MDB_EXTRA, kit.MDB_ERROR), e) - }) + m.Go(func() { + if e := cmd.Wait(); m.Warn(e != nil, ErrStart, cmd.Args, " ", e) { + m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, + kit.MDB_STATUS, Status.Error, kit.MDB_ERROR, e) } else { - m.Cost("%v exit: %v", cmd.Args, cmd.ProcessState.ExitCode()) - m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) { - kit.Value(value, kit.MDB_STATUS, StatusClose) - }) + m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode()) + m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, + kit.MDB_STATUS, Status.Stop) } }) } +const ErrStart = "daemon start: " + +var Status = struct{ Error, Start, Stop string }{ + Error: "error", + Start: "start", + Stop: "stop", +} + +const ( + START = "start" + STOP = "stop" +) + const DAEMON = "daemon" func init() { @@ -67,40 +70,45 @@ func init() { DAEMON: {Name: DAEMON, Help: "守护进程", Value: kit.Data(kit.MDB_PATH, "var/daemon")}, }, Commands: map[string]*ice.Command{ - DAEMON: {Name: "daemon hash 查看:button=auto 清理:button", Help: "守护进程", Action: map[string]*ice.Action{ - "delete": {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Richs(DAEMON, "", m.Option(kit.MDB_HASH), func(key string, value map[string]interface{}) { - m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "") - m.Log_DELETE(DAEMON, kit.Format(value)) - }) + DAEMON: {Name: "daemon hash auto 添加 清理", Help: "守护进程", Action: map[string]*ice.Action{ + START: {Name: "start cmd env dir", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Option(CMD_TYPE, DAEMON) + m.Cmdy(SYSTEM, kit.Split(m.Option("cmd"))) }}, - "prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) { - m.Richs(DAEMON, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - if value["status"] == "error" || strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.SSH_PID]), "\n") == 1 { - m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "") - m.Log_DELETE(DAEMON, kit.Format(value)) - } - }) - }}, - "stop": {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { - m.Richs(DAEMON, "", m.Option(kit.MDB_HASH), func(key string, value map[string]interface{}) { + STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(mdb.SELECT, DAEMON, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)).Table(func(index int, value map[string]string, head []string) { + m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), kit.MDB_STATUS, Status.Stop) m.Cmdy(SYSTEM, "kill", "-9", value[kit.SSH_PID]) - if strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.SSH_PID]), "\n") == 1 { - value[kit.MDB_STATUS] = StatusClose - } }) }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, DAEMON, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + }}, + mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.PRUNES, DAEMON, "", mdb.HASH, kit.MDB_STATUS, Status.Error) + m.Cmdy(mdb.PRUNES, DAEMON, "", mdb.HASH, kit.MDB_STATUS, Status.Stop) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { - m.Option("fields", "time,hash,status,pid,name,dir") - m.Cmdy("mdb.select", DAEMON, "", kit.MDB_HASH) - m.Sort("time", "time_r") - m.PushAction("停止", "删除") - return - } + m.Option(mdb.FIELDS, "time,hash,status,pid,cmd,dir") + m.Cmdy(mdb.SELECT, DAEMON, "", mdb.HASH) + m.Table(func(index int, value map[string]string, head []string) { + switch value[kit.MDB_STATUS] { + case Status.Start: + m.PushButton(STOP) + default: + m.PushButton(mdb.REMOVE) + } + }) - m.Option(CMD_TYPE, DAEMON) - m.Cmdy(SYSTEM, arg) + } else if m.Richs(DAEMON, "", arg[0], nil) != nil { + m.Option(mdb.FIELDS, mdb.DETAIL) + m.Cmdy(mdb.SELECT, DAEMON, "", mdb.HASH, kit.MDB_HASH, arg) + + } else { + m.Option(CMD_TYPE, DAEMON) + m.Cmdy(SYSTEM, arg) + } }}, }, }, nil) diff --git a/base/cli/output.go b/base/cli/output.go new file mode 100644 index 00000000..af28c385 --- /dev/null +++ b/base/cli/output.go @@ -0,0 +1,63 @@ +package cli + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + kit "github.com/shylinux/toolkits" + + "io" +) + +const OUTPUT = "output" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + OUTPUT: {Name: OUTPUT, Help: "输出", Value: kit.Data()}, + }, + Commands: map[string]*ice.Command{ + OUTPUT: {Name: "output hash id auto", Help: "输出", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create cmd", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + h := m.Cmdx(mdb.INSERT, OUTPUT, "", mdb.HASH, kit.MDB_STATUS, Status.Start, arg) + r, w := io.Pipe() + m.Go(func() { + buf := make([]byte, 1024) + for { + if n, e := r.Read(buf); e != nil || n == 0 { + break + } else { + m.Grow(OUTPUT, kit.Keys(kit.MDB_HASH, h), kit.Dict( + kit.SSH_RES, string(buf[:n]), + )) + } + } + m.Cmd(mdb.MODIFY, OUTPUT, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, Status.Stop) + }) + m.Option(OUTPUT, w) + m.Echo(h) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, OUTPUT, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, OUTPUT, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + }}, + mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.PRUNES, OUTPUT, "", mdb.HASH, kit.MDB_STATUS, Status.Stop) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + m.Option(mdb.FIELDS, "time,hash,status,name") + m.Cmdy(mdb.SELECT, OUTPUT, "", mdb.HASH) + m.PushAction(mdb.REMOVE) + return + } + + m.Option("_control", "_page") + m.Option(mdb.FIELDS, kit.Select("time,id,res", mdb.DETAIL, len(arg) > 1)) + m.Cmdy(mdb.SELECT, OUTPUT, kit.Keys(kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, arg[1:]) + m.Sort(kit.MDB_ID) + }}, + }, + }, nil) +} diff --git a/base/cli/proc.go b/base/cli/proc.go new file mode 100644 index 00000000..8236aac3 --- /dev/null +++ b/base/cli/proc.go @@ -0,0 +1,37 @@ +package cli + +import ( + ice "github.com/shylinux/icebergs" + kit "github.com/shylinux/toolkits" + + "os" + "strings" +) + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{}, + Commands: map[string]*ice.Command{ + "proc": {Name: "proc name=ice.bin PID auto", Help: "进程管理", Action: map[string]*ice.Action{ + "kill": {Name: "kill", Help: "结束", Hand: func(m *ice.Message, arg ...string) { + if p, e := os.FindProcess(kit.Int(m.Option("PID"))); m.Assert(e) { + m.Assert(p.Kill()) + } + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + msg := m.Spawn() + msg.Split(m.Cmdx(SYSTEM, "ps", "ux"), "", " ", "\n") + msg.Table(func(index int, value map[string]string, head []string) { + if m.Appendv(ice.MSG_APPEND, "action", head); len(arg) > 1 && value["PID"] != arg[1] { + return + } + if len(arg) > 0 && !strings.Contains(value["COMMAND"], arg[0]) { + return + } + m.PushButton("结束") + m.Push("", value) + }) + }}, + }, + }, nil) +} diff --git a/base/cli/python.go b/base/cli/python.go index 2f63d996..e7fbbfd3 100644 --- a/base/cli/python.go +++ b/base/cli/python.go @@ -1,12 +1,10 @@ package cli import ( - "path" - "runtime" - "strings" - ice "github.com/shylinux/icebergs" kit "github.com/shylinux/toolkits" + + "path" ) const PYTHON = "python" @@ -15,38 +13,35 @@ func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ PYTHON: {Name: "python", Help: "脚本命令", Value: kit.Data( - "windows", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz", - "darwin", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz", - "linux", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz", - + "source", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz", "qrcode", `import pyqrcode; print(pyqrcode.create('%s').terminal(module_color='%s', quiet_zone=1))`, - PYTHON, "python", "pip", "pip", )}, }, Commands: map[string]*ice.Command{ - PYTHON: {Name: "python 编译:button 下载:button", Help: "脚本命令", Action: map[string]*ice.Action{ + PYTHON: {Name: "python port path auto 启动:button 构建 下载", Help: "脚本命令", Action: map[string]*ice.Action{ "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("web.code.install", "download", m.Conf(PYTHON, kit.Keys(kit.MDB_META, runtime.GOOS))) + m.Cmdy("web.code.install", "download", m.Conf(PYTHON, "meta.source")) }}, - "compile": {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) { - name := path.Base(strings.TrimSuffix(strings.TrimSuffix(m.Conf(PYTHON, kit.Keys(kit.MDB_META, runtime.GOOS)), ".tar.xz"), "zip")) - m.Option(CMD_DIR, path.Join(m.Conf("web.code.install", kit.META_PATH), name)) - m.Cmdy(SYSTEM, "./configure", "--prefix="+kit.Path("usr/local")) - m.Cmdy(SYSTEM, "make", "-j8") - m.Cmdy(SYSTEM, "make", "install") + "build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy("web.code.install", "build", m.Conf(PYTHON, "meta.source")) + }}, + "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy("web.code.install", "start", m.Conf(PYTHON, "meta.source"), "bin/python3") }}, - "install": {Name: "install arg...", Help: "安装", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.pip"), "install", arg) - }}, "qrcode": {Name: "qrcode text color", Help: "安装", Hand: func(m *ice.Message, arg ...string) { prefix := []string{SYSTEM, m.Conf(PYTHON, kit.Keys(kit.MDB_META, PYTHON))} m.Cmdy(prefix, "-c", kit.Format(m.Conf(PYTHON, "meta.qrcode"), kit.Select("hello world", arg, 0), kit.Select("blue", arg, 1))) }}, + "pip": {Name: "pip", Help: "安装", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.pip"), "install", arg) + }}, + "run": {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.python"), arg) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - prefix := []string{SYSTEM, m.Conf(PYTHON, kit.Keys(kit.MDB_META, PYTHON))} - m.Cmdy(prefix, arg) + m.Cmdy("web.code.install", path.Base(m.Conf(PYTHON, kit.META_SOURCE)), arg) }}, }, }, nil) diff --git a/base/cli/runtime.go b/base/cli/runtime.go new file mode 100644 index 00000000..8e6e51fd --- /dev/null +++ b/base/cli/runtime.go @@ -0,0 +1,73 @@ +package cli + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/ctx" + kit "github.com/shylinux/toolkits" + + "bytes" + "io/ioutil" + "os" + "strings" +) + +const RUNTIME = "runtime" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + RUNTIME: {Name: RUNTIME, Help: "运行环境", Value: kit.Dict()}, + }, + Commands: map[string]*ice.Command{ + RUNTIME: {Name: "runtime info=procinfo,hostinfo,diskinfo,ifconfig,hostname,userinfo,bootinfo auto", Help: "运行环境", Action: map[string]*ice.Action{ + "procinfo": {Name: "procinfo", Help: "procinfo", Hand: func(m *ice.Message, arg ...string) { + m.Split(m.Cmdx(SYSTEM, "ps", "u"), "", " ", "\n") + }}, + "hostinfo": {Name: "hostinfo", Help: "hostinfo", Hand: func(m *ice.Message, arg ...string) { + if f, e := os.Open("/proc/cpuinfo"); e == nil { + defer f.Close() + if b, e := ioutil.ReadAll(f); e == nil { + m.Push("nCPU", bytes.Count(b, []byte("processor"))) + } + } + if f, e := os.Open("/proc/meminfo"); e == nil { + defer f.Close() + if b, e := ioutil.ReadAll(f); e == nil { + for i, ls := range strings.Split(string(b), "\n") { + vs := kit.Split(ls, ": ") + m.Push(strings.TrimSpace(vs[0]), kit.FmtSize(kit.Int64(strings.TrimSpace(vs[1]))*1024)) + if i > 1 { + break + } + } + } + } + m.Push("uptime", kit.Split(m.Cmdx(SYSTEM, "uptime"), ",")[0]) + }}, + "diskinfo": {Name: "diskinfo", Help: "diskinfo", Hand: func(m *ice.Message, arg ...string) { + m.Spawn().Split(m.Cmdx(SYSTEM, "df", "-h"), "", " ", "\n").Table(func(index int, value map[string]string, head []string) { + if strings.HasPrefix(value["Filesystem"], "/dev") { + m.Push("", value, head) + } + }) + }}, + "ifconfig": {Name: "ifconfig", Help: "ifconfig", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy("tcp.host") + }}, + "hostname": {Name: "hostname", Help: "hostname", Hand: func(m *ice.Message, arg ...string) { + m.Conf(RUNTIME, "boot.hostname", arg[1]) + ice.Info.HostName = arg[1] + m.Echo(ice.Info.HostName) + }}, + "userinfo": {Name: "userinfo", Help: "userinfo", Hand: func(m *ice.Message, arg ...string) { + m.Split(m.Cmdx(SYSTEM, "who"), "user term time", " ", "\n") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 && arg[0] == "bootinfo" { + arg = arg[1:] + } + m.Cmdy(ctx.CONFIG, RUNTIME, arg) + }}, + }, + }, nil) +} diff --git a/base/cli/system.go b/base/cli/system.go index 583f8a30..9b241b03 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -2,19 +2,60 @@ package cli import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" + "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" "bytes" "fmt" + "io" "os" "os/exec" "strings" - "time" ) +func _system_show(m *ice.Message, cmd *exec.Cmd) { + m.Cmd(mdb.INSERT, SYSTEM, "", mdb.LIST, "cmd", strings.Join(cmd.Args, " "), "dir", cmd.Dir, "env", strings.Join(cmd.Env, ","), + aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE), + aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA), + ) + + if w, ok := m.Optionv("output").(io.WriteCloser); ok { + cmd.Stderr = w + cmd.Stdout = w + + if e := cmd.Run(); e != nil { + m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", e.Error()) + } else { + m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode()) + } + } else { + err := bytes.NewBuffer(make([]byte, 0, 1024)) + out := bytes.NewBuffer(make([]byte, 0, 1024)) + cmd.Stderr = err + cmd.Stdout = out + defer func() { + m.Push(CMD_ERR, err.String()) + m.Push(CMD_OUT, out.String()) + m.Echo(kit.Select(err.String(), out.String())) + }() + + if e := cmd.Run(); e != nil { + m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", kit.Select(e.Error(), err.String())) + } else { + m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode(), "err", err.Len(), "out", out.Len()) + } + } + + m.Push(kit.MDB_TIME, m.Time()) + m.Push(CMD_CODE, int(cmd.ProcessState.ExitCode())) +} + +const ErrRun = "cli run err: " + const ( - CMD_STDOUT = "cmd_stdout" CMD_STDERR = "cmd_stderr" + CMD_STDOUT = "cmd_stdout" CMD_TYPE = "cmd_type" CMD_DIR = "cmd_dir" @@ -25,38 +66,25 @@ const ( CMD_CODE = "cmd_code" ) -const ErrRun = "run err " - -func _system_show(m *ice.Message, cmd *exec.Cmd) { - out := bytes.NewBuffer(make([]byte, 0, 1024)) - err := bytes.NewBuffer(make([]byte, 0, 1024)) - cmd.Stdout = out - cmd.Stderr = err - defer func() { - m.Cost("%v exit: %v out: %v err: %v ", - cmd.Args, cmd.ProcessState.ExitCode(), out.Len(), err.Len()) - }() - - if e := cmd.Run(); e != nil { - m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", kit.Select(e.Error(), err.String())) - } - - m.Push(kit.MDB_TIME, m.Time()) - m.Push(CMD_CODE, int(cmd.ProcessState.ExitCode())) - m.Push(CMD_ERR, err.String()) - m.Push(CMD_OUT, out.String()) - m.Echo(out.String()) -} - const SYSTEM = "system" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - SYSTEM: {Name: "system", Help: "系统命令", Value: kit.Data()}, + SYSTEM: {Name: SYSTEM, Help: "系统命令", Value: kit.Data()}, }, Commands: map[string]*ice.Command{ - SYSTEM: {Name: "system cmd 执行:button 清空:button", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + SYSTEM: {Name: "system id auto", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + if len(arg) == 0 || kit.Int(arg[0]) > 0 { + m.Option("_control", "_page") + m.Option(mdb.FIELDS, kit.Select("time,id,cmd,dir,env", mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, SYSTEM, "", mdb.LIST, kit.MDB_ID, arg) + return + } + + if len(arg) == 1 { + arg = kit.Split(arg[0]) + } cmd := exec.Command(arg[0], arg[1:]...) // 运行目录 @@ -83,29 +111,6 @@ func init() { _system_show(m, cmd) } }}, - "ssh_user": {Name: "ssh_user", Help: "ssh_user", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - msg := m.Cmd(SYSTEM, "who") - msg.Split(msg.Result(), "name term begin", " \t", "\n") - msg.Table(func(index int, value map[string]string, head []string) { - m.Push("name", value["name"]) - m.Push("term", value["term"]) - - ls := strings.Split(value["begin"], "(") - ls[0] = strings.Join(kit.Split(ls[0], " \t"), " ") - if len(ls) > 1 { - m.Push("ip", strings.TrimSuffix(ls[1], ")")) - } - - t, e := time.ParseInLocation("2006 Jan 2 15:04", "2020 "+ls[0], time.Local) - if e != nil { - t, _ = time.ParseInLocation("2006-01-02 15:04", ls[0], time.Local) - } - m.Push("begin", t.Format("2006-01-02 15:04:05")) - d := time.Since(t) - d = d / time.Millisecond * time.Millisecond - m.Push("duration", d.String()) - }) - }}, }, }, nil) } diff --git a/base/ctx/cmd.go b/base/ctx/command.go similarity index 65% rename from base/ctx/cmd.go rename to base/ctx/command.go index 36dd9544..7657deb9 100644 --- a/base/ctx/cmd.go +++ b/base/ctx/command.go @@ -8,19 +8,15 @@ import ( "strings" ) -func _command_list(m *ice.Message, all bool, name string) { +func _command_list(m *ice.Message, name string) { p := m.Spawn(m.Source()) - if all { - p = ice.Pulse - } - if name != "" { p.Search(name, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) { m.Push("key", s.Cap(ice.CTX_FOLLOW)) m.Push("name", kit.Format(cmd.Name)) m.Push("help", kit.Simple(cmd.Help)[0]) - m.Push("meta", kit.Format(cmd.Meta)) - m.Push("list", kit.Format(cmd.List)) + m.Push("meta", kit.Formats(cmd.Meta)) + m.Push("list", kit.Formats(cmd.List)) }) return } @@ -28,8 +24,7 @@ func _command_list(m *ice.Message, all bool, name string) { list := []string{} for k := range p.Target().Commands { if k[0] == '/' || k[0] == '_' { - // 内部命令 - continue + continue // 内部命令 } list = append(list, k) } @@ -48,9 +43,8 @@ const COMMAND = "command" func init() { Index.Merge(&ice.Context{ Commands: map[string]*ice.Command{ - COMMAND: {Name: "command [all] command", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - all, arg := _parse_arg_all(m, arg...) - _command_list(m, all, strings.Join(arg, ".")) + COMMAND: {Name: "command key auto", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + _command_list(m, strings.Join(arg, ".")) }}, }, }, nil) diff --git a/base/ctx/conf.go b/base/ctx/config.go similarity index 90% rename from base/ctx/conf.go rename to base/ctx/config.go index 330aff8f..b082b362 100644 --- a/base/ctx/conf.go +++ b/base/ctx/config.go @@ -12,17 +12,13 @@ import ( "strings" ) -func _config_list(m *ice.Message, all bool) { +func _config_list(m *ice.Message) { p := m.Spawn(m.Source()) - if all { - p = ice.Pulse - } list := []string{} for k := range p.Target().Configs { if k[0] == '/' || k[0] == '_' { - // 内部命令 - continue + continue // 内部配置 } list = append(list, k) } @@ -85,19 +81,19 @@ func _config_make(m *ice.Message, chain string, arg ...string) { } } func _config_rich(m *ice.Message, name string, key string, arg ...string) { - m.Rich(name, key, kit.Dict(arg)) + m.Rich(name, key, kit.Data(arg)) } func _config_grow(m *ice.Message, name string, key string, arg ...string) { m.Grow(name, key, kit.Dict(arg)) } -const CONFIG = "config" const ( SAVE = "save" LOAD = "load" RICH = "rich" GROW = "grow" ) +const CONFIG = "config" func init() { Index.Merge(&ice.Context{ @@ -105,7 +101,7 @@ func init() { CONFIG: {Name: "config", Help: "配置", Value: kit.Data("path", "var/conf")}, }, Commands: map[string]*ice.Command{ - CONFIG: {Name: "config [all] [chain [key [arg...]]]", Help: "配置", Action: map[string]*ice.Action{ + CONFIG: {Name: "config key auto", Help: "配置", Action: map[string]*ice.Action{ SAVE: {Name: "save", Help: "保存", Hand: func(m *ice.Message, arg ...string) { _config_save(m, arg[0], arg[1:]...) }}, @@ -119,8 +115,8 @@ func init() { _config_grow(m, arg[0], arg[1], arg[2:]...) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if all, arg := _parse_arg_all(m, arg...); len(arg) == 0 { - _config_list(m, all) + if len(arg) == 0 { + _config_list(m) return } _config_make(m, arg[0], arg[1:]...) diff --git a/base/ctx/context.go b/base/ctx/context.go new file mode 100644 index 00000000..137ee01b --- /dev/null +++ b/base/ctx/context.go @@ -0,0 +1,39 @@ +package ctx + +import ( + ice "github.com/shylinux/icebergs" + kit "github.com/shylinux/toolkits" +) + +func _context_list(m *ice.Message, all bool) { + m.Travel(func(p *ice.Context, s *ice.Context) { + m.Push(kit.MDB_NAME, kit.Select("ice", s.Cap(ice.CTX_FOLLOW))) + m.Push(ice.CTX_STATUS, s.Cap(ice.CTX_STATUS)) + m.Push(ice.CTX_STREAM, s.Cap(ice.CTX_STREAM)) + m.Push(kit.MDB_HELP, s.Help) + }) +} + +const CONTEXT = "context" + +func init() { + Index.Merge(&ice.Context{ + Commands: map[string]*ice.Command{ + CONTEXT: {Name: "context name=web.chat action=context,command,config key auto", Help: "模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Search(kit.Select("ice", arg, 0)+".", func(p *ice.Context, s *ice.Context, key string) { + msg := m.Spawn(s) + defer m.Copy(msg) + + switch kit.Select(CONTEXT, arg, 1) { + case CONTEXT: + _context_list(msg, true) + case COMMAND: + msg.Cmdy(COMMAND, arg[2:]) + case CONFIG: + msg.Cmdy(CONFIG, arg[2:]) + } + }) + }}, + }, + }, nil) +} diff --git a/base/ctx/ctx.go b/base/ctx/ctx.go index cf7ad06d..5b0839f5 100644 --- a/base/ctx/ctx.go +++ b/base/ctx/ctx.go @@ -1,68 +1,15 @@ package ctx import ( - "strings" - ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" + + "strings" ) -func _parse_arg_all(m *ice.Message, arg ...string) (bool, []string) { - if len(arg) > 0 && arg[0] == "all" { - return true, arg[1:] - } - return false, arg -} - -func _context_list(m *ice.Message, all bool) { - p := m.Spawn(m.Source()) - if all { - p = ice.Pulse - } - - p.Travel(func(p *ice.Context, s *ice.Context) { - if p != nil { - m.Push("ups", kit.Select("shy", p.Cap(ice.CTX_FOLLOW))) - } else { - m.Push("ups", "shy") - } - m.Push(kit.MDB_NAME, s.Name) - m.Push(ice.CTX_STATUS, s.Cap(ice.CTX_STATUS)) - m.Push(ice.CTX_STREAM, s.Cap(ice.CTX_STREAM)) - m.Push("help", s.Help) - }) -} - -const CONTEXT = "context" - var Index = &ice.Context{Name: "ctx", Help: "配置模块", Commands: map[string]*ice.Command{ - CONTEXT: {Name: "context [all] [name [command|config arg...]]", Help: "模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if all, arg := _parse_arg_all(m, arg...); len(arg) == 0 { - _context_list(m, all) - return - } - - if len(arg) > 1 && arg[1] == COMMAND { - m.Search(arg[0]+".", func(sup *ice.Context, sub *ice.Context, key string) { - m.Copy(m.Spawn(sub).Cmd(COMMAND, arg[2:])) - }) - } else { - m.Search(arg[0]+".", func(p *ice.Context, s *ice.Context, key string) { - msg := m.Spawn(s) - switch kit.Select(CONTEXT, arg, 1) { - case CONTEXT: - _context_list(msg, true) - case COMMAND: - msg.Cmdy(COMMAND, arg[0], arg[2:]) - case CONFIG: - msg.Cmdy(CONFIG, arg[2:]) - } - m.Copy(msg) - }) - } - }}, ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmd(mdb.SEARCH, mdb.CREATE, COMMAND, m.AddCmd(&ice.Command{Hand: func(m *ice.Message, c *ice.Context, cc string, arg ...string) { arg = arg[1:] diff --git a/base/ctx/ctx.shy b/base/ctx/ctx.shy new file mode 100644 index 00000000..7a5fcec3 --- /dev/null +++ b/base/ctx/ctx.shy @@ -0,0 +1,6 @@ +chapter "ctx" + +field "模块" context +field "命令" command +field "配置" config + diff --git a/base/gdb/event.go b/base/gdb/event.go index 94e52996..f070148b 100644 --- a/base/gdb/event.go +++ b/base/gdb/event.go @@ -13,7 +13,7 @@ func _event_listen(m *ice.Message, event string, cmd string) { func _event_action(m *ice.Message, event string, arg ...string) { m.Option(mdb.FIELDS, "time,id,cmd") m.Cmd(mdb.SELECT, EVENT, kit.Keys(kit.MDB_HASH, kit.Hashs(event)), mdb.LIST).Table(func(index int, value map[string]string, head []string) { - m.Cmd(kit.Split(value[kit.SSH_CMD]), event, arg).Cost("event %v %v", event, arg) + m.Cmd(kit.Split(value[kit.SSH_CMD]), event, arg).Cost(EVENT, event, "arg", arg) }) } diff --git a/base/lex/lex.go b/base/lex/lex.go index b9d84bd3..a3f83b1f 100644 --- a/base/lex/lex.go +++ b/base/lex/lex.go @@ -7,7 +7,6 @@ import ( const LEX = "lex" var Index = &ice.Context{Name: LEX, Help: "词法模块", - Configs: map[string]*ice.Config{}, Commands: map[string]*ice.Command{ "hi": {Name: "hi", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Echo("hello %s world", c.Name) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 7cb14121..424f628e 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -12,13 +12,13 @@ import ( "strings" ) -func _fields(m *ice.Message) []string { - return kit.Split(kit.Select("time,hash,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) -} func _file_name(m *ice.Message, arg ...string) string { return kit.Select(path.Join("usr/export", path.Join(arg[:2]...)), arg, 3) } +func _hash_fields(m *ice.Message) []string { + return kit.Split(kit.Select("time,hash,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) +} func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) { m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1]) m.Echo(m.Rich(prefix, chain, kit.Data(arg))) @@ -33,7 +33,7 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) { if field == kit.MDB_HASH && value == RANDOM { value = kit.MDB_RANDOMS } - fields := _fields(m) + fields := _hash_fields(m) m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) { if val[kit.MDB_META] != nil { val = val[kit.MDB_META].(map[string]interface{}) @@ -86,13 +86,11 @@ func _hash_import(m *ice.Message, prefix, chain, file string) { count := 0 if m.Conf(prefix, kit.Keys(chain, kit.MDB_META, kit.MDB_SHORT)) == "" { for k, data := range list { - // 导入数据 m.Conf(prefix, kit.Keys(chain, kit.MDB_HASH, k), data) count++ } } else { for _, data := range list { - // 导入数据 m.Rich(prefix, chain, data) count++ } @@ -102,7 +100,7 @@ func _hash_import(m *ice.Message, prefix, chain, file string) { m.Echo("%d", count) } func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) { - fields := kit.Split(kit.Select("time,hash,type,name,text", m.Option(FIELDS))) + fields := _hash_fields(m) m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { if val[kit.MDB_META] != nil { val = val[kit.MDB_META].(map[string]interface{}) @@ -137,6 +135,9 @@ func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) { m.Sort(kit.MDB_COUNT, "int_r") } +func _list_fields(m *ice.Message) []string { + return kit.Split(kit.Select("time,id,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) +} func _list_insert(m *ice.Message, prefix, chain string, arg ...string) { m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1]) m.Echo("%d", m.Grow(prefix, chain, kit.Dict(arg))) @@ -144,8 +145,11 @@ func _list_insert(m *ice.Message, prefix, chain string, arg ...string) { func _list_delete(m *ice.Message, prefix, chain, field, value string) { } func _list_select(m *ice.Message, prefix, chain, field, value string) { - fields := kit.Split(kit.Select("time,id,type,name,text", m.Option(FIELDS))) - m.Grows(prefix, chain, field, value, func(index int, val map[string]interface{}) { + if value == "" { + field = "" + } + fields := _list_fields(m) + m.Grows(prefix, chain, kit.Select(m.Option("cache.field"), field), kit.Select(m.Option("cache.value"), value), func(index int, val map[string]interface{}) { if val[kit.MDB_META] != nil { val = val[kit.MDB_META].(map[string]interface{}) } @@ -257,9 +261,12 @@ func _list_inputs(m *ice.Message, prefix, chain string, field, value string) { m.Sort(kit.MDB_COUNT, "int_r") } +func _zone_fields(m *ice.Message) []string { + return kit.Split(kit.Select("zone,id,time,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) +} func _zone_select(m *ice.Message, prefix, chain, zone string, id string) { cb := m.Optionv("cache.cb") - fields := kit.Split(kit.Select("zone,id,time,type,name,text", m.Option(FIELDS))) + fields := _zone_fields(m) m.Richs(prefix, chain, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) { if val[kit.MDB_META] != nil { val = val[kit.MDB_META].(map[string]interface{}) @@ -301,7 +308,7 @@ func _zone_export(m *ice.Message, prefix, chain, file string) { w := csv.NewWriter(f) defer w.Flush() - fields := kit.Split(kit.Select("zone,id,time,type,name,text", m.Option(FIELDS))) + fields := _zone_fields(m) w.Write(fields) count := 0 diff --git a/base/ssh/_trash.go b/base/ssh/_trash.go deleted file mode 100644 index 2f826dd7..00000000 --- a/base/ssh/_trash.go +++ /dev/null @@ -1,71 +0,0 @@ -package ssh - -func (f *Frame) history(m *ice.Message, line string) string { - favor := m.Conf(SOURCE, kit.Keys(kit.MDB_META, web.FAVOR)) - if strings.HasPrefix(strings.TrimSpace(line), "!!") { - if len(line) == 2 { - line = m.Cmd(web.FAVOR, favor).Append(kit.MDB_TEXT) - } - } else if strings.HasPrefix(strings.TrimSpace(line), "!") { - if len(line) == 1 { - // 历史记录 - msg := m.Cmd(web.FAVOR, favor) - msg.Sort(kit.MDB_ID) - msg.Appendv(ice.MSG_APPEND, kit.MDB_TIME, kit.MDB_ID, kit.MDB_TEXT) - f.printf(m, msg.Table().Result()) - return "" - } - if i, e := strconv.Atoi(line[1:]); e == nil { - // 历史命令 - line = kit.Format(kit.Value(m.Cmd(web.FAVOR, favor, i).Optionv("value"), kit.MDB_TEXT)) - } else { - f.printf(m, m.Cmd("history", "search", line[1:]).Table().Result()) - return "" - } - } else if strings.TrimSpace(line) != "" && f.source == STDIO { - // 记录历史 - m.Cmd(web.FAVOR, favor, "cmd", f.source, line) - } - return line -} - -const ( - REMOTE = "remote" - QRCODE = "qrcode" -) - -func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - REMOTE: {Name: "remote", Help: "远程连接", Value: kit.Data()}, - }, - Commands: map[string]*ice.Command{ - - QRCODE: {Name: "qrcode arg...", Help: "命令提示", Action: map[string]*ice.Action{ - "json": {Name: "json [key val]...", Help: "json", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(cli.PYTHON, QRCODE, kit.Format(kit.Parse(nil, "", arg...))) - m.Render(ice.RENDER_RESULT) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(cli.PYTHON, QRCODE, strings.Join(arg, "")) - m.Render(ice.RENDER_RESULT) - }}, - REMOTE: {Name: "remote user remote port local", Help: "远程连接", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - key := m.Rich(REMOTE, nil, kit.Dict( - "user", arg[0], "remote", arg[1], "port", arg[2], "local", arg[3], - )) - m.Echo(key) - m.Info(key) - - m.Gos(m, func(m *ice.Message) { - for { - m.Cmd(cli.SYSTEM, "ssh", "-CNR", kit.Format("%s:%s:22", arg[2], kit.Select("localhost", arg, 3)), - kit.Format("%s@%s", arg[0], arg[1])) - m.Info("reconnect after 10s") - time.Sleep(time.Second * 10) - } - }) - }}, - }, - }, nil) -} diff --git a/base/ssh/channel.go b/base/ssh/channel.go index edddb4a5..242efb25 100644 --- a/base/ssh/channel.go +++ b/base/ssh/channel.go @@ -52,7 +52,7 @@ func _ssh_watch(m *ice.Message, meta map[string]string, h string, input io.Reade switch buf[i] { case '\r', '\n': cmd := strings.TrimSpace(string(buf[:i])) - m.Log_IMPORT(aaa.HOSTNAME, meta[aaa.HOSTNAME], aaa.USERNAME, meta[aaa.USERNAME], CMD, cmd) + m.Log_IMPORT(tcp.HOSTNAME, meta[tcp.HOSTNAME], aaa.USERNAME, meta[aaa.USERNAME], CMD, cmd) m.Cmdy(mdb.INSERT, CHANNEL, kit.Keys(kit.MDB_HASH, h), mdb.LIST, kit.MDB_TYPE, CMD, kit.MDB_TEXT, cmd) i = 0 default: diff --git a/base/ssh/connect.go b/base/ssh/connect.go index ae6577cc..14d1d5e0 100644 --- a/base/ssh/connect.go +++ b/base/ssh/connect.go @@ -24,7 +24,7 @@ func _ssh_conn(m *ice.Message, conn net.Conn, username, hostport string) (*ssh.C c, chans, reqs, err := ssh.NewClientConn(conn, hostport, &ssh.ClientConfig{ User: username, Auth: methods, HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { - m.Logs(CONNECT, aaa.HOSTNAME, hostname, aaa.HOSTPORT, remote.String()) + m.Logs(CONNECT, tcp.HOSTNAME, hostname, tcp.HOSTPORT, remote.String()) return nil }, }) diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index ba514dc0..66766c27 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -283,7 +283,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { r, f.stdout = os.Stdin, os.Stdout m.Option("_option", ice.MSG_USERNAME) - m.Option(ice.MSG_USERNAME, cli.UserName) + m.Option(ice.MSG_USERNAME, ice.Info.UserName) m.Option(ice.MSG_USERROLE, aaa.ROOT) m.Option(ice.MSG_USERZONE, "boot") aaa.UserRoot(m) @@ -355,7 +355,7 @@ func init() { } if arg[0] == STDIO { - m.Option("_control", "page") + m.Option("_control", "_page") } else { m.Option("cache.limit", "-1") } diff --git a/base/ssh/service.go b/base/ssh/service.go index 54550141..27030005 100644 --- a/base/ssh/service.go +++ b/base/ssh/service.go @@ -23,7 +23,7 @@ import ( ) func _ssh_meta(conn ssh.ConnMetadata) map[string]string { - return map[string]string{aaa.USERNAME: conn.User(), aaa.HOSTPORT: conn.RemoteAddr().String()} + return map[string]string{aaa.USERNAME: conn.User(), tcp.HOSTPORT: conn.RemoteAddr().String()} } func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { @@ -31,7 +31,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { meta, err := _ssh_meta(conn), errors.New(ice.ErrNotAuth) if tcp.IsLocalHost(m, strings.Split(conn.RemoteAddr().String(), ":")[0]) { - m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) + m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) err = nil // 本机用户 } else { m.Cmd(mdb.SELECT, SERVICE, kit.Keys(kit.MDB_HASH, h), mdb.LIST).Table(func(index int, value map[string]string, head []string) { @@ -42,8 +42,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e != nil, e) { if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 { - m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.HOSTNAME, value[kit.MDB_NAME]) - meta[aaa.HOSTNAME] = kit.Select("", kit.Split(value[kit.MDB_NAME], "@"), 1) + m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[kit.MDB_NAME]) + meta[tcp.HOSTNAME] = kit.Select("", kit.Split(value[kit.MDB_NAME], "@"), 1) err = nil // 认证成功 } } @@ -56,7 +56,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { meta, err := _ssh_meta(conn), errors.New(ice.ErrNotAuth) m.Richs(aaa.USER, "", conn.User(), func(k string, value map[string]interface{}) { if string(password) == kit.Format(value[aaa.PASSWORD]) { - m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD])))) + m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD])))) err = nil // 密码登录 } }) @@ -64,7 +64,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { }, BannerCallback: func(conn ssh.ConnMetadata) string { - m.Log_IMPORT(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) + m.Log_IMPORT(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) return m.Conf(SERVICE, "meta.welcome") }, } @@ -94,8 +94,8 @@ func _ssh_accept(m *ice.Message, h string, c net.Conn) { } } func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh.Channel, requests <-chan *ssh.Request) { - m.Logs(CHANNEL, aaa.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr()) - defer m.Logs("dischan", aaa.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr()) + m.Logs(CHANNEL, tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr()) + defer m.Logs("dischan", tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr()) shell := kit.Select("bash", os.Getenv("SHELL")) list := []string{"PATH=" + os.Getenv("PATH")} @@ -110,7 +110,7 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh meta[CHANNEL] = h for request := range requests { - m.Logs("request", aaa.HOSTPORT, c.RemoteAddr(), kit.MDB_TYPE, request.Type) + m.Logs("request", tcp.HOSTPORT, c.RemoteAddr(), kit.MDB_TYPE, request.Type) switch request.Type { case "pty-req": diff --git a/base/ssh/ssh.go b/base/ssh/ssh.go index 1e13b5ca..4aeba28a 100644 --- a/base/ssh/ssh.go +++ b/base/ssh/ssh.go @@ -14,7 +14,7 @@ var Index = &ice.Context{Name: SSH, Help: "终端模块", Commands: map[string]* }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if _, ok := m.Target().Server().(*Frame); ok { - m.Done() + m.Done(true) } m.Richs(SERVICE, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { kit.Value(value, "meta.status", tcp.CLOSE) diff --git a/base/tcp/client.go b/base/tcp/client.go index 985e094c..5ba6d00d 100644 --- a/base/tcp/client.go +++ b/base/tcp/client.go @@ -56,10 +56,11 @@ func init() { }, Commands: map[string]*ice.Command{ CLIENT: {Name: "client hash auto 清理", Help: "客户端", Action: map[string]*ice.Action{ - DIAL: {Name: "dial port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) { + DIAL: {Name: "dial type name port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) { c, e := net.Dial(TCP, m.Option(HOST)+":"+m.Option(PORT)) h := m.Cmdx(mdb.INSERT, CLIENT, "", mdb.HASH, PORT, m.Option(PORT), HOST, m.Option(HOST), - kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e)) + kit.MDB_TYPE, m.Option(kit.MDB_TYPE), kit.MDB_NAME, m.Option(kit.MDB_NAME), + kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e)) c = &Conn{m: m, h: h, s: &Stat{}, Conn: c} if e == nil { @@ -92,10 +93,10 @@ func init() { m.Cmdy(mdb.PRUNES, CLIENT, "", mdb.HASH, kit.MDB_STATUS, CLOSE) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select("time,hash,status,name,host,port,error,nread,nwrite", mdb.DETAIL, len(arg) > 0)) + m.Option(mdb.FIELDS, kit.Select("time,hash,status,type,name,host,port,error,nread,nwrite", mdb.DETAIL, len(arg) > 0)) if m.Cmdy(mdb.SELECT, CLIENT, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) == 0 { m.Table(func(index int, value map[string]string, head []string) { - m.PushButton(kit.Select("", "删除", value[kit.MDB_STATUS] == CLOSE)) + m.PushButton(kit.Select("", "删除", value[kit.MDB_STATUS] == OPEN)) }) } }}, diff --git a/base/tcp/host.go b/base/tcp/host.go index e94bc7d2..bbb10969 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -60,6 +60,10 @@ func _islocalhost(m *ice.Message, ip string) (ok bool) { } func IsLocalHost(m *ice.Message, ip string) bool { return _islocalhost(m, ip) } +const ( + HOSTPORT = "hostport" + HOSTNAME = "hostname" +) const HOST = "host" func init() { diff --git a/base/tcp/server.go b/base/tcp/server.go index d1ac8705..fac22a89 100644 --- a/base/tcp/server.go +++ b/base/tcp/server.go @@ -27,7 +27,8 @@ func (l Listener) Accept() (net.Conn, error) { ls = strings.Split(strings.TrimPrefix(c.RemoteAddr().String(), "["), "]:") } h := l.m.Cmdx(mdb.INSERT, CLIENT, "", mdb.HASH, HOST, ls[0], PORT, ls[1], - kit.MDB_NAME, l.m.Option(kit.MDB_NAME), kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e)) + kit.MDB_TYPE, l.m.Option(kit.MDB_TYPE), kit.MDB_NAME, l.m.Option(kit.MDB_NAME), + kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e)) return &Conn{m: l.m, h: h, s: &Stat{}, Conn: c}, e } @@ -50,10 +51,10 @@ func init() { }, Commands: map[string]*ice.Command{ SERVER: {Name: "server hash auto 清理", Help: "服务器", Action: map[string]*ice.Action{ - LISTEN: {Name: "LISTEN port=9010 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) { + LISTEN: {Name: "LISTEN type name port=9010 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) { l, e := net.Listen(TCP, m.Option(HOST)+":"+m.Option(PORT)) - h := m.Cmdx(mdb.INSERT, SERVER, "", mdb.HASH, PORT, m.Option(PORT), HOST, m.Option(HOST), - kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e)) + h := m.Cmdx(mdb.INSERT, SERVER, "", mdb.HASH, arg, + kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e)) l = &Listener{m: m, h: h, s: &Stat{}, Listener: l} if e == nil { @@ -105,7 +106,7 @@ func init() { m.Cmdy(mdb.PRUNES, SERVER, "", mdb.HASH, kit.MDB_STATUS, CLOSE) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select("time,hash,status,name,host,port,error,nconn", mdb.DETAIL, len(arg) > 0)) + m.Option(mdb.FIELDS, kit.Select("time,hash,status,type,name,host,port,error,nconn", mdb.DETAIL, len(arg) > 0)) if m.Cmdy(mdb.SELECT, SERVER, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) == 0 { m.Table(func(index int, value map[string]string, head []string) { m.PushButton(kit.Select("", "删除", value[kit.MDB_STATUS] == CLOSE)) diff --git a/base/web/cache.go b/base/web/cache.go index 8bd355fc..75f16a6d 100644 --- a/base/web/cache.go +++ b/base/web/cache.go @@ -13,31 +13,13 @@ import ( ) func _cache_name(m *ice.Message, h string) string { - return path.Join(m.Conf(CACHE, "meta.path"), h[:2], h) -} - -func _cache_list(m *ice.Message, key string) { - if key == "" { - m.Grows(CACHE, nil, "", "", func(index int, value map[string]interface{}) { - // 缓存列表 - m.Push("", value, []string{kit.MDB_TIME, kit.MDB_ID, DATA, kit.MDB_TYPE}) - m.Push(kit.MDB_SIZE, kit.FmtSize(kit.Int64(value[kit.MDB_SIZE]))) - m.Push("", value, []string{kit.MDB_NAME, kit.MDB_TEXT}) - }) - m.Sort(kit.MDB_ID, "int_r") - return - } - m.Richs(CACHE, nil, key, func(key string, value map[string]interface{}) { - // 缓存详情 - m.Push("detail", value) - }) + return path.Join(m.Conf(CACHE, kit.META_PATH), h[:2], h) } func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // file size if name == "" { return } - if len(text) > 512 { - // 存入文件 + if len(text) > 512 { // 存入文件 p := m.Cmdx(nfs.SAVE, _cache_name(m, kit.Hashs(text)), text) text, arg = p, kit.Simple(p, len(text)) } @@ -46,17 +28,9 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi size := kit.Int(kit.Select(kit.Format(len(text)), arg, 1)) file := kit.Select("", arg, 0) text = kit.Select(file, text) - h := m.Rich(CACHE, nil, kit.Dict( + h := m.Cmdx(mdb.INSERT, CACHE, "", mdb.HASH, kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text, - kit.MDB_FILE, file, kit.MDB_SIZE, size, - )) - m.Log_CREATE(CACHE, h, kit.MDB_TYPE, kind, kit.MDB_NAME, name) - - // 添加记录 - m.Grow(CACHE, nil, kit.Dict( - kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text, - kit.MDB_SIZE, size, DATA, h, - )) + kit.MDB_FILE, file, kit.MDB_SIZE, size) // 返回结果 m.Push(kit.MDB_TIME, m.Time()) @@ -68,15 +42,15 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi m.Push(DATA, h) } func _cache_watch(m *ice.Message, key, file string) { - m.Richs(CACHE, nil, key, func(key string, value map[string]interface{}) { - if value[kit.MDB_FILE] == nil { + m.Option(mdb.FIELDS, "time,hash,size,type,name,text,file") + m.Cmd(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, key).Table(func(index int, value map[string]string, head []string) { + if value[kit.MDB_FILE] == "" { m.Cmdy(nfs.SAVE, file, value[kit.MDB_TEXT]) } else { m.Cmdy(nfs.LINK, file, value[kit.MDB_FILE]) } }) } - func _cache_catch(m *ice.Message, name string) (file, size string) { if f, e := os.Open(name); m.Assert(e) { defer f.Close() @@ -99,7 +73,7 @@ func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size stri buf.Seek(0, os.SEEK_SET) if n, e := io.Copy(f, buf); m.Assert(e) { m.Log_IMPORT(kit.MDB_FILE, p, kit.MDB_SIZE, kit.FmtSize(int64(n))) - return h.Header.Get("Content-Type"), h.Filename, p, kit.Format(n) + return h.Header.Get(ContentType), h.Filename, p, kit.Format(n) } } } @@ -108,7 +82,7 @@ func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size stri func _cache_download(m *ice.Message, r *http.Response) (file, size string) { defer r.Body.Close() - total := kit.Int(kit.Select("1", r.Header.Get("Content-Length"))) + total := kit.Int(kit.Select("1", r.Header.Get(ContentLength))) if f, p, e := kit.Create(path.Join("var/tmp", kit.Hashs("uniq"))); m.Assert(e) { size, buf := 0, make([]byte, 1024) for { @@ -160,18 +134,15 @@ const CACHE = "cache" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - CACHE: {Name: "cache", Help: "缓存池", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_TEXT, - kit.MDB_PATH, "var/file", - kit.MDB_STORE, "var/data", - kit.MDB_FSIZE, "200000", - kit.MDB_LIMIT, "50", - kit.MDB_LEAST, "30", + CACHE: {Name: CACHE, Help: "缓存池", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_PATH, "var/file", + kit.MDB_STORE, "var/data", kit.MDB_FSIZE, "200000", + kit.MDB_LIMIT, "50", kit.MDB_LEAST, "30", )}, }, Commands: map[string]*ice.Command{ - CACHE: {Name: "cache data=auto auto", Help: "缓存池", Action: map[string]*ice.Action{ - WATCH: {Name: "watch key file", Help: "查看", Hand: func(m *ice.Message, arg ...string) { + CACHE: {Name: "cache hash auto", Help: "缓存池", Action: map[string]*ice.Action{ + WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) { _cache_watch(m, arg[0], arg[1]) }}, WRITE: {Name: "write type name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) { @@ -186,15 +157,16 @@ func init() { _cache_save(m, kind, name, "", file, size) }}, DOWNLOAD: {Name: "download type name", Help: "下载", Hand: func(m *ice.Message, arg ...string) { - if r, ok := m.Optionv("response").(*http.Response); ok { + if r, ok := m.Optionv(RESPONSE).(*http.Response); ok { file, size := _cache_download(m, r) _cache_save(m, arg[0], arg[1], "", file, size) } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, "time,size,type,name,text,file") - m.Cmdy(mdb.SELECT, m.Prefix(CACHE), "", mdb.HASH, kit.MDB_HASH, arg) + m.Option(mdb.FIELDS, "time,hash,size,type,name,text,file") + m.Cmdy(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, arg) }}, + "/cache/": {Name: "/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Richs(CACHE, nil, arg[0], func(key string, value map[string]interface{}) { if value[kit.MDB_FILE] == nil { diff --git a/base/web/dream.go b/base/web/dream.go index 96c154cc..e990800e 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -4,6 +4,7 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/gdb" + "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/nfs" kit "github.com/shylinux/toolkits" @@ -14,33 +15,35 @@ import ( ) func _dream_list(m *ice.Message) { - // 任务列表 - m.Cmdy(nfs.DIR, m.Conf(DREAM, "meta.path"), "time name").Table(func(index int, value map[string]string, head []string) { + m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "time size name").Table(func(index int, value map[string]string, head []string) { if m.Richs(SPACE, nil, value[kit.MDB_NAME], func(key string, value map[string]interface{}) { m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) m.Push(kit.MDB_STATUS, gdb.START) + m.PushButton(gdb.STOP) }) == nil { - m.Push(kit.MDB_TYPE, "none") + m.Push(kit.MDB_TYPE, WORKER) m.Push(kit.MDB_STATUS, gdb.STOP) + m.PushButton(gdb.START) } - m.PushRender("action", "button", "start,stop,restart") }) - m.Sort(kit.MDB_NAME) + m.Sort(kit.MDB_NAME, "str_r") } func _dream_show(m *ice.Message, name string) { // 规范命名 if !strings.Contains(name, "-") || !strings.HasPrefix(name, "20") { - name = m.Time("20060102-") + name + name = m.Time("20060102-") + strings.ReplaceAll(name, "-", "_") } // 创建目录 - p := path.Join(m.Conf(DREAM, "meta.path"), name) + p := path.Join(m.Conf(DREAM, kit.META_PATH), name) os.MkdirAll(p, ice.MOD_DIR) - if m.Option("repos") != "" { - m.Cmd("web.code.git.repos", "create", "remote", m.Option("repos"), "path", p) + // 下载代码 + if m.Option(kit.SSH_REPOS) != "" { + m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, m.Option(kit.SSH_REPOS), kit.MDB_PATH, p) } + // 任务脚本 miss := path.Join(p, "etc/miss.sh") if _, e := os.Stat(miss); e != nil { m.Cmd(nfs.SAVE, miss, m.Conf(DREAM, "meta.miss")) @@ -49,39 +52,36 @@ func _dream_show(m *ice.Message, name string) { if b, e := ioutil.ReadFile(path.Join(p, m.Conf(gdb.SIGNAL, "meta.pid"))); e == nil { if s, e := os.Stat("/proc/" + string(b)); e == nil && s.IsDir() { m.Info("already exists %v", string(b)) - // 已经启动 - return + return // 已经启动 } } if m.Richs(SPACE, nil, name, nil) == nil { - // 启动任务 - m.Option(cli.CMD_DIR, p) - m.Option(cli.CMD_STDERR, path.Join(p, m.Conf(DREAM, "meta.env.ctx_log"))) + m.Optionv(cli.CMD_DIR, p) m.Optionv(cli.CMD_ENV, kit.Simple( "ctx_dev", m.Conf(cli.RUNTIME, "conf.ctx_dev"), "PATH", kit.Path(path.Join(p, "bin"))+":"+os.Getenv("PATH"), - "USER", cli.UserName, - m.Confv(DREAM, "meta.env"), + "USER", ice.Info.UserName, m.Confv(DREAM, "meta.env"), )) + // 启动任务 + m.Optionv(cli.CMD_STDERR, path.Join(p, m.Conf(DREAM, "meta.env.ctx_log"))) m.Cmd(cli.DAEMON, m.Confv(DREAM, "meta.cmd"), "self", name) } m.Cmdy(nfs.DIR, p) } -const DREAM = "dream" const ( DREAM_START = "dream.start" DREAM_STOP = "dream.stop" ) +const DREAM = "dream" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - DREAM: {Name: "dream", Help: "梦想家", Value: kit.Data("path", "usr/local/work", - "cmd", []interface{}{"ice.bin", SPACE, "connect"}, "env", kit.Dict( - "ctx_log", "bin/boot.log", "ctx_mod", "ctx,log,gdb,ssh", - ), + DREAM: {Name: DREAM, Help: "梦想家", Value: kit.Data("path", "usr/local/work", + "cmd", []interface{}{"ice.bin", SPACE, "connect"}, + "env", kit.Dict("ctx_log", "bin/boot.log"), "miss", `#!/bin/bash [ -f ~/.ish/plug.sh ] || [ -f ./.ish/plug.sh ] || git clone ${ISH_CONF_HUB_PROXY:="https://"}github.com/shylinux/intshell ./.ish [ "$ISH_CONF_PRE" != "" ] || source ./.ish/plug.sh || source ~/.ish/plug.sh @@ -97,29 +97,26 @@ ish_miss_prepare_install )}, }, Commands: map[string]*ice.Command{ - DREAM: {Name: "dream [name [cmd...]] auto", Help: "梦想家", Meta: kit.Dict("detail", []interface{}{"启动", "停止"}), Action: map[string]*ice.Action{ - gdb.START: {Name: "start type name", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME))) - _dream_show(m, m.Option(kit.MDB_NAME)) + DREAM: {Name: "dream name path auto 启动", Help: "梦想家", Action: map[string]*ice.Action{ + gdb.START: {Name: "start type=worker,server name repos", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + _dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME)))) }}, gdb.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(SPACE, m.Option(kit.MDB_NAME), "exit", "1") + m.Cmdy(SPACE, m.Option(kit.MDB_NAME), "exit", "0") }}, - gdb.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(SPACE, m.Option(kit.MDB_NAME), "exit", "1") - m.Sleep("1s") - _dream_show(m, m.Option(kit.MDB_NAME)) + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case kit.MDB_NAME: + m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,time") + } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { _dream_list(m) return } - if len(arg) > 1 { - m.Cmdy(SPACE, arg[0], arg[1:]) - return - } - _dream_show(m, arg[0]) + m.Option(nfs.DIR_ROOT, path.Join(m.Conf(DREAM, kit.META_PATH), arg[0])) + m.Cmdy(nfs.DIR, arg[1:]) }}, }, }, nil) diff --git a/base/web/render.go b/base/web/render.go index 471d1500..df83b2b8 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -3,7 +3,6 @@ package web import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" - "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" "github.com/skip2/go-qrcode" @@ -14,26 +13,6 @@ import ( "time" ) -func URL(m *ice.Message, path string, arg ...interface{}) string { - list := kit.Simple(arg) - if m.Option("pod") != "" { - list = append(list, "pod", m.Option("pod")) - } - return kit.MergeURL2(m.R.Header.Get("Origin"), path, list) -} -func Count(m *ice.Message, cmd, key, name string) int { - count := kit.Int(m.Conf(cmd, kit.Keys(key, name))) - m.Conf(cmd, kit.Keys(key, name), count+1) - return count -} -func Format(key string, arg ...interface{}) string { - switch args := kit.Simple(arg); key { - case "a": - return fmt.Sprintf("%s", kit.Format(args[0]), kit.Select(kit.Format(args[0]), args, 1)) - } - return "" -} - const ( STATUS = "status" COOKIE = "cookie" @@ -97,69 +76,7 @@ func RenderCookie(msg *ice.Message, value string, arg ...string) { // name path expire := time.Now().Add(kit.Duration(kit.Select(msg.Conf(aaa.SESS, "meta.expire"), arg, 2))) http.SetCookie(msg.W, &http.Cookie{Value: value, Name: kit.Select(ice.MSG_SESSID, arg, 0), Path: kit.Select("/", arg, 1), Expires: expire}) } -func RenderStatus(msg *ice.Message, code int, text string) { // name path expire +func RenderStatus(msg *ice.Message, code int, text string) { msg.W.WriteHeader(code) msg.W.Write([]byte(text)) } - -var RENDER = struct { - A string - IMG string - Video string - Field string - Frame string - Button string - - Download string -}{ - A: "a", - IMG: "img", - Video: "video", - Field: "field", - Frame: "frame", - Button: "button", - - Download: "download", -} - -func init() { - Index.Merge(&ice.Context{ - Commands: map[string]*ice.Command{ - "_render": {Action: map[string]*ice.Action{ - RENDER.A: {Hand: func(m *ice.Message, arg ...string) { - // u := kit.Select(m.Conf(SHARE, "meta.domain"), arg, 1) - u := kit.Select(arg[0], arg, 1) - m.Echo(`%s`, u, arg[0]) - }}, - RENDER.IMG: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(``, arg[0], kit.Select("120", arg, 1)) - }}, - RENDER.Video: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(`