1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
This commit is contained in:
harveyshao 2022-04-02 15:21:16 +08:00
parent 0c6bb3d2c2
commit 25e0f9b050
13 changed files with 112 additions and 67 deletions

View File

@ -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))

View File

@ -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) {
}},

View File

@ -132,6 +132,7 @@ func init() {
return
}
_config_make(m, arg[0], arg[1:]...)
m.DisplayStoryJSON()
}},
}})
}

View File

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

View File

@ -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 {

View File

@ -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)

View File

@ -32,7 +32,7 @@ func init() {
}},
}, Configs: map[string]*ice.Config{
REFER: {Name: REFER, Help: "参考", Value: kit.Data(
nfs.TEMPLATE, `<ul {{.OptionTemplate}}>{{range $index, $value := .Optionv "list"}}<li>{{index $value 0}}: <a href="{{index $value 1}}" target="_blank">{{index $value 1}}</a></li>{{end}}</ul>`,
nfs.TEMPLATE, `<ul {{.OptionTemplate}}>{{range $index, $value := .Optionv "list"}}<li>{{index $value 0}}: <a href="{{index $value 1}}" data-name="{{index $value 0}}" target="_blank">{{index $value 1}}</a></li>{{end}}</ul>`,
)},
}})
}

View File

@ -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])

View File

@ -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)

View File

@ -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)
}
}},
}})

View File

@ -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))
})
}},

View File

@ -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 {

View File

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