From b346bd01d072226e6fc0cc44bad5d2b4213bbe94 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Fri, 16 Jul 2021 16:59:11 +0800 Subject: [PATCH] opt bash --- base/aaa/sess.go | 4 ++ base/cli/daemon.go | 1 + base/cli/system.go | 11 +++++ base/mdb/mdb.go | 25 ++++++---- base/tcp/client.go | 2 +- base/web/serve.go | 10 ++-- conf.go | 1 + core/chat/files.go | 16 +++---- core/chat/river.go | 2 +- core/code/publish.go | 3 ++ logs.go | 13 +++--- misc.go | 43 +++++++++++++---- misc/bash/bash.go | 10 ++-- misc/bash/bash.shy | 7 +-- misc/bash/download.go | 2 +- misc/bash/favor.go | 105 ++++++++++++++++++++---------------------- misc/bash/input.go | 4 -- misc/bash/sess.go | 78 ++++++++++++++++--------------- misc/bash/sync.go | 77 ++++++++++++++++--------------- misc/bash/trash.go | 42 ++++++++--------- type.go | 2 +- 21 files changed, 250 insertions(+), 208 deletions(-) diff --git a/base/aaa/sess.go b/base/aaa/sess.go index 369bf37b..abec4063 100644 --- a/base/aaa/sess.go +++ b/base/aaa/sess.go @@ -57,6 +57,10 @@ const ( IP = "ip" UA = "ua" ) +const ( + LOGIN = "login" + LOGOUT = "logout" +) const ( SESS_CREATE = "sess.create" ) diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 165d3bb0..7481367e 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -68,6 +68,7 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) { const ( PID = "pid" + PWD = "pwd" DIR = "dir" ENV = "env" CMD = "cmd" diff --git a/base/cli/system.go b/base/cli/system.go index a9ee517d..57cc8bb2 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -9,6 +9,7 @@ import ( "strings" ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" ) @@ -48,6 +49,16 @@ func _system_show(m *ice.Message, cmd *exec.Cmd) { m.Push(kit.MDB_TIME, m.Time()) m.Push(CMD_CODE, int(cmd.ProcessState.ExitCode())) } +func SystemProcess(m *ice.Message, text string, arg ...string) { + if len(arg) > 0 && arg[0] == RUN { + m.Cmdy(SYSTEM, arg[1:]) + return + } + + m.Cmdy(ctx.COMMAND, SYSTEM) + m.ProcessField(SYSTEM, RUN) + m.Push(ARG, kit.Split(text)) +} const ( CMD_DIR = "cmd_dir" diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 8aa19353..0f4a5d62 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -201,23 +201,21 @@ func _list_export(m *ice.Message, prefix, chain, file string) { count := 0 head := kit.Split(m.Option(FIELDS)) m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { - val = kit.GetMeta(val) - - if index == 0 && len(head) == 0 { - // 输出表头 - for k := range val { - head = append(head, k) + if val = kit.GetMeta(val); index == 0 { + if len(head) == 0 { // 默认表头 + for k := range val { + head = append(head, k) + } + sort.Strings(head) } - sort.Strings(head) - w.Write(head) + w.Write(head) // 输出表头 } - // 输出数据 data := []string{} for _, k := range head { data = append(data, kit.Format(val[k])) } - w.Write(data) + w.Write(data) // 输出数据 count++ }) @@ -416,6 +414,9 @@ const ( REVERT = "revert" REPEAT = "repeat" UPLOAD = "upload" + + NEXT = "next" + PREV = "prev" ) const ( CACHE_LIMIT = "cache.limit" @@ -462,6 +463,8 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* }}, DELETE: {Name: "delete key sub type field value", Help: "删除", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { + case ZONE: + _hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4]) case HASH: _hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4]) case LIST: @@ -470,6 +473,8 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* }}, MODIFY: {Name: "modify key sub type field value arg...", Help: "编辑", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { + case ZONE: + _list_modify(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.SubKey(arg[3]))), kit.MDB_ID, arg[4], arg[5:]...) case HASH: _hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...) case LIST: diff --git a/base/tcp/client.go b/base/tcp/client.go index 6f696344..122d1912 100644 --- a/base/tcp/client.go +++ b/base/tcp/client.go @@ -31,7 +31,7 @@ func (c *Conn) Write(b []byte) (int, error) { return n, e } func (c *Conn) Close() error { - c.m.Cmd(mdb.MODIFY, CLIENT, "", mdb.HASH, kit.MDB_HASH, c.h, kit.MDB_STATUS, CLOSE, "nread", c.s.nr, "nwrite", c.s.nw) + // c.m.Cmd(mdb.MODIFY, CLIENT, "", mdb.HASH, kit.MDB_HASH, c.h, kit.MDB_STATUS, CLOSE, "nread", c.s.nr, "nwrite", c.s.nw) return c.Conn.Close() } diff --git a/base/web/serve.go b/base/web/serve.go index 16b2350b..1660e35b 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -124,9 +124,11 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon // 请求参数 for k, v := range r.Form { if r.Header.Get(ContentType) != ContentJSON { - // for i, p := range v { - // // v[i], _ = url.QueryUnescape(p) - // } + if msg.IsCliUA() { + for i, p := range v { + v[i], _ = url.QueryUnescape(p) + } + } } if msg.Optionv(k, v); k == ice.MSG_SESSID { RenderCookie(msg, v[0]) @@ -168,7 +170,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { // 权限检查 msg.Target().Cmd(msg, WEB_LOGIN, r.URL.Path, cmds...) - return cmds, msg.Result() != "false" + return cmds, msg.Result(0) != ice.ErrWarn && msg.Result() != ice.FALSE } if ls := strings.Split(r.URL.Path, "/"); msg.Conf(SERVE, kit.Keym(aaa.BLACK, ls[1])) == "true" { diff --git a/conf.go b/conf.go index 0e93d6a7..f04596e3 100644 --- a/conf.go +++ b/conf.go @@ -25,6 +25,7 @@ const ( // REPOS SUCCESS = "success" FAILURE = "failure" + FALSE = "false" TRUE = "true" OK = "ok" ) diff --git a/core/chat/files.go b/core/chat/files.go index 32baca5d..bd738e31 100644 --- a/core/chat/files.go +++ b/core/chat/files.go @@ -18,20 +18,20 @@ func init() { FILES: {Name: "files hash auto upload", Help: "文件夹", Action: map[string]*ice.Action{ web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) - m.Cmdy(mdb.INSERT, FILES, "", mdb.HASH, kit.MDB_NAME, up[1], kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_DATA, up[0], kit.MDB_SIZE, up[2]) + m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_NAME, up[1], kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_DATA, up[0], kit.MDB_SIZE, up[2]) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, FILES, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + m.Cmdy(mdb.DELETE, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select("time,size,type,name,data", mdb.DETAIL, len(arg) > 0)) - m.Cmd(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg).Table(func(index int, value map[string]string, head []string) { - m.Push("", value, kit.Split(kit.Select("time,size,type,name", "time,size,type,name", len(arg) > 0))) - - if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], "/share/cache/"+value[kit.MDB_DATA]); len(arg) > 0 { + m.Fields(len(arg) == 0, "time,size,type,name,hash") + m.Cmd(mdb.SELECT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, arg).Table(func(index int, value map[string]string, head []string) { + link := kit.MergeURL("/share/cache/"+value[kit.MDB_DATA], "pod", m.Option(ice.MSG_USERPOD)) + m.Push("", value, kit.Split(m.Option(ice.MSG_FIELDS))) + if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 { switch { case kit.ExtIsImage(value[kit.MDB_NAME]): - m.PushImages(kit.MDB_IMAGE, "/share/cache/"+value[kit.MDB_DATA]) + m.PushImages(kit.MDB_IMAGE, link) } } }) diff --git a/core/chat/river.go b/core/chat/river.go index 7158fc5d..a86d1d2a 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -309,7 +309,7 @@ func init() { m.Cmdy(mdb.IMPORT, RIVER, "", mdb.HASH) }}, aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { - for _, k := range []string{"tmux", "base", "miss", "binary", "source"} { + for _, k := range []string{"tmux", "base", "miss", "binary", "source", "module"} { m.Cmdy("web.code.publish", "contexts", k) } }}, diff --git a/core/code/publish.go b/core/code/publish.go index b73d3564..3d4bca07 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -148,6 +148,9 @@ echo "hello world" } var _contexts = kit.Dict( + "module", `# 创建模块 +export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp; source $ctx_temp module +`, "source", `# 源码安装 export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp; source $ctx_temp source `, diff --git a/logs.go b/logs.go index 9e1072cb..63e68fb2 100644 --- a/logs.go +++ b/logs.go @@ -88,14 +88,13 @@ func (m *Message) Cost(arg ...interface{}) *Message { return m.log(LOG_COST, strings.Join(list, " ")) } func (m *Message) Warn(err bool, arg ...interface{}) bool { - if err { - list := kit.Simple(arg...) - if len(list) > 1 || len(m.meta[MSG_RESULT]) > 0 && m.meta[MSG_RESULT][0] != ErrWarn { - m.meta[MSG_RESULT] = append([]string{ErrWarn}, list...) - } - return m.log(LOG_WARN, fmt.Sprint(arg...)) != nil + if !err || len(m.meta[MSG_RESULT]) > 0 && m.meta[MSG_RESULT][0] == ErrWarn { + return err } - return false + + m.meta[MSG_RESULT] = kit.Simple(ErrWarn, arg) + m.log(LOG_WARN, fmt.Sprint(arg...)) + return err } func (m *Message) Error(err bool, str string, arg ...interface{}) bool { if err { diff --git a/misc.go b/misc.go index c87cdf37..d4ebfe84 100644 --- a/misc.go +++ b/misc.go @@ -189,19 +189,19 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message { return m.Push(key, Render(m, view, name, arg)) } func (m *Message) PushDownload(key string, arg ...interface{}) { // [name] file - m.Push(key, Render(m, RENDER_DOWNLOAD, arg...)) + if !m.IsCliUA() { + m.Push(key, Render(m, RENDER_DOWNLOAD, arg...)) + } } func (m *Message) PushAnchor(arg ...interface{}) { // [name] link - if m.IsCliUA() { - return + if !m.IsCliUA() { + m.Push(kit.MDB_LINK, Render(m, RENDER_ANCHOR, arg...)) } - m.Push(kit.MDB_LINK, Render(m, RENDER_ANCHOR, arg...)) } func (m *Message) PushButton(arg ...string) { - if m.IsCliUA() { - return + if !m.IsCliUA() { + m.Push(kit.MDB_ACTION, Render(m, RENDER_BUTTON, strings.Join(arg, ","))) } - m.Push(kit.MDB_ACTION, Render(m, RENDER_BUTTON, strings.Join(arg, ","))) } func (m *Message) PushScript(arg ...string) *Message { // [type] text... return m.Push(kit.MDB_SCRIPT, Render(m, RENDER_SCRIPT, arg)) @@ -257,9 +257,19 @@ type Option struct { Value interface{} } -func OptionFields(str string) Option { return Option{MSG_FIELDS, str} } -func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} } -func (m *Message) OptionFields(str string) { m.Option(MSG_FIELDS, str) } +func (m *Message) OptionSimple(key ...string) (res []string) { + for _, k := range strings.Split(strings.Join(key, ","), ",") { + res = append(res, k, m.Option(k)) + } + return +} +func OptionFields(str ...string) Option { return Option{MSG_FIELDS, strings.Join(str, ",")} } +func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} } +func (m *Message) OptionFields(str ...string) { m.Option(MSG_FIELDS, strings.Join(str, ",")) } +func (m *Message) OptionPage(arg ...string) { + m.Option("cache.offend", kit.Select("0", arg, 1)) + m.Option("cache.limit", kit.Select("10", arg, 0)) +} func (m *Message) OptionLoad(file string) *Message { if f, e := os.Open(file); e == nil { defer f.Close() @@ -350,6 +360,19 @@ func (m *Message) ProcessRefresh(delay string) { func (m *Message) ProcessRefresh30ms() { m.ProcessRefresh("30ms") } func (m *Message) ProcessRefresh300ms() { m.ProcessRefresh("300ms") } func (m *Message) ProcessRefresh3s() { m.ProcessRefresh("3s") } +func (m *Message) ProcessCommand(cmd, val string, arg ...string) { + if len(arg) > 0 && arg[0] == "run" { + m.Cmdy(cmd, arg[1:]) + return + } + + m.Cmdy("command", cmd) + m.ProcessField(cmd, "run") + m.Push("arg", kit.Format(kit.Split(val))) +} +func (m *Message) ProcessCommandOpt(arg ...string) { + m.Push("opt", kit.Format(m.OptionSimple(arg...))) +} func (m *Message) ProcessField(arg ...interface{}) { m.Process(PROCESS_FIELD) m.Option("_prefix", arg...) diff --git a/misc/bash/bash.go b/misc/bash/bash.go index 13294275..48145714 100644 --- a/misc/bash/bash.go +++ b/misc/bash/bash.go @@ -15,7 +15,7 @@ const BASH = "bash" var Index = &ice.Context{Name: BASH, Help: "命令行", Configs: map[string]*ice.Config{ BASH: {Name: BASH, Help: "命令行", Value: kit.Data( - kit.SSH_SOURCE, "http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz", + cli.SOURCE, "http://mirrors.aliyun.com/gnu/bash/bash-4.4.18.tar.gz", )}, }, Commands: map[string]*ice.Command{ @@ -24,16 +24,16 @@ var Index = &ice.Context{Name: BASH, Help: "命令行", BASH: {Name: "bash port path auto start build download", Help: "命令行", Action: map[string]*ice.Action{ web.DOWNLOAD: {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.INSTALL, web.DOWNLOAD, m.Conf(BASH, kit.META_SOURCE)) + m.Cmdy(code.INSTALL, web.DOWNLOAD, m.Conf(BASH, kit.Keym(cli.SOURCE))) }}, cli.BUILD: {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.INSTALL, cli.BUILD, m.Conf(BASH, kit.META_SOURCE)) + m.Cmdy(code.INSTALL, cli.BUILD, m.Conf(BASH, kit.Keym(cli.SOURCE))) }}, cli.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.INSTALL, cli.START, m.Conf(BASH, kit.META_SOURCE), "bin/bash") + m.Cmdy(code.INSTALL, cli.START, m.Conf(BASH, kit.Keym(cli.SOURCE)), "bin/bash") }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(code.INSTALL, path.Base(m.Conf(BASH, kit.META_SOURCE)), arg) + m.Cmdy(code.INSTALL, path.Base(m.Conf(BASH, kit.Keym(cli.SOURCE))), arg) }}, }, } diff --git a/misc/bash/bash.shy b/misc/bash/bash.shy index 5404c98b..528cd0cf 100644 --- a/misc/bash/bash.shy +++ b/misc/bash/bash.shy @@ -7,15 +7,15 @@ refer ` chapter "源码" field "bash" web.code.bash.bash -field "bash" web.code.inner args `usr/install/bash-4.2.53/ input.c 625` +field "bash" web.code.inner args `usr/install/bash-4.4.18/ input.c 636` section "构建" spark shell ` yum install -y wget make gcc yum install -y byacc.x86_64 -wget http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz -tar xvf bash-4.2.53.tar.gz && cd bash-4.2.53 +wget https://mirrors.aliyun.com/gnu/bash/bash-4.4.18.tar.gz +tar xvf bash-4.4.18.tar.gz && cd bash-4.4.18 ./configure --prefix=$PWD/_install make -j8 && make install @@ -32,4 +32,5 @@ field "会话流" web.code.bash.sess field "同步流" web.code.bash.sync field "收藏夹" web.code.bash.favor field "回收站" web.code.bash.trash +field "文件夹" web.chat.files diff --git a/misc/bash/download.go b/misc/bash/download.go index 33fb505a..d7c6103e 100644 --- a/misc/bash/download.go +++ b/misc/bash/download.go @@ -20,7 +20,7 @@ func init() { m.Render(kit.Select(ice.RENDER_DOWNLOAD, ice.RENDER_RESULT, m.Append(kit.MDB_FILE) == ""), m.Append(kit.MDB_TEXT)) }}, "/upload": {Name: "/upload", Help: "上传", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - // 缓存文件 + // 上传文件 msg := m.Cmd(web.CACHE, web.UPLOAD) m.Option(ice.MSG_UPLOAD, msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME), msg.Append(kit.MDB_SIZE)) m.Cmd(chat.FILES, web.UPLOAD) diff --git a/misc/bash/favor.go b/misc/bash/favor.go index 88c06151..eb7b095d 100644 --- a/misc/bash/favor.go +++ b/misc/bash/favor.go @@ -13,72 +13,65 @@ func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_TOPIC, kit.MDB_FIELD, "time,id,type,name,text", + kit.MDB_SHORT, kit.MDB_ZONE, kit.MDB_FIELD, "time,id,type,name,text,pwd,username,hostname", )}, }, Commands: map[string]*ice.Command{ - FAVOR: {Name: "favor topic id auto create export import", Help: "收藏夹", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) - }}, - mdb.INSERT: {Name: "insert topic=系统命令 type=shell name=1 text=pwd pwd=/home", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC)) - m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.SubKey(m.Option(kit.MDB_TOPIC)), mdb.LIST, arg[2:]) - }}, - mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), kit.SubKey(m.Option(kit.MDB_TOPIC)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.HASH, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC)) - }}, - mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.EXPORT, m.Prefix(FAVOR), "", mdb.HASH) - }}, - mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.IMPORT, m.Prefix(FAVOR), "", mdb.HASH) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch arg[0] { - case kit.MDB_TOPIC: - m.Cmdy(mdb.INPUTS, m.Prefix(FAVOR), "", mdb.HASH, arg) - default: - m.Cmdy(mdb.INPUTS, m.Prefix(FAVOR), kit.SubKey(m.Option(kit.MDB_TOPIC)), mdb.LIST, arg) - } - }}, - cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - if len(arg) > 0 && arg[0] == cli.RUN { - m.Cmdy(cli.SYSTEM, arg[1:]) - return - } - - m.ShowPlugin("", cli.SYSTEM, cli.RUN) - m.Push(kit.SSH_ARG, kit.Split(m.Option(kit.MDB_TEXT))) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 { - m.Option(mdb.FIELDS, "time,count,topic") - m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH) - m.PushAction(mdb.REMOVE) - return - } - - m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(FAVOR), kit.META_FIELD), mdb.DETAIL, len(arg) > 1)) - m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), kit.SubKey(arg[0]), mdb.LIST, kit.MDB_ID, arg[1:]) - m.PushAction(cli.SYSTEM) - }}, - "/favor": {Name: "/favor", Help: "收藏", Action: map[string]*ice.Action{ - mdb.EXPORT: {Name: "export tab note", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + mdb.EXPORT: {Name: "export zone name", Help: "导出", Hand: func(m *ice.Message, arg ...string) { m.Echo("#!/bin/sh\n\n") - m.Cmdy(m.Prefix(FAVOR), m.Option("tab")).Table(func(index int, value map[string]string, head []string) { - // 查看收藏 - if m.Option("note") == "" || m.Option("note") == value[kit.MDB_NAME] { + m.Cmdy(FAVOR, m.Option(kit.MDB_ZONE)).Table(func(index int, value map[string]string, head []string) { + if m.Option(kit.MDB_NAME) == "" || m.Option(kit.MDB_NAME) == value[kit.MDB_NAME] { m.Echo("# %v\n%v\n\n", value[kit.MDB_NAME], value[kit.MDB_TEXT]) } }) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(m.Prefix(FAVOR)).Table() + m.Cmdy(FAVOR).Table() + }}, + FAVOR: {Name: "favor zone id auto", Help: "收藏夹", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) + }}, + mdb.INSERT: {Name: "insert zone=系统命令 type=shell name=1 text=pwd pwd=/home", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:]) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), "", mdb.ZONE, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.ZONE, m.OptionSimple(kit.MDB_ZONE)) + }}, + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(kit.MDB_ZONE, m.Conf(FAVOR, kit.META_FIELD)) + m.Cmdy(mdb.EXPORT, m.Prefix(FAVOR), "", mdb.ZONE) + m.Conf(FAVOR, kit.MDB_HASH, "") + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(FAVOR), "", mdb.ZONE) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case kit.MDB_ZONE: + m.Cmdy(mdb.INPUTS, m.Prefix(FAVOR), "", mdb.HASH, arg) + default: + m.Cmdy(mdb.INPUTS, m.Prefix(FAVOR), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.LIST, arg) + } + }}, + cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + m.Option(cli.CMD_DIR, m.Option(cli.PWD)) + m.ProcessCommand(cli.SYSTEM, m.Option(kit.MDB_TEXT), arg...) + m.ProcessCommandOpt(cli.PWD) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Fields(len(arg) < 2, kit.Select(m.Conf(FAVOR, kit.META_FIELD), "time,zone,count", len(arg) == 0)) + if m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.ZONE, arg); len(arg) == 0 { + m.Action(mdb.CREATE, mdb.EXPORT, mdb.IMPORT) + m.PushAction(mdb.REMOVE) + } else { + m.PushAction(cli.SYSTEM) + } }}, }, }) diff --git a/misc/bash/input.go b/misc/bash/input.go index f4311f0f..2e1d79ac 100644 --- a/misc/bash/input.go +++ b/misc/bash/input.go @@ -2,7 +2,6 @@ package bash import ( ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/cli" kit "github.com/shylinux/toolkits" "strings" @@ -12,9 +11,6 @@ import ( func init() { Index.Merge(&ice.Context{ Commands: map[string]*ice.Command{ - "/qrcode": {Name: "/qrcode", Help: "二维码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(cli.QRCODE, m.Option(kit.MDB_TEXT)) - }}, "/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { list := kit.Split(m.Option("line"), m.Option("break")) word := list[kit.Int(m.Option("index"))] diff --git a/misc/bash/sess.go b/misc/bash/sess.go index 6bdbc046..3ca4586c 100644 --- a/misc/bash/sess.go +++ b/misc/bash/sess.go @@ -1,27 +1,22 @@ package bash import ( + "io/ioutil" + "strings" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" + "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - - "io/ioutil" - "strings" ) const ( SID = "sid" ARG = "arg" SUB = "sub" - PWD = "pwd" - PID = "pid" -) -const ( - LOGIN = "login" - LOGOUT = "logout" ) const SESS = "sess" @@ -33,50 +28,59 @@ func init() { )}, }, Commands: map[string]*ice.Command{ - SESS: {Name: "sess hash auto prunes", Help: "会话流", Action: map[string]*ice.Action{ - mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { - m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) - m.Cmdy(mdb.PRUNES, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, LOGOUT) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(SESS), kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) - m.Cmdy(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, arg) - }}, - web.WEB_LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if f, _, e := m.R.FormFile(SUB); e == nil { defer f.Close() - // 文件参数 if b, e := ioutil.ReadAll(f); e == nil { - m.Option(SUB, string(b)) + m.Option(SUB, string(b)) // 文件参数 } } - if strings.TrimSpace(m.Option(SID)) != "" { - m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) - msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, strings.TrimSpace(m.Option(SID))) - - // 用户信息 - if m.Option(SID, msg.Append(kit.MDB_HASH)) != "" { - m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME)) - m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) - } + switch m.Render(ice.RENDER_RESULT); m.R.URL.String() { + case "/qrcode", "/sess": // 登录入口 + return } - m.Render(ice.RENDER_RESULT) + + if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin) { + return + } + + msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), + ice.OptionFields(m.Conf(SESS, kit.META_FIELD))) + m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME)) + m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) + m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin) + }}, + "/qrcode": {Name: "/qrcode", Help: "二维码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy(cli.QRCODE, m.Option(kit.MDB_TEXT), m.Option(cli.FG), m.Option(cli.BG)) }}, "/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{ - LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, LOGOUT) + aaa.LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, aaa.LOGOUT) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if strings.TrimSpace(m.Option(SID)) == "" { - m.Option(SID, m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, LOGIN, - aaa.USERNAME, m.Option(aaa.USERNAME), tcp.HOSTNAME, m.Option(tcp.HOSTNAME), PID, m.Option(PID), PWD, m.Option(PWD))) + if m.Option(SID) == "" { + m.Option(SID, m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, aaa.LOGIN, + m.OptionSimple(aaa.USERNAME, tcp.HOSTNAME, cli.PID, cli.PWD))) } else { - m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, LOGIN) + m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, aaa.LOGIN) } m.Echo(m.Option(SID)) }}, + SESS: {Name: "sess hash auto prunes", Help: "会话流", Action: map[string]*ice.Action{ + mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(m.Conf(SESS, kit.META_FIELD)) + m.Cmdy(mdb.PRUNES, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, aaa.LOGOUT) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(m.Conf(SESS, kit.META_FIELD)) + m.Cmdy(mdb.DELETE, m.Prefix(SESS), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH)) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Fields(len(arg) == 0, m.Conf(SESS, kit.META_FIELD)) + m.Cmdy(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, arg) + m.PushAction(mdb.REMOVE) + }}, }, }) } diff --git a/misc/bash/sync.go b/misc/bash/sync.go index fcac2dec..3235d19f 100644 --- a/misc/bash/sync.go +++ b/misc/bash/sync.go @@ -1,16 +1,22 @@ package bash import ( + "strings" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/tcp" kit "github.com/shylinux/toolkits" - - "strings" ) +const _sync_index = 1 + +func _sync_count(m *ice.Message) string { + return m.Conf(SYNC, kit.Keym(kit.MDB_COUNT)) +} + const ( SHELL = "shell" HISTORY = "history" @@ -21,12 +27,33 @@ func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,id,type,name,text", + kit.MDB_FIELD, "time,id,type,name,text,pwd,username,hostname", )}, }, Commands: map[string]*ice.Command{ - SYNC: {Name: "sync id auto export import", Help: "同步流", Action: map[string]*ice.Action{ + "/sync": {Name: "/sync", Help: "同步", Action: map[string]*ice.Action{ + HISTORY: {Name: "history", Help: "历史", Hand: func(m *ice.Message, arg ...string) { + ls := strings.SplitN(strings.TrimSpace(m.Option(ARG)), " ", 4) + if text := strings.TrimSpace(strings.Join(ls[3:], " ")); text != "" { + m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TIME, ls[1]+" "+ls[2], + kit.MDB_TYPE, SHELL, kit.MDB_NAME, ls[0], kit.MDB_TEXT, text, + m.OptionSimple(cli.PWD, aaa.USERNAME, tcp.HOSTNAME, tcp.HOSTNAME)) + + } + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0], + kit.MDB_TEXT, m.Option(SUB), m.OptionSimple(cli.PWD)) + }}, + SYNC: {Name: "sync id auto page export import", Help: "同步流", Action: map[string]*ice.Action{ + mdb.PREV: {Name: "prev", Help: "上一页", Hand: func(m *ice.Message, arg ...string) { + mdb.PrevPage(m, _sync_count(m), kit.Slice(arg, _sync_index)...) + }}, + mdb.NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) { + mdb.NextPage(m, _sync_count(m), kit.Slice(arg, _sync_index)...) + }}, mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.OptionFields(m.Conf(SYNC, kit.META_FIELD)) m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { @@ -34,46 +61,24 @@ func init() { }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { switch arg[0] { - case kit.MDB_TOPIC: + case kit.MDB_ZONE: m.Cmdy(FAVOR, mdb.INPUTS, arg) } }}, cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - if len(arg) > 0 && arg[0] == cli.RUN { - m.Cmdy(cli.SYSTEM, arg[1:]) - return - } - - m.ShowPlugin("", cli.SYSTEM, cli.RUN) - m.Push(cli.ARG, kit.Format(kit.Simple(kit.Split(m.Option(kit.MDB_TEXT))))) + m.Option(cli.CMD_DIR, m.Option(cli.PWD)) + m.ProcessCommand(cli.SYSTEM, m.Option(kit.MDB_TEXT), arg...) + m.ProcessCommandOpt(cli.PWD) }}, - FAVOR: {Name: "favor topic=some@key type name text", Help: "收藏", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(m.Prefix(FAVOR), mdb.INSERT, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC), - kit.MDB_TYPE, m.Option(kit.MDB_TYPE), kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) + FAVOR: {Name: "favor zone=some@key type name text pwd", Help: "收藏", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(FAVOR, mdb.INSERT, m.OptionSimple(kit.MDB_ZONE, m.Conf(FAVOR, kit.META_FIELD))) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 { - m.Option(mdb.FIELDS, mdb.DETAIL) - } else { - m.Option(mdb.FIELDS, m.Conf(SYNC, kit.META_FIELD)) - defer m.PushAction(cli.SYSTEM, FAVOR) - } - + m.OptionPage(kit.Slice(arg, _sync_index)...) + m.Fields(len(arg) == 0 || arg[0] == "", m.Conf(SYNC, kit.META_FIELD)) m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg) - }}, - "/sync": {Name: "/sync", Help: "同步", Action: map[string]*ice.Action{ - HISTORY: {Name: "history", Help: "历史", Hand: func(m *ice.Message, arg ...string) { - ls := strings.SplitN(strings.TrimSpace(m.Option(ARG)), " ", 4) - if text := strings.TrimSpace(strings.Join(ls[3:], " ")); text != "" { - m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, ls[0], - tcp.HOSTNAME, m.Option(tcp.HOSTNAME), aaa.USERNAME, m.Option(aaa.USERNAME), - kit.MDB_TEXT, text, PWD, m.Option(PWD), kit.MDB_TIME, ls[1]+" "+ls[2]) - - } - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0], - kit.MDB_TEXT, m.Option(SUB), PWD, m.Option(PWD)) + m.PushAction(cli.SYSTEM, FAVOR) + m.StatusTimeCountTotal(_sync_count(m)) }}, }, }) diff --git a/misc/bash/trash.go b/misc/bash/trash.go index 755b384f..6db91dd8 100644 --- a/misc/bash/trash.go +++ b/misc/bash/trash.go @@ -2,6 +2,7 @@ package bash import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/nfs" @@ -19,45 +20,38 @@ func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ TRASH: {Name: TRASH, Help: "回收站", Value: kit.Data( - kit.MDB_FIELD, "time,hash,hostname,size,from,to", + kit.MDB_FIELD, "time,hash,username,hostname,size,from,to", )}, }, Commands: map[string]*ice.Command{ + "/trash": {Name: "/trash", Help: "回收", Action: map[string]*ice.Action{ + mdb.INSERT: {Name: "insert from to", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(TRASH, mdb.INSERT, arg) + }}, + }}, TRASH: {Name: "TRASH hash path auto prunes", Help: "回收站", Action: map[string]*ice.Action{ mdb.INSERT: {Name: "insert from= to=", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(TRASH), "", mdb.HASH, FROM, m.Option(FROM), TO, m.Option(TO)) + m.Cmdy(mdb.INSERT, m.Prefix(TRASH), "", mdb.HASH, m.OptionSimple(aaa.USERNAME, tcp.HOSTNAME, kit.MDB_SIZE, FROM, TO)) + }}, + mdb.REVERT: {Name: "revert", Help: "恢复", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(cli.SYSTEM, "mv", m.Option(TO), m.Option(FROM)) + m.Cmdy(mdb.DELETE, m.Prefix(TRASH), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH)) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(cli.SYSTEM, "rm", "-rf", m.Option(TO)) - m.Cmdy(mdb.DELETE, m.Prefix(TRASH), "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + m.Cmdy(mdb.DELETE, m.Prefix(TRASH), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH)) }}, mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { }}, - "reback": {Name: "reback", Help: "恢复", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(cli.SYSTEM, "mv", m.Option(TO), m.Option(FROM)) - m.Cmdy(mdb.DELETE, m.Prefix(TRASH), "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) - }}, nfs.DIR: {Name: "dir", Help: "目录", Hand: func(m *ice.Message, arg ...string) { - if len(arg) > 0 && arg[0] == cli.RUN { - m.Option(nfs.DIR_ROOT, m.Option(TO)) - m.Cmdy(nfs.DIR, kit.Select("", arg, 1)) - return - } - m.ShowPlugin("", nfs.DIR, cli.RUN) + m.Option(nfs.DIR_ROOT, m.Option(TO)) + m.ProcessCommand(nfs.DIR, "", arg...) + m.ProcessCommandOpt(TO) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(TRASH), kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) + m.Fields(len(arg) == 0, m.Conf(TRASH, kit.META_FIELD)) m.Cmdy(mdb.SELECT, m.Prefix(TRASH), "", mdb.HASH, kit.MDB_HASH, arg) - m.PushAction(nfs.DIR, "reback", mdb.REMOVE) - }}, - - "/trash": {Name: "/trash", Help: "回收", Action: map[string]*ice.Action{ - mdb.INSERT: {Name: "insert from to", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(TRASH), "", mdb.HASH, tcp.HOSTNAME, m.Option(tcp.HOSTNAME), - kit.MDB_SIZE, m.Option(kit.MDB_SIZE), FROM, m.Option(FROM), TO, m.Option(TO)) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - + m.PushAction(nfs.DIR, mdb.REVERT, mdb.REMOVE) }}, }, }) diff --git a/type.go b/type.go index 17cfd961..640a12b1 100644 --- a/type.go +++ b/type.go @@ -128,7 +128,7 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess } m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, - kit.Select(kit.FileLine(cmd.Hand, 3), kit.FileLine(8, 3), m.target.Name == "mdb")) + kit.Select(kit.FileLine(cmd.Hand, 3), kit.FileLine(9, 3), m.target.Name == "mdb")) cmd.Hand(m, c, key, arg...) return m }