diff --git a/base/cli/forever.go b/base/cli/forever.go index b98bbad3..cbab015f 100644 --- a/base/cli/forever.go +++ b/base/cli/forever.go @@ -20,20 +20,27 @@ func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ FOREVER: {Name: "forever", Help: "启动", Action: map[string]*ice.Action{ SERVE: {Name: "serve", Help: "服务", Hand: func(m *ice.Message, arg ...string) { - env := []string{PATH, BinPath()} - for _, k := range []string{HOME, CTX_SHY, CTX_DEV, CTX_OPS, CTX_ARG, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER} { - env = append(env, k, kit.Env(k)) + env := []string{PATH, BinPath(), HOME, kit.Select(kit.Path(""), os.Getenv(HOME))} + for _, k := range []string{SHELL, CTX_SHY, CTX_DEV, CTX_OPS, CTX_ARG, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER} { + if kit.Env(k) != "" { + env = append(env, k, kit.Env(k)) + } } m.Option(CMD_ENV, env) - m.Option(CMD_ERRPUT, kit.Select(ice.BIN_BOOT_LOG, kit.Env(CTX_LOG))) + m.Optionv(CMD_INPUT, os.Stdin) + m.Optionv(CMD_OUTPUT, os.Stdout) + m.Optionv(CMD_ERRPUT, os.Stderr) + if p := kit.Env(CTX_LOG); p != "" { + m.Optionv(CMD_ERRPUT, p) + } m.Cmdy(FOREVER, kit.Select(os.Args[0], nfs.PWD+ice.BIN_ICE_BIN, kit.FileExists(ice.BIN_ICE_BIN)), SERVE, START, ice.DEV, "", aaa.USERNAME, aaa.ROOT, aaa.PASSWORD, aaa.ROOT, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { for { println(kit.Format("%s run %s", kit.Now(), kit.Join(arg, ice.SP))) - if m.Sleep("1s"); IsSuccess(m.Cmd(SYSTEM, arg, kit.Dict(CMD_INPUT, os.Stdin, CMD_OUTPUT, os.Stdout))) { + if m.Sleep("1s"); IsSuccess(m.Cmd(SYSTEM, arg)) { println(kit.Format("%s exit", kit.Now())) return } diff --git a/base/cli/runtime.go b/base/cli/runtime.go index 45133dff..2026d4d9 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -119,9 +119,10 @@ const ( UBUNTU = "ubuntu" ) const ( - USER = "USER" - HOME = "HOME" - PATH = "PATH" + SHELL = "SHELL" + USER = "USER" + HOME = "HOME" + PATH = "PATH" ) const ( CTX_SHY = "ctx_shy" @@ -156,7 +157,7 @@ func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ RUNTIME: {Name: RUNTIME, Help: "运行环境", Value: kit.Dict()}, }, Commands: map[string]*ice.Command{ - RUNTIME: {Name: "runtime info=ifconfig,hostinfo,hostname,userinfo,procinfo,bootinfo,diskinfo auto", Help: "运行环境", Action: map[string]*ice.Action{ + RUNTIME: {Name: "runtime info=ifconfig,hostinfo,hostname,userinfo,procinfo,bootinfo,diskinfo,env auto", Help: "运行环境", Action: map[string]*ice.Action{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _runtime_init(m) m.Cmd(RUNTIME, MAXPROCS, "1") @@ -193,6 +194,13 @@ func init() { DISKINFO: {Name: "diskinfo", Help: "磁盘信息", Hand: func(m *ice.Message, arg ...string) { _runtime_diskinfo(m) }}, + "env": {Name: "env", Help: "环境变量", Hand: func(m *ice.Message, arg ...string) { + for _, v := range os.Environ() { + ls := strings.SplitN(v, "=", 2) + m.Push(mdb.NAME, ls[0]) + m.Push(mdb.VALUE, ls[1]) + } + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 0 && arg[0] == BOOTINFO { arg = arg[1:] diff --git a/base/cli/system.go b/base/cli/system.go index 652109b6..0056a43d 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -53,6 +53,8 @@ func _system_cmd(m *ice.Message, arg ...string) *exec.Cmd { return cmd } func _system_out(m *ice.Message, out string) io.Writer { + defer func() { m.Warn(recover(), "output", out) }() + if w, ok := m.Optionv(out).(io.Writer); ok { return w } else if m.Option(out) == "" { @@ -65,6 +67,9 @@ func _system_out(m *ice.Message, out string) io.Writer { return nil } func _system_find(m *ice.Message, bin string, dir ...string) string { + if strings.Contains(bin, ice.DF) { + return bin + } if strings.HasPrefix(bin, ice.PS) { return bin } diff --git a/base/log/log.go b/base/log/log.go index d413d896..31ba3a41 100644 --- a/base/log/log.go +++ b/base/log/log.go @@ -47,14 +47,18 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { bio.WriteString(l.p) bio.WriteString(ice.SP) - if p, ok := view[PREFIX].(string); ok { - bio.WriteString(p) + if ice.Info.Colors == true { + if p, ok := view[PREFIX].(string); ok { + bio.WriteString(p) + } } bio.WriteString(l.l) bio.WriteString(ice.SP) bio.WriteString(l.s) - if p, ok := view[SUFFIX].(string); ok { - bio.WriteString(p) + if ice.Info.Colors == true { + if p, ok := view[SUFFIX].(string); ok { + bio.WriteString(p) + } } bio.WriteString(ice.NL) bio.Flush() diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index 87c21bf8..d634ffa6 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -70,7 +70,9 @@ func (f *Frame) prompt(m *ice.Message, list ...string) *Frame { case TARGET: fmt.Fprintf(f.stdout, f.target.Name) default: - fmt.Fprintf(f.stdout, v) + if ice.Info.Colors || v[0] != '\033' { + fmt.Fprintf(f.stdout, v) + } } } return f @@ -165,7 +167,9 @@ func (f *Frame) scan(m *ice.Message, h, line string) *Frame { // continue // 注释 // } if ps = f.ps1; f.stdout == os.Stdout { - f.printf(m, "\033[0m") // 清空格式 + if ice.Info.Colors { + f.printf(m, "\033[0m") // 清空格式 + } } line = f.parse(m, line) } diff --git a/base/web/serve.go b/base/web/serve.go index 78254589..c4f5fcaa 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -21,6 +21,24 @@ var rewriteList = []interface{}{} func AddRewrite(cb interface{}) { rewriteList = append(rewriteList, cb) } +func _serve_domain(m *ice.Message) string { + if p := m.Config(DOMAIN); p != "" { + return p + } + if p := m.R.Header.Get("X-Host"); p != "" { + return p + } + if m.R.Method == "POST" { + if p := m.R.Header.Get("Referer"); p != "" { + return p + } + } + if m.R.TLS == nil { + return kit.Format("http://%s", m.R.Host) + } else { + return kit.Format("https://%s", m.R.Host) + } +} func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool { if r.Header.Get("Index-Module") == "" { r.Header.Set("Index-Module", m.Prefix()) @@ -135,11 +153,12 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon } // 请求地址 - msg.Option(ice.MSG_USERWEB, kit.Select(msg.Config(DOMAIN), kit.Select(r.Header.Get("Referer"), r.Header.Get("X-Host")))) + msg.R, msg.W = r, w + msg.Option(ice.MSG_USERWEB, _serve_domain(msg)) msg.Option(ice.MSG_USERADDR, kit.Select(r.RemoteAddr, r.Header.Get(ice.MSG_USERADDR))) msg.Option(ice.MSG_USERIP, r.Header.Get(ice.MSG_USERIP)) msg.Option(ice.MSG_USERUA, r.Header.Get("User-Agent")) - msg.R, msg.W = r, w + msg.Debug("what %v", msg.FormatMeta()) // 会话别名 if sessid := msg.Option(CookieName(msg.Option(ice.MSG_USERWEB))); sessid != "" { diff --git a/base/web/space.go b/base/web/space.go index d4c29e94..2bb6cb80 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -19,8 +19,7 @@ func _space_link(m *ice.Message, pod string, arg ...interface{}) string { return tcp.ReplaceLocalhost(m, kit.MergePOD(m.Option(ice.MSG_USERWEB), pod, arg...)) } func _space_domain(m *ice.Message) (link string) { - link = m.Config(DOMAIN) - if link == "" { + if link = m.Config(DOMAIN); link == "" { link = m.Cmd(SPACE, ice.DEV, cli.PWD).Append(mdb.LINK) } if link == "" { @@ -29,6 +28,13 @@ func _space_domain(m *ice.Message) (link string) { if link == "" { link = m.Option(ice.MSG_USERWEB) } + if link == "" && m.R != nil && m.R.Host != "" && !tcp.IsLocalHost(m, m.R.Host) { + if m.R.TLS == nil { + link = kit.Format("http://%s", m.R.Host) + } else { + link = kit.Format("https://%s", m.R.Host) + } + } if link == "" { link = kit.Format("http://localhost:%s", m.Cmd(SERVE).Append(tcp.PORT)) } @@ -224,12 +230,14 @@ func _space_fork(m *ice.Message) { m.Go(func(msg *ice.Message) { switch m.Option(ice.CMD) { case cli.PWD: - link := kit.MergeURL(_space_domain(msg), aaa.GRANT, name) + link := kit.MergeURL(_space_domain(m), aaa.GRANT, name) msg.Sleep300ms(SPACE, name, cli.PWD, name, link, msg.Cmdx(cli.QRCODE, link)) case "sso": - link := _space_domain(msg) + link := _space_domain(m) + m.Debug("what %v", link) ls := strings.Split(kit.ParseURL(link).Path, ice.PS) - link = kit.MergeURL2(_space_domain(msg), "/chat/sso", "space", kit.Select("", ls, 3), "back", m.Option(ice.MSG_USERWEB)) + link = kit.MergeURL2(_space_domain(m), "/chat/sso", "space", kit.Select("", ls, 3), "back", m.Option(ice.MSG_USERWEB)) + m.Debug("what %v", link) msg.Sleep300ms(SPACE, name, cli.PWD, name, link, msg.Cmdx(cli.QRCODE, link)) default: msg.Sleep300ms(SPACE, name, cli.PWD, name) diff --git a/core/code/publish.go b/core/code/publish.go index ff69bcbf..8a8ebcc0 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -13,6 +13,7 @@ import ( "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" + "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) @@ -68,7 +69,12 @@ func init() { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.Config(nfs.PATH)) m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey()) m.Config(ice.CONTEXTS, _contexts) + m.Watch(web.SERVE_START, m.PrefixKey()) }}, + web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) { + _publish_file(m, ice.ICE_BIN) + }}, + ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) { defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }() defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }() diff --git a/info.go b/info.go index 95227174..c0ca15de 100644 --- a/info.go +++ b/info.go @@ -24,6 +24,7 @@ var Info = struct { UserName string PassWord string + Colors bool Domain string NodeType string NodeName string diff --git a/init.go b/init.go index 763e0fd2..2ed2648f 100644 --- a/init.go +++ b/init.go @@ -111,6 +111,12 @@ func Run(arg ...string) string { switch Index.Merge(Index).Begin(Pulse.Spawn(), arg...); kit.Select("", arg, 0) { case SERVE, SPACE: // 启动服务 + switch path.Base(os.Getenv("SHELL")) { + case "", ".": + Info.Colors = false + default: + Info.Colors = true + } if log.LogDisable = false; Index.Start(Pulse, arg...) { Pulse.TryCatch(Pulse, true, func(Pulse *Message) { Index.wg.Wait() }) os.Exit(kit.Int(Pulse.Option(EXIT))) diff --git a/logs.go b/logs.go index 6d28c3bf..ef0eba3d 100644 --- a/logs.go +++ b/logs.go @@ -20,15 +20,17 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message { // 日志颜色 prefix, suffix := "", "" - switch level { - case LOG_CREATE, LOG_INSERT, LOG_MODIFY, LOG_EXPORT, LOG_IMPORT: - prefix, suffix = "\033[36;44m", "\033[0m" - case LOG_CMDS, LOG_START, LOG_SERVE: - prefix, suffix = "\033[32m", "\033[0m" - case LOG_WARN, LOG_ERROR, LOG_CLOSE: - prefix, suffix = "\033[31m", "\033[0m" - case LOG_AUTH, LOG_COST: - prefix, suffix = "\033[33m", "\033[0m" + if Info.Colors { + switch level { + case LOG_CREATE, LOG_INSERT, LOG_MODIFY, LOG_EXPORT, LOG_IMPORT: + prefix, suffix = "\033[36;44m", "\033[0m" + case LOG_CMDS, LOG_START, LOG_SERVE: + prefix, suffix = "\033[32m", "\033[0m" + case LOG_WARN, LOG_ERROR, LOG_CLOSE: + prefix, suffix = "\033[31m", "\033[0m" + case LOG_AUTH, LOG_COST: + prefix, suffix = "\033[33m", "\033[0m" + } } // 文件行号