1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 17:44:05 +08:00
This commit is contained in:
harveyshao 2021-07-16 16:59:11 +08:00
parent 0ad239fbcb
commit b346bd01d0
21 changed files with 250 additions and 208 deletions

View File

@ -57,6 +57,10 @@ const (
IP = "ip" IP = "ip"
UA = "ua" UA = "ua"
) )
const (
LOGIN = "login"
LOGOUT = "logout"
)
const ( const (
SESS_CREATE = "sess.create" SESS_CREATE = "sess.create"
) )

View File

@ -68,6 +68,7 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
const ( const (
PID = "pid" PID = "pid"
PWD = "pwd"
DIR = "dir" DIR = "dir"
ENV = "env" ENV = "env"
CMD = "cmd" CMD = "cmd"

View File

@ -9,6 +9,7 @@ import (
"strings" "strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" 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(kit.MDB_TIME, m.Time())
m.Push(CMD_CODE, int(cmd.ProcessState.ExitCode())) 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 ( const (
CMD_DIR = "cmd_dir" CMD_DIR = "cmd_dir"

View File

@ -201,23 +201,21 @@ func _list_export(m *ice.Message, prefix, chain, file string) {
count := 0 count := 0
head := kit.Split(m.Option(FIELDS)) head := kit.Split(m.Option(FIELDS))
m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) {
val = kit.GetMeta(val) if val = kit.GetMeta(val); index == 0 {
if len(head) == 0 { // 默认表头
if index == 0 && len(head) == 0 {
// 输出表头
for k := range val { for k := range val {
head = append(head, k) head = append(head, k)
} }
sort.Strings(head) sort.Strings(head)
w.Write(head) }
w.Write(head) // 输出表头
} }
// 输出数据
data := []string{} data := []string{}
for _, k := range head { for _, k := range head {
data = append(data, kit.Format(val[k])) data = append(data, kit.Format(val[k]))
} }
w.Write(data) w.Write(data) // 输出数据
count++ count++
}) })
@ -416,6 +414,9 @@ const (
REVERT = "revert" REVERT = "revert"
REPEAT = "repeat" REPEAT = "repeat"
UPLOAD = "upload" UPLOAD = "upload"
NEXT = "next"
PREV = "prev"
) )
const ( const (
CACHE_LIMIT = "cache.limit" 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) { DELETE: {Name: "delete key sub type field value", Help: "删除", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[2] { switch arg[2] {
case ZONE:
_hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4])
case HASH: case HASH:
_hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4]) _hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4])
case LIST: 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) { 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] { 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: case HASH:
_hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...) _hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...)
case LIST: case LIST:

View File

@ -31,7 +31,7 @@ func (c *Conn) Write(b []byte) (int, error) {
return n, e return n, e
} }
func (c *Conn) Close() error { 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() return c.Conn.Close()
} }

View File

@ -124,9 +124,11 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
// 请求参数 // 请求参数
for k, v := range r.Form { for k, v := range r.Form {
if r.Header.Get(ContentType) != ContentJSON { if r.Header.Get(ContentType) != ContentJSON {
// for i, p := range v { if msg.IsCliUA() {
// // v[i], _ = url.QueryUnescape(p) for i, p := range v {
// } v[i], _ = url.QueryUnescape(p)
}
}
} }
if msg.Optionv(k, v); k == ice.MSG_SESSID { if msg.Optionv(k, v); k == ice.MSG_SESSID {
RenderCookie(msg, v[0]) 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 { if _, ok := msg.Target().Commands[WEB_LOGIN]; ok {
// 权限检查 // 权限检查
msg.Target().Cmd(msg, WEB_LOGIN, r.URL.Path, cmds...) 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" { if ls := strings.Split(r.URL.Path, "/"); msg.Conf(SERVE, kit.Keym(aaa.BLACK, ls[1])) == "true" {

View File

@ -25,6 +25,7 @@ const ( // REPOS
SUCCESS = "success" SUCCESS = "success"
FAILURE = "failure" FAILURE = "failure"
FALSE = "false"
TRUE = "true" TRUE = "true"
OK = "ok" OK = "ok"
) )

View File

@ -18,20 +18,20 @@ func init() {
FILES: {Name: "files hash auto upload", Help: "文件夹", Action: map[string]*ice.Action{ FILES: {Name: "files hash auto upload", Help: "文件夹", Action: map[string]*ice.Action{
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) 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) { 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) { }, 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.Fields(len(arg) == 0, "time,size,type,name,hash")
m.Cmd(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg).Table(func(index int, value map[string]string, head []string) { m.Cmd(mdb.SELECT, m.Prefix(FILES), "", 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))) 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], "/share/cache/"+value[kit.MDB_DATA]); len(arg) > 0 { if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 {
switch { switch {
case kit.ExtIsImage(value[kit.MDB_NAME]): case kit.ExtIsImage(value[kit.MDB_NAME]):
m.PushImages(kit.MDB_IMAGE, "/share/cache/"+value[kit.MDB_DATA]) m.PushImages(kit.MDB_IMAGE, link)
} }
} }
}) })

