diff --git a/misc/bash/bash.go b/misc/bash/bash.go new file mode 100644 index 00000000..e8932fd7 --- /dev/null +++ b/misc/bash/bash.go @@ -0,0 +1,41 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/gdb" + "github.com/shylinux/icebergs/base/web" + "github.com/shylinux/icebergs/core/code" + kit "github.com/shylinux/toolkits" + + "path" +) + +const BASH = "bash" + +var Index = &ice.Context{Name: BASH, Help: "命令行", + Configs: map[string]*ice.Config{ + BASH: {Name: BASH, Help: "命令行", Value: kit.Data( + "source", "http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz", + )}, + }, + Commands: map[string]*ice.Command{ + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, + + 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)) + }}, + gdb.BUILD: {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.INSTALL, gdb.BUILD, m.Conf(BASH, kit.META_SOURCE)) + }}, + gdb.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.INSTALL, gdb.START, m.Conf(BASH, kit.META_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) + }}, + }, +} + +func init() { code.Index.Register(Index, &web.Frame{}) } diff --git a/misc/bash/bash.shy b/misc/bash/bash.shy new file mode 100644 index 00000000..5404c98b --- /dev/null +++ b/misc/bash/bash.shy @@ -0,0 +1,35 @@ +title "bash" +refer ` +官网 https://www.gnu.org/software/bash/ +文档 https://www.gnu.org/software/bash/manual/bash.html +源码 http://ftp.gnu.org/gnu/bash/ +` + +chapter "源码" +field "bash" web.code.bash.bash +field "bash" web.code.inner args `usr/install/bash-4.2.53/ input.c 625` + +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 + +./configure --prefix=$PWD/_install +make -j8 && make install +` + +section "启动" +spark shell ` +cd ./_install +./bin/bash +` + +chapter "应用" +field "会话流" web.code.bash.sess +field "同步流" web.code.bash.sync +field "收藏夹" web.code.bash.favor +field "回收站" web.code.bash.trash + diff --git a/misc/bash/download.go b/misc/bash/download.go new file mode 100644 index 00000000..5430d7f4 --- /dev/null +++ b/misc/bash/download.go @@ -0,0 +1,35 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/web" + "github.com/shylinux/icebergs/core/chat" + kit "github.com/shylinux/toolkits" +) + +func init() { + Index.Merge(&ice.Context{ + Commands: map[string]*ice.Command{ + "/download": {Name: "/download", Help: "下载", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 || arg[0] == "" { + m.Cmdy(chat.FILES).Table() + return + } + + // 下载文件 + m.Cmdy(web.CACHE, m.Cmd(chat.FILES, arg[0]).Append(kit.MDB_DATA)) + 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)) + m.Cmd(chat.FILES, web.UPLOAD) + + for _, k := range []string{kit.MDB_DATA, kit.MDB_TIME, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_SIZE} { + m.Echo("%s: %s\n", k, msg.Append(k)) + } + }}, + }, + }) +} diff --git a/misc/bash/favor.go b/misc/bash/favor.go new file mode 100644 index 00000000..106c84bf --- /dev/null +++ b/misc/bash/favor.go @@ -0,0 +1,85 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/mdb" + kit "github.com/shylinux/toolkits" +) + +const FAVOR = "favor" + +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", + )}, + }, + 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] == mdb.ENGINE { + m.Cmdy(cli.SYSTEM, arg[1:]) + return + } + + m.PushPlugin(cli.SYSTEM, cli.SYSTEM, mdb.ENGINE) + 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) { + 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.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() + }}, + }, + }) +} diff --git a/misc/bash/input.go b/misc/bash/input.go new file mode 100644 index 00000000..8857c048 --- /dev/null +++ b/misc/bash/input.go @@ -0,0 +1,107 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + kit "github.com/shylinux/toolkits" + + "strings" + "unicode" +) + +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.SYSTEM, cli.QRCODE, kit.MDB_TEXT, 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"))] + switch arg[0] { + case "shy": + m.Cmd("web.code.input.find", word).Table(func(index int, value map[string]string, head []string) { + m.Echo(value["text"]).Echo(" ") + }) + + case "line": + if strings.HasPrefix(m.Option("line"), "ice ") { + list := kit.Split(m.Option("line")) + switch list[1] { + case "add": + m.Cmd("web.code.input.push", list[2:]) + m.Option("line", list[4]) + m.Option("point", 0) + default: + m.Cmdy(list[1:]) + break + } + } + + line := []rune(m.Option("line")) + if begin := kit.Int(m.Option("point")); begin < len(line) { + m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { + m.Echo(string(line[:begin])) + for i := begin; i < len(line); i++ { + if i-begin < 3 && i < len(line)-1 { + continue + } + // 编码转换 + for j := 0; j < 4; j++ { + code := string(line[begin : i+1-j]) + list := append(m.Cmd("web.code.input.find", code).Appendv("text"), code) + if len(list) > 1 { + m.Echo(kit.Select(code, list[0])) + m.Info("input %s->%s", code, list[0]) + i = i - j + break + } + } + // 输出编码 + begin = i + 1 + } + }) + break + } + fallthrough + case "end": + m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { + last_text := kit.Format(kit.Value(value, "last.text")) + last_list := kit.Simple(kit.Value(value, "last.list")) + last_index := kit.Int(kit.Value(value, "last.index")) + + if last_text != "" && strings.HasSuffix(m.Option("line"), last_text) { + // 补全记录 + index := last_index + 1 + text := last_list[index%len(last_list)] + kit.Value(value, "last.index", index) + kit.Value(value, "last.text", text) + m.Echo(strings.TrimSuffix(m.Option("line"), last_text) + text) + m.Info("%d %v", index, last_list) + return + } + + line := []rune(m.Option("line")) + for i := len(line); i >= 0; i-- { + if i > 0 && len(line)-i < 4 && unicode.IsLower(line[i-1]) { + continue + } + + // 编码转换 + code := string(line[i:]) + list := append(m.Cmd("web.code.input.find", code).Appendv("text"), code) + value["last"] = kit.Dict("code", code, "text", list[0], "list", list, "index", 0) + + // 输出编码 + m.Echo(string(line[:i])) + m.Echo(kit.Select(code, list[0])) + m.Info("input %s->%s", code, list[0]) + break + } + }) + } + m.Info("trans: %v", m.Result()) + }}, + }, + }) +} diff --git a/misc/bash/sess.go b/misc/bash/sess.go new file mode 100644 index 00000000..86b1a90a --- /dev/null +++ b/misc/bash/sess.go @@ -0,0 +1,80 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" + "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" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + SESS: {Name: SESS, Help: "会话流", Value: kit.Data( + kit.MDB_FIELD, "time,hash,status,username,hostname,pid,pwd", + )}, + }, + 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.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)) + } + } + + 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)) + } + } + m.Render(ice.RENDER_RESULT) + }}, + "/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) + }}, + }, 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))) + } else { + m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, LOGIN) + } + m.Echo(m.Option(SID)) + }}, + }, + }) +} diff --git a/misc/bash/sync.go b/misc/bash/sync.go new file mode 100644 index 00000000..e662fb03 --- /dev/null +++ b/misc/bash/sync.go @@ -0,0 +1,73 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/tcp" + kit "github.com/shylinux/toolkits" + + "strings" +) + +const ( + SHELL = "shell" + HISTORY = "history" +) +const SYNC = "sync" + +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", + )}, + }, + Commands: map[string]*ice.Command{ + SYNC: {Name: "sync id auto export import", Help: "同步流", Action: map[string]*ice.Action{ + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case kit.MDB_TOPIC: + m.Cmdy(m.Prefix(FAVOR)).Appendv(ice.MSG_APPEND, kit.MDB_TOPIC, kit.MDB_COUNT, kit.MDB_TIME) + } + }}, + FAVOR: {Name: "favor topic 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)) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 { + m.Option(mdb.FIELDS, mdb.DETAIL) + m.Option(mdb.CACHE_FILED, kit.MDB_ID) + m.Option(mdb.CACHE_VALUE, arg[0]) + } else { + m.Option(mdb.FIELDS, m.Conf(SYNC, kit.META_FIELD)) + m.Option(ice.MSG_CONTROL, ice.CONTROL_PAGE) + defer m.PushAction(FAVOR) + } + + m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, m.Option(mdb.CACHE_FILED), m.Option(mdb.CACHE_VALUE)) + }}, + "/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)) + }}, + }, + }) +} diff --git a/misc/bash/trash.go b/misc/bash/trash.go new file mode 100644 index 00000000..e25ce52e --- /dev/null +++ b/misc/bash/trash.go @@ -0,0 +1,59 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/nfs" + "github.com/shylinux/icebergs/base/tcp" + kit "github.com/shylinux/toolkits" + + "path" +) + +const TRASH = "trash" + +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", + )}, + }, + Commands: map[string]*ice.Command{ + 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")) + }}, + 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)) + }}, + "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)) + }}, + mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 { + m.Cmd(mdb.SELECT, m.Prefix(TRASH), "", mdb.HASH, kit.MDB_HASH, arg).Table(func(index int, value map[string]string, head []string) { + m.Cmdy(nfs.DIR, path.Join(value["to"], kit.Select("", arg, 1))) + }) + return + } + m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(TRASH), kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, m.Prefix(TRASH), "", mdb.HASH, kit.MDB_HASH, arg) + m.PushAction("reback", mdb.REMOVE) + }}, + + "/trash": {Name: "/trash", Help: "回收", Action: map[string]*ice.Action{ + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, 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")) + }}, + }, + }) +} diff --git a/misc/bash/zsh.go b/misc/bash/zsh.go new file mode 100644 index 00000000..f6aa9c7a --- /dev/null +++ b/misc/bash/zsh.go @@ -0,0 +1,38 @@ +package bash + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/gdb" + "github.com/shylinux/icebergs/base/web" + "github.com/shylinux/icebergs/core/code" + kit "github.com/shylinux/toolkits" + + "path" +) + +const ZSH = "zsh" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + ZSH: {Name: ZSH, Help: "命令行", Value: kit.Data( + "source", "https://nchc.dl.sourceforge.net/project/zsh/zsh/5.8/zsh-5.8.tar.xz", + )}, + }, + Commands: map[string]*ice.Command{ + ZSH: {Name: "zsh 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(ZSH, kit.META_SOURCE)) + }}, + gdb.BUILD: {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.INSTALL, gdb.BUILD, m.Conf(ZSH, kit.META_SOURCE)) + }}, + gdb.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.INSTALL, gdb.START, m.Conf(ZSH, kit.META_SOURCE), "bin/zsh") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy(code.INSTALL, path.Base(m.Conf(ZSH, kit.META_SOURCE)), arg) + }}, + }, + }) +} diff --git a/misc/bash/zsh.shy b/misc/bash/zsh.shy new file mode 100644 index 00000000..8654eff3 --- /dev/null +++ b/misc/bash/zsh.shy @@ -0,0 +1,29 @@ +title "zsh" +refer ` +官网 https://www.zsh.org/ +文档 http://zsh.sourceforge.net/Doc/Release/zsh_toc.html +源码 https://github.com/zsh-users/zsh/ +` + +chapter "源码" +field zsh web.code.bash.zsh +field zsh web.code.inner args `[ usr/install/zsh-5.8/ Src/main.c 91 ]` + +section "构建" +spark shell ` +yum install -y wget make gcc +yum install -y ncurses-devel.x86_64 + +wget https://nchc.dl.sourceforge.net/project/zsh/zsh/5.8/zsh-5.8.tar.xz +tar xvf zsh-5.8.tar.xz && cd zsh-5.8 + +./configure --prefix=$PWD/_install +make -j8 && make install +` + +section "启动" +spark shell ` +cd ./_install +./bin/zsh +` +