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...))
}