1
0
forked from x/icebergs
This commit is contained in:
shaoying 2020-11-04 22:02:42 +08:00
parent f9faaa4d9a
commit 1f228402e6
23 changed files with 222 additions and 474 deletions

View File

@ -13,6 +13,7 @@ func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
PYTHON: {Name: "python", Help: "脚本命令", Value: kit.Data(
"python", "python",
"source", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz",
"qrcode", `import pyqrcode; print(pyqrcode.create('%s').terminal(module_color='%s', quiet_zone=1))`,
)},
@ -30,9 +31,9 @@ func init() {
}},
"qrcode": {Name: "qrcode text color", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
prefix := []string{SYSTEM, m.Conf(PYTHON, kit.Keys(kit.MDB_META, PYTHON))}
prefix := []string{SYSTEM, m.Conf(PYTHON, "meta.python")}
m.Cmdy(prefix, "-c", kit.Format(m.Conf(PYTHON, "meta.qrcode"),
kit.Select("hello world", arg, 0), kit.Select("blue", arg, 1)))
kit.Select("hello world", m.Option("text")), kit.Select("blue", m.Option("color"))))
}},
"pip": {Name: "pip", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.pip"), "install", arg)

View File

@ -1,6 +1,7 @@
package cli
import (
qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go"
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
@ -60,6 +61,9 @@ const (
CMD_CODE = "cmd_code"
)
const (
QRCODE = "qrcode"
)
const SYSTEM = "system"
func init() {
@ -68,7 +72,32 @@ func init() {
SYSTEM: {Name: SYSTEM, Help: "系统命令", Value: kit.Data()},
},
Commands: map[string]*ice.Command{
SYSTEM: {Name: "system id auto", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) {
SYSTEM: {Name: "system id auto", Help: "系统命令", Action: map[string]*ice.Action{
QRCODE: {Name: "qrcode text fg bg lv", Help: "二维码", Hand: func(m *ice.Message, arg ...string) {
fg := qrcodeTerminal.ConsoleColors.BrightBlue
bg := qrcodeTerminal.ConsoleColors.BrightWhite
switch m.Option("fg") {
case "black":
fg = qrcodeTerminal.ConsoleColors.BrightBlack
case "red":
fg = qrcodeTerminal.ConsoleColors.BrightRed
case "green":
fg = qrcodeTerminal.ConsoleColors.BrightGreen
case "yellow":
fg = qrcodeTerminal.ConsoleColors.BrightYellow
case "blue":
fg = qrcodeTerminal.ConsoleColors.BrightBlue
case "cyan":
fg = qrcodeTerminal.ConsoleColors.BrightCyan
case "magenta":
fg = qrcodeTerminal.ConsoleColors.BrightMagenta
case "white":
fg = qrcodeTerminal.ConsoleColors.BrightWhite
}
obj := qrcodeTerminal.New2(fg, bg, qrcodeTerminal.QRCodeRecoveryLevels.Medium)
m.Echo("%s", *obj.Get(m.Option(kit.MDB_TEXT)))
}},
}, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) {
if len(arg) == 0 || kit.Int(arg[0]) > 0 {
m.Option("_control", "_page")
m.Option(mdb.FIELDS, kit.Select("time,id,cmd,dir,env", mdb.DETAIL, len(arg) > 0))

View File

@ -411,6 +411,7 @@ const (
INPUTS = "inputs"
INVITE = "invite"
COMMIT = "commit"
SOURCE = "source"
)
const (
CACHE_LIMIT = "cache.limit"

View File

@ -99,6 +99,9 @@ ish_miss_prepare_install
Commands: map[string]*ice.Command{
DREAM: {Name: "dream name path auto 启动", Help: "梦想家", Action: map[string]*ice.Action{
gdb.START: {Name: "start type=worker,server repos name", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_NAME) == "self" {
m.Option(kit.MDB_NAME, "")
}
_dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME))))
}},
gdb.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {

View File

@ -69,6 +69,6 @@ var Index = &ice.Context{Name: CHAT, Help: "聊天中心",
func init() {
web.Index.Register(Index, &web.Frame{},
HEADER, RIVER, STORM, ACTION, FOOTER,
LOCATION, PASTE, SCAN,
LOCATION, PASTE, SCAN, FILES,
)
}

14
exec.go
View File

@ -110,9 +110,14 @@ func (m *Message) Back(res *Message) *Message {
return m
}
func (m *Message) Gos(msg *Message, cb interface{}, args ...interface{}) *Message {
task.Put(m.Cmdx("gdb.routine", "create", "fileline", kit.FileLine(cb, 3), "status", "start"), func(task *task.Task) error {
msg.Optionv("task.hash", task.Arg)
msg.Optionv("_task", task)
// h := m.Cmdx("gdb.routine", "create", "fileline", kit.FileLine(cb, 3), "status", "start")
task.Put(kit.FileLine(3, 3), func(task *task.Task) error {
// msg.Optionv("task.hash", task.Arg)
// msg.Optionv("_task", task)
// defer func() {
// msg.Option(kit.MDB_HASH, task.Arg)
// msg.Cmdx("gdb.routine", "modify", "status", "stop")
// }()
msg.TryCatch(msg, true, func(msg *Message) {
switch cb := cb.(type) {
@ -122,9 +127,6 @@ func (m *Message) Gos(msg *Message, cb interface{}, args ...interface{}) *Messag
cb()
}
})
msg.Option(kit.MDB_HASH, task.Arg)
msg.Cmdx("gdb.routine", "modify", "status", "stop")
return nil
})
return msg

2
go.mod
View File

@ -3,8 +3,10 @@ module github.com/shylinux/icebergs
go 1.13
require (
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
github.com/gorilla/websocket v1.4.2
github.com/kr/pty v1.1.1
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/nareix/joy4 v0.0.0-20200507095837-05a4ffbb5369
github.com/shylinux/toolkits v0.1.9
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e

9
go.sum
View File

@ -1,9 +1,15 @@
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/maruel/rs v0.0.0-20150922171536-2c81c4312fe4/go.mod h1:kcRFpEzolcEklV6rD7W95mG49/sbdX/PlFmd7ni3RvA=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/nareix/joy4 v0.0.0-20200507095837-05a4ffbb5369/go.mod h1:aFJ1ZwLjvHN4yEzE5Bkz8rD8/d8Vlj3UIuvz2yfET7I=
github.com/shylinux/toolkits v0.1.9 h1:gfQnXSBBuCtUueNF5eL0kZAjJS8pzODrjxIL0WynqsQ=
github.com/shylinux/toolkits v0.1.9/go.mod h1:Y68Ot6xOmo1bun67YvqC3chDGeU2gDxtsUnvVDGJm4g=
@ -17,4 +23,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View File

@ -1,24 +0,0 @@
package vim
/*
m.Conf(web.FAVOR, "meta.render.vimrc", m.AddCmd(&ice.Command{Name: "render favor id", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
value := m.Optionv("value").(map[string]interface{})
switch value["name"] {
case "read", "write", "exec":
p := path.Join(kit.Format(kit.Value(value, "extra.pwd")), kit.Format(kit.Value(value, "extra.buf")))
if strings.HasPrefix(kit.Format(kit.Value(value, "extra.buf")), "/") {
p = path.Join(kit.Format(kit.Value(value, "extra.buf")))
}
f, e := os.Open(p)
m.Assert(e)
defer f.Close()
b, e := ioutil.ReadAll(f)
m.Assert(e)
m.Echo(string(b))
default:
m.Cmdy(cli.SYSTEM, "sed", "-n", fmt.Sprintf("/%s/,/^}$/p", value["text"]), kit.Value(value, "extra.buf"))
}
}}))
*/

View File

@ -3,6 +3,7 @@ package vim
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits"
"strings"
@ -14,26 +15,23 @@ func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data(
kit.MDB_SHORT, "topic", kit.MDB_FIELD, "time,id,type,name,text,file,line",
kit.MDB_SHORT, kit.MDB_TOPIC, kit.MDB_FIELD, "time,id,type,name,text,file,line",
)},
},
Commands: map[string]*ice.Command{
FAVOR: {Name: "favor topic=auto id=auto auto 创建 导出 导入", Help: "收藏夹", Action: map[string]*ice.Action{
FAVOR: {Name: "favor topic=auto id=auto 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=数据结构 name=hi text=hello", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Richs(m.Prefix(FAVOR), "", m.Option("topic"), func(key string, value map[string]interface{}) {
m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg)
})
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.Richs(m.Prefix(FAVOR), "", m.Option("topic"), func(key string, value map[string]interface{}) {
m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
})
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, "topic", m.Option("topic"))
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)
@ -43,42 +41,51 @@ func init() {
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case "topic":
m.Option(mdb.FIELDS, "time,count,topic")
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH)
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)
}
}},
code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 && arg[0] == mdb.RENDER {
m.Cmdy(code.INNER, arg[1:])
return
}
m.PushPlugin(code.INNER, code.INNER, mdb.RENDER)
m.Push(kit.SSH_ARG, kit.Format([]string{kit.Select("./", m.Option(kit.MDB_PATH)), m.Option(kit.MDB_FILE), m.Option(kit.MDB_LINE)}))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 0 {
m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(FAVOR), kit.META_FIELD), mdb.DETAIL, len(arg) > 1))
m.Richs(m.Prefix(FAVOR), "", arg[0], func(key string, value map[string]interface{}) {
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, arg[1:])
})
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, "time,count,topic")
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH)
m.PushAction("删除")
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(code.INNER)
}},
"/favor": {Name: "/favor", Help: "收藏", Action: map[string]*ice.Action{
"select": {Name: "select", Help: "主题", Hand: func(m *ice.Message, arg ...string) {
list := []string{}
m.Cmd(m.Prefix(FAVOR)).Table(func(index int, value map[string]string, head []string) {
list = append(list, value["topic"])
})
m.Render(ice.RENDER_RESULT, strings.Join(list, "\n"))
}},
"insert": {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(m.Prefix(FAVOR), mdb.INSERT, "topic", m.Option("tab"),
"name", m.Option("note"), "text", m.Option("arg"), "file", m.Option("buf"), "line", m.Option("row"),
mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(m.Prefix(FAVOR), mdb.INSERT, kit.MDB_TOPIC, m.Option(TAB),
kit.MDB_NAME, m.Option("note"), kit.MDB_TEXT, m.Option(ARG), kit.MDB_FILE, m.Option(BUF), kit.MDB_LINE, m.Option(ROW),
)
}},
mdb.SELECT: {Name: "select", Help: "主题", Hand: func(m *ice.Message, arg ...string) {
list := []string{}
m.Cmd(m.Prefix(FAVOR)).Table(func(index int, value map[string]string, head []string) {
list = append(list, value[kit.MDB_TOPIC])
})
m.Echo(strings.Join(list, "\n"))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Render(ice.RENDER_RESULT)
m.Cmd(m.Prefix(FAVOR), m.Option("tab")).Table(func(index int, value map[string]string, head []string) {
m.Echo("%v\n", m.Option("tab")).Echo("%v:%v:%v:(%v): %v\n",
value["file"], value["line"], "1", value["name"], value["text"])
m.Cmd(m.Prefix(FAVOR), m.Option(TAB)).Table(func(index int, value map[string]string, head []string) {
m.Echo("%v\n", m.Option(TAB)).Echo("%v:%v:%v:(%v): %v\n",
value[kit.MDB_FILE], value[kit.MDB_LINE], "1", value[kit.MDB_NAME], value[kit.MDB_TEXT])
})
}},
},

View File

@ -19,7 +19,7 @@ func init() {
)},
},
Commands: map[string]*ice.Command{
INPUT: {Name: "sync id=auto auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{
INPUT: {Name: "sync id=auto 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(INPUT), "", mdb.LIST)
}},
@ -30,9 +30,8 @@ func init() {
m.Option(mdb.FIELDS, kit.Select(m.Conf(INPUT, kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
m.Cmdy(mdb.SELECT, m.Prefix(INPUT), "", mdb.LIST, kit.MDB_ID, arg)
}},
"/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Render(ice.RENDER_RESULT)
"/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice ") {
list := kit.Split(arg[0])
switch list[1] {

View File

@ -8,7 +8,6 @@ import (
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
"fmt"
"io/ioutil"
"strings"
)
@ -19,6 +18,10 @@ const (
SUB = "sub"
PWD = "pwd"
PID = "pid"
BUF = "buf"
TAB = "tab"
ROW = "row"
COL = "col"
)
const SESS = "sess"
@ -27,45 +30,19 @@ func init() {
Configs: map[string]*ice.Config{
SESS: {Name: SESS, Help: "会话流", Value: kit.Data(
kit.MDB_FIELD, "time,hash,status,username,hostname,pid,pwd",
"contexts", `export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -sL $ctx_dev >$ctx_temp; source $ctx_temp`,
)},
},
Commands: map[string]*ice.Command{
SESS: {Name: "sess hash auto 清理", Help: "会话流", Action: map[string]*ice.Action{
"contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
if buf, err := kit.Render(m.Conf(m.Prefix(SESS), "meta.contexts"), m); m.Assert(err) {
m.Cmdy("web.wiki.spark", "shell", string(buf))
}
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}},
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)
m.PushAction("删除")
}},
"/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) {
m.Render(ice.RENDER_RESULT)
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD))
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))
}},
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()
@ -75,8 +52,8 @@ func init() {
}
}
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD))
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))
@ -85,6 +62,19 @@ func init() {
}
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))
}},
},
})
}

