diff --git a/base/cli/runtime.go b/base/cli/runtime.go index fbd81e86..faa25281 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -2,13 +2,11 @@ package cli import ( "os" - "os/user" "path" "runtime" "strings" ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" @@ -47,13 +45,8 @@ func _runtime_init(m *ice.Message) { name = kit.Slice(strings.Split(name, "\\"), -1)[0] m.Conf(RUNTIME, kit.Keys(BOOT, PATHNAME), name) } - if m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), kit.Select(kit.Env(USER), kit.Env(CTX_USER))) == "" { - if user, e := user.Current(); e == nil && user.Name != "" { - m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), kit.Select(user.Name, kit.Env(CTX_USER))) - } else { - m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), aaa.ROOT) - } - } + + m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), kit.Select(kit.UserName(), kit.Env(CTX_USER))) ice.Info.HostName = m.Conf(RUNTIME, kit.Keys(BOOT, HOSTNAME)) ice.Info.PathName = m.Conf(RUNTIME, kit.Keys(BOOT, PATHNAME)) ice.Info.UserName = m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME)) diff --git a/base/ctx/command.go b/base/ctx/command.go index 56f3ecb2..8dbc209e 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -84,7 +84,9 @@ func init() { m.Cmd(mdb.SEARCH, mdb.CREATE, m.CommandKey(), m.PrefixKey()) }}, mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { - _command_search(m, arg[0], kit.Select("", arg, 1), kit.Select("", arg, 2)) + if arg[0] == m.CommandKey() || len(arg) > 1 && arg[1] != "" { + _command_search(m, arg[0], kit.Select("", arg, 1), kit.Select("", arg, 2)) + } }}, INDEX: {Name: "index", Help: "索引", Hand: func(m *ice.Message, arg ...string) { }}, diff --git a/base/ctx/config.go b/base/ctx/config.go index ca34d9fc..d59b84ba 100644 --- a/base/ctx/config.go +++ b/base/ctx/config.go @@ -132,6 +132,7 @@ func init() { return } _config_make(m, arg[0], arg[1:]...) + m.DisplayStoryJSON() }}, }}) } diff --git a/base/mdb/search.go b/base/mdb/search.go index c713acda..6edf451e 100644 --- a/base/mdb/search.go +++ b/base/mdb/search.go @@ -19,7 +19,7 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 1 { - m.Cmdy(SELECT, m.PrefixKey(), "", HASH, m.Config(SHORT), arg, func(value map[string]interface{}) { + m.Cmdy(SELECT, m.PrefixKey(), "", HASH, m.Config(SHORT), kit.Slice(arg, 0, 1), func(value map[string]interface{}) { m.OptionFields(kit.Select("ctx,cmd,type,name,text", kit.Select(m.OptionFields()))) m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) }) diff --git a/base/mdb/zone.go b/base/mdb/zone.go index 6f5f786b..a687fe30 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -200,12 +200,18 @@ func ZoneAction(args ...interface{}) map[string]*ice.Action { }) } func ZoneSelect(m *ice.Message, arg ...string) *ice.Message { + arg = kit.Slice(arg, 0, 2) m.Fields(len(arg), kit.Fields(TIME, m.Config(SHORT), COUNT), m.Config(FIELD)) if m.Cmdy(SELECT, m.PrefixKey(), "", ZONE, arg); kit.Select("", arg, 0) == "" { m.Sort(m.Config(SHORT)) m.PushAction(REMOVE) } - m.StatusTimeCount() + if len(arg) == 0 { + m.StatusTimeCount() + } + if len(arg) == 1 { + m.StatusTimeCountTotal(m.Conf(m.PrefixKey(), kit.Keys(HASH, kit.Hashs(arg[0]), kit.Keym("count")))) + } return m } func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message { diff --git a/core/code/vimer.go b/core/code/vimer.go index 583628a6..a2c39cd2 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -6,8 +6,10 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) @@ -22,6 +24,9 @@ func init() { AUTOGEN: {Name: "create main=src/main.go zone name=hi help type=Zone,Hash,Lists,Data,Code list key", Help: "模块", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, mdb.CREATE, arg) }}, + web.DREAM: {Name: "dream name repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(web.DREAM, cli.START, arg) + }}, "script": {Name: "script file=hi/hi.js text=", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { m.Option(mdb.TEXT, strings.TrimSpace(m.Option(mdb.TEXT))) m.Cmdy(TEMPLATE, nfs.DEFS) @@ -31,6 +36,13 @@ func init() { m.Option(mdb.TEXT, strings.TrimSpace(m.Option(mdb.TEXT))) m.Cmdy(TEMPLATE, nfs.DEFS) }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch m.Option(ctx.ACTION) { + case web.DREAM: + m.Cmdy(web.DREAM, mdb.INPUTS, arg) + } + }}, + COMPILE: {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) { if msg := m.Cmd(COMPILE, ice.SRC_MAIN_GO, ice.BIN_ICE_BIN); !cli.IsSuccess(msg) { _inner_make(m, msg) diff --git a/core/wiki/refer.go b/core/wiki/refer.go index 1c826752..d72350e3 100644 --- a/core/wiki/refer.go +++ b/core/wiki/refer.go @@ -32,7 +32,7 @@ func init() { }}, }, Configs: map[string]*ice.Config{ REFER: {Name: REFER, Help: "参考", Value: kit.Data( - nfs.TEMPLATE, ``, + nfs.TEMPLATE, ``, )}, }}) } diff --git a/core/wiki/word.go b/core/wiki/word.go index 4652c5c8..5053e529 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -33,11 +33,38 @@ func init() { LABEL, kit.List(CHART, LABEL), CHAIN, kit.List(CHART, CHAIN), ), + mdb.SHORT, "type,name,text", + mdb.FIELD, "time,hash,type,name,text", )}, }, Commands: map[string]*ice.Command{ - WORD: {Name: "word path=src/main.shy@key auto play", Help: "语言文字", Meta: kit.Dict( - ice.DisplayLocal(""), - ), Action: ice.MergeAction(map[string]*ice.Action{ + WORD: {Name: "word path=src/main.shy@key auto play", Help: "语言文字", Meta: kit.Dict(ice.DisplayLocal("")), Action: ice.MergeAction(map[string]*ice.Action{ + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { + m.Cmd(mdb.SEARCH, mdb.CREATE, m.CommandKey(), m.PrefixKey()) + }}, + mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Table(func(index int, value map[string]string, head []string) { + if arg[1] == "" { + if value[mdb.TYPE] == SPARK { + value[mdb.TEXT] = ice.Render(m, ice.RENDER_SCRIPT, value[mdb.TEXT]) + } + m.PushSearch(value) + } + }) + }}, + mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, arg) + }}, + "recent": {Name: "recent", Help: "最近", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(m.Config(mdb.FIELD)) + m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Table(func(index int, value map[string]string, head []string) { + if value[mdb.TYPE] == "spark" { + value[mdb.TEXT] = ice.Render(m, ice.RENDER_SCRIPT, value[mdb.TEXT]) + } + m.Push("", value, head) + }) + m.PushAction(mdb.REMOVE) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, "src/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), nfs.DIR_CLI_FIELDS) m.Cmdy(nfs.DIR, "src/help/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), nfs.DIR_CLI_FIELDS) @@ -46,7 +73,7 @@ func init() { m.Cmdy(arg[0], ctx.ACTION, ice.RUN, arg[2:]) }}, ice.PLAY: {Name: "play", Help: "演示"}, - }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }, ctx.CmdAction(), mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(nfs.DIR_REG, m.Config(lex.REGEXP)) if m.Option(nfs.DIR_DEEP, ice.TRUE); !_wiki_list(m, cmd, arg...) { _word_show(m, arg[0]) diff --git a/meta.go b/meta.go index 8765e617..16079695 100644 --- a/meta.go +++ b/meta.go @@ -318,7 +318,8 @@ func (m *Message) Table(cbs ...func(index int, value map[string]string, head []s return m } - for i := 0; i < m.Length(); i++ { + n := m.Length() + for i := 0; i < n; i++ { line := map[string]string{} for _, k := range m.meta[MSG_APPEND] { line[k] = kit.Select("", m.meta[k], i) diff --git a/misc/ssh/connect.go b/misc/ssh/connect.go index 025409d0..83972d8d 100644 --- a/misc/ssh/connect.go +++ b/misc/ssh/connect.go @@ -156,61 +156,59 @@ const CONNECT = "connect" func init() { psh.Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ - CONNECT: {Name: CONNECT, Help: "连接", Value: kit.Data( - mdb.FIELD, "time,hash,status,username,host,port", - )}, + CONNECT: {Name: CONNECT, Help: "连接", Value: kit.Data(mdb.SHORT, "name", mdb.FIELD, "time,name,status,username,host,port")}, }, Commands: map[string]*ice.Command{ - CONNECT: {Name: "connect hash auto", Help: "连接", Action: ice.MergeAction(map[string]*ice.Action{ - ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - m.Richs(CONNECT, "", mdb.FOREACH, func(key string, value map[string]interface{}) { - if value = kit.GetMeta(value); kit.Value(value, mdb.STATUS) == tcp.OPEN { - m.Cmd(CONNECT, tcp.DIAL, aaa.USERNAME, value[aaa.USERNAME], mdb.HASH, key, value) - } - }) - }}, + CONNECT: {Name: "connect name auto", Help: "连接", Action: ice.MergeAction(map[string]*ice.Action{ tcp.OPEN: {Name: "open authfile username=shy password verfiy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "终端", Hand: func(m *ice.Message, arg ...string) { aaa.UserRoot(m) _ssh_open(m.OptionLoad(m.Option("authfile")), arg...) m.Echo("exit %v@%v:%v\n", m.Option(aaa.USERNAME), m.Option(tcp.HOST), m.Option(tcp.PORT)) }}, - tcp.DIAL: {Name: "dial username=shy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + tcp.DIAL: {Name: "dial name=shylinux username=shy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Go(func() { _ssh_conn(m, func(client *ssh.Client) { - h := m.Option(mdb.HASH) - if h == "" { - h = m.Rich(CONNECT, "", kit.Dict( - aaa.USERNAME, m.Option(aaa.USERNAME), - tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT), - mdb.STATUS, tcp.OPEN, CONNECT, client, - )) - } else { - m.Conf(CONNECT, kit.Keys(mdb.HASH, h, CONNECT), client) - } - m.Cmd(CONNECT, SESSION, mdb.HASH, h) + m.Rich(CONNECT, "", kit.Dict( + mdb.NAME, m.Option(mdb.NAME), + aaa.USERNAME, m.Option(aaa.USERNAME), + tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT), + mdb.STATUS, tcp.OPEN, CONNECT, client, + )) + m.Cmd(CONNECT, SESSION, mdb.NAME, m.Option(mdb.NAME)) }, arg...) }) m.ProcessRefresh3s() }}, - - SESSION: {Name: "session hash", Help: "会话", Hand: func(m *ice.Message, arg ...string) { + SESSION: {Name: "session name", Help: "会话", Hand: func(m *ice.Message, arg ...string) { var client *ssh.Client - m.Richs(CONNECT, "", m.Option(mdb.HASH), func(key string, value map[string]interface{}) { + m.Richs(CONNECT, "", m.Option(mdb.NAME), func(key string, value map[string]interface{}) { client, _ = value[CONNECT].(*ssh.Client) }) - h := m.Rich(SESSION, "", kit.Data(mdb.STATUS, tcp.OPEN, CONNECT, m.Option(mdb.HASH))) + h := m.Rich(SESSION, "", kit.Data(mdb.NAME, m.Option(mdb.NAME), mdb.STATUS, tcp.OPEN, CONNECT, m.Option(mdb.NAME))) if session, e := _ssh_session(m, h, client); m.Assert(e) { session.Shell() session.Wait() } m.Echo(h) }}, + "command": {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + m.Richs(CONNECT, "", m.Option(mdb.NAME), func(key string, value map[string]interface{}) { + if client, ok := value[CONNECT].(*ssh.Client); ok { + if session, e := client.NewSession(); m.Assert(e) { + defer session.Close() + if b, e := session.CombinedOutput(m.Option("cmd")); m.Assert(e) { + m.Echo(string(b)) + } + } + } + }) + }}, }, mdb.HashActionStatus()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { mdb.HashSelect(m, arg...).Table(func(index int, value map[string]string, head []string) { - m.PushButton(kit.Select("", SESSION, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) + m.PushButton(kit.Select("", "command,session", value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) }) if len(arg) == 0 { - m.Action(tcp.DIAL, mdb.PRUNES) + m.Action(tcp.DIAL) } }}, }}) diff --git a/misc/ssh/session.go b/misc/ssh/session.go index d150573e..a6dd476a 100644 --- a/misc/ssh/session.go +++ b/misc/ssh/session.go @@ -59,21 +59,14 @@ const SESSION = "session" func init() { psh.Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ - SESSION: {Name: SESSION, Help: "会话", Value: kit.Data( - mdb.FIELD, "time,hash,status,count,connect", - )}, + SESSION: {Name: SESSION, Help: "会话", Value: kit.Data(mdb.SHORT, "name", mdb.FIELD, "time,name,status,count,connect")}, }, Commands: map[string]*ice.Command{ - SESSION: {Name: "session hash id auto", Help: "会话", Action: ice.MergeAction(map[string]*ice.Action{ - ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - m.Richs(SESSION, "", mdb.FOREACH, func(key string, value map[string]interface{}) { - kit.Value(value, kit.Keym(mdb.STATUS), tcp.CLOSE) - }) - }}, + SESSION: {Name: "session name id auto", Help: "会话", Action: ice.MergeAction(map[string]*ice.Action{ mdb.REPEAT: {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SESSION, ctx.ACTION, ctx.COMMAND, CMD, m.Option(mdb.TEXT)) }}, ctx.COMMAND: {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - m.Richs(SESSION, "", m.Option(mdb.HASH), func(key string, value map[string]interface{}) { + m.Richs(SESSION, "", m.Option(mdb.NAME), func(key string, value map[string]interface{}) { if w, ok := kit.Value(value, kit.Keym(INPUT)).(io.Writer); ok { m.Grow(SESSION, kit.Keys(mdb.HASH, key), kit.Dict(mdb.TYPE, CMD, mdb.TEXT, m.Option(CMD))) w.Write([]byte(m.Option(CMD) + ice.NL)) @@ -81,20 +74,18 @@ func init() { }) m.ProcessRefresh300ms() }}, - }, mdb.HashActionStatus()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { - m.Action(mdb.PRUNES) - mdb.HashSelect(m, arg...) - m.Set(ice.MSG_APPEND, ctx.ACTION) - m.Table(func(index int, value map[string]string, head []string) { + mdb.HashSelect(m, arg...).Table(func(index int, value map[string]string, head []string) { m.PushButton(kit.Select("", ctx.COMMAND, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) }) return } - m.Action(ctx.COMMAND) - m.Fields(len(arg[1:]), "time,id,type,text") - mdb.ZoneSelect(m, arg...).Table(func(index int, value map[string]string, head []string) { + m.Action(ctx.COMMAND, mdb.PAGE) + m.OptionPage(kit.Slice(arg, 2)...) + m.Fields(len(kit.Slice(arg, 1, 2)), "time,id,type,text") + mdb.ZoneSelect(m, kit.Slice(arg, 0, 2)...).Table(func(index int, value map[string]string, head []string) { m.PushButton(kit.Select("", mdb.REPEAT, value[mdb.TYPE] == CMD)) }) }}, diff --git a/option.go b/option.go index 15ecaeda..91f43e40 100644 --- a/option.go +++ b/option.go @@ -25,9 +25,11 @@ func (m *Message) OptionFields(arg ...string) string { return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS))) } func (m *Message) OptionPage(arg ...string) { - m.Option(CACHE_LIMIT, kit.Select("10", arg, 0)) - m.Option(CACHE_OFFEND, kit.Select("0", arg, 1)) + m.Option(CACHE_LIMIT, kit.Select("", arg, 0)) + m.Option(CACHE_OFFEND, kit.Select("", arg, 1)) m.Option(CACHE_FILTER, kit.Select("", arg, 2)) + m.Option("offend", kit.Select("", arg, 1)) + m.Option("limit", kit.Select("", arg, 0)) } func (m *Message) OptionLoad(file string) *Message { if f, e := os.Open(file); e == nil { diff --git a/render.go b/render.go index 6b67d9bd..cb89bf59 100644 --- a/render.go +++ b/render.go @@ -119,6 +119,18 @@ func (m *Message) PushAnchor(arg ...interface{}) { // [name] link } } func (m *Message) PushButton(arg ...interface{}) { // name... + if m.FieldsIsDetail() { + for i, k := range m.meta["key"] { + if k == "action" { + m.meta["value"][i] = Render(m, RENDER_BUTTON, arg...) + return + } + } + } + if len(m.meta["action"]) >= m.Length() { + m.meta["action"] = []string{} + } + if !m.IsCliUA() { m.Push(ACTION, Render(m, RENDER_BUTTON, arg...)) }