diff --git a/base/cli/runtime.go b/base/cli/runtime.go index 11507281..86ed025c 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -21,7 +21,7 @@ func _runtime_init(m *ice.Message) { }) // 环境变量 - for _, k := range []string{CTX_SHY, CTX_DEV, CTX_OPS, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER} { + for _, k := range []string{CTX_SHY, CTX_DEV, CTX_OPS, CTX_ARG, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER} { m.Conf(RUNTIME, kit.Keys(CONF, k), os.Getenv(k)) } @@ -118,6 +118,7 @@ const ( CTX_SHY = "ctx_shy" CTX_DEV = "ctx_dev" CTX_OPS = "ctx_ops" + CTX_ARG = "ctx_arg" CTX_PID = "ctx_pid" CTX_LOG = "ctx_log" diff --git a/base/mdb/hash.go b/base/mdb/hash.go index e589b1ce..f6fdaecb 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -14,7 +14,6 @@ func _hash_fields(m *ice.Message) []string { } func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) { list := map[string]int{} - m.Debug("what %v %v", prefix, chain) m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" { list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT]) @@ -143,6 +142,9 @@ func HashAction(fields ...string) map[string]*ice.Action { if m.Config(kit.MDB_HASH) == "uniq" { return kit.MDB_HASH } + if m.Config(kit.MDB_SHORT) == "uniq" { + return kit.MDB_HASH + } return kit.Select(kit.MDB_HASH, m.Config(kit.MDB_SHORT)) } return ice.SelectAction(map[string]*ice.Action{ diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index b7b2ae27..4f99a10b 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -115,7 +115,6 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]* MODIFY: {Name: "modify key sub type field value arg...", Help: "编辑", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[2] { case ZONE: // modify key sub type zone id field value - m.Debug("what %v %v", arg[3], kit.KeyHash(arg[3])) _list_modify(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.MDB_ID, arg[4], arg[5:]...) case HASH: _hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...) diff --git a/base/web/cache.go b/base/web/cache.go index 3d185e38..7e7a7c97 100644 --- a/base/web/cache.go +++ b/base/web/cache.go @@ -102,9 +102,6 @@ func _cache_download(m *ice.Message, r *http.Response) (file, size string) { }) default: if s != step && s%10 == 0 { - m.Debug("what %v", m.OptionCB(SPIDE)) - m.Debug("what %v", m.OptionCB(SPIDE)) - m.Debug("what %v", kit.FileLine(m.OptionCB(SPIDE), 3)) m.Log_IMPORT(kit.MDB_FILE, p, kit.MDB_STEP, s, kit.MDB_SIZE, kit.FmtSize(int64(size)), kit.MDB_TOTAL, kit.FmtSize(int64(total))) } diff --git a/base/web/dream.go b/base/web/dream.go index a77bb7bb..5bef0e55 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -43,7 +43,7 @@ func _dream_show(m *ice.Message, name string) { os.MkdirAll(p, ice.MOD_DIR) } - m.ProcessOpen(m.MergeURL2("/chat/pod/" + name)) + defer m.ProcessOpen(m.MergeURL2("/chat/pod/" + name)) // 任务模板 if m.Option(kit.MDB_TEMPLATE) != "" { diff --git a/base/web/serve.go b/base/web/serve.go index fcb74fbb..005967f8 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -125,6 +125,11 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon msg.Option(ice.MSG_USERADDR, msg.Option(ice.MSG_USERIP)) } + cookie := ice.MSG_SESSID + "_" + strings.ReplaceAll(strings.ReplaceAll(kit.ParseURLMap(msg.Option(ice.MSG_USERWEB))["host"], ".", "_"), ":", "_") + if sessid := msg.Option(cookie); sessid != "" { + msg.Option(ice.MSG_SESSID, sessid) + } + // 请求数据 switch r.Header.Get(ContentType) { case ContentJSON: @@ -286,8 +291,8 @@ func init() { m.Config(kit.Keys(aaa.WHITE, k), ice.TRUE) } }}, - cli.START: {Name: "start dev name=ops proto=http host port=9020", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if cli.NodeInfo(m, SERVER, ice.Info.HostName); m.Option(tcp.PORT) == tcp.RANDOM { + cli.START: {Name: "start dev name=ops proto=http host port=9020 nodename", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + if cli.NodeInfo(m, SERVER, kit.Select(ice.Info.HostName, m.Option("nodename"))); m.Option(tcp.PORT) == tcp.RANDOM { m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT)) } diff --git a/base/web/space.go b/base/web/space.go index d5f7d574..2d788bc3 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -35,49 +35,50 @@ func _space_domain(m *ice.Message) (link string) { return tcp.ReplaceLocalhost(m, link) } func _space_dial(m *ice.Message, dev, name string, arg ...string) { - m.Richs(SPIDE, nil, dev, func(key string, value map[string]interface{}) { - client := kit.Value(value, tcp.CLIENT).(map[string]interface{}) - redial := m.Confm(SPACE, kit.Keym("redial")) + if strings.HasPrefix(dev, "http") { + m.Cmd(SPIDE, mdb.CREATE, ice.DEV, dev) + dev = ice.DEV + } + + value := m.Richs(SPIDE, nil, dev, nil) + client := kit.Value(value, tcp.CLIENT).(map[string]interface{}) + + host := kit.Format(client[tcp.HOSTNAME]) + proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1) + uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, kit.MDB_NAME, name, + SHARE, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_share")), RIVER, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_river")), arg) + + m.Go(func() { + u := kit.ParseURL(uri) + redial := m.Configm("redial") frame := m.Target().Server().(*Frame) - host := kit.Format(client[tcp.HOSTNAME]) - proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1) - uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, kit.MDB_NAME, name, - SHARE, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_share")), RIVER, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_river")), arg) - u := kit.ParseURL(uri) + for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ { + msg := m.Spawn() + msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn) { + if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e) { + msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host)) + msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri) - m.Go(func() { - for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ { - msg := m.Spawn() - msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn, e error) { - if msg.Warn(e) { - return + // 连接成功 + if i = 0; _space_handle(msg, true, frame.send, s, dev) { + i = -2 // 连接关闭 } + } + }) + ls := strings.Split(host, ":") + msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.SimpleKV("type,name,host,port", proto, dev, ls[0], kit.Select("443", ls, 1))) - if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e) { - msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host)) - msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri) - - // 连接成功 - if i = 0; _space_handle(msg, true, frame.send, s, dev) { - i = -2 // 连接关闭 - } - } - }) - ls := strings.Split(host, ":") - msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.MDB_TYPE, "wss", kit.MDB_NAME, dev, tcp.HOST, ls[0], tcp.PORT, kit.Select("443", ls, 1)) - - // 断线重连 - sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond - msg.Cost("order", i, "sleep", sleep, "reconnect", dev) - time.Sleep(sleep) - } - }) + // 断线重连 + sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond + msg.Cost("order", i, "sleep", sleep, "reconnect", dev) + time.Sleep(sleep) + } }) } func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *websocket.Conn, name string) bool { for running := true; running; { - if _, b, e := c.ReadMessage(); m.Warn(e, "space", name) { + if _, b, e := c.ReadMessage(); m.Warn(e, SPACE, name) { break } else { socket, msg := c, m.Spawn(b) @@ -90,7 +91,12 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w if msg.Optionv(ice.MSG_HANDLE, ice.TRUE); safe { msg.Go(func() { _space_exec(msg, source, target, c, name) }) } else { - msg.Push(kit.MDB_LINK, kit.MergePOD(_space_domain(msg), name)) + url := kit.ParseURL(_space_domain(msg)) + pod := url.Query().Get(ice.POD) + if strings.HasPrefix(url.Path, "/chat/pod") { + pod = strings.Split(url.Path, ice.PS)[3] + } + msg.Push(kit.MDB_LINK, kit.MergeURL2(url.String(), "/chat/pod/"+kit.Keys(pod, name), ice.POD, "")) _space_echo(msg, []string{}, kit.Revert(source)[1:], c, name) } @@ -120,7 +126,7 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w } } else { // 接收响应 - m.Sleep("30ms") + m.Sleep30ms() res.Back(msg) } } @@ -243,7 +249,7 @@ func init() { m.Cmd(mdb.SEARCH, mdb.CREATE, SPACE, m.Prefix(SPACE)) }}, SPACE: {Name: "space name cmd auto", Help: "空间站", Action: ice.MergeAction(map[string]*ice.Action{ - tcp.DIAL: {Name: "dial dev name river", Help: "连接", Hand: func(m *ice.Message, arg ...string) { + tcp.DIAL: {Name: "dial dev=ops name river", Help: "连接", Hand: func(m *ice.Message, arg ...string) { _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME))) }}, mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { @@ -282,11 +288,11 @@ func init() { case CHROME: // 交互节点 m.Go(func(msg *ice.Message) { switch m.Option("cmd") { - case "pwd": + case cli.PWD: link := kit.MergeURL(_space_domain(msg), "grant", name) - msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, msg.Cmdx(cli.QRCODE, link)) + msg.Sleep("100ms").Cmd(SPACE, name, cli.PWD, name, link, msg.Cmdx(cli.QRCODE, link)) default: - msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name) + msg.Sleep("100ms").Cmd(SPACE, name, cli.PWD, name) } }) case WORKER: // 工作节点 diff --git a/base/web/spide.go b/base/web/spide.go index c91ad3b0..fbe3ef7b 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -346,6 +346,7 @@ func init() { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") { mdb.HashSelect(m, kit.Slice(arg, 0, 1)...) + m.Sort("client.name") return } _spide_list(m, arg...) diff --git a/base/web/web.go b/base/web/web.go index baafdefe..2288021a 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -68,6 +68,9 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool { } }) + m.Event(SERVE_START) + defer m.Event(SERVE_STOP) + web.m, web.Server = m, &http.Server{Handler: web} switch cb := m.Optionv(kit.Keycb(SERVE)).(type) { case func(http.Handler): @@ -93,6 +96,10 @@ func (web *Frame) Close(m *ice.Message, arg ...string) bool { } const WEB = "web" +const ( + SERVE_START = "serve.start" + SERVE_STOP = "serve.stop" +) var Index = &ice.Context{Name: WEB, Help: "网络模块"} diff --git a/conf.go b/conf.go index 39123e4f..8ae88a80 100644 --- a/conf.go +++ b/conf.go @@ -35,6 +35,7 @@ const ( OPS = "ops" ICE = "ice" + ENV = "env" RUN = "run" RES = "res" ERR = "err" diff --git a/core/chat/chat.go b/core/chat/chat.go index ca276879..243a2f13 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -13,5 +13,6 @@ func init() { web.Index.Register(Index, &web.Frame{}, HEADER, RIVER, STORM, ACTION, FOOTER, SCAN, PASTE, FILES, LOCATION, + WEBSITE, ) } diff --git a/core/chat/room.go b/core/chat/room.go index 321935c6..5e0b8bfe 100644 --- a/core/chat/room.go +++ b/core/chat/room.go @@ -30,7 +30,6 @@ func init() { mdb.INSERT: {Name: "insert zone type=hi name=hello text=world", Help: "发送", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(kit.MDB_ZONE), arg[2:]) m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, ice.Option{mdb.FIELDS, "time,space"}).Table(func(index int, value map[string]string, head []string) { - m.Debug("what %v", value) m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name")) }) }}, diff --git a/core/code/bench.go b/core/code/bench.go index f7e27abf..be4eaa85 100644 --- a/core/code/bench.go +++ b/core/code/bench.go @@ -35,7 +35,6 @@ func _bench_http(m *ice.Message, target string, arg ...string) { m.Assert(err) list = append(list, req) } - m.Debug("what %v", v) } var body int64 diff --git a/core/code/go.go b/core/code/go.go index d86e49f5..6e3b4e16 100644 --- a/core/code/go.go +++ b/core/code/go.go @@ -141,7 +141,7 @@ func init() { ))}, GO: {Name: GO, Help: "后端", Value: kit.Data(PLUG, kit.Dict( SPLIT, kit.Dict("space", "\t ", "operator", "{[(&.,:;!|<>)]}"), - PREFIX, kit.Dict("//", COMMENT, "/*", COMMENT, "* ", COMMENT), + PREFIX, kit.Dict("// ", COMMENT, "/*", COMMENT, "* ", COMMENT), PREPARE, kit.Dict( KEYWORD, kit.Simple( "package", "import", "type", "struct", "interface", "const", "var", "func", diff --git a/core/code/shy.go b/core/code/shy.go index 970e48b5..8bef2879 100644 --- a/core/code/shy.go +++ b/core/code/shy.go @@ -32,7 +32,7 @@ func init() { }, PlugAction())}, }, Configs: map[string]*ice.Config{ SHY: {Name: SHY, Help: "脚本", Value: kit.Data(PLUG, kit.Dict( - PREFIX, kit.Dict("#", COMMENT), + PREFIX, kit.Dict("# ", COMMENT), PREPARE, kit.Dict( KEYWORD, kit.Simple( "title", diff --git a/core/team/plan.go b/core/team/plan.go index bb7c22ab..5e21edc5 100644 --- a/core/team/plan.go +++ b/core/team/plan.go @@ -50,9 +50,7 @@ func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message { m.Push(key, value, fields, val) m.PushButton(_task_action(m, value[STATUS], mdb.PLUGIN)) }) - m.Debug("what %v", 123) m.Cmd(mdb.SELECT, m.Prefix(TASK), "", mdb.ZONE, kit.MDB_FOREACH) - m.Debug("what %v", 123) return m } diff --git a/data.go b/data.go index 48192064..422c1c95 100644 --- a/data.go +++ b/data.go @@ -22,6 +22,7 @@ func (m *Message) Config(key string, arg ...interface{}) string { m.Conf(m.PrefixKey(), kit.Keym(key), arg[0]) } return m.Conf(m.PrefixKey(), kit.Keym(key)) + // return kit.Format(m.Configv(key, arg...)) } func (m *Message) Configv(key string, arg ...interface{}) interface{} { if len(arg) > 0 { @@ -29,6 +30,10 @@ func (m *Message) Configv(key string, arg ...interface{}) interface{} { } return m.Confv(m.PrefixKey(), kit.Keym(key)) } +func (m *Message) Configm(key string, arg ...interface{}) map[string]interface{} { + v, _ := m.Configv(key, arg...).(map[string]interface{}) + return v +} func (m *Message) ConfigSimple(key ...string) (list []string) { for _, k := range kit.Split(kit.Join(key)) { list = append(list, k, m.Config(k)) diff --git a/init.go b/init.go index 516ba568..20e949db 100644 --- a/init.go +++ b/init.go @@ -104,6 +104,9 @@ func Run(arg ...string) string { if len(arg) == 0 { arg = append(arg, HELP) } + if os.Getenv("ctx_arg") != "" { + arg = append(arg, kit.Split(os.Getenv("ctx_arg"))...) + } Index.root, Pulse.root = Index, Pulse Pulse.Option(CACHE_LIMIT, "10") diff --git a/misc.go b/misc.go index b48b383b..ba18a814 100644 --- a/misc.go +++ b/misc.go @@ -37,7 +37,14 @@ func (m *Message) CSV(text string, head ...string) *Message { } return m } -func (m *Message) Split(str string, field string, sp string, nl string) *Message { +func (m *Message) SplitIndex(str string, arg ...string) *Message { + return m.Split(str, kit.Simple("index", arg)...) +} +func (m *Message) Split(str string, arg ...string) *Message { + m.Set(MSG_APPEND).Set(MSG_RESULT) + field := kit.Select("", arg, 0) + sp := kit.Select(SP, arg, 1) + nl := kit.Select(NL, arg, 2) fields, indexs := kit.Split(field, sp, sp, sp), []int{} for i, l := range kit.Split(str, nl, nl, nl) { if strings.HasPrefix(l, "Binary") { @@ -58,9 +65,9 @@ func (m *Message) Split(str string, field string, sp string, nl string) *Message if len(indexs) > 0 { // 按位切分 for i, v := range indexs { if i == len(indexs)-1 { - m.Push(kit.Select(SP, fields, i), l[v:]) + m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), strings.TrimSpace(l[v:])) } else { - m.Push(kit.Select(SP, fields, i), l[v:indexs[i+1]]) + m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), strings.TrimSpace(l[v:indexs[i+1]])) } } continue @@ -113,6 +120,9 @@ func (m *Message) OptionUserWeb() *url.URL { func (m *Message) SetAppend(arg ...string) *Message { return m.Set(MSG_APPEND, arg...) } +func (m *Message) SetResult(arg ...string) *Message { + return m.Set(MSG_RESULT, arg...) +} func (m *Message) RenameAppend(from, to string) { for i, v := range m.meta[MSG_APPEND] { if v == from { diff --git a/misc/mp/login.go b/misc/mp/login.go index c55cd014..a2ccc0be 100644 --- a/misc/mp/login.go +++ b/misc/mp/login.go @@ -83,7 +83,6 @@ func init() { QRCODE: {Name: "qrcode path scene", Help: "扫码", Hand: func(m *ice.Message, arg ...string) { msg := m.Cmd(web.SPIDE, MP, web.SPIDE_POST, "/wxa/getwxacodeunlimit?access_token="+m.Cmdx(LOGIN, TOKENS), m.OptionSimple("path,scene")) - m.Debug("what %v", msg.FormatMeta()) m.Echo(kit.Format(``, base64.StdEncoding.EncodeToString([]byte(msg.Result())), "some")) m.ProcessInner() }}, diff --git a/option.go b/option.go index ce4ae0e6..99a64175 100644 --- a/option.go +++ b/option.go @@ -96,7 +96,14 @@ func (m *Message) Upload(dir string) { m.Cmdy("spide", DEV, SAVE, p, "GET", m.MergeURL2(path.Join("/share/cache", up[0]))) } } -func (m *Message) Action(arg ...string) { +func (m *Message) Action(arg ...interface{}) { + for i, v := range arg { + switch v.(type) { + case string: + default: + arg[i] = kit.Format(v) + } + } m.Option(MSG_ACTION, kit.Format(arg)) } func (m *Message) Status(arg ...interface{}) { diff --git a/render.go b/render.go index b2a4a726..290ec86f 100644 --- a/render.go +++ b/render.go @@ -17,7 +17,10 @@ func Render(m *Message, cmd string, args ...interface{}) string { switch arg := kit.Simple(args...); cmd { case RENDER_ANCHOR: // [name] link - p := m.MergeURL2(kit.Select(arg[0], arg, 1)) + p := kit.Select(arg[0], arg, 1) + if !strings.HasPrefix(p, "http") { + p = m.MergeURL2(p) + } return kit.Format(`%s`, p, arg[0]) case RENDER_BUTTON: // name... @@ -169,7 +172,6 @@ func (m *Message) PushPodCmd(cmd string, arg ...string) { val[POD] = kit.Keys(value[kit.MDB_NAME], val[POD]) m.Push("", val, head) }) - m.Debug(m.FormatMeta()) } }) }