View File

@ -3,10 +3,7 @@ package vim
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
"io/ioutil"
)
const SYNC = "sync"
@ -19,15 +16,6 @@ func init() {
)},
},
Commands: map[string]*ice.Command{
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))
}
}
}},
SYNC: {Name: "sync id=auto auto 导出 导入", 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)
@ -35,23 +23,37 @@ func init() {
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
if len(arg) > 0 {
m.Option("cache.field", kit.MDB_ID)
m.Option("cache.value", arg[0])
} else {
if m.Option("_control", "page"); m.Option("cache.limit") == "" {
m.Option("cache.limit", "10")
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("cache.field"), m.Option("cache.value"))
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, m.Option(mdb.CACHE_FILED), m.Option(mdb.CACHE_VALUE))
}},
"/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Render(ice.RENDER_RESULT)
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, VIMRC, kit.MDB_NAME, arg[0], kit.MDB_TEXT, kit.Select(m.Option("arg"), m.Option("sub")),
"pwd", m.Option("pwd"), "buf", m.Option("buf"), "row", m.Option("row"), "col", m.Option("col"))
if m.Option(ARG) == "qa" {
m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, "logout")
}
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, VIMRC, kit.MDB_NAME, arg[0],
kit.MDB_TEXT, kit.Select(m.Option(ARG), m.Option(SUB)),
PWD, m.Option(PWD), BUF, m.Option(BUF), ROW, m.Option(ROW), COL, m.Option(COL))
}},
},
})

