diff --git a/base/gdb/event.go b/base/gdb/event.go index 64a505c1..1ff064b5 100644 --- a/base/gdb/event.go +++ b/base/gdb/event.go @@ -1,6 +1,8 @@ package gdb import ( + "sync" + ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/mdb" kit "shylinux.com/x/toolkits" @@ -26,6 +28,7 @@ func init() { mdb.ZoneSelect(m.Spawn(ice.OptionFields("")), arg[1]).Table(func(value ice.Maps) { m.Cmdy(kit.Split(value[ice.CMD]), arg[1], arg[2:], ice.OptionFields("")) }) + _waitMap.Range(func(key, cb ice.Any) bool { cb.(func(*ice.Message, ...string))(m, arg...); return true }) }}, }, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELDS, "time,id,cmd"), mdb.ClearOnExitHashAction())}, }) @@ -56,3 +59,17 @@ func EventDeferEvent(m *ice.Message, key string, arg ...ice.Any) func(string, .. Event(m, key, arg...) return func(key string, args ...ice.Any) { Event(m, key, args...) } } + +var _waitMap = sync.Map{} + +func WaitEvent(m *ice.Message, key string, cb func(*ice.Message, ...string) bool) { + wg := sync.WaitGroup{} + h := kit.HashsUniq() + defer _waitMap.Delete(h) + _waitMap.Store(h, func(m *ice.Message, arg ...string) { + m.Info("WaitEvent %v %v", key, kit.FileLine(cb, 3)) + kit.If((key == "" || m.Option(EVENT) == key) && cb(m, arg...), func() { wg.Done() }) + }) + wg.Add(1) + defer wg.Wait() +} diff --git a/base/tcp/host.go b/base/tcp/host.go index 24f0c05b..9b18a5f3 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -3,6 +3,7 @@ package tcp import ( "fmt" "net" + "os" "strings" ice "shylinux.com/x/icebergs" @@ -12,11 +13,18 @@ import ( kit "shylinux.com/x/toolkits" ) -func _host_publish(m *ice.Message) string { - if p := mdb.Config(m, DOMAIN); p != "" { - return p - } - return m.Cmdv(HOST, mdb.Config(m, ice.MAIN), aaa.IP) +func _host_domain(m *ice.Message) string { + return kit.GetValid( + func() string { return m.Option("tcp_domain") }, + func() string { return mdb.Config(m, DOMAIN) }, + func() string { return os.Getenv("tcp_domain") }, + func() string { + if !kit.IsIn(m.ActionKey(), "", ice.LIST) { + return m.Cmdv(HOST, mdb.Config(m, ice.MAIN), aaa.IP) + } + return "" + }, + ) } func _host_list(m *ice.Message, name string) { if ifs, e := net.Interfaces(); m.Assert(e) { @@ -39,7 +47,7 @@ func _host_list(m *ice.Message, name string) { m.Push(mdb.INDEX, -1).Push(mdb.NAME, LOCALHOST).Push(aaa.IP, "127.0.0.1").Push("mask", "255.0.0.0").Push("hard", "") } m.SortInt(mdb.INDEX) - m.StatusTimeCount(mdb.ConfigSimple(m, ice.MAIN, DOMAIN)) + m.StatusTimeCount(DOMAIN, _host_domain(m)) } const ( @@ -79,9 +87,9 @@ func init() { }}, PUBLISH: {Hand: func(m *ice.Message, arg ...string) { if strings.Contains(arg[0], LOCALHOST) { - arg[0] = strings.Replace(arg[0], LOCALHOST, _host_publish(m), 1) + arg[0] = strings.Replace(arg[0], LOCALHOST, _host_domain(m), 1) } else if strings.Contains(arg[0], "127.0.0.1") { - arg[0] = strings.Replace(arg[0], "127.0.0.1", _host_publish(m), 1) + arg[0] = strings.Replace(arg[0], "127.0.0.1", _host_domain(m), 1) } m.Echo(arg[0]) }}, diff --git a/base/web/dream.go b/base/web/dream.go index 7f51bffe..ed9730a8 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -81,11 +81,11 @@ func _dream_start(m *ice.Message, name string) { cli.CTX_OPS, Domain(tcp.LOCALHOST, m.Cmdv(SERVE, tcp.PORT)), cli.CTX_LOG, ice.VAR_LOG_BOOT_LOG, cli.CTX_PID, ice.VAR_LOG_ICE_PID, cli.CTX_ROOT, kit.Path(""), cli.PATH, cli.BinPath(p, ""), cli.USER, ice.Info.Username, )...), cli.CMD_OUTPUT, path.Join(p, ice.VAR_LOG_BOOT_LOG), mdb.CACHE_CLEAR_ONEXIT, ice.TRUE) - defer m.Sleep3s() gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.NAME, mdb.TYPE)) kit.If(m.Option(nfs.BINARY), func(p string) { _dream_binary(m, p) }) kit.If(m.Option(nfs.TEMPLATE), func(p string) { _dream_template(m, p) }) m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, mdb.TYPE, WORKER, m.OptionSimple(mdb.NAME), cli.DAEMON, ice.OPS) + gdb.WaitEvent(m, DREAM_OPEN, func(m *ice.Message, arg ...string) bool { return m.Option(mdb.NAME) == name }) } func _dream_binary(m *ice.Message, p string) { if bin := path.Join(m.Option(cli.CMD_DIR), ice.BIN_ICE_BIN); nfs.Exists(m, bin) { @@ -265,6 +265,8 @@ func init() { DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { kit.Switch(m.Option(mdb.TYPE), []string{WORKER, SERVER}, func() { m.PushButton(OPEN, ice.MAIN) }) }}, + DREAM_OPEN: {Hand: func(m *ice.Message, arg ...string) { + }}, STATS_TABLES: {Hand: func(m *ice.Message, arg ...string) { if msg := mdb.HashSelects(m.Spawn()); msg.Length() > 0 { stats := map[string]int{} diff --git a/base/web/space.go b/base/web/space.go index 93a559f9..1ca5af95 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -3,6 +3,7 @@ package web import ( "math/rand" "net" + "runtime" "strings" "sync" "time" @@ -28,7 +29,7 @@ func _space_qrcode(m *ice.Message, dev string) { } func _space_dial(m *ice.Message, dev, name string, arg ...string) { u := kit.ParseURL(kit.MergeURL2(strings.Replace(m.Cmdv(SPIDE, dev, CLIENT_ORIGIN), HTTP, "ws", 1), PP(SPACE), mdb.TYPE, ice.Info.NodeType, mdb.NAME, name, - nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions(), arg)) + nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions(), "goos", runtime.GOOS, "goarch", runtime.GOARCH, arg)) args := kit.SimpleKV("type,name,host,port", u.Scheme, dev, u.Hostname(), kit.Select(kit.Select("443", "80", u.Scheme == "ws"), u.Port())) gdb.Go(m, func() { once := sync.Once{} @@ -47,6 +48,22 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { } }, kit.Join(kit.Simple(SPACE, name), lex.SP)) } +func _space_agent(m *ice.Message, args ...string) []string { + kit.If(m.Option("goos"), func(p string) { args = append(args, "system", p) }) + for _, p := range []string{"Android", "iPhone", "Mac", "Windows"} { + if strings.Contains(m.Option(ice.MSG_USERUA), p) { + args = append(args, "system", p) + break + } + } + for _, p := range []string{"MicroMessenger", "Alipay", "Edg", "Chrome", "Safari", "Go-http-client"} { + if strings.Contains(m.Option(ice.MSG_USERUA), p) { + args = append(args, "agent", p) + break + } + } + return args +} func _space_fork(m *ice.Message) { addr := kit.Select(m.R.RemoteAddr, m.R.Header.Get(ice.MSG_USERADDR)) text := strings.ReplaceAll(kit.Select(addr, m.Option(mdb.TEXT)), "%2F", nfs.PS) @@ -67,6 +84,7 @@ func _space_fork(m *ice.Message) { args := kit.Simple(mdb.TYPE, kit.Select(WORKER, m.Option(mdb.TYPE)), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(nfs.MODULE, nfs.VERSION, cli.DAEMON)) args = append(args, aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE)) args = append(args, aaa.UA, m.Option(ice.MSG_USERUA), aaa.IP, m.Option(ice.MSG_USERIP)) + args = _space_agent(m, args...) if c, e := websocket.Upgrade(m.W, m.R); !m.Warn(e) { gdb.Go(m, func() { defer mdb.HashCreateDeferRemove(m, args, kit.Dict(mdb.TARGET, c))() @@ -291,7 +309,7 @@ func init() { } }}, nfs.PS: {Hand: func(m *ice.Message, arg ...string) { _space_fork(m) }}, - }, mdb.HashAction(mdb.LIMIT, 1000, mdb.LEAST, 500, mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text,module,version,ip,usernick,username,userrole", ctx.ACTION, OPEN, REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000)), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.LIMIT, 1000, mdb.LEAST, 500, mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text,module,version,agent,system,ip,usernick,username,userrole", ctx.ACTION, OPEN, REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000)), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 { if len(arg) == 1 && strings.Contains(arg[0], nfs.PT) { ls := kit.Split(arg[0], nfs.PT) diff --git a/base/web/web.go b/base/web/web.go index ce8cfe6d..3ae553e4 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -62,7 +62,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) { default: m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, HTTP, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(l net.Listener) { defer mdb.HashCreateDeferRemove(m, m.OptionSimple(mdb.NAME, tcp.PROTO), arg, cli.STATUS, tcp.START)() - gdb.Event(m, SERVE_START, arg) + gdb.Event(m.Spawn(), SERVE_START, arg) m.Warn(f.Server.Serve(l)) }) kit.If(m.IsErr(), func() { fmt.Println(); fmt.Println(m.Result()); m.Cmd(ice.QUIT) }) diff --git a/core/code/publish.go b/core/code/publish.go index 7fdd4c5a..9996b43a 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -47,6 +47,7 @@ func _publish_contexts(m *ice.Message, arg ...string) { m.Options(nfs.DIR_ROOT, "").OptionDefault(ice.MSG_USERNAME, "demo") for _, k := range kit.Default(arg, ice.MISC) { m.Options(web.DOMAIN, web.UserHost(m), cli.CTX_ENV, kit.Select("", lex.SP+kit.JoinKV(mdb.EQ, lex.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != "")) + m.Option("tcp_domain", kit.ParseURL(web.UserHost(m)).Hostname()) switch k { case INSTALL: m.Option("format", "raw") @@ -57,6 +58,7 @@ func _publish_contexts(m *ice.Message, arg ...string) { case nfs.SOURCE, ice.DEV: m.Options(nfs.SOURCE, ice.Info.Make.Remote) case nfs.BINARY, ice.APP: + case "curl", "wget": case "manual": m.Options(nfs.BINARY, "ice.linux.amd64")