mirror of
https://shylinux.com/x/icebergs
synced 2025-04-26 17:44:05 +08:00
opt bash
This commit is contained in:
parent
0ad239fbcb
commit
b346bd01d0
@ -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"
|
||||||
)
|
)
|
||||||
|
@ -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"
|
||||||
|
@ -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"
|
||||||
|
@ -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:
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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" {
|
||||||
|
1
conf.go
1
conf.go
@ -25,6 +25,7 @@ const ( // REPOS
|
|||||||
|
|
||||||
SUCCESS = "success"
|
SUCCESS = "success"
|
||||||
FAILURE = "failure"
|
FAILURE = "failure"
|
||||||
|
FALSE = "false"
|
||||||
TRUE = "true"
|
TRUE = "true"
|
||||||
OK = "ok"
|
OK = "ok"
|
||||||
)
|
)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
|
@ -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
13
logs.go
@ -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
39
misc.go
@ -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...)
|
||||||
|
@ -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)
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -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"))]
|
||||||
|
@ -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)
|
||||||
|
}},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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))
|
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -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) {
|
|
||||||
|
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
2
type.go
2
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,
|
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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user