diff --git a/base/ssh/script.go b/base/ssh/script.go index 22f5649d..31e07a88 100644 --- a/base/ssh/script.go +++ b/base/ssh/script.go @@ -15,6 +15,7 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" ) @@ -51,6 +52,8 @@ func (f *Frame) prompt(m *ice.Message, list ...string) *Frame { switch v { case mdb.COUNT: fmt.Fprintf(f.stdout, "%d", f.count) + case tcp.HOSTNAME: + fmt.Fprintf(f.stdout, "%s", kit.Slice(kit.Split(ice.Info.Hostname, " -/."), -1)[0]) case mdb.TIME: fmt.Fprintf(f.stdout, time.Now().Format("15:04:05")) case TARGET: @@ -117,7 +120,7 @@ func (f *Frame) parse(m *ice.Message, h, line string) string { func (f *Frame) scan(m *ice.Message, h, line string) *Frame { f.ps1 = kit.Simple(m.Confv(PROMPT, kit.Keym(PS1))) f.ps2 = kit.Simple(m.Confv(PROMPT, kit.Keym(PS2))) - // m.Options(MESSAGE, m, ice.LOG_DISABLE, ice.TRUE) + m.Options(MESSAGE, m, ice.LOG_DISABLE, ice.TRUE) m.I, m.O = f.stdin, f.stdout ps, bio := f.ps1, bufio.NewScanner(f.stdin) for f.prompt(m, ps...); f.stdin != nil && bio.Scan(); f.prompt(m, ps...) { @@ -236,7 +239,7 @@ func init() { } }}, PROMPT: {Name: "prompt arg run", Help: "命令提示", Actions: ctx.ConfAction( - PS1, ice.List{"\033[33;44m", mdb.COUNT, "[", mdb.TIME, "]", "\033[5m", TARGET, "\033[0m", "\033[44m", ">", "\033[0m ", "\033[?25h", "\033[32m"}, + PS1, ice.List{"\033[33;44m", mdb.COUNT, "@", tcp.HOSTNAME, "[", mdb.TIME, "]", "\033[5m", TARGET, "\033[0m", "\033[44m", ">", "\033[0m ", "\033[?25h", "\033[32m"}, PS2, ice.List{mdb.COUNT, " ", TARGET, "> "}, ), Hand: func(m *ice.Message, arg ...string) { if f, ok := m.Target().Server().(*Frame); ok { diff --git a/base/web/broad.go b/base/web/broad.go index 7b4d5e73..44097644 100644 --- a/base/web/broad.go +++ b/base/web/broad.go @@ -2,6 +2,7 @@ package web import ( "net" + "strings" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" @@ -30,7 +31,7 @@ func _broad_serve(m *ice.Message, host, port string) { m.Go(func() { _broad_send(m.Sleep("100ms"), host, port, "255.255.255.255", "9020", mdb.TYPE, ice.Info.NodeType, mdb.NAME, ice.Info.NodeName) }) - if s, e := net.ListenUDP("udp4", _broad_addr(m, "0.0.0.0", port)); m.Assert(e) { + if s, e := net.ListenUDP("udp4", _broad_addr(m, host, port)); m.Assert(e) { defer s.Close() buf := make([]byte, ice.MOD_BUFS) for { @@ -41,7 +42,7 @@ func _broad_serve(m *ice.Message, host, port string) { m.Logs(mdb.IMPORT, BROAD, string(buf[:n]), "from", from) msg := m.Spawn(buf[:n]) if msg.Option(mdb.ZONE) == "echo" { - mdb.HashCreate(m, msg.OptionSimple(kit.Simple(msg.Optionv(ice.MSG_OPTION))...)) + _broad_save(m, msg) continue } if remote := _broad_addr(m, msg.Option(tcp.HOST), msg.Option(tcp.PORT)); remote != nil { @@ -49,11 +50,22 @@ func _broad_serve(m *ice.Message, host, port string) { m.Logs(mdb.EXPORT, BROAD, kit.Format(value), "to", kit.Format(remote)) s.WriteToUDP([]byte(m.Spawn(value, kit.Dict(mdb.ZONE, "echo")).FormatMeta()), remote) }) - mdb.HashCreate(m, msg.OptionSimple(kit.Simple(msg.Optionv(ice.MSG_OPTION))...)) + _broad_save(m, msg) } } } } +func _broad_save(m, msg *ice.Message) { + save := false + m.Cmd(tcp.HOST, func(values ice.Maps) { + if strings.Split(msg.Option(tcp.HOST), ice.PT)[0] == strings.Split(values[aaa.IP], ice.PT)[0] { + save = true + } + }) + if save { + mdb.HashCreate(m, msg.OptionSimple(kit.Simple(msg.Optionv(ice.MSG_OPTION))...)) + } +} const BROAD = "broad" @@ -61,7 +73,7 @@ func init() { Index.MergeCommands(ice.Commands{ BROAD: {Name: "broad hash auto", Help: "广播", Actions: ice.MergeActions(ice.Actions{ mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == BROAD || arg[0] == mdb.FOREACH { + if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { host := m.Cmd(tcp.HOST).Append(aaa.IP) domain := OptionUserWeb(m).Hostname() m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { @@ -79,7 +91,9 @@ func init() { } }}, SERVE: {Name: "serve port=9020", Hand: func(m *ice.Message, arg ...string) { - _broad_serve(m, m.Cmd(tcp.HOST).Append(aaa.IP), m.Option(tcp.PORT)) + m.Cmd(tcp.HOST).TableGo(func(values ice.Maps) { + _broad_serve(m, values[aaa.IP], m.Option(tcp.PORT)) + }) }}, OPEN: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessOpen(m, kit.Format("http://%s:%s", m.Option(tcp.HOST), m.Option(tcp.PORT))) diff --git a/base/web/dream.go b/base/web/dream.go index edacaecb..c83991f2 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -108,6 +108,9 @@ func init() { case mdb.NAME, nfs.TEMPLATE: _dream_list(m).Cut("name,status,time") case nfs.REPOS: + if msg := m.Cmd(SPIDE, ice.OPS, SPIDE_MSG, m.Option(ice.MSG_USERHOST)+"/x/list"); !msg.IsErr() { + m.Copy(msg) + } for _, dev := range []string{ice.OPS, ice.DEV, ice.SHY} { if msg := m.Cmd(SPIDE, dev, SPIDE_MSG, "/x/list"); !msg.IsErr() { m.Copy(msg) diff --git a/base/web/serve.go b/base/web/serve.go index 86a4fbd5..54b454b9 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -26,8 +26,11 @@ func _serve_start(m *ice.Message) { if cli.NodeInfo(m, kit.Select(ice.Info.Hostname, m.Option("nodename")), SERVER); m.Option(tcp.PORT) == tcp.RANDOM { m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT)) } + if runtime.GOOS == cli.WINDOWS { + m.Cmd(SPIDE, ice.OPS, kit.Format("http://localhost:%s/exit", m.Option(tcp.PORT))).Sleep("100ms") + } m.Target().Start(m, m.OptionSimple(tcp.HOST, tcp.PORT)...) - m.Go(func() { m.Cmd(BROAD, SERVE, m.OptionSimple(tcp.PORT)) }) + defer m.Go(func() { m.Cmd(BROAD, SERVE, m.OptionSimple(tcp.PORT)) }) for _, v := range kit.Split(m.Option(ice.DEV)) { m.Cmd(SPACE, tcp.DIAL, ice.DEV, v, mdb.NAME, ice.Info.NodeName) } @@ -177,19 +180,23 @@ const SERVE = "serve" func init() { Index.MergeCommands(ice.Commands{ + "/exit": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(ice.EXIT) }}, SERVE: {Name: "serve name auto start", Help: "服务器", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.NodeInfo(m, ice.Info.Pathname, WORKER) }}, - cli.START: {Name: "start dev name proto host port=9020 nodename username usernick", Hand: func(m *ice.Message, arg ...string) { + cli.START: {Name: "start dev proto host port=9020 nodename username usernick", Hand: func(m *ice.Message, arg ...string) { _serve_start(m) }}, SERVE_START: {Hand: func(m *ice.Message, arg ...string) { - m.Go(func() { + go func() { + m.Option(ice.LOG_DISABLE, ice.TRUE) opened := false - m.Sleep("2s").Cmd(SPACE, func(values ice.Maps) { - if values[mdb.TYPE] == CHROME { - opened = true - } - }) + for i := 0; i < 3 && !opened; i++ { + m.Sleep("1s").Cmd(SPACE, func(values ice.Maps) { + if values[mdb.TYPE] == CHROME { + opened = true + } + }) + } if opened { return } @@ -199,7 +206,7 @@ func init() { case cli.DARWIN: m.Cmd(cli.SYSTEM, "open", host) } - }) + }() }}, SERVE_REWRITE: {Hand: func(m *ice.Message, arg ...string) { if arg[0] != http.MethodGet { diff --git a/base/web/space.go b/base/web/space.go index 862575fb..cb5c1302 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -33,9 +33,11 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { 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()) { defer mdb.HashCreateDeferRemove(m, kit.SimpleKV("", MASTER, dev, msg.Append(tcp.HOSTNAME)), kit.Dict(mdb.TARGET, conn))() if !prints && ice.Info.Colors { - m.Go(func() { - m.Sleep30ms().Cmd(ssh.PRINTF, kit.Dict(nfs.CONTENT, "\r"+ice.Render(m, ice.RENDER_QRCODE, m.CmdAppend(SPACE, dev, cli.PWD, mdb.LINK)))).Cmd(ssh.PROMPT) - }) + go func() { + m.Sleep("300ms").Cmd(ssh.PRINTF, kit.Dict(nfs.CONTENT, "\r"+ice.Render(m, ice.RENDER_QRCODE, m.CmdAppend(SPACE, dev, cli.PWD, mdb.LINK)))).Cmd(ssh.PROMPT, kit.Dict( + ice.LOG_DISABLE, ice.TRUE, + )) + }() prints = true } _space_handle(m.Spawn(), true, dev, conn) @@ -182,11 +184,11 @@ func init() { _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) }}, mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == SPACE || arg[0] == mdb.FOREACH { + if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { switch values[mdb.TYPE] { - case WORKER: - m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, MergePod(m, values[mdb.NAME]))), values) + case SERVER, WORKER: + m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, strings.Split(MergePod(m, values[mdb.NAME]), ice.QS)[0])), values) case MASTER: m.PushSearch(mdb.TEXT, m.Cmd(SPIDE, values[mdb.NAME], ice.Maps{ice.MSG_FIELDS: ""}).Append(CLIENT_ORIGIN), values) } diff --git a/core/chat/favor.go b/core/chat/favor.go index 46ac50b3..f83477a9 100644 --- a/core/chat/favor.go +++ b/core/chat/favor.go @@ -53,9 +53,16 @@ func init() { "record1": {Name: "favor upload", Help: "截图"}, "record2": {Name: "favor upload", Help: "录屏"}, mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { - m.OptionDefault(mdb.TYPE, mdb.LINK, mdb.NAME, kit.ParseURL(m.Option(mdb.TEXT)).Host) + if strings.HasPrefix(m.Option(mdb.TEXT), ice.HTTP) { + m.OptionDefault(mdb.TYPE, mdb.LINK, mdb.NAME, kit.ParseURL(m.Option(mdb.TEXT)).Host) + } mdb.HashCreate(m, m.OptionSimple()) }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { + m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { m.PushSearch(values) }) + } + }}, web.UPLOAD: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("", mdb.CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT)) }}, diff --git a/init.go b/init.go index 116b4dff..3fca5b38 100644 --- a/init.go +++ b/init.go @@ -104,6 +104,8 @@ func Run(arg ...string) string { Pulse.Option(ls[0], ls[1]) } }) + time.Local = time.FixedZone("Beijing", 28800) + Pulse.time = time.Now() if Pulse._cmd == nil { Pulse._cmd = &Command{RawHand: logs.FileLines(3)} } diff --git a/misc/git/status.go b/misc/git/status.go index 5b40bd16..933d0cf1 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -81,7 +81,7 @@ func _status_tags(m *ice.Message) { }) } func _status_each(m *ice.Message, title string, cmds ...string) { - web.GoToast(m, title, func(toast func(string, int, int)) { + web.GoToast(m, kit.Select(strings.Join(cmds, ice.SP), title), func(toast func(string, int, int)) { list, count, total := []string{}, 0, len(m.Confm(REPOS, mdb.HASH)) ReposList(m).Tables(func(value ice.Maps) { toast(value[REPOS], count, total) @@ -213,13 +213,13 @@ func init() { m.Cmdy(REPOS, mdb.CREATE) }}, PULL: {Help: "下载", Hand: func(m *ice.Message, arg ...string) { - _status_each(m, PULL, cli.SYSTEM, GIT, PULL) - _status_each(m, PULL, cli.SYSTEM, GIT, PULL, "--tags") + _status_each(m, "", cli.SYSTEM, GIT, PULL) + _status_each(m, "", cli.SYSTEM, GIT, PULL, "--tags") }}, PUSH: {Help: "上传", Hand: func(m *ice.Message, arg ...string) { if m.Option(REPOS) == "" { - _status_each(m, PUSH, cli.SYSTEM, GIT, PUSH) - _status_each(m, PUSH, cli.SYSTEM, GIT, PUSH, "--tags") + _status_each(m, "", cli.SYSTEM, GIT, PUSH) + _status_each(m, "", cli.SYSTEM, GIT, PUSH, "--tags") return } m.Option(cli.CMD_DIR, _repos_path(m.Option(REPOS)))