1
0
forked from x/icebergs

add web.proxy

This commit is contained in:
shaoying 2020-03-16 15:48:49 +08:00
parent 0ed939c9b3
commit 155177ea92
17 changed files with 299 additions and 90 deletions

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"os" "os"
"runtime"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -135,14 +136,15 @@ func Run(arg ...string) string {
arg = os.Args[1:] arg = os.Args[1:]
} }
if len(arg) == 0 { if len(arg) == 0 {
// arg = append(arg, WEB_SERVE)
arg = append(arg, WEB_SPACE, "connect", "self") arg = append(arg, WEB_SPACE, "connect", "self")
} }
frame := &Frame{} frame := &Frame{}
Index.server = frame Index.server = frame
Pulse.Option("cache.limit", "30")
Pulse.Option("begin_time", Pulse.Time()) Pulse.Option("begin_time", Pulse.Time())
runtime.GOMAXPROCS(1)
if frame.Begin(Pulse.Spawns(), arg...).Start(Pulse, arg...) { if frame.Begin(Pulse.Spawns(), arg...).Start(Pulse, arg...) {
frame.Close(Pulse.Spawns(), arg...) frame.Close(Pulse.Spawns(), arg...)
} }
@ -151,7 +153,6 @@ func Run(arg ...string) string {
Pulse.Table() Pulse.Table()
} }
fmt.Printf(Pulse.Result()) fmt.Printf(Pulse.Result())
// time.Sleep(time.Second)
os.Exit(frame.code) os.Exit(frame.code)
return "" return ""
} }

View File