View File

@ -1,67 +0,0 @@
" 自动刷新
let ShyComeList = {}
fun! ShyCome(buf, row, action, extra)
" 低配命令
if !exists("appendbufline")
execute a:extra["row"]
if a:extra["count"] > 0
execute "+1,+" . a:extra["count"] ."delete"
endif
let a:extra["count"] = 0
for line in reverse(split(ShySend("sync", {"cmds": "trans", "arg": getline(".")}), "\n"))
let a:extra["count"] += 1
call append(".", line)
endfor
return
endif
if a:action == "refresh"
" 清空历史
if a:extra["count"] > 0 | call deletebufline(a:buf, a:row+1, a:row+a:extra["count"]) | endif
let a:extra["count"] = 0
endif
" 刷新命令
for line in reverse(split(ShySend({"cmd": "trans", "arg": getbufline(a:buf, a:row)[0]}), "\n"))
call appendbufline(a:buf, a:row, line)
let a:extra["count"] += 1
endfor
" 插入表头
call appendbufline(a:buf, a:row, strftime(" ~~ %Y-%m-%d %H:%M:%S"))
let a:extra["count"] += 1
endfun
fun! ShyUpdate(timer)
let what = g:ShyComeList[a:timer]
call ShyLog("timer", a:timer, what)
call ShyCome(what["buf"], what["row"], what["action"], what)
endfun
fun! ShyComes(action)
if !exists("b:timer") | let b:timer = -1 | endif
" 清除定时
if b:timer > 0 | call timer_stop(b:timer) | let b:timer = -2 | return | endif
" 添加定时
let b:timer = timer_start(1000, funcref('ShyUpdate'), {"repeat": -1})
let g:ShyComeList[b:timer] = {"buf": bufname("."), "row": line("."), "pre": getline("."), "action": a:action, "count": 0}
call ShyLog("new timer", b:timer)
endfun
fun! ShyCheck(target)
if a:target == "cache"
call ShySync("bufs")
call ShySync("regs")
call ShySync("marks")
call ShySync("tags")
elseif a:target == "fixs"
let l = len(getqflist())
if l > 0
execute "copen " . (l > 10? 10: l + 1)
call ShySync("fixs")
else
cclose
end
end
endfun
" nnoremap <C-G><C-R> :call ShyCheck("cache")<CR>
nnoremap <C-G><C-K> :call ShyComes("refresh")<CR>

