diff --git a/base/cli/forever.go b/base/cli/forever.go index 4deba3a6..792c70e1 100644 --- a/base/cli/forever.go +++ b/base/cli/forever.go @@ -28,8 +28,7 @@ func init() { } } for _, v := range os.Environ() { - ls := kit.Split(v, "=", "=") - if kit.IndexOf(env, ls[0]) == -1 { + if ls := kit.Split(v, "=", "="); kit.IndexOf(env, ls[0]) == -1 && len(ls) > 1 { env = append(env, ls[0], ls[1]) } } diff --git a/base/cli/runtime.go b/base/cli/runtime.go index aa9211dd..951680ab 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -162,7 +162,6 @@ const ( var ENV_LIST = []string{ TERM, SHELL, CTX_SHY, CTX_DEV, CTX_OPS, CTX_ARG, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER, CTX_DAEMON, - "DOCKER_HOST", } const ( diff --git a/base/nfs/dir.go b/base/nfs/dir.go index 2d671735..4ac0f2fe 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -29,15 +29,18 @@ func _dir_hash(m *ice.Message, p string) string { return "" } func _dir_list(m *ice.Message, root string, name string, level int, deep bool, dir_type string, dir_reg *regexp.Regexp, fields []string) *ice.Message { - list, e := ReadDir(m, path.Join(root, name)) - if e != nil && len(list) == 0 { // 单个文件 - ls, _ := ReadDir(m, path.Dir(path.Join(root, name))) - for _, s := range ls { - if s.Name() == path.Base(name) { - list = append(list, s) + list, _ := ReadDir(m, path.Join(root, name)) + + if len(list) == 0 { // 单个文件 + if s, e := StatFile(m, path.Join(root, name)); e == nil && !s.IsDir() { + ls, _ := ReadDir(m, path.Dir(path.Join(root, name))) + for _, s := range ls { + if s.Name() == path.Base(name) { + list = append(list, s) + } } + name, deep = path.Dir(name), false } - name, deep = path.Dir(name), false } for _, f := range list { diff --git a/base/web/dream.go b/base/web/dream.go index 463c9358..e8b3a89c 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -144,7 +144,8 @@ func init() { m.ProcessOpen(MergePod(m, m.Option(mdb.NAME)+"/cmd/web.code.vimer", "", "")) }}, "xterm": {Name: "xterm", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - m.ProcessOpen(MergePod(m, m.Option(mdb.NAME)+"/cmd/web.code.xterm", "hash", m.Cmdx(SPACE, m.Option(mdb.NAME), "web.code.xterm", mdb.CREATE, "type", "sh"))) + m.ProcessOpen(MergePod(m, m.Option(mdb.NAME)+"/cmd/web.code.xterm", mdb.HASH, + m.Cmdx(SPACE, m.Option(mdb.NAME), "web.code.xterm", mdb.CREATE, mdb.TYPE, nfs.SH, mdb.NAME, "xterm"))) }}, cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) diff --git a/base/web/option.go b/base/web/option.go index d74f0717..d10b97e5 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -141,3 +141,13 @@ func MergeLink(m Message, url string, arg ...ice.Any) string { func MergePod(m Message, pod string, arg ...ice.Any) string { return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...) } +func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string { + p := "/chat" + if pod != "" { + p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod) + } + if cmd != "" { + p += "/cmd/" + cmd + } + return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...) +} diff --git a/base/web/space.go b/base/web/space.go index cbe93642..ba67d635 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -12,6 +12,7 @@ import ( "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" "shylinux.com/x/websocket" @@ -348,15 +349,25 @@ func init() { m.StatusTimeCount("nCPU", ncpu, "nmem", kit.Format("%.2fG", nmem/1000.0)) m.Debug("what %v", m.FormatMeta()) }}, + cli.OPEN: {Name: "open", Help: "打开", Hand: func(m *ice.Message, arg ...string) { + m.ProcessOpen(MergePod(m, m.Option(mdb.NAME), "", "")) + }}, + "vimer": {Name: "vimer", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.ProcessOpen(MergePod(m, m.Option(mdb.NAME)+"/cmd/web.code.vimer", "", "")) + }}, + "xterm": {Name: "xterm", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + m.ProcessOpen(MergePod(m, m.Option(mdb.NAME)+"/cmd/web.code.xterm", mdb.HASH, + m.Cmdx(SPACE, m.Option(mdb.NAME), "web.code.xterm", mdb.CREATE, mdb.TYPE, nfs.SH, mdb.NAME, "xterm"))) + }}, }, mdb.HashCloseAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 { // 节点列表 if mdb.HashSelect(m, arg...); len(arg) == 0 { m.Tables(func(value ice.Maps) { switch value[mdb.TYPE] { - case MASTER: - m.PushAnchor(value[mdb.NAME], m.CmdAppend(SPIDE, value[mdb.NAME], CLIENT_URL)) + case SERVER, WORKER: + m.PushButton(cli.OPEN, "vimer", "xterm") default: - m.PushAnchor(value[mdb.NAME], MergePod(m, value[mdb.NAME])) + m.PushButton("") } }) m.Sort("type,name,text") diff --git a/core/code/binpack.go b/core/code/binpack.go index 8a83b195..94703b26 100644 --- a/core/code/binpack.go +++ b/core/code/binpack.go @@ -133,7 +133,9 @@ func init() { if list[value[nfs.PATH]] { return } - list[value[nfs.PATH]] = true + if list[value[nfs.PATH]] = true; strings.Contains(value[nfs.PATH], "/go/pkg/mod/") { + value[nfs.PATH] = "/require/" + strings.Split(value[nfs.PATH], "/go/pkg/mod/")[1] + } _binpack_file(m, w, value[nfs.PATH]) }) }) diff --git a/core/code/compile.go b/core/code/compile.go index 0bc5bacd..48245d61 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -60,12 +60,12 @@ func init() { }, Hand: func(m *ice.Message, arg ...string) { // 下载依赖 _autogen_version(m.Spawn()) - m.Cmd(cli.SYSTEM, GO, "get", "shylinux.com/x/ice") // 执行编译 web.PushStream(m) main, file, goos, arch := _compile_target(m, arg...) m.Optionv(cli.CMD_ENV, kit.Simple(m.Configv(cli.ENV), cli.HOME, kit.Env(cli.HOME), cli.PATH, kit.Env(cli.PATH), cli.GOOS, goos, cli.GOARCH, arch)) + m.Cmd(cli.SYSTEM, GO, "get", "shylinux.com/x/ice") if msg := m.Cmd(cli.SYSTEM, GO, cli.BUILD, "-o", file, main, ice.SRC_VERSION_GO, ice.SRC_BINPACK_GO); !cli.IsSuccess(msg) { m.Copy(msg) return diff --git a/core/code/xterm.go b/core/code/xterm.go index 464686fe..20f921f6 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -60,12 +60,14 @@ func init() { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { switch mdb.HashInputs(m, arg); arg[0] { case mdb.TYPE: - m.Push(arg[0], "ice.bin source stdio", "tmux attach -t miss", "node", "python", "bash", "sh") + m.Push(arg[0], "ice.bin source stdio", "tmux attach -t miss", "docker run -w /root -it alpine", "python", "node", "bash", "sh") case mdb.NAME: - m.Push(arg[0], path.Base(m.Option(mdb.TYPE))) + m.Push(arg[0], ice.Info.HostName, path.Base(m.Option(mdb.TYPE))) } }}, - mdb.CREATE: {Name: "create type=sh name=xterm", Help: "创建"}, + mdb.CREATE: {Name: "create type=sh name", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + mdb.HashCreate(m.Spawn(), mdb.NAME, m.Option(mdb.TYPE), m.OptionSimple(mdb.TYPE, mdb.NAME)) + }}, "resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) { pty.Setsize(_xterm_get(m, m.Option(mdb.HASH)).File, &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))}) }}, @@ -78,8 +80,12 @@ func init() { _xterm_get(m, kit.Select(m.Option(mdb.HASH), arg, 0)).Write([]byte(m.Cmdx(PUBLISH, ice.CONTEXTS, INSTALL) + ice.NL)) m.ProcessHold() }}, + web.WEBSITE: {Name: "website", Help: "打开", Hand: func(m *ice.Message, arg ...string) { + m.ProcessOpen(web.MergePodCmd(m, "", m.PrefixKey(), mdb.HASH, m.Option(mdb.HASH))) + }}, }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text")), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) == 0 { + m.PushAction(web.WEBSITE, mdb.REMOVE) m.Action(mdb.CREATE, mdb.PRUNES) } else { m.Action("full", INSTALL)