@ -20,6 +20,7 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
ice.CLI_RUNTIME: {Name: "runtime", Help: "运行环境", Value: kit.Dict()}, ice.CLI_RUNTIME: {Name: "runtime", Help: "运行环境", Value: kit.Dict()},
ice.CLI_SYSTEM: {Name: "system", Help: "系统命令", Value: kit.Data()}, ice.CLI_SYSTEM: {Name: "system", Help: "系统命令", Value: kit.Data()},
"python": {Name: "python", Help: "系统命令", Value: kit.Data("python", "python", "pip", "pip")}, "python": {Name: "python", Help: "系统命令", Value: kit.Data("python", "python", "pip", "pip")},
"daemon": {Name: "daemon", Help: "守护进程", Value: kit.Data(kit.MDB_SHORT, "name")},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -94,15 +95,25 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
case "daemon": case "daemon":
// 守护进程 // 守护进程
cmd.Env = append(cmd.Env, fmt.Sprintf("PATH=%s", os.Getenv("PATH"))) cmd.Env = append(cmd.Env, fmt.Sprintf("PATH=%s", os.Getenv("PATH")))
if e := cmd.Start(); e != nil {
m.Warn(e != nil, "%v start: %s", arg, e)
return
}
m.Rich("daemon", nil, kit.Dict(kit.MDB_NAME, cmd.Process.Pid, "status", "running"))
m.Echo("%d", cmd.Process.Pid)
m.Gos(m, func(m *ice.Message) { m.Gos(m, func(m *ice.Message) {
if e := cmd.Start(); e != nil { if e := cmd.Wait(); e != nil {
m.Warn(e != nil, "%v start: %s", arg, e)
} else if e := cmd.Wait(); e != nil {
m.Warn(e != nil, "%v wait: %s", arg, e) m.Warn(e != nil, "%v wait: %s", arg, e)
} else { } else {
m.Cost("%v exit: %v", arg, cmd.ProcessState.ExitCode()) m.Cost("%v exit: %v", arg, cmd.ProcessState.ExitCode())
m.Rich("daemon", nil, func(key string, value map[string]interface{}) {
value["status"] = "exited"
})
} }
}) })
default: default:
// 系统命令 // 系统命令
out := bytes.NewBuffer(make([]byte, 0, 1024)) out := bytes.NewBuffer(make([]byte, 0, 1024))
@ -118,6 +129,11 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
m.Echo(out.String()) m.Echo(out.String())
} }
}}, }},
"daemon": {Name: "daemon", Help: "守护进程", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[0] {
case "exit":
}
}},
"python": {Name: "python", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "python": {Name: "python", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
prefix := []string{ice.CLI_SYSTEM, m.Conf("python", "meta.python")} prefix := []string{ice.CLI_SYSTEM, m.Conf("python", "meta.python")}
switch arg[0] { switch arg[0] {

View File

@ -8,12 +8,14 @@ import (
"os" "os"
"path" "path"
"sort" "sort"
"strings"
) )
var Index = &ice.Context{Name: "ctx", Help: "配置模块", var Index = &ice.Context{Name: "ctx", Help: "配置模块",
Caches: map[string]*ice.Cache{}, Caches: map[string]*ice.Cache{},
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
ice.CTX_CONFIG: {Name: "config", Help: "配置", Value: kit.Data("path", "var/conf")}, ice.CTX_CONFIG: {Name: "config", Help: "配置", Value: kit.Data("path", "var/conf")},
"demo": {Name: "demo", Help: "配置", Value: kit.Data("path", "var/conf")},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
ice.CTX_CONTEXT: {Name: "context [all]", Help: "模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.CTX_CONTEXT: {Name: "context [all]", Help: "模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -169,8 +171,12 @@ var Index = &ice.Context{Name: "ctx", Help: "配置模块",
} }
default: default:
if len(arg) > 2 { if len(arg) > 2 {
// 修改配置 if strings.HasPrefix(arg[2], "@") {
msg.Conf(arg[0], arg[1], arg[2]) msg.Conf(arg[0], arg[1], msg.Cmdx("nfs.cat", arg[2][1:]))
} else {
msg.Conf(arg[0], arg[1], kit.Parse(nil, "", arg[2:]...))
}
} }
if len(arg) > 1 { if len(arg) > 1 {
// 读取配置 // 读取配置

View File

@ -30,7 +30,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
return true return true
} }
m.Log(ice.LOG_SIGNAL, "%v: %v", s, m.Confv(ice.GDB_SIGNAL, kit.Keys(kit.MDB_HASH, s))) m.Log(ice.LOG_SIGNAL, "%v: %v", s, m.Confv(ice.GDB_SIGNAL, kit.Keys(kit.MDB_HASH, s)))
m.Cmd(m.Confv(ice.GDB_SIGNAL, kit.Keys(kit.MDB_HASH, s))) m.Cmd(m.Confv(ice.GDB_SIGNAL, kit.Keys(kit.MDB_HASH, s)), kit.Keys(s))
case t, ok := <-f.t: case t, ok := <-f.t:
if !ok { if !ok {
@ -73,9 +73,10 @@ var Index = &ice.Context{Name: "gdb", Help: "事件模块",
kit.MDB_META, kit.Dict("pid", "var/run/ice.pid"), kit.MDB_META, kit.Dict("pid", "var/run/ice.pid"),
kit.MDB_LIST, kit.List(), kit.MDB_LIST, kit.List(),
kit.MDB_HASH, kit.Dict( kit.MDB_HASH, kit.Dict(
"2", []interface{}{"exit"}, "2", []interface{}{"exit", "0"},
"3", []interface{}{"exit", "1"}, "3", []interface{}{"exit", "1"},
"15", []interface{}{"exit"}, "15", []interface{}{"exit", "1"},
"20", []interface{}{"cli.daemon", "exit"},
"30", []interface{}{"exit"}, "30", []interface{}{"exit"},
"31", []interface{}{"exit", "1"}, "31", []interface{}{"exit", "1"},
"28", "WINCH", "28", "WINCH",

View File

@ -52,7 +52,7 @@ func (f *Frame) printf(m *ice.Message, res string, arg ...interface{}) *Frame {
return f return f
} }
func (f *Frame) parse(m *ice.Message, line string) *Frame { func (f *Frame) parse(m *ice.Message, line string) *Frame {
for _, one := range kit.Split(line, ";") { for _, one := range kit.Split(line, ";", ";", ";") {
ls := kit.Split(one) ls := kit.Split(one)
m.Log(ice.LOG_IMPORT, "stdin: %d %v", len(ls), ls) m.Log(ice.LOG_IMPORT, "stdin: %d %v", len(ls), ls)

View File

@ -19,3 +19,35 @@ var share_template = kit.Dict(
</body> </body>
`, `,
) )
var favor_template = kit.Dict(
"shell", `<div class="code">{{$msg := .}}{{range $index, $_ := .Appendv "_index"}}{{$name := $msg.Appendv "name"}}{{$text := $msg.Appendv "text"}}
# {{index $name $index}}
{{index $text $index}}
{{end}}
</div>`,
"vimrc", `<div class="code">{{$msg := .}}{{range $index, $_ := .Appendv "_index"}}{{$name := $msg.Appendv "name"}}{{$id := $msg.Appendv "id"}}
{{$res := index $id $index|$msg.Prefile ""}}
# {{index $name $index}} {{index $res "extra.buf"}}:{{index $res "extra.row"}}
{{index $res "content"}}
{{end}}
</div>`,
"field", `{{$msg := .}}
{{range $index, $_ := .Appendv "_index"}}
{{$type := $msg.Appendv "type"}}{{$name := $msg.Appendv "name"}}{{$text := $msg.Appendv "text"}}
<fieldset class="story {{index $name $index}}" data-type="{{index $type $index}}" data-name="{{index $name $index}}" data-text="{{index $text $index}}" data-meta='{{index $text $index|$msg.Preview}}'>
<legend>{{index $name $index}}</legend>
<form class="option"></form>
<div class="action"></div>
<div class="output"></div>
<div class="status"></div>
</fieldset>
{{end}}
`,
"spide", `<ul>{{$msg := .}}
{{range $index, $_ := .Appendv "_index"}}
{{$name := $msg.Appendv "name"}}
{{$text := $msg.Appendv "text"}}
<li>{{index $name $index}}: <a href="{{index $text $index}}" target="_blank">{{index $text $index}}</a></li>
{{end}}
</ul>`,
)

View File

@ -443,7 +443,9 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
"cmd", []interface{}{ice.CLI_SYSTEM, "ice.bin", ice.WEB_SPACE, "connect"}, "cmd", []interface{}{ice.CLI_SYSTEM, "ice.bin", ice.WEB_SPACE, "connect"},
)}, )},
ice.WEB_FAVOR: {Name: "favor", Help: "收藏夹", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, ice.WEB_FAVOR: {Name: "favor", Help: "收藏夹", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_NAME, "template", favor_template,
)},
ice.WEB_CACHE: {Name: "cache", Help: "缓存池", Value: kit.Data( ice.WEB_CACHE: {Name: "cache", Help: "缓存池", Value: kit.Data(
kit.MDB_SHORT, "text", "path", "var/file", "store", "var/data", "fsize", "100000", "limit", "50", "least", "30", kit.MDB_SHORT, "text", "path", "var/file", "store", "var/data", "fsize", "100000", "limit", "50", "least", "30",
)}, )},
@ -472,8 +474,13 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
if m.Richs(ice.WEB_SPIDE, nil, "shy", nil) == nil { if m.Richs(ice.WEB_SPIDE, nil, "shy", nil) == nil {
m.Cmd(ice.WEB_SPIDE, "add", "shy", kit.Select("https://shylinux.com:443", m.Conf(ice.CLI_RUNTIME, "conf.ctx_shy"))) m.Cmd(ice.WEB_SPIDE, "add", "shy", kit.Select("https://shylinux.com:443", m.Conf(ice.CLI_RUNTIME, "conf.ctx_shy")))
} }
m.Rich(ice.WEB_SPACE, nil, kit.Dict(
kit.MDB_TYPE, ice.WEB_BETTER, kit.MDB_NAME, "tmux",
kit.MDB_TEXT, m.Conf(ice.CLI_RUNTIME, "boot.username"),
))
m.Watch(ice.SYSTEM_INIT, "web.code.git.repos", "volcanos", m.Conf(ice.WEB_SERVE, "meta.volcanos.path"), m.Watch(ice.SYSTEM_INIT, "web.code.git.repos", "volcanos", m.Conf(ice.WEB_SERVE, "meta.volcanos.path"),
m.Conf(ice.WEB_SERVE, "meta.volcanos.repos"), m.Conf(ice.WEB_SERVE, "meta.volcanos.branch")) m.Conf(ice.WEB_SERVE, "meta.volcanos.repos"), m.Conf(ice.WEB_SERVE, "meta.volcanos.branch"))
m.Conf(ice.WEB_FAVOR, "meta.template", favor_template)
}}, }},
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
p := m.Conf(ice.WEB_CACHE, "meta.store") p := m.Conf(ice.WEB_CACHE, "meta.store")
@ -753,9 +760,9 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
kit.MDB_INPUT, "button", "value", "返回", "cb", "Last", kit.MDB_INPUT, "button", "value", "返回", "cb", "Last",
), 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 { if len(arg) == 0 {
// 节点列表 // 空间列表
m.Richs(ice.WEB_SPACE, nil, "*", func(key string, value map[string]interface{}) { m.Richs(ice.WEB_SPACE, nil, "*", func(key string, value map[string]interface{}) {
m.Push(key, value, []string{"time", "type", "name", "user"}) m.Push(key, value, []string{"time", "type", "name", "text"})
}) })
m.Sort("name") m.Sort("name")
return return
@ -804,7 +811,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
// 连接成功 // 连接成功
msg.Rich(ice.WEB_SPACE, nil, kit.Dict( msg.Rich(ice.WEB_SPACE, nil, kit.Dict(
kit.MDB_TYPE, ice.WEB_MASTER, kit.MDB_NAME, dev, "user", kit.Value(value, "client.hostname"), kit.MDB_TYPE, ice.WEB_MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, kit.Value(value, "client.hostname"),
"socket", s, "socket", s,
)) ))
msg.Log(ice.LOG_CMDS, "%d conn %s success %s", i, dev, u) msg.Log(ice.LOG_CMDS, "%d conn %s success %s", i, dev, u)
@ -826,6 +833,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
default: default:
if len(arg) == 1 { if len(arg) == 1 {
// 空间空间
list := []string{} list := []string{}
m.Cmdy(ice.WEB_SPACE, arg[0], "space").Table(func(index int, value map[string]string, head []string) { m.Cmdy(ice.WEB_SPACE, arg[0], "space").Table(func(index int, value map[string]string, head []string) {
list = append(list, arg[0]+"."+value["name"]) list = append(list, arg[0]+"."+value["name"])
@ -833,7 +841,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
m.Append("name", list) m.Append("name", list)
break break
// 节点详情 // 空间详情
m.Richs(ice.WEB_SPACE, nil, arg[0], func(key string, value map[string]interface{}) { m.Richs(ice.WEB_SPACE, nil, arg[0], func(key string, value map[string]interface{}) {
m.Push("detail", value) m.Push("detail", value)
}) })
@ -849,16 +857,24 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
target := strings.Split(arg[0], ".") target := strings.Split(arg[0], ".")
m.Warn(m.Richs(ice.WEB_SPACE, nil, target[0], func(key string, value map[string]interface{}) { m.Warn(m.Richs(ice.WEB_SPACE, nil, target[0], func(key string, value map[string]interface{}) {
if socket, ok := value["socket"].(*websocket.Conn); ok { if socket, ok := value["socket"].(*websocket.Conn); ok {
// 构造路由 // 复制选项
id := kit.Format(c.ID()) for _, k := range kit.Simple(m.Optionv("_option")) {
m.Optionv(ice.MSG_SOURCE, []string{id})
m.Optionv(ice.MSG_TARGET, target[1:])
for _, k := range []string{"top", "hot", ice.MSG_USERNAME} {
if m.Options(k) { if m.Options(k) {
m.Option(k, m.Option(k)) switch k {
case "detail", "cmds":
default:
if m.Option(k) != "" {
m.Option(k, m.Option(k))
}
}
} }
} }
// 构造路由
id := kit.Format(c.ID())
m.Set(ice.MSG_DETAIL, arg[1:]...) m.Set(ice.MSG_DETAIL, arg[1:]...)
m.Optionv(ice.MSG_TARGET, target[1:])
m.Optionv(ice.MSG_SOURCE, []string{id})
m.Info("send %s %s", id, m.Format("meta")) m.Info("send %s %s", id, m.Format("meta"))
// 下发命令 // 下发命令
@ -949,13 +965,27 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
ice.WEB_FAVOR: {Name: "favor [path [type name [text [key value]....]]", Help: "收藏夹", Meta: kit.Dict( ice.WEB_FAVOR: {Name: "favor [path [type name [text [key value]....]]", Help: "收藏夹", Meta: kit.Dict(
"remote", "pod", "exports", []string{"hot", "favor"}, "remote", "pod", "exports", []string{"hot", "favor"},
"detail", []string{"编辑", "收录", "导出", "删除"}, "detail", []string{"编辑", "收藏", "收录", "导出", "删除"},
), List: kit.List( ), List: kit.List(
kit.MDB_INPUT, "text", "name", "favor", "action", "auto", kit.MDB_INPUT, "text", "name", "favor", "action", "auto",
kit.MDB_INPUT, "text", "name", "id", "action", "auto", kit.MDB_INPUT, "text", "name", "id", "action", "auto",
kit.MDB_INPUT, "button", "value", "查看", "action", "auto", kit.MDB_INPUT, "button", "value", "查看", "action", "auto",
kit.MDB_INPUT, "button", "value", "返回", "cb", "Last", kit.MDB_INPUT, "button", "value", "返回", "cb", "Last",
kit.MDB_INPUT, "button", "value", "渲染",
kit.MDB_INPUT, "button", "value", "回放",
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch m.Option("_action") {
case "渲染":
m.Option("render", "spide")
m.Richs(ice.WEB_FAVOR, nil, kit.Select(m.Option("favor"), arg, 0), func(key string, value map[string]interface{}) {
m.Option("render", kit.Select("spide", kit.Value(value, "meta.render")))
})
defer m.Render(m.Conf(ice.WEB_FAVOR, kit.Keys("meta.template", m.Option("render"))))
case "回放":
return
}
if len(arg) > 1 && arg[0] == "action" { if len(arg) > 1 && arg[0] == "action" {
favor, id := m.Option("favor"), m.Option("id") favor, id := m.Option("favor"), m.Option("id")
switch arg[2] { switch arg[2] {
@ -968,6 +998,12 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
switch arg[1] { switch arg[1] {
case "modify", "编辑": case "modify", "编辑":
m.Richs(ice.WEB_FAVOR, nil, favor, func(key string, value map[string]interface{}) { m.Richs(ice.WEB_FAVOR, nil, favor, func(key string, value map[string]interface{}) {
if id == "" {
m.Log(ice.LOG_MODIFY, "favor: %s value: %v->%v", key, kit.Value(value, kit.Keys("meta", arg[2])), arg[3])
m.Echo("%s->%s", kit.Value(value, kit.Keys("meta", arg[2])), arg[3])
kit.Value(value, kit.Keys("meta", arg[2]), arg[3])
return
}
m.Grows(ice.WEB_FAVOR, kit.Keys(kit.MDB_HASH, key), "id", id, func(index int, value map[string]interface{}) { m.Grows(ice.WEB_FAVOR, kit.Keys(kit.MDB_HASH, key), "id", id, func(index int, value map[string]interface{}) {
m.Log(ice.LOG_MODIFY, "favor: %s index: %d value: %v->%v", key, index, value[arg[2]], arg[3]) m.Log(ice.LOG_MODIFY, "favor: %s index: %d value: %v->%v", key, index, value[arg[2]], arg[3])
m.Echo("%s->%s", value[arg[2]], arg[3]) m.Echo("%s->%s", value[arg[2]], arg[3])
@ -1010,12 +1046,14 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
// 收藏门类 // 收藏门类
m.Richs(ice.WEB_FAVOR, nil, "*", func(key string, value map[string]interface{}) { m.Richs(ice.WEB_FAVOR, nil, "*", func(key string, value map[string]interface{}) {
m.Push(key, value["meta"], []string{"time", "count"}) m.Push(key, value["meta"], []string{"time", "count"})
m.Push("render", kit.Select("spide", kit.Value(value, "meta.render")))
m.Push("favor", kit.Value(value, "meta.name")) m.Push("favor", kit.Value(value, "meta.name"))
}) })
m.Sort("favor") m.Sort("favor")
return return
} }
m.Option("favor", arg[0])
fields := []string{kit.MDB_TIME, kit.MDB_ID, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT} fields := []string{kit.MDB_TIME, kit.MDB_ID, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT}
if len(arg) > 1 && arg[1] == "extra" { if len(arg) > 1 && arg[1] == "extra" {
fields, arg = append(fields, arg[2:]...), arg[:1] fields, arg = append(fields, arg[2:]...), arg[:1]
@ -1580,13 +1618,37 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
}}, }},
ice.WEB_ROUTE: {Name: "route", Help: "路由", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.WEB_ROUTE: {Name: "route", Help: "路由", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
}}, m.Richs(ice.WEB_SPACE, nil, arg[0], func(key string, value map[string]interface{}) {
ice.WEB_PROXY: {Name: "proxy", Help: "代理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch value[kit.MDB_TYPE] {
case ice.WEB_MASTER:
case ice.WEB_SERVER:
case ice.WEB_WORKER:
}
})
m.Cmdy(ice.WEB_SPACE, arg[0], arg[1:]) m.Cmdy(ice.WEB_SPACE, arg[0], arg[1:])
}}, }},
ice.WEB_PROXY: {Name: "proxy", Help: "代理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Richs(ice.WEB_SPACE, nil, arg[0], func(key string, value map[string]interface{}) {
if value[kit.MDB_TYPE] == ice.WEB_BETTER {
switch value[kit.MDB_NAME] {
case "tmux":
m.Cmd("web.code.tmux.session").Table(func(index int, value map[string]string, head []string) {
if value["tag"] == "1" {
m.Log(ice.LOG_SELECT, "space: %s", value["session"])
arg[0] = value["session"]
}
})
}
}
})
m.Cmdy(ice.WEB_ROUTE, arg[0], arg[1:])
}},
ice.WEB_GROUP: {Name: "group", Help: "分组", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.WEB_GROUP: {Name: "group", Help: "分组", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(ice.WEB_PROXY, arg[0], arg[1:])
}}, }},
ice.WEB_LABEL: {Name: "label", Help: "标签", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.WEB_LABEL: {Name: "label", Help: "标签", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(ice.WEB_GROUP, arg[0], arg[1:])
}}, }},
"/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -1796,7 +1858,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
h := m.Rich(ice.WEB_SPACE, nil, kit.Dict( h := m.Rich(ice.WEB_SPACE, nil, kit.Dict(
kit.MDB_TYPE, m.Option("node"), kit.MDB_TYPE, m.Option("node"),
kit.MDB_NAME, m.Option("name"), kit.MDB_NAME, m.Option("name"),
kit.MDB_USER, m.Option("user"), kit.MDB_TEXT, m.Option("user"),
"sessid", m.Option("sessid"), "sessid", m.Option("sessid"),
"share", share, "socket", s, "share", share, "socket", s,
)) ))

View File

@ -78,6 +78,7 @@ const ( // WEB
WEB_MASTER = "master" WEB_MASTER = "master"
WEB_MYSELF = "myself" WEB_MYSELF = "myself"
WEB_BETTER = "better"
WEB_SERVER = "server" WEB_SERVER = "server"
WEB_WORKER = "worker" WEB_WORKER = "worker"
) )

View File

@ -5,8 +5,6 @@ import (
_ "github.com/shylinux/icebergs/base" _ "github.com/shylinux/icebergs/base"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
"github.com/shylinux/toolkits" "github.com/shylinux/toolkits"
"strings"
) )
var Index = &ice.Context{Name: "chat", Help: "聊天中心", var Index = &ice.Context{Name: "chat", Help: "聊天中心",
@ -31,7 +29,6 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
[]interface{}{"field", "draw", "web.wiki"}, []interface{}{"field", "draw", "web.wiki"},
[]interface{}{"field", "data", "web.wiki"}, []interface{}{"field", "data", "web.wiki"},
[]interface{}{"field", "word", "web.wiki"}, []interface{}{"field", "word", "web.wiki"},
[]interface{}{"field", "mind", "web.wiki"},
[]interface{}{"field", "walk", "web.wiki"}, []interface{}{"field", "walk", "web.wiki"},
[]interface{}{"field", "feel", "web.wiki"}, []interface{}{"field", "feel", "web.wiki"},
@ -445,12 +442,31 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
// 命令补全 // 命令补全
if len(arg) > 3 && arg[3] == "action" { if len(arg) > 3 && arg[3] == "action" {
switch arg[4] { switch arg[4] {
case "input":
switch arg[5] {
case "location":
// 查询位置
m.Copy(m.Cmd("aaa.location"), "append", "name")
return
}
case "favor":
m.Cmdy(ice.WEB_FAVOR, arg[5:])
return
case "location": case "location":
// 记录位置 // 记录位置
m.Cmdy("aaa.location", arg[5:]) m.Cmdy("aaa.location", arg[5:])
return return
case "upload": case "upload":
m.Cmdy(ice.WEB_STORY, "upload") m.Cmdy(ice.WEB_STORY, "upload")
return
case "story":
// cmds := kit.Split(arg[7])
// if m.Right(cmds, arg[8:]) {
// m.Cmdy(cmds, arg[8:])
// }
// return
case "share": case "share":
list := []string{} list := []string{}
@ -460,13 +476,6 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
// 共享命令 // 共享命令
m.Cmdy(ice.WEB_SHARE, "add", "action", arg[5], arg[6], list) m.Cmdy(ice.WEB_SHARE, "add", "action", arg[5], arg[6], list)
return return
case "input":
switch arg[5] {
case "location":
// 查询位置
m.Copy(m.Cmd("aaa.location"), "append", "name")
return
}
} }
} }
@ -476,19 +485,30 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
}) })
if len(cmds) == 0 { if len(cmds) == 0 {
// 没有命令
m.Push("_output", "status")
m.Set("result").Echo("404")
return return
} }
if !m.Right(cmd, arg[2]) { if !m.Right(cmds) {
// 没有权限 // 没有权限
m.Push("_output", "status") m.Push("_output", "status")
m.Set("result").Echo("403") m.Set("result").Echo("403")
return return
} }
m.Cmd(ice.WEB_FAVOR, "cmd.history", "cmd", m.Option(ice.MSG_SESSID)[:6], strings.Join(cmds, " ")) // 代理命令
proxy := []string{}
m.Search(cmds[0], func(p *ice.Context, c *ice.Context, key string, cmd *ice.Command) {
if remote := kit.Format(kit.Value(cmd.Meta, "remote")); m.Option(remote) != "" {
proxy = append(proxy, ice.WEB_PROXY, m.Option(remote))
}
})
// 执行命令 // 执行命令
m.Cmdy(cmds).Option("cmds", cmds) m.Cmdy(proxy, cmds).Option("cmds", cmds)
// m.Cmd(ice.WEB_FAVOR, "cmd.history", "cmd", m.Option(ice.MSG_SESSID)[:6], strings.Join(cmds, " "))
}}, }},
}, },
} }

View File

@ -246,7 +246,9 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
data := kit.Dict() data := kit.Dict()
cmds := kit.Split(arg[1]) cmds := kit.Split(arg[1])
m.Search(cmds[0], func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) { m.Search(cmds[0], func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
data["feature"], data["inputs"] = cmd.Meta, cmd.List if data["feature"], data["inputs"] = cmd.Meta, cmd.List; len(cmd.List) == 0 {
data["inputs"] = m.Confv("field", "meta.some.simple.inputs")
}
}) })
for i := 2; i < len(arg)-1; i += 2 { for i := 2; i < len(arg)-1; i += 2 {
@ -413,6 +415,16 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
switch arg[1] { switch arg[1] {
case "story": case "story":
cmds := kit.Split(arg[4]) cmds := kit.Split(arg[4])
if len(arg) > 6 {
switch arg[5] {
case "action":
switch arg[6] {
case "favor":
m.Cmdy(ice.WEB_FAVOR, arg[7:])
return
}
}
}
if m.Right(cmds, arg[5:]) { if m.Right(cmds, arg[5:]) {
m.Cmdy(cmds, arg[5:]) m.Cmdy(cmds, arg[5:])
} }

View File

@ -101,7 +101,7 @@ var Index = &ice.Context{Name: "chrome", Help: "浏览器",
// 添加收藏 // 添加收藏
cmds := []string{ice.WEB_FAVOR, m.Option("tab"), ice.TYPE_SPIDE, m.Option("note"), arg[0]} cmds := []string{ice.WEB_FAVOR, m.Option("tab"), ice.TYPE_SPIDE, m.Option("note"), arg[0]}
if m.Cmdy(cmds); m.Option("you") != "" { if m.Cmdy(cmds); m.Option("you") != "" {
m.Cmdy(ice.WEB_SPACE, m.Option("you"), cmds) m.Cmdy(ice.WEB_PROXY, m.Option("you"), cmds)
} }
return return
} }

View File

@ -11,7 +11,7 @@ import (
var Index = &ice.Context{Name: "docker", Help: "虚拟机", var Index = &ice.Context{Name: "docker", Help: "虚拟机",
Caches: map[string]*ice.Cache{}, Caches: map[string]*ice.Cache{},
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
"docker": {Name: "docker", Help: "虚拟机", Value: kit.Data(kit.MDB_SHORT, "name")}, "docker": {Name: "docker", Help: "虚拟机", Value: kit.Data(kit.MDB_SHORT, "name", "build", []interface{}{})},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
"init": {Name: "init", Help: "初始化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "init": {Name: "init", Help: "初始化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -31,10 +31,18 @@ var Index = &ice.Context{Name: "docker", Help: "虚拟机",
return return
} }
args := []string{}
kit.Fetch(m.Confv("docker", "meta.build"), func(index int, value string) {
switch value {
case "home":
args = append(args, "-w", "/root")
case "mount":
args = append(args, "--mount", kit.Format("type=bind,source=%s,target=/root", kit.Path(m.Conf(ice.WEB_DREAM, "meta.path"), arg[0])))
}
})
// 创建容器 // 创建容器
pid := m.Cmdx(prefix, "run", "-dt", "-w", "/root", "--name", arg[0], pid := m.Cmdx(prefix, "run", "-dt", args, "--name", arg[0], "alpine")
// "--mount", kit.Format("type=bind,source=%s,target=/root", kit.Path(m.Conf(ice.WEB_DREAM, "meta.path"), arg[0])),
"alpine")
m.Log(ice.LOG_CREATE, "%s: %s", arg[0], pid) m.Log(ice.LOG_CREATE, "%s: %s", arg[0], pid)
m.Cmd(ice.WEB_FAVOR, kit.Select("alpine.auto", arg, 1)).Table(func(index int, value map[string]string, head []string) { m.Cmd(ice.WEB_FAVOR, kit.Select("alpine.auto", arg, 1)).Table(func(index int, value map[string]string, head []string) {

View File

@ -18,7 +18,7 @@ var Index = &ice.Context{Name: "input", Help: "输入法",
Caches: map[string]*ice.Cache{}, Caches: map[string]*ice.Cache{},
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
"input": {Name: "input", Help: "输入法", Value: kit.Data( "input": {Name: "input", Help: "输入法", Value: kit.Data(
"store", "var/input/", "fsize", "200000", "limit", "5000", "least", "1000", "store", "var/data/input", "fsize", "200000", "limit", "5000", "least", "1000",
"repos", "wubi-dict", "local", "some", "repos", "wubi-dict", "local", "some",
)}, )},
}, },
@ -45,13 +45,14 @@ var Index = &ice.Context{Name: "input", Help: "输入法",
// 清空数据 // 清空数据
lib := kit.Select(path.Base(arg[0]), arg, 1) lib := kit.Select(path.Base(arg[0]), arg, 1)
m.Assert(os.RemoveAll(m.Option("cache.store", path.Join(m.Conf("input", "meta.store"), lib)))) m.Assert(os.RemoveAll(path.Join(m.Conf("input", "meta.store"), lib)))
m.Conf("input", lib, "") m.Conf("input", lib, "")
// 缓存配置 // 缓存配置
m.Option("cache.least", m.Conf("input", "meta.least")) m.Conf("input", kit.Keys(lib, "meta.store"), path.Join(m.Conf("input", "meta.store"), lib))
m.Option("cache.limit", m.Conf("input", "meta.limit")) m.Conf("input", kit.Keys(lib, "meta.fsize"), m.Conf("input", "meta.fsize"))
m.Option("cache.fsize", m.Conf("input", "meta.fsize")) m.Conf("input", kit.Keys(lib, "meta.limit"), m.Conf("input", "meta.limit"))
m.Conf("input", kit.Keys(lib, "meta.least"), m.Conf("input", "meta.least"))
// 加载词库 // 加载词库
for bio.Scan() { for bio.Scan() {
@ -65,17 +66,16 @@ var Index = &ice.Context{Name: "input", Help: "输入法",
m.Grow("input", lib, kit.Dict("text", line[0], "code", line[1], "weight", line[2])) m.Grow("input", lib, kit.Dict("text", line[0], "code", line[1], "weight", line[2]))
} }
// 保存词库 // 保存词库
m.Option("cache.least", 0) m.Conf("input", kit.Keys(lib, "meta.limit"), 0)
m.Option("cache.limit", 0) m.Conf("input", kit.Keys(lib, "meta.least"), 0)
m.Echo("%s: %d", lib, m.Grow("input", lib, kit.Dict("text", "成功", "code", "z", "weight", "0"))) m.Echo("%s: %d", lib, m.Grow("input", lib, kit.Dict("text", "成功", "code", "z", "weight", "0")))
} }
}}, }},
"push": {Name: "push lib text code [weight]", Help: "添加词汇", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "push": {Name: "push lib text code [weight]", Help: "添加词汇", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option("cache.least", 0) m.Conf("input", kit.Keys(arg[0], "meta.limit"), 0)
m.Option("cache.limit", 0) m.Conf("input", kit.Keys(arg[0], "meta.least"), 0)
m.Option("cache.store", path.Join(m.Conf("input", "meta.store"), arg[0]))
m.Echo("%s: %d", arg[0], m.Grow("input", arg[0], kit.Dict( m.Echo("%s: %d", arg[0], m.Grow("input", arg[0], kit.Dict(
"text", arg[1], "code", arg[2], "weight", kit.Select("9091929394", arg, 3)))) "text", arg[1], "code", arg[2], "weight", kit.Select("90919495", arg, 3))))
}}, }},
"list": {Name: "list [lib [offend [limit]]]", Help: "查看词汇", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "list": {Name: "list [lib [offend [limit]]]", Help: "查看词汇", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {

View File

@ -283,6 +283,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
"local": {Name: "local which target", Help: "虚拟机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "local": {Name: "local which target", Help: "虚拟机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
prefix := kit.Simple(m.Confv("prefix", "meta.cmd")) prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
m.Cmd("web.code.docker.auto", arg[1])
m.Cmdy(prefix, "send-keys", "-t", arg[1], "docker exec -it ", arg[1], " bash", "Enter") m.Cmdy(prefix, "send-keys", "-t", arg[1], "docker exec -it ", arg[1], " bash", "Enter")
}}, }},
"relay": {Name: "relay which target", Help: "跳板机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "relay": {Name: "relay which target", Help: "跳板机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {

View File

@ -93,13 +93,16 @@ highlight Comment ctermfg=cyan ctermbg=darkblue
" 收藏列表 " 收藏列表
call ShyDefine("g:favor_tab", "") call ShyDefine("g:favor_tab", "")
call ShyDefine("g:favor_note", "") call ShyDefine("g:favor_note", "")
let shyList=["启动流程", "请求响应", "服务集群", "数据结构", "系统架构", "编译原理"]
fun! ShyFavor() fun! ShyFavor()
let g:favor_tab = input("tab: ", g:favor_tab) " let g:favor_tab = input("tab: ", g:favor_tab)
let g:favor_tab = g:shyList[inputlist(g:shyList)-1]
let g:favor_note = input("note: ", g:favor_note) let g:favor_note = input("note: ", g:favor_note)
call ShySend("favor", {"tab": g:favor_tab, "note": g:favor_note, "arg": getline("."), "row": getpos(".")[1], "col": getpos(".")[2]}) call ShySend("favor", {"tab": g:favor_tab, "note": g:favor_note, "arg": getline("."), "row": getpos(".")[1], "col": getpos(".")[2]})
endfun endfun
fun! ShyFavors() fun! ShyFavors()
let res = split(ShySend("favor", {"tab": input("tab: ", g:favor_tab)}), "\n") " let res = split(ShySend("favor", {"tab": input("tab: ", g:favor_tab)}), "\n")
let res = split(ShySend("favor", {"tab": g:shyList[inputlist(g:shyList)-1]}), "\n")
let page = "" | let note = "" let page = "" | let note = ""
for i in range(0, len(res)-1, 2) for i in range(0, len(res)-1, 2)
if res[i] != page if res[i] != page
@ -108,7 +111,21 @@ fun! ShyFavors()
endif endif
let page = res[i] | let note .= res[i+1] . "\n" let page = res[i] | let note .= res[i+1] . "\n"
endfor endfor
if note != "" | lexpr note | lopen | let note = "" | endif if note != "" | lexpr note | let note = "" | endif
let view = inputlist(["列表", "默认", "垂直", "水平"])
for i in range(0, len(res)-1, 2)
if i < 5
if l:view == 4
split | lnext
elseif l:view == 3
vsplit | lnext
endif
endif
endfor
botright lopen
if l:view == 1 | only | endif
endfun endfun
fun! ShyCheck(target) fun! ShyCheck(target)
if a:target == "cache" if a:target == "cache"

View File

@ -63,7 +63,7 @@ var Index = &ice.Context{Name: "vim", Help: "编辑器",
}}, }},
"/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) {
if strings.HasPrefix(strings.TrimSpace(arg[0]), "ice ") { if strings.HasPrefix(strings.TrimSpace(arg[0]), "ice ") {
list := kit.Split(strings.TrimSpace(arg[0]), "ice ") list := kit.Split(strings.TrimSpace(arg[0]))
switch list[1] { switch list[1] {
case "add": case "add":
// 添加词汇 // 添加词汇

92
type.go
View File

@ -428,6 +428,12 @@ func (m *Message) Echo(str string, arg ...interface{}) *Message {
return m return m
} }
func (m *Message) Copy(msg *Message, arg ...string) *Message { func (m *Message) Copy(msg *Message, arg ...string) *Message {
if m == msg {
return m
}
if m == nil {
return m
}
if len(arg) > 0 { if len(arg) > 0 {
// 精确复制 // 精确复制
for _, k := range arg[1:] { for _, k := range arg[1:] {
@ -959,6 +965,24 @@ func (m *Message) Watch(key string, arg ...string) *Message {
return m return m
} }
func (m *Message) Preview(arg string) (res string) {
list := kit.Split(arg)
m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) {
res = kit.Format(kit.Dict("feature", cmd.Meta, "inputs", cmd.List))
})
return res
}
func (m *Message) Prefile(favor string, id string) map[string]string {
res := map[string]string{}
m.Option("render", "")
m.Option("_action", "")
m.Cmd(WEB_FAVOR, kit.Select(m.Option("favor"), favor), id).Table(func(index int, value map[string]string, head []string) {
res[value["key"]] = value["value"]
})
res["content"] = m.Cmdx(CLI_SYSTEM, "sed", "-n", kit.Format("%d,%dp", kit.Int(res["extra.row"]), kit.Int(res["extra.row"])+3), res["extra.buf"])
return res
}
func (m *Message) Prefix(arg ...string) string { func (m *Message) Prefix(arg ...string) string {
return kit.Keys(m.Cap(CTX_FOLLOW), arg) return kit.Keys(m.Cap(CTX_FOLLOW), arg)
} }
@ -1226,16 +1250,24 @@ func (m *Message) Grow(key string, chain interface{}, data interface{}) int {
meta["count"] = id meta["count"] = id
// 保存数据 // 保存数据
if len(list) >= kit.Int(kit.Select(m.Conf(WEB_CACHE, "meta.limit"), kit.Select(kit.Format(meta["limit"]), m.Option("cache.limit")))) { if len(list) >= kit.Int(kit.Select(m.Conf(WEB_CACHE, "meta.limit"), kit.Format(meta["limit"]))) {
least := kit.Int(kit.Select(m.Conf(WEB_CACHE, "meta.least"), kit.Select(kit.Format(meta["least"]), m.Option("cache.least")))) least := kit.Int(kit.Select(m.Conf(WEB_CACHE, "meta.least"), kit.Format(meta["least"])))
// 创建文件 record, _ := meta["record"].([]interface{})
name := path.Join(kit.Select(m.Conf(WEB_CACHE, "meta.store"), kit.Select(kit.Format(meta["store"]), m.Option("cache.store"))), kit.Keys(key, chain, "csv"))
if s, e := os.Stat(name); e == nil { // 文件命名
if s.Size() > kit.Int64(kit.Select(m.Conf(WEB_CACHE, "meta.fsize"), kit.Select(kit.Format(meta["fsize"]), m.Option("cache.fsize")))) { prefix := path.Join(kit.Select(m.Conf(WEB_CACHE, "meta.store"), kit.Format(meta["store"])), key)
name = strings.Replace(name, ".csv", fmt.Sprintf("_%d.csv", kit.Int(meta["offset"])), -1) name := path.Join(prefix, kit.Keys(kit.Select("list", chain), "csv"))
if len(record) > 0 {
name = kit.Format(kit.Value(record, kit.Keys(len(record)-1, "file")))
if s, e := os.Stat(name); e == nil {
if s.Size() > kit.Int64(kit.Select(m.Conf(WEB_CACHE, "meta.fsize"), kit.Format(meta["fsize"]))) {
name = fmt.Sprintf("%s/%s_%d.csv", prefix, kit.Select("list", chain), kit.Int(meta["offset"]))
}
} }
} }
// 打开文件
f, e := os.OpenFile(name, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) f, e := os.OpenFile(name, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
if e != nil { if e != nil {
f, _, e = kit.Create(name) f, _, e = kit.Create(name)
@ -1256,28 +1288,22 @@ func (m *Message) Grow(key string, chain interface{}, data interface{}) int {
} }
sort.Strings(keys) sort.Strings(keys)
w.Write(keys) w.Write(keys)
m.Info("write head: %v", keys)
w.Flush() w.Flush()
s, e = f.Stat() s, e = f.Stat()
} else { } else {
r := csv.NewReader(f) r := csv.NewReader(f)
keys, e = r.Read() keys, e = r.Read()
m.Info("read head: %v", keys)
} }
// 保存记录 // 创建索引
count := len(list) - least count := len(list) - least
offset := kit.Int(meta["offset"]) offset := kit.Int(meta["offset"])
record, _ := meta["record"].([]interface{}) meta["record"] = append(record, map[string]interface{}{
if len(record) > 0 && kit.Format(kit.Value(record, kit.Keys(len(record)-1, "file"))) == name && count < 10 { "time": m.Time(), "offset": offset, "count": count,
kit.Value(record, kit.Keys(len(record)-1, "count"), kit.Int(kit.Value(record, kit.Keys(len(record)-1, "count")))+count) "file": name, "position": s.Size(),
} else { })
meta["record"] = append(record, map[string]interface{}{
"time": m.Time(),
"offset": offset,
"position": s.Size(),
"count": count,
"file": name,
})
}
// 保存数据 // 保存数据
for i, v := range list { for i, v := range list {
@ -1300,7 +1326,7 @@ func (m *Message) Grow(key string, chain interface{}, data interface{}) int {
m.Log(LOG_INFO, "%s.%v save %s offset %v+%v", key, chain, name, offset, count) m.Log(LOG_INFO, "%s.%v save %s offset %v+%v", key, chain, name, offset, count)
meta["offset"] = offset + count meta["offset"] = offset + count
list = list[:least] list = list[count:]
cache[kit.MDB_LIST] = list cache[kit.MDB_LIST] = list
w.Flush() w.Flush()
} }
@ -1453,16 +1479,22 @@ func (m *Message) Cmd(arg ...interface{}) *Message {
m.Search(list[0], func(p *Context, c *Context, key string, cmd *Command) { m.Search(list[0], func(p *Context, c *Context, key string, cmd *Command) {
m.TryCatch(m.Spawns(c), true, func(msg *Message) { m.TryCatch(m.Spawns(c), true, func(msg *Message) {
msg.meta[MSG_DETAIL] = list
m.Hand, msg.Hand, m = true, true, msg
if you := m.Option(kit.Format(kit.Value(cmd.Meta, "remote"))); you != "" {
// 远程命令
msg.Copy(msg.Spawns(c).Cmd(WEB_SPACE, you, list[0], list[1:]))
} else {
// 本地命令
p.Run(msg, cmd, key, list[1:]...)
}
m.Hand, msg.Hand = true, true m.Hand, msg.Hand = true, true
msg.meta[MSG_DETAIL] = list
// _key := kit.Format(kit.Value(cmd.Meta, "remote"))
// if you := m.Option(_key); you != "" {
// // 远程命令
// msg.Option(_key, "")
// msg.Option("_option", m.Optionv("option"))
// msg.Copy(msg.Spawns(c).Cmd(WEB_LABEL, you, list[0], list[1:]))
// } else {
// // 本地命令
// p.Run(msg, cmd, key, list[1:]...)
// }
p.Run(msg, cmd, key, list[1:]...)
m.Hand, msg.Hand, m = true, true, msg
}) })
}) })