View File

@ -2,40 +2,44 @@ package vim
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/gdb"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/nfs"
"github.com/shylinux/icebergs/base/web"
"github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits"
"os"
"path"
"strings"
)
const VIM = "vim"
func _vim_pkg(m *ice.Message) string {
return strings.Replace(strings.Replace(kit.TrimExt(m.Conf(VIM, kit.META_SOURCE)), ".", "", -1), "-", "", -1)
}
const VIMRC = "vimrc"
const VIM = "vim"
var Index = &ice.Context{Name: VIM, Help: "编辑器",
Commands: map[string]*ice.Command{
VIM: {Name: "vim port=auto path=auto auto 启动 构建 下载", Help: "编辑器", Action: map[string]*ice.Action{
"download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, "download", m.Conf(VIM, kit.META_SOURCE))
VIM: {Name: "vim port=auto path=auto 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(VIM, kit.META_SOURCE))
}},
"build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, "build", strings.Replace(strings.Replace(kit.TrimExt(m.Conf(VIM, kit.META_SOURCE)), ".", "", -1), "-", "", -1))
gdb.BUILD: {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, gdb.BUILD, _vim_pkg(m), m.Confv(VIM, "meta.build"))
}},
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
gdb.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Optionv("prepare", func(p string) []string {
return []string{}
list := kit.Simple(m.Confv(VIM, "meta.start"))
for i := 0; i < len(list); i += 2 {
m.Cmd(web.SPIDE, "dev", web.SPIDE_SAVE, path.Join(os.Getenv("HOME"), list[i]),
web.SPIDE_GET, m.Conf(VIM, "meta.remote")+list[i+1])
m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_SAVE, path.Join(p, list[i]),
web.SPIDE_GET, "/share/local/usr/intshell/misc/vim/"+list[i+1])
}
return []string{}
return []string{"-T", "screen", "-c", "PlugInstall", "-c", "exit", "-c", "exit"}
})
m.Cmdy(code.INSTALL, "start", strings.Replace(strings.Replace(kit.TrimExt(m.Conf(VIM, kit.META_SOURCE)), ".", "", -1), "-", "", -1), "bin/vim")
m.Cmdy(code.INSTALL, gdb.START, _vim_pkg(m), "bin/vim")
// 安装插件
m.Echo("\n")
@ -48,7 +52,7 @@ var Index = &ice.Context{Name: VIM, Help: "编辑器",
}},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
if strings.HasPrefix(arg[2], "http") {
m.Cmdy(web.SPIDE, "dev", "raw", "GET", arg[2]+arg[1])
m.Cmdy(web.SPIDE, web.SPIDE_DEV, web.SPIDE_RAW, web.SPIDE_GET, arg[2]+arg[1])
return
}
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
@ -62,17 +66,15 @@ var Index = &ice.Context{Name: VIM, Help: "编辑器",
}},
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load()
m.Cmd(mdb.PLUGIN, mdb.CREATE, VIMRC, VIM, c.Cap(ice.CTX_FOLLOW))
m.Cmd(mdb.RENDER, mdb.CREATE, VIMRC, VIM, c.Cap(ice.CTX_FOLLOW))
m.Cmd(mdb.PLUGIN, mdb.CREATE, VIM, VIM, c.Cap(ice.CTX_FOLLOW))
m.Cmd(mdb.RENDER, mdb.CREATE, VIM, VIM, c.Cap(ice.CTX_FOLLOW))
m.Cmd(mdb.PLUGIN, mdb.CREATE, VIM, m.Prefix(VIM))
m.Cmd(mdb.RENDER, mdb.CREATE, VIM, m.Prefix(VIM))
m.Cmd(mdb.PLUGIN, mdb.CREATE, VIMRC, m.Prefix(VIM))
m.Cmd(mdb.RENDER, mdb.CREATE, VIMRC, m.Prefix(VIM))
}},
},
Configs: map[string]*ice.Config{
VIM: {Name: "vim", Help: "编辑器", Value: kit.Data(
"source", "ftp://ftp.vim.org/pub/vim/unix/vim-8.1.tar.bz2",
"remote", "https://raw.githubusercontent.com/shylinux/contexts/master/etc/conf/",
"build", []interface{}{
"--enable-multibyte=yes",
"--enable-pythoninterp=yes",
@ -82,13 +84,13 @@ var Index = &ice.Context{Name: VIM, Help: "编辑器",
"start", []interface{}{
".vimrc", "vimrc",
".vim/autoload/plug.vim", "plug.vim",
".vim/autoload/auto.vim", "auto.vim",
".vim/syntax/javascript.vim", "javascript.vim",
".vim/syntax/shy.vim", "shy.vim",
".vim/syntax/shy.vim", "sh.vim",
".vim/syntax/go.vim", "go.vim",
},
"history", "vim.history",
"plug", kit.Dict(
"split", kit.Dict(
"space", " \t",

View File

@ -8,21 +8,24 @@ premenu
chapter "源码"
field "安装" web.code.vim.vim
field "源码" web.code.inner args `[ usr/install/vim81/ src/main.c 110 ]`
field "脚本" web.code.inner args `[ usr/install/vim81/install/share/vim/vim81/ filetype.vim ]`
field "文档" web.code.inner args `[ usr/install/vim81/install/share/vim/vim81/doc/ help.txt ]`
field "源码" web.code.inner args `usr/install/vim81/ src/main.c 110`
field "脚本" web.code.inner args `usr/install/vim81/_install/share/vim/vim81/ filetype.vim`
field "文档" web.code.inner args `usr/install/vim81/_install/share/vim/vim81/doc/ help.txt`
section "构建"
spark shell `
yum install -y wget make gcc
wget ftp://ftp.vim.org/pub/vim/unix/vim-8.1.tar.bz2
tar xvf vim-8.1.tar.bz2 && cd vim81
./configure --prefix=$PWD/install --enable-multibyte=yes
./configure --prefix=$PWD/_install --enable-multibyte=yes
make -j4 && make install
`
section "启动"
spark shell `
cd ./install
cd ./_install
./bin/vim
`

View File

@ -30,6 +30,7 @@ cd ./_install
chapter "应用"
web.code.zsh.sess contexts
field "文件夹" web.chat.files
field "会话流" web.code.zsh.sess
field "回收站" web.code.zsh.trash
field "收藏夹" web.code.zsh.favor

View File

@ -8,28 +8,23 @@ import (
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{},
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(web.SPACE, m.Option("you"), web.STORY).Table()
m.Cmdy("web.chat.files").Table()
return
}
// 查找文件
if m.Cmdy(web.STORY, "index", arg[0]).Append("text") == "" && m.Option("you") != "" {
// 上发文件
m.Cmd(web.SPACE, m.Option("you"), web.STORY, "push", arg[0], "dev", arg[0])
m.Cmdy(web.STORY, "index", arg[0])
}
// 下载文件
m.Cmdy(web.CACHE, m.Cmd("web.chat.files", arg[0]).Append("data"))
m.Render(kit.Select(ice.RENDER_DOWNLOAD, ice.RENDER_RESULT, m.Append("file") == ""), m.Append("text"))
}},
"/upload": {Name: "/upload", Help: "上传", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
// 缓存文件
msg := m.Cmd(web.STORY, "upload")
msg := m.Cmd(web.CACHE, web.UPLOAD)
m.Option(ice.MSG_UPLOAD, msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME))
m.Cmd("web.chat.files", "upload")
m.Echo("data: %s\n", msg.Append("data"))
m.Echo("time: %s\n", msg.Append("time"))
m.Echo("type: %s\n", msg.Append("type"))

View File

@ -2,6 +2,7 @@ package zsh
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
)
@ -16,7 +17,7 @@ func init() {
)},
},
Commands: map[string]*ice.Command{
FAVOR: {Name: "favor topic id auto 创建 导出 导入", Help: "收藏夹", Action: map[string]*ice.Action{
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)
}},
@ -44,6 +45,15 @@ func init() {
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.RENDER {
m.Cmdy(cli.SYSTEM, arg[1:])
return
}
m.PushPlugin(cli.SYSTEM, cli.SYSTEM, mdb.RENDER)
m.Push(kit.SSH_ARG, kit.Format([]string{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")
@ -52,12 +62,9 @@ func init() {
return
}
if len(arg) > 0 {
m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(FAVOR), kit.META_FIELD), mdb.DETAIL, len(arg) > 1))
m.Richs(m.Prefix(FAVOR), "", arg[0], func(key string, value map[string]interface{}) {
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, arg[1:])
})
}
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{

View File

@ -13,8 +13,8 @@ func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{},
Commands: map[string]*ice.Command{
"/qrcode": {Name: "/qrcode", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(cli.PYTHON, "qrcode", "hi")
"/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"))

View File

@ -30,33 +30,31 @@ func init() {
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST)
}},
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))
}},
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) {
m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
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)
if m.Option(ice.MSG_CONTROL, "_page"); m.Option(mdb.CACHE_LIMIT) == "" {
m.Option(mdb.CACHE_LIMIT, "10")
}
}
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, m.Option(mdb.CACHE_FILED), m.Option(mdb.CACHE_VALUE))
}},
"/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[0] {
case "history":
"/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],
@ -64,10 +62,10 @@ func init() {
kit.MDB_TEXT, text, PWD, m.Option(PWD), kit.MDB_TIME, ls[1]+" "+ls[2])
}
default:
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))
}
}},
}, 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