View File

@ -309,7 +309,7 @@ func init() {
m.Cmdy(mdb.IMPORT, RIVER, "", mdb.HASH) m.Cmdy(mdb.IMPORT, RIVER, "", mdb.HASH)
}}, }},
aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { 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) m.Cmdy("web.code.publish", "contexts", k)
} }
}}, }},

View File

@ -148,6 +148,9 @@ echo "hello world"
} }
var _contexts = kit.Dict( 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", `# 源码安装 "source", `# 源码安装
export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp; source $ctx_temp source export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp; source $ctx_temp source
`, `,

13
logs.go
View File

@ -88,14 +88,13 @@ func (m *Message) Cost(arg ...interface{}) *Message {
return m.log(LOG_COST, strings.Join(list, " ")) return m.log(LOG_COST, strings.Join(list, " "))
} }
func (m *Message) Warn(err bool, arg ...interface{}) bool { func (m *Message) Warn(err bool, arg ...interface{}) bool {
if err { if !err || len(m.meta[MSG_RESULT]) > 0 && m.meta[MSG_RESULT][0] == ErrWarn {
list := kit.Simple(arg...) return err
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
} m.meta[MSG_RESULT] = kit.Simple(ErrWarn, arg)
return false m.log(LOG_WARN, fmt.Sprint(arg...))
return err
} }
func (m *Message) Error(err bool, str string, arg ...interface{}) bool { func (m *Message) Error(err bool, str string, arg ...interface{}) bool {
if err { if err {

39
misc.go
View File

@ -189,20 +189,20 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message {
return m.Push(key, Render(m, view, name, arg)) return m.Push(key, Render(m, view, name, arg))
} }
func (m *Message) PushDownload(key string, arg ...interface{}) { // [name] file func (m *Message) PushDownload(key string, arg ...interface{}) { // [name] file
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_DOWNLOAD, arg...)) m.Push(key, Render(m, RENDER_DOWNLOAD, arg...))
} }
func (m *Message) PushAnchor(arg ...interface{}) { // [name] link
if m.IsCliUA() {
return
} }
func (m *Message) PushAnchor(arg ...interface{}) { // [name] link
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
} }
func (m *Message) PushButton(arg ...string) {
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... func (m *Message) PushScript(arg ...string) *Message { // [type] text...
return m.Push(kit.MDB_SCRIPT, Render(m, RENDER_SCRIPT, arg)) return m.Push(kit.MDB_SCRIPT, Render(m, RENDER_SCRIPT, arg))
} }
@ -257,9 +257,19 @@ type Option struct {
Value interface{} Value interface{}
} }
func OptionFields(str string) Option { return 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 OptionHash(str string) Option { return Option{kit.MDB_HASH, str} }
func (m *Message) OptionFields(str string) { m.Option(MSG_FIELDS, 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 { func (m *Message) OptionLoad(file string) *Message {
if f, e := os.Open(file); e == nil { if f, e := os.Open(file); e == nil {
defer f.Close() defer f.Close()
@ -350,6 +360,19 @@ func (m *Message) ProcessRefresh(delay string) {
func (m *Message) ProcessRefresh30ms() { m.ProcessRefresh("30ms") } func (m *Message) ProcessRefresh30ms() { m.ProcessRefresh("30ms") }
func (m *Message) ProcessRefresh300ms() { m.ProcessRefresh("300ms") } func (m *Message) ProcessRefresh300ms() { m.ProcessRefresh("300ms") }
func (m *Message) ProcessRefresh3s() { m.ProcessRefresh("3s") } 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{}) { func (m *Message) ProcessField(arg ...interface{}) {
m.Process(PROCESS_FIELD) m.Process(PROCESS_FIELD)
m.Option("_prefix", arg...) m.Option("_prefix", arg...)

View File

@ -15,7 +15,7 @@ const BASH = "bash"
var Index = &ice.Context{Name: BASH, Help: "命令行", var Index = &ice.Context{Name: BASH, Help: "命令行",
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
BASH: {Name: BASH, Help: "命令行", Value: kit.Data( 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{ 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{ 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) { 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) { 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) { 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) { }, 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)
}}, }},
}, },
} }

View File

@ -7,15 +7,15 @@ refer `
chapter "源码" chapter "源码"
field "bash" web.code.bash.bash 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 "构建" section "构建"
spark shell ` spark shell `
yum install -y wget make gcc yum install -y wget make gcc
yum install -y byacc.x86_64 yum install -y byacc.x86_64
wget http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz wget https://mirrors.aliyun.com/gnu/bash/bash-4.4.18.tar.gz
tar xvf bash-4.2.53.tar.gz && cd bash-4.2.53 tar xvf bash-4.4.18.tar.gz && cd bash-4.4.18
./configure --prefix=$PWD/_install ./configure --prefix=$PWD/_install
make -j8 && make install make -j8 && make install
@ -32,4 +32,5 @@ field "会话流" web.code.bash.sess
field "同步流" web.code.bash.sync field "同步流" web.code.bash.sync
field "收藏夹" web.code.bash.favor field "收藏夹" web.code.bash.favor
field "回收站" web.code.bash.trash field "回收站" web.code.bash.trash
field "文件夹" web.chat.files

View File

@ -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)) 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) { "/upload": {Name: "/upload", Help: "上传", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
// 缓存文件 // 上传文件
msg := m.Cmd(web.CACHE, web.UPLOAD) 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.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) m.Cmd(chat.FILES, web.UPLOAD)

View File

@ -13,72 +13,65 @@ func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data( 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{ 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{ "/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.Echo("#!/bin/sh\n\n")
m.Cmdy(m.Prefix(FAVOR), m.Option("tab")).Table(func(index int, value map[string]string, head []string) { 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] {
if m.Option("note") == "" || m.Option("note") == value[kit.MDB_NAME] {
m.Echo("# %v\n%v\n\n", value[kit.MDB_NAME], value[kit.MDB_TEXT]) 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) { }, 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)
}
}}, }},
}, },
}) })

View File

@ -2,7 +2,6 @@ package bash
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"strings" "strings"
@ -12,9 +11,6 @@ import (
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Commands: map[string]*ice.Command{ 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) { "/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")) list := kit.Split(m.Option("line"), m.Option("break"))
word := list[kit.Int(m.Option("index"))] word := list[kit.Int(m.Option("index"))]

View File

@ -1,27 +1,22 @@
package bash package bash
import ( import (
"io/ioutil"
"strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"io/ioutil"
"strings"
) )
const ( const (
SID = "sid" SID = "sid"
ARG = "arg" ARG = "arg"
SUB = "sub" SUB = "sub"
PWD = "pwd"
PID = "pid"
)
const (
LOGIN = "login"
LOGOUT = "logout"
) )
const SESS = "sess" const SESS = "sess"
@ -33,50 +28,59 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ 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) { web.WEB_LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if f, _, e := m.R.FormFile(SUB); e == nil { if f, _, e := m.R.FormFile(SUB); e == nil {
defer f.Close() defer f.Close()
// 文件参数
if b, e := ioutil.ReadAll(f); e == nil { if b, e := ioutil.ReadAll(f); e == nil {
m.Option(SUB, string(b)) m.Option(SUB, string(b)) // 文件参数
} }
} }
if strings.TrimSpace(m.Option(SID)) != "" { switch m.Render(ice.RENDER_RESULT); m.R.URL.String() {
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) case "/qrcode", "/sess": // 登录入口
msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, strings.TrimSpace(m.Option(SID))) return
}
// 用户信息 if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin) {
if m.Option(SID, msg.Append(kit.MDB_HASH)) != "" { 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(aaa.USERNAME, msg.Append(aaa.USERNAME))
m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME))
} m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin)
} }},
m.Render(ice.RENDER_RESULT) "/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{ "/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{
LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { 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, LOGOUT) 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) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if strings.TrimSpace(m.Option(SID)) == "" { if m.Option(SID) == "" {
m.Option(SID, m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, LOGIN, m.Option(SID, m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, aaa.LOGIN,
aaa.USERNAME, m.Option(aaa.USERNAME), tcp.HOSTNAME, m.Option(tcp.HOSTNAME), PID, m.Option(PID), PWD, m.Option(PWD))) m.OptionSimple(aaa.USERNAME, tcp.HOSTNAME, cli.PID, cli.PWD)))
} else { } 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)) 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)
}},
}, },
}) })
} }

View File

@ -1,16 +1,22 @@
package bash package bash
import ( import (
"strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
kit "github.com/shylinux/toolkits" 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 ( const (
SHELL = "shell" SHELL = "shell"
HISTORY = "history" HISTORY = "history"
@ -21,12 +27,33 @@ func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data( 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{ 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) { 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) m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST)
}}, }},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case kit.MDB_TOPIC: case kit.MDB_ZONE:
m.Cmdy(FAVOR, mdb.INPUTS, arg) m.Cmdy(FAVOR, mdb.INPUTS, arg)
} }
}}, }},
cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) { cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 && arg[0] == cli.RUN { m.Option(cli.CMD_DIR, m.Option(cli.PWD))
m.Cmdy(cli.SYSTEM, arg[1:]) m.ProcessCommand(cli.SYSTEM, m.Option(kit.MDB_TEXT), arg...)
return m.ProcessCommandOpt(cli.PWD)
}
m.ShowPlugin("", cli.SYSTEM, cli.RUN)
m.Push(cli.ARG, kit.Format(kit.Simple(kit.Split(m.Option(kit.MDB_TEXT)))))
}}, }},
FAVOR: {Name: "favor topic=some@key type name text", Help: "收藏", Hand: func(m *ice.Message, arg ...string) { FAVOR: {Name: "favor zone=some@key type name text pwd", Help: "收藏", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(m.Prefix(FAVOR), mdb.INSERT, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC), m.Cmdy(FAVOR, mdb.INSERT, m.OptionSimple(kit.MDB_ZONE, m.Conf(FAVOR, kit.META_FIELD)))
kit.MDB_TYPE, m.Option(kit.MDB_TYPE), kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_TEXT, m.Option(kit.MDB_TEXT))
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 0 { m.OptionPage(kit.Slice(arg, _sync_index)...)
m.Option(mdb.FIELDS, mdb.DETAIL) m.Fields(len(arg) == 0 || arg[0] == "", m.Conf(SYNC, kit.META_FIELD))
} else {
m.Option(mdb.FIELDS, m.Conf(SYNC, kit.META_FIELD))
defer m.PushAction(cli.SYSTEM, FAVOR)
}
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg) m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg)
}}, m.PushAction(cli.SYSTEM, FAVOR)
"/sync": {Name: "/sync", Help: "同步", Action: map[string]*ice.Action{ m.StatusTimeCountTotal(_sync_count(m))
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))
}}, }},
}, },
}) })

View File

@ -2,6 +2,7 @@ package bash
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/nfs"
@ -19,45 +20,38 @@ func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
TRASH: {Name: TRASH, Help: "回收站", Value: kit.Data( 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{ 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{ 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) { 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) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(cli.SYSTEM, "rm", "-rf", m.Option(TO)) 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) { 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) { 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.Option(nfs.DIR_ROOT, m.Option(TO))
m.Cmdy(nfs.DIR, kit.Select("", arg, 1)) m.ProcessCommand(nfs.DIR, "", arg...)
return m.ProcessCommandOpt(TO)
}
m.ShowPlugin("", nfs.DIR, cli.RUN)
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, 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.Cmdy(mdb.SELECT, m.Prefix(TRASH), "", mdb.HASH, kit.MDB_HASH, arg)
m.PushAction(nfs.DIR, "reback", mdb.REMOVE) m.PushAction(nfs.DIR, mdb.REVERT, 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) {
}}, }},
}, },
}) })

View File

@ -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, 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...) cmd.Hand(m, c, key, arg...)
return m return m
} }