diff --git a/base/aaa/email.go b/base/aaa/email.go index 16109dfc..6791482b 100644 --- a/base/aaa/email.go +++ b/base/aaa/email.go @@ -34,7 +34,7 @@ func init() { m.Warn(smtp.SendMail(m.Option(SERVICE), auth, m.Option(USERNAME), kit.Split(m.Option(TO)), content)) m.Logs(mdb.EXPORT, EMAIL, auth, string(content)) }}, - }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,service,username,password")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,service,username,password"), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { mdb.HashSelect(m, arg...).PushAction(SEND, mdb.REMOVE) }}, }) diff --git a/base/aaa/role.go b/base/aaa/role.go index 5dee6aba..34a901a2 100644 --- a/base/aaa/role.go +++ b/base/aaa/role.go @@ -92,7 +92,7 @@ func init() { m.Echo(ice.OK) } }}, - }, mdb.HashAction(mdb.SHORT, mdb.NAME)), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, mdb.NAME), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { _role_list(m, kit.Select("", arg, 0)).PushAction(mdb.DELETE) }}, }) @@ -145,4 +145,4 @@ func Black(m *ice.Message, key ...string) { for _, key := range key { m.Cmd(ROLE, BLACK, VOID, key) } -} \ No newline at end of file +} diff --git a/base/cli/mirrors.go b/base/cli/mirrors.go index 68372f15..29872202 100644 --- a/base/cli/mirrors.go +++ b/base/cli/mirrors.go @@ -42,6 +42,9 @@ func init() { func release(m *ice.Message) string { osid := runtime.GOOS + if osid != "linux" { + return osid + } m.Cmd(nfs.CAT, "/etc/os-release", kit.Dict(ice.MSG_USERROLE, aaa.ROOT), func(text string) { if ls := kit.Split(text, ice.EQ); len(ls) > 1 { switch ls[0] { diff --git a/base/cli/runtime.go b/base/cli/runtime.go index a0b5fbdc..453b2795 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -156,6 +156,7 @@ func init() { Index.MergeCommands(ice.Commands{ RUNTIME: {Name: "runtime info=ifconfig,hostinfo,hostname,userinfo,procinfo,diskinfo,bootinfo,api,cli,cmd,env auto", Help: "运行环境", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _runtime_init(m) }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", "", nil) }}, IFCONFIG: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy("tcp.host") }}, HOSTINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_hostinfo(m) }}, HOSTNAME: {Hand: func(m *ice.Message, arg ...string) { diff --git a/base/ctx/command.go b/base/ctx/command.go index c4369450..6aecf779 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -197,7 +197,7 @@ func TravelCmd(m *ice.Message, cb func(key, file, line string)) *ice.Message { if IsOrderCmd(key) { return } - if ls := kit.Split(cmd.GetFileLines(), ice.DF); !m.Warn(len(ls) == 0, ice.ErrNotFound, key) { + if ls := kit.Split(cmd.GetFileLines(), ice.DF); len(ls) > 0 { cb(kit.Keys(s.Cap(ice.CTX_FOLLOW), key), strings.TrimPrefix(ls[0], kit.Path("")+ice.PS), kit.Select("1", ls, 1)) } }) diff --git a/base/ctx/config.go b/base/ctx/config.go index e83d748f..1060c381 100644 --- a/base/ctx/config.go +++ b/base/ctx/config.go @@ -12,21 +12,43 @@ import ( "shylinux.com/x/toolkits/miss" ) -func _config_save(m *ice.Message, name string, arg ...string) { - name = path.Join(ice.VAR_CONF, name) - if f, p, e := miss.CreateFile(name); m.Assert(e) { - defer f.Close() - defer m.Echo(p) - msg := m.Spawn(m.Source()) - data := ice.Map{} - for _, k := range arg { - if v := msg.Confv(k); v != "" { - data[k] = v +func _config_only(v ice.Any, arg ...string) bool { + switch v := v.(type) { + case nil: + return true + case ice.Map: + if len(v) > len(arg) { + return false + } + kit.Sort(arg) + for _, k := range kit.SortedKey(v) { + if kit.IndexOf(arg, k) == -1 { + return false } } + return true + } + return false +} +func _config_save(m *ice.Message, name string, arg ...string) { + msg := m.Spawn(m.Source()) + data := ice.Map{} + for _, k := range arg { + // if v := msg.Confv(k); _config_only(v, mdb.META) && _config_only(kit.Value(v, mdb.META), mdb.FIELD, mdb.SHORT) { + if v := msg.Confv(k); _config_only(v, mdb.META) { + continue + } else { + data[k] = v + } + } + if len(data) == 0 { + return + } + if f, p, e := miss.CreateFile(path.Join(ice.VAR_CONF, name)); m.Assert(e) { + defer f.Close() + defer m.Echo(p) if s, e := json.MarshalIndent(data, "", " "); !m.Warn(e) { if _, e := f.Write(s); !m.Warn(e) { - } } } diff --git a/base/gdb/event.go b/base/gdb/event.go index db90a848..a7d50084 100644 --- a/base/gdb/event.go +++ b/base/gdb/event.go @@ -21,6 +21,7 @@ func init() { }}, HAPPEN: {Name: "happen event", Help: "触发", Hand: func(m *ice.Message, arg ...string) { defer m.Cost() + m.OptionCB(mdb.SELECT, "") mdb.ZoneSelect(m.Spawn(ice.OptionFields("")), m.Option(EVENT)).Tables(func(value ice.Maps) { m.Cmdy(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:], ice.OptionFields("")) }) @@ -56,3 +57,13 @@ func Watch(m *ice.Message, key string, arg ...string) *ice.Message { func Event(m *ice.Message, key string, arg ...ice.Any) *ice.Message { return m.Cmdy(EVENT, HAPPEN, EVENT, kit.Select(kit.Keys(m.CommandKey(), m.ActionKey()), key), arg, logs.FileLineMeta(logs.FileLine(-1))) } +func EventDeferEvent(m *ice.Message, key string, arg ...ice.Any) func(string, ...ice.Any) { + Event(m, key, arg...) + return func(key string, args ...ice.Any) { + if len(args) > 0 { + Event(m, key, args) + } else { + Event(m, key, arg) + } + } +} diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 006f00ca..4abb589c 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -7,8 +7,8 @@ import ( ice "shylinux.com/x/icebergs" kit "shylinux.com/x/toolkits" - "shylinux.com/x/toolkits/miss" "shylinux.com/x/toolkits/logs" + "shylinux.com/x/toolkits/miss" ) func _hash_fields(m *ice.Message) []string { @@ -146,8 +146,10 @@ func StatusHashAction(arg ...Any) ice.Actions { }}, }, HashAction(arg...)) } -func ExitClearHashAction() ice.Actions { - return ice.MergeActions(ice.Actions{ ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", HASH, "") }} }) +func ClearHashOnExitAction() ice.Actions { + return ice.MergeActions(ice.Actions{ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { + m.Conf("", HASH, "") + }}}) } func HashKey(m *ice.Message) string { @@ -278,6 +280,14 @@ func HashSelectClose(m *ice.Message) *ice.Message { func HashPrunesValue(m *ice.Message, field, value string) { m.Cmdy(PRUNES, m.PrefixKey(), "", HASH, field, value, ice.OptionFields(HashField(m))) } +func HashCreateDeferRemove(m *ice.Message, arg ...Any) func() { + h := HashCreate(m, arg...) + return func() { HashRemove(m, HASH, h) } +} +func HashModifyDeferRemove(m *ice.Message, arg ...Any) func() { + HashModify(m, arg...) + return func() { HashRemove(m, arg...) } +} func Richs(m *ice.Message, prefix string, chain Any, raw Any, cb Any) (res Map) { cache := m.Confm(prefix, chain) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 5733608a..52bf7495 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -51,7 +51,7 @@ func _mdb_select(m *ice.Message, cb Any, key string, value Map, fields []string, res[k] = kit.Format(v) } cb(res) - case nil: + case string, []string, []ice.Any, nil: if m.FieldsIsDetail() { m.Push(ice.FIELDS_DETAIL, value) } else { diff --git a/base/mdb/render.go b/base/mdb/render.go index d9fc2a40..c56b9307 100644 --- a/base/mdb/render.go +++ b/base/mdb/render.go @@ -37,5 +37,6 @@ func RenderAction(args ...ice.Any) ice.Actions { }) } }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", HASH, "") }}, }) } diff --git a/base/tcp/host.go b/base/tcp/host.go index cde21994..19cfb100 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -46,9 +46,9 @@ func _host_list(m *ice.Message, name string) { const ( LOCALHOST = "localhost" - - ISLOCAL = "islocal" - PUBLISH = "publish" + + ISLOCAL = "islocal" + PUBLISH = "publish" ) const HOST = "host" @@ -77,12 +77,11 @@ func init() { } m.Echo(arg[0]) }}, - }, mdb.HashAction(mdb.SHORT, mdb.TEXT)), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, mdb.TEXT), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { _host_list(m, kit.Select("", arg, 0)) - m.Debug(m.FormatChain()) }}, }) } -func IsLocalHost(m *ice.Message, ip string) bool { return m.Cmdx(HOST, ISLOCAL, ip) == ice.OK } +func IsLocalHost(m *ice.Message, ip string) bool { return m.Cmdx(HOST, ISLOCAL, ip) == ice.OK } func PublishLocalhost(m *ice.Message, url string) string { return m.Cmdx(HOST, PUBLISH, url) } diff --git a/base/tcp/server.go b/base/tcp/server.go index 8047b6ae..6dfe7e8e 100644 --- a/base/tcp/server.go +++ b/base/tcp/server.go @@ -66,6 +66,6 @@ func init() { LISTEN: {Name: "listen type name port=9030 host=", Hand: func(m *ice.Message, arg ...string) { _server_listen(m, arg...) }}, - }, mdb.StatusHashAction(mdb.FIELD, "time,hash,status,type,name,host,port,error,nconn"))}, + }, mdb.StatusHashAction(mdb.FIELD, "time,hash,status,type,name,host,port,error,nconn"), mdb.ClearHashOnExitAction())}, }) } diff --git a/base/web/broad.go b/base/web/broad.go index a08d395a..903ce578 100644 --- a/base/web/broad.go +++ b/base/web/broad.go @@ -9,12 +9,14 @@ import ( "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" + "shylinux.com/x/toolkits/logs" ) func _broad_addr(m *ice.Message, host, port string) *net.UDPAddr { - addr, err := net.ResolveUDPAddr("udp4", kit.Format("%s:%s", host, port)) - m.Assert(err) - return addr + if addr, e := net.ResolveUDPAddr("udp4", kit.Format("%s:%s", host, port)); !m.Warn(e != nil, e, host, port, logs.FileLineMeta(logs.FileLine(2))) { + return addr + } + return nil } func _broad_send(m *ice.Message, host, port string, remote_host, remote_port string) { if s, e := net.DialUDP("udp", nil, _broad_addr(m, remote_host, remote_port)); m.Assert(e) { @@ -26,9 +28,9 @@ func _broad_send(m *ice.Message, host, port string, remote_host, remote_port str } func _broad_serve(m *ice.Message, host, port string) { _broad_send(m, host, port, "255.255.255.255", "9020") - if s, e := net.ListenUDP("udp", _broad_addr(m, "0.0.0.0", port)); m.Assert(e) { + if s, e := net.ListenUDP("udp4", _broad_addr(m, "0.0.0.0", port)); m.Assert(e) { defer s.Close() - mdb.HashCreate(m, tcp.HOST, host, tcp.PORT, port, kit.Dict(mdb.TARGET, s)) + defer mdb.HashCreateDeferRemove(m, tcp.HOST, host, tcp.PORT, port, kit.Dict(mdb.TARGET, s))() buf := make([]byte, ice.MOD_BUFS) for { n, addr, err := s.ReadFromUDP(buf[:]) @@ -40,7 +42,7 @@ func _broad_serve(m *ice.Message, host, port string) { if m.Cmd(BROAD, kit.Format("%s,%s", msg.Option(tcp.HOST), msg.Option(tcp.PORT))).Length() > 0 { continue } - if remote, err := net.ResolveUDPAddr("udp4", kit.Format("%s:%s", msg.Option(tcp.HOST), msg.Option(tcp.PORT))); !m.Warn(err) { + if remote := _broad_addr(m, msg.Option(tcp.HOST), msg.Option(tcp.PORT)); !m.Warn(remote == nil) { m.Cmd(BROAD, func(value ice.Maps) { m.Logs(mdb.EXPORT, BROAD, kit.Format(value), "to", kit.Format(remote)) s.WriteToUDP([]byte(m.Spawn(value).FormatMeta()), remote) @@ -62,6 +64,6 @@ func init() { OPEN: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessOpen(m, kit.Format("http://%s:%s", m.Option(tcp.HOST), m.Option(tcp.PORT))) }}, - }, mdb.HashAction(mdb.SHORT, "host,port", mdb.FIELD, "time,hash,host,port", mdb.ACTION, OPEN), mdb.ExitClearHashAction())}, + }, mdb.HashAction(mdb.SHORT, "host,port", mdb.FIELD, "time,hash,host,port", mdb.ACTION, OPEN), mdb.ClearHashOnExitAction())}, }) } diff --git a/base/web/serve.go b/base/web/serve.go index 50bc79b8..0495d184 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -194,7 +194,7 @@ func init() { mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port", tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE, ice.INTSHELL, kit.Dict(nfs.PATH, ice.USR_INTSHELL, INDEX, ice.INDEX_SH, nfs.REPOS, "https://shylinux.com/x/intshell", nfs.BRANCH, nfs.MASTER), ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html", nfs.REPOS, "https://shylinux.com/x/volcanos", nfs.BRANCH, nfs.MASTER), - ), mdb.ExitClearHashAction(), ServeAction())}, + ), mdb.ClearHashOnExitAction(), ServeAction())}, PP(ice.INTSHELL): {Name: "/intshell/", Help: "命令行", Actions: aaa.WhiteAction(), Hand: func(m *ice.Message, arg ...string) { RenderIndex(m, ice.INTSHELL, arg...) }}, diff --git a/base/web/space.go b/base/web/space.go index 0ac087eb..c495ad32 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -27,8 +27,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { next := time.Duration(rand.Intn(a*(i+1))+b*i) * time.Millisecond m.Cmd(tcp.CLIENT, tcp.DIAL, args, func(c net.Conn) { if conn, _, e := websocket.NewClient(c, uri, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !m.Warn(e, tcp.DIAL, dev, SPACE, uri.String()) { - mdb.HashCreate(m, kit.SimpleKV("", MASTER, dev, msg.Append(tcp.HOSTNAME)), kit.Dict(mdb.TARGET, conn)) - defer mdb.HashRemove(m, dev) + defer mdb.HashCreateDeferRemove(m, kit.SimpleKV("", MASTER, dev, msg.Append(tcp.HOSTNAME)), kit.Dict(mdb.TARGET, conn))() _space_handle(m, true, dev, conn) } }).Cost("order", i, "sleep", next, "redial", dev).Sleep(next) @@ -42,11 +41,11 @@ func _space_fork(m *ice.Message) { name := strings.ToLower(kit.ReplaceAll(kit.Select(m.Option(ice.MSG_USERADDR), m.Option(mdb.NAME)), ice.PT, "_", ice.DF, "_")) args := kit.Simple(mdb.TYPE, kit.Select(WORKER, m.Option(mdb.TYPE)), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(SHARE, RIVER, ice.MSG_USERUA)) m.Go(func() { - defer kit.BeginEnd(func() { mdb.HashCreate(m, args, kit.Dict(mdb.TARGET, conn)) }, func() { mdb.HashRemove(m, name) })() - defer kit.BeginEnd(func() { gdb.Event(m, SPACE_OPEN, args) }, func() { gdb.Event(m, SPACE_CLOSE, args) })() + defer mdb.HashCreateDeferRemove(m, args, kit.Dict(mdb.TARGET, conn))() + defer gdb.EventDeferEvent(m, SPACE_OPEN, args)(SPACE_CLOSE, args) switch m.Option(mdb.TYPE) { case WORKER: - defer kit.BeginEnd(func() { gdb.Event(m, DREAM_OPEN, args) }, func() { gdb.Event(m, DREAM_CLOSE, args) })() + defer gdb.EventDeferEvent(m, DREAM_OPEN, args)(DREAM_CLOSE, args) case CHROME: m.Cmd(SPACE, name, cli.PWD, name) } @@ -77,6 +76,7 @@ func _space_handle(m *ice.Message, safe bool, name string, conn *websocket.Conn) }) { } else if res := getSend(m, next); !m.Warn(res == nil || len(target) != 1, ice.ErrNotFound, next) { res.Cost(kit.Format("[%v]->%v %v %v", next, res.Optionv(ice.MSG_TARGET), res.Detailv(), msg.FormatSize())) + m.Sleep("10ms") back(res, msg) // 接收响应 } } @@ -131,8 +131,9 @@ func _space_send(m *ice.Message, space string, arg ...string) { _space_echo(m, []string{addSend(m, m)}, target, conn) } }), ice.ErrNotFound, space) { - m.Sleep("30ms") - call(m, m.Config(kit.Keys(TIMEOUT, "c")), func(res *ice.Message) { m.Copy(res) }) + call(m, m.Config(kit.Keys(TIMEOUT, "c")), func(res *ice.Message) { + m.Copy(res) + }) } } @@ -168,8 +169,7 @@ func init() { _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) }}, mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { - mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) - defer mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) + defer mdb.HashModifyDeferRemove(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)() m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT) }}, SPACE_LOGIN: {Hand: func(m *ice.Message, arg ...string) { @@ -185,7 +185,7 @@ func init() { }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text", REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "30s"), BUFFER, kit.Dict("r", ice.MOD_BUFS, "w", ice.MOD_BUFS), - ), mdb.ExitClearHashAction(), SpaceAction(), aaa.WhiteAction()), Hand: func(m *ice.Message, arg ...string) { + ), mdb.ClearHashOnExitAction(), SpaceAction(), aaa.WhiteAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 { mdb.HashSelect(m, arg...).Sort("type,name,text") } else { diff --git a/base/web/spide.go b/base/web/spide.go index fd06f8e7..b8ebfbe6 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -22,7 +22,8 @@ import ( ) func _spide_create(m *ice.Message, name, address string) { - if uri, e := url.Parse(address); !m.Warn(e != nil || address == "") { + // if uri, e := url.Parse(address); !m.Warn(e != nil || address == "", address) { + if uri, e := url.Parse(address); m.Assert(e == nil) { m.Logs(mdb.CREATE, SPIDE, name, ADDRESS, address) dir, file := path.Split(uri.EscapedPath()) mdb.HashCreate(m, CLIENT_NAME, name) @@ -393,7 +394,7 @@ func init() { m.Push(tcp.PROTOCOL, msg.Append("client.protocol")) m.Push(DOMAIN, msg.Append("client.protocol")+"://"+msg.Append("client.hostname")+kit.Select("", arg, 1)) }}, - }, mdb.HashAction(mdb.SHORT, CLIENT_NAME, mdb.FIELD, "time,client.name,client.url", LOGHEADERS, ice.FALSE)), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, CLIENT_NAME, mdb.FIELD, "time,client.name,client.url", LOGHEADERS, ice.FALSE), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") { mdb.HashSelect(m, kit.Slice(arg, 0, 1)...).Sort(CLIENT_NAME) } else { diff --git a/base/web/web.go b/base/web/web.go index 50bafd43..6ebf7102 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -61,8 +61,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { }(key, cmd) } }) - gdb.Event(m, SERVE_START, arg) - defer gdb.Event(m, SERVE_STOP, arg) + defer gdb.EventDeferEvent(m, SERVE_START, arg)(SERVE_STOP, arg) switch cb := m.OptionCB("").(type) { case func(http.Handler): cb(f) diff --git a/core/chat/template.go b/core/chat/template.go index 63ffb68d..30ed1db8 100644 --- a/core/chat/template.go +++ b/core/chat/template.go @@ -50,7 +50,7 @@ func init() { m.Cmd(mdb.DELETE, m.PrefixKey(), kit.KeyHash(m.Option(RIVER)), mdb.HASH, m.OptionSimple(STORM)) } }}, - }), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { switch len(arg) { case 0: m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields("time,river")) diff --git a/core/code/compile.go b/core/code/compile.go index 10f762e0..bf93a0e3 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -52,7 +52,7 @@ func init() { cli.IsAlpine(m, "vim") cli.IsAlpine(m, "tmux") if cli.IsAlpine(m, "git"); !cli.IsAlpine(m, "go", "go git") { - mdb.ZoneInsert(m, cli.CLI, "go", cli.CMD, kit.Format("install download https://golang.google.cn/dl/go1.15.5.%s-%s.tar.gz usr/local", runtime.GOOS, runtime.GOARCH)) + m.Cmd(mdb.INSERT, cli.CLI, "", mdb.ZONE, cli.CLI, "go", cli.CMD, kit.Format("install download https://golang.google.cn/dl/go1.15.5.%s-%s.tar.gz usr/local", runtime.GOOS, runtime.GOARCH)) } }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { diff --git a/core/code/upgrade.go b/core/code/upgrade.go index 36762837..5f9493d9 100644 --- a/core/code/upgrade.go +++ b/core/code/upgrade.go @@ -23,11 +23,11 @@ func init() { nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")), ))}, }, Commands: ice.Commands{ - UPGRADE: {Name: "upgrade item=target,binary,source run restart", Help: "升级", Actions: ice.Actions{ + UPGRADE: {Name: "upgrade item=target,binary,source run restart", Help: "升级", Actions: ice.MergeActions(ice.Actions{ cli.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) { m.Go(func() { m.Sleep300ms(ice.EXIT, 1) }) }}, - }, Hand: func(m *ice.Message, arg ...string) { + }, mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { mdb.ZoneSelect(m, kit.Select(nfs.TARGET, arg, 0)).Tables(func(value ice.Maps) { if value[nfs.FILE] == ice.ICE_BIN { // 程序文件 value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH) diff --git a/core/code/webpack.go b/core/code/webpack.go index 0458a63a..09668251 100644 --- a/core/code/webpack.go +++ b/core/code/webpack.go @@ -167,7 +167,7 @@ func init() { nfs.Trash(m, m.Option(nfs.PATH)) } }}, - }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path"), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { m.Option(nfs.DIR_TYPE, nfs.CAT) m.Option(nfs.DIR_DEEP, ice.TRUE) m.OptionFields(nfs.DIR_WEB_FIELDS) diff --git a/misc.go b/misc.go index e8a06a56..ccd2645e 100644 --- a/misc.go +++ b/misc.go @@ -335,6 +335,13 @@ func MergeActions(arg ...Any) Actions { hand(m, arg...) last(m, arg...) } + } else if k == CTX_EXIT { + last := h.Hand + hand := v.Hand + h.Hand = func(m *Message, arg ...string) { + hand(m, arg...) + last(m, arg...) + } } else if h.Name = kit.Select(v.Name, h.Name); h.Hand == nil { h.Hand = v.Hand } diff --git a/misc/git/repos.go b/misc/git/repos.go index 7d9e0c4f..61841578 100644 --- a/misc/git/repos.go +++ b/misc/git/repos.go @@ -79,7 +79,7 @@ func init() { web.DREAM_OPEN: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("web.code.git.repos", mdb.CREATE, m.OptionSimple(nfs.REPOS), nfs.PATH, m.Option(nfs.PATH)) }}, - }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,branch,commit,remote")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,branch,commit,remote"), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { // 仓库列表 mdb.HashSelect(m, arg...).Sort(mdb.NAME).RenameAppend(mdb.NAME, REPOS) } else { // 文件列表