@ -5,6 +5,7 @@ import (
"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"
@ -15,12 +16,12 @@ const TRASH = "trash"
func init() {
Index.Merge(&ice.Context{
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",
)},
},
Commands: map[string]*ice.Command{
TRASH: {Name: "TRASH hash path auto 清理", 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) {
m.Cmdy(mdb.INSERT, m.Prefix(TRASH), "", mdb.HASH, "from", m.Option("from"), "to", m.Option("to"))
}},
@ -28,12 +29,12 @@ func init() {
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))
}},
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))
}},
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) {
@ -43,15 +44,15 @@ func init() {
}
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("恢复", "删除")
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, "hostname", m.Option("hostname"),
"size", m.Option("size"), "from", m.Option("from"), "to", m.Option("to"))
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"))
}},
},
})

View File

@ -1,213 +0,0 @@
#!/bin/sh
# 连接配置
if [ "${ctx_dev}" = "" ] || [ "${ctx_dev}" = "-" ]; then
ctx_dev="http://localhost:9020"
fi
ctx_sid=${ctx_sid:=""}
ctx_share=${ctx_share:=""}
ctx_sh=`ps|grep $$|grep -v grep`
# 请求配置
ctx_head=${ctx_head:="Content-Type: application/json"}
ctx_curl=${ctx_curl:="curl"}
ctx_url=$ctx_dev"/code/zsh/"
ctx_cmd=${ctx_cmd:=""}
# 输出配置
ctx_silent=${ctx_silent:=""}
ctx_err=${ctx_err:="/dev/null"}
ctx_welcome=${ctx_welcome:="^_^ \033[32mWelcome to Context world\033[0m ^_^"}
ctx_goodbye=${ctx_goodbye:="v_v \033[31mGoodbye to Context world\033[0m v_v"}
# 输出信息
ShyRight() {
[ "$1" = "" ] && return 1
[ "$1" = "0" ] && return 1
[ "$1" = "false" ] && return 1
return 0
}
ShyEcho() {
ShyRight "$ctx_silent" || echo "$@"
}
ShyLog() {
echo "$@" > $ctx_err
}
# 发送数据
ShyWord() {
echo "$*"|sed "s/\ /%20/g"|sed "s/|/%7C/g"|sed "s/\;/%3B/g"|sed "s/\[/%5B/g"|sed "s/\]/%5D/g"
}
ShyLine() {
echo "$*"|sed -e 's/\"/\\\"/g' -e 's/\n/\\n/g'
}
ShyJSON() {
[ $# -eq 1 ] && echo \"`ShyLine "$1"`\" && return
echo -n "{"
while [ $# -gt 1 ]; do
echo -n \"`ShyLine "$1"`\"\:\"`ShyLine "$2"`\"
shift 2 && [ $# -gt 1 ] && echo -n ","
done
echo -n "}"
}
ShyPost() {
ctx_cmd="$1" && shift
case $ctx_sh in
*zsh)
ShyJSON SHELL "${SHELL:=bash}" pwd "${PWD:=/root}" sid "${ctx_sid:=0}" cmds "$@"|read data
;;
*)
local data=`ShyJSON SHELL "${SHELL:=bash}" pwd "${PWD:=/root}" sid "${ctx_sid:=0}" cmds "$@"`
;;
esac
echo $data > $ctx_err
${ctx_curl} -s "${ctx_url}${ctx_cmd}" -H "${ctx_head}" -d "${data}"
}
# 终端登录
ShyHelp() {
ShyPost help "$@"
}
ShyLogin() {
HOST=`hostname` ctx_sid=`ShyPost login "" share "${ctx_share}" pid "$$" pane "${TMUX_PANE}" hostname "${HOST}" username "${USER}"`
echo "${ctx_welcome}"
echo "${ctx_dev} "
echo -n "sid: ${ctx_sid} "
echo "begin: ${ctx_begin} "
export ctx_sid
}
ShyLogout() {
ShySync history
echo ${ctx_goodbye} && [ "$ctx_sid" != "" ] && ShyPost logout
}
# 发送文件
ShySend() {
local TEMP=`mktemp /tmp/tmp.XXXXXX` && "$@" > $TEMP
ShyRight "$ctx_silent" || cat $TEMP
${ctx_curl} -s "${ctx_url}sync" -F "cmds=$1" -F "cmds=$*" -F "sub=@$TEMP" \
-F "SHELL=${SHELL}" -F "pwd=${PWD}" -F "sid=${ctx_sid}"
}
ShyUpload() {
${ctx_curl} -s "${ctx_url}upload" -F "upload=@$1" \
-F "SHELL=${SHELL}" -F "pwd=${PWD}" -F "sid=${ctx_sid}"
}
ShyDownload() {
${ctx_curl} -s "${ctx_url}download" -F "cmds=$1" \
-F "SHELL=${SHELL}" -F "pwd=${PWD}" -F "sid=${ctx_sid}"
}
ShyInstall() {
case "$1" in
"vim")
# git vim
curl -fLo ~/.vimrc https://raw.githubusercontent.com/shylinux/contexts/master/etc/conf/vimrc
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
vim -c PlugInstall
;;
*)
;;
esac
}
ShyUpgrade() {
file=auto.sh && [ "$1" != "" ] && file=$1
${ctx_curl} -s $ctx_dev/publish/$file > $file && source auto.sh
}
ShyRelay() {
which=relay && [ "$1" != "" ] && which=$1 && shift
favor=tmux.auto && [ "$1" != "" ] && favor=$1 && shift
step=before arg="" && for cmd in "$@"; do
[ "$cmd" = after ] && step=after && continue
arg="$arg&$step="`ShyWord $cmd`
done
${ctx_curl} -s "$ctx_dev/code/tmux/favor?relay=$which&cmds=$favor&$arg" &
}
ShyLocal() {
which=alpine && [ "$1" != "" ] && which=$1 && shift
favor=tmux.auto && [ "$1" != "" ] && favor=$1 && shift
step=before arg="" && for cmd in "$@"; do
[ "$cmd" = after ] && step=after && continue
arg="$arg&$step="`ShyWord $cmd`
done
${ctx_curl} -s "$ctx_dev/code/tmux/favor?local=$which&cmds=$favor&$arg" &
}
ShyFavor() {
cmd=$1; [ "$READLINE_LINE" != "" ] && set $READLINE_LINE && READLINE_LINE=""
if [ "$cmd" = "sh" ] ; then
# 查看收藏
ctx_word="sh"
shift && [ "$1" != "" ] && ctx_tab="$1"
shift && ctx_note="$1"
else
# 添加收藏
[ "$1" != "" ] && ctx_word="$*" || ctx_word=`history|tail -n1|head -n1|sed -e 's/^[\ 0-9]*//g'`
fi
ShyPost favor "${ctx_word}" tab "${ctx_tab}" note "${ctx_note}"
}
ShyInput() {
if [ "$1" = "line" ] ; then
READLINE_LINE=`ShyPost input "$1" line "$READLINE_LINE" point "$READLINE_POINT"`
else
COMPREPLY=(`ShyPost input "$COMP_WORDS" line "$COMP_LINE" index "$COMP_CWORD" break "$COMP_WORDBREAKS"`)
fi
}
# 同步数据
ShySync() {
case "$1" in
"base")
ShySync df &>/dev/null
ShySync ps &>/dev/null
ShySync env &>/dev/null
ShySync free &>/dev/null
ShySync history
;;
"history")
ctx_end=`history|tail -n1|awk '{print $1}'`
ctx_begin=${ctx_begin:=$ctx_end}
ctx_count=`expr $ctx_end - $ctx_begin`
ShyEcho "sync $ctx_begin-$ctx_end count $ctx_count to $ctx_dev"
HISTTIMEFORMAT="%F %T " history|tail -n $ctx_count |while read line; do
ShyPost sync history arg "$line" >/dev/null
done
ctx_begin=$ctx_end
;;
ps) ShySend ps -ef ;;
*) ShySend "$@"
esac
}
ShyInit() {
[ "$ctx_begin" = "" ] && ctx_begin=`history|tail -n1|awk '{print $1}'`
case "${SHELL##*/}" in
"zsh") PROMPT='%![%*]%c$ ' ;;
*) PS1="\!-$$-\u@\h[\t]\W\$ " ;;
esac
if bind &>/dev/null; then
# bash
bind -x '"\C-G\C-R":ShySync base'
bind -x '"\C-G\C-G":ShySync history'
# bind -x '"\C-P":history-search-backward'
# bind -x '"\C-N":history-search-forward'
# bind 'TAB:complete'
bind 'TAB:menu-complete'
complete -F ShyInput word
bind -x '"\C-K":ShyInput line'
bind -x '"\C-G\C-F":ShyFavor'
bind -x '"\C-GF":ShyFavor sh'
bind -x '"\C-Gf":ShyFavor sh'
elif bindkey &>/dev/null; then
# zsh
setopt nosharehistory
bindkey -s '\C-G\C-R' 'ShySync base\n'
bindkey -s '\C-G\C-G' 'ShySync history\n'
fi
echo "url: ${ctx_url}"
echo -n "pid: $$"
echo -n "begin: ${ctx_begin}"
echo -n "share: ${ctx_share}"
echo "pane: $TMUX_PANE"
}