1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-03-09 11:39:32 +08:00
parent f3e0b8bf58
commit 45c782207f
25 changed files with 228 additions and 114 deletions

View File

@ -14,6 +14,7 @@ import (
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file" "shylinux.com/x/toolkits/file"
) )
@ -161,8 +162,9 @@ const (
CMD_ERR = "cmd_err" CMD_ERR = "cmd_err"
CMD_OUT = "cmd_out" CMD_OUT = "cmd_out"
MAN = "man" MAN = "man"
GREP = "grep" GREP = "grep"
OPENS = "opens"
) )
const SYSTEM = "system" const SYSTEM = "system"
@ -170,6 +172,24 @@ const SYSTEM = "system"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
SYSTEM: {Name: "system cmd", Help: "系统命令", Actions: ice.MergeActions(ice.Actions{ SYSTEM: {Name: "system cmd", Help: "系统命令", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if runtime.GOOS == DARWIN && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
list := map[string]bool{"Terminal.app": true, "Docker.app": true, "Google Chrome.app": true}
for _, p := range strings.Split(m.Cmdx("", nfs.SH, "-c", `ps aux|grep /Applications/|grep -v Cache|grep -v Helper|grep -v Widget|grep -v Extension|grep -v Chrome|grep -v com.app|grep -v grep|grep -o "[^/]*.app"|sort|uniq`), ice.NL) {
list[p] = true
}
for p := range list {
m.PushSearch(mdb.TYPE, OPENS, mdb.TEXT, p)
}
}
if arg[0] == m.CommandKey() && arg[1] == OPENS {
for _, p := range []string{"/Applications", "/System/Applications", "/System/Applications/Utilities"} {
m.Cmd(nfs.DIR, p, mdb.NAME, func(value ice.Maps) { m.PushSearch(mdb.TEXT, path.Join(p, value[mdb.NAME]), value) })
}
}
}
}},
nfs.PUSH: {Hand: func(m *ice.Message, arg ...string) { nfs.PUSH: {Hand: func(m *ice.Message, arg ...string) {
for _, p := range arg { for _, p := range arg {
if !strings.Contains(m.Cmdx(nfs.CAT, ice.ETC_PATH), p) { if !strings.Contains(m.Cmdx(nfs.CAT, ice.ETC_PATH), p) {

View File

@ -15,7 +15,7 @@ const DEBUG = "debug"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
DEBUG: {Name: "debug level=watch,bench,debug,error,watch offset filter auto doc", Help: "后台日志", Actions: ice.Actions{ DEBUG: {Name: "debug level=error,bench,debug,error,watch offset filter auto doc", Help: "后台日志", Actions: ice.Actions{
"doc": {Help: "文档", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen("https://pkg.go.dev/std") }}, "doc": {Help: "文档", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen("https://pkg.go.dev/std") }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
offset := kit.Int(kit.Select("0", arg, 1)) offset := kit.Int(kit.Select("0", arg, 1))

View File

@ -118,6 +118,7 @@ const (
FIELDS = "fields" FIELDS = "fields"
PARAMS = "params" PARAMS = "params"
RECENT = "recent"
INPUTS = "inputs" INPUTS = "inputs"
CREATE = "create" CREATE = "create"
REMOVE = "remove" REMOVE = "remove"

View File

@ -166,7 +166,9 @@ func OptionLoad(m *ice.Message, file string) *ice.Message {
return m return m
} }
func Template(m *ice.Message, file string) string { return kit.Renders(TemplateText(m, file), m) } func Template(m *ice.Message, file string, arg ...ice.Any) string {
return kit.Renders(kit.Format(TemplateText(m, file), arg...), m)
}
func TemplateText(m *ice.Message, file string) string { func TemplateText(m *ice.Message, file string) string {
return m.Cmdx(CAT, path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Base(file))) return m.Cmdx(CAT, path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Base(file)))
} }

View File

@ -4,6 +4,7 @@ import (
"os" "os"
"path" "path"
"regexp" "regexp"
"runtime"
"strings" "strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
@ -152,7 +153,7 @@ const (
DIR_DEEP = "dir_deep" DIR_DEEP = "dir_deep"
DIR_REG = "dir_reg" DIR_REG = "dir_reg"
DIR_DEF_FIELDS = "time,path,size,action" DIR_DEF_FIELDS = "time,size,path,action"
DIR_WEB_FIELDS = "time,size,path,link,action" DIR_WEB_FIELDS = "time,size,path,link,action"
DIR_CLI_FIELDS = "path,size,time" DIR_CLI_FIELDS = "path,size,time"
) )
@ -165,6 +166,8 @@ const (
NAME = "name" NAME = "name"
SIZE = "size" SIZE = "size"
LINE = "line" LINE = "line"
OPENS = "opens"
) )
const DIR = "dir" const DIR = "dir"
@ -175,6 +178,22 @@ func init() {
aaa.White(m, ice.SRC, ice.BIN, ice.USR) aaa.White(m, ice.SRC, ice.BIN, ice.USR)
aaa.Black(m, ice.USR_LOCAL) aaa.Black(m, ice.USR_LOCAL)
}}, mdb.UPLOAD: {}, }}, mdb.UPLOAD: {},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
m.Debug("what ")
if arg[0] == mdb.FOREACH && arg[1] == "" && runtime.GOOS == "darwin" && m.Cmdx("host", "islocal", m.Option(ice.MSG_USERIP)) == ice.OK {
m.Debug("what ")
for _, p := range []string{"Desktop", "Documents", "Downloads", "Pictures"} {
p := kit.HomePath(p)
m.Cmd(DIR, PWD, mdb.NAME, mdb.TIME, kit.Dict(DIR_ROOT, p)).SortTimeR(mdb.TIME).TablesLimit(5, func(value ice.Maps) {
name := value[mdb.NAME]
if len(kit.TrimExt(name)) > 30 {
name = name[:10] + ".." + name[len(name)-10:]
}
m.PushSearch(mdb.TYPE, OPENS, mdb.NAME, name, mdb.TEXT, path.Join(p, value[mdb.NAME]))
})
}
}
}},
TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(TRASH, mdb.CREATE, m.Option(PATH)) }}, TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(TRASH, mdb.CREATE, m.Option(PATH)) }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
root, dir := kit.Select(PWD, m.Option(DIR_ROOT)), kit.Select(PWD, arg, 0) root, dir := kit.Select(PWD, m.Option(DIR_ROOT)), kit.Select(PWD, arg, 0)

View File

@ -85,7 +85,7 @@ func init() {
} }
if n, e := io.Copy(f, r); !m.Warn(e) { if n, e := io.Copy(f, r); !m.Warn(e) {
size += n size += n
m.Logs(mdb.EXPORT, LINE, i, SIZE, kit.FmtSize(size), FILE, p, SIZE, kit.FmtSize(n)) // m.Logs(mdb.EXPORT, LINE, i, SIZE, kit.FmtSize(size), FILE, p, SIZE, kit.FmtSize(n))
os.Chmod(p, os.FileMode(h.Mode)) os.Chmod(p, os.FileMode(h.Mode))
} }
} }

View File

@ -50,6 +50,7 @@ const (
ISLOCAL = "islocal" ISLOCAL = "islocal"
PUBLISH = "publish" PUBLISH = "publish"
GATEWAY = "gateway"
) )
const HOST = "host" const HOST = "host"
@ -65,6 +66,12 @@ func init() {
aaa.BLACK: {Name: "black name text", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) { aaa.BLACK: {Name: "black name text", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, mdb.TYPE, m.ActionKey(), m.OptionSimple(mdb.NAME, mdb.TEXT)) mdb.HashCreate(m, mdb.TYPE, m.ActionKey(), m.OptionSimple(mdb.NAME, mdb.TEXT))
}}, }},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
ip := m.Cmd("", GATEWAY).Append(aaa.IP)
m.PushSearch(mdb.TYPE, GATEWAY, mdb.NAME, ip, mdb.TEXT, "http://"+ip)
}
}},
ISLOCAL: {Hand: func(m *ice.Message, arg ...string) { ISLOCAL: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] = strings.Split(strings.TrimPrefix(arg[0], "["), "]")[0]; arg[0] == "::1" || strings.HasPrefix(arg[0], "127.") { if arg[0] = strings.Split(strings.TrimPrefix(arg[0], "["), "]")[0]; arg[0] == "::1" || strings.HasPrefix(arg[0], "127.") {
m.Echo(ice.OK) m.Echo(ice.OK)
@ -80,6 +87,9 @@ func init() {
} }
m.Echo(arg[0]) m.Echo(arg[0])
}}, }},
GATEWAY: {Hand: func(m *ice.Message, arg ...string) {
m.Push(aaa.IP, kit.Keys(kit.Slice(strings.Split(m.Cmd("").Append(aaa.IP), ice.PT), 0, 3), "1"))
}},
}, mdb.HashAction(mdb.SHORT, mdb.TEXT), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, mdb.TEXT), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) {
_host_list(m, kit.Select("", arg, 0)) _host_list(m, kit.Select("", arg, 0))
}}, }},

View File

@ -76,19 +76,18 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
BROAD: {Name: "broad hash auto", Help: "广播", Actions: ice.MergeActions(ice.Actions{ BROAD: {Name: "broad hash auto", Help: "广播", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { if arg[0] == mdb.FOREACH && arg[1] == "" {
host := m.Cmd(tcp.HOST).Append(aaa.IP) host, domain := m.Cmd(tcp.HOST).Append(aaa.IP), OptionUserWeb(m).Hostname()
domain := OptionUserWeb(m).Hostname() m.Cmd("", ice.OptionFields(""), func(value ice.Maps) {
m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { if value[tcp.HOST] == host {
if values[tcp.HOST] == host { value[tcp.HOST] = domain
values[tcp.HOST] = domain
} }
switch values[mdb.TYPE] { switch value[mdb.TYPE] {
case "sshd": case "sshd":
m.PushSearch(mdb.NAME, ice.Render(m, ice.RENDER_SCRIPT, kit.Format("ssh -p %s %s@%s", values[tcp.PORT], m.Option(ice.MSG_USERNAME), values[tcp.HOST])), m.PushSearch(mdb.NAME, ice.Render(m, ice.RENDER_SCRIPT, kit.Format("ssh -p %s %s@%s", value[tcp.PORT], m.Option(ice.MSG_USERNAME), value[tcp.HOST])),
mdb.TEXT, kit.Format("http://%s:%s", values[tcp.HOST], values[tcp.PORT]), values) mdb.TEXT, kit.Format("http://%s:%s", value[tcp.HOST], value[tcp.PORT]), value)
default: default:
m.PushSearch(mdb.TEXT, kit.Format("http://%s:%s", values[tcp.HOST], values[tcp.PORT]), values) m.PushSearch(mdb.TEXT, kit.Format("http://%s:%s", value[tcp.HOST], value[tcp.PORT]), value)
} }
}) })
} }

View File

@ -103,6 +103,13 @@ const DREAM = "dream"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
DREAM: {Name: "dream name path auto create", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{ DREAM: {Name: "dream name path auto create", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.Cmd("", ice.OptionFields(), func(value ice.Maps) {
m.PushSearch(mdb.TEXT, MergePods(m, value[mdb.NAME]), value)
})
}
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case mdb.NAME, nfs.TEMPLATE: case mdb.NAME, nfs.TEMPLATE:

View File

@ -133,11 +133,17 @@ func MergeURL2(m Message, url string, arg ...ice.Any) string {
return kit.MergeURL2(m.Option(ice.MSG_USERWEB), url, arg...) return kit.MergeURL2(m.Option(ice.MSG_USERWEB), url, arg...)
} }
func MergeLink(m Message, url string, arg ...ice.Any) string { func MergeLink(m Message, url string, arg ...ice.Any) string {
return strings.Split(MergeURL2(m, url, arg...), "?")[0] return strings.Split(MergeURL2(m, url, arg...), ice.QS)[0]
} }
func MergePod(m Message, pod 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...) return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
} }
func MergePods(m Message, pod string, arg ...ice.Any) string {
return kit.MergeURL(strings.Split(MergePod(m, pod), ice.QS)[0], arg...)
}
func MergePodCmds(m Message, pod, cmd string, arg ...ice.Any) string {
return kit.MergeURL(strings.Split(MergePodCmd(m, pod, cmd), ice.QS)[0], arg...)
}
func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string { func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string {
p := "/chat" p := "/chat"
p += path.Join("/pod/", kit.Keys(m.Option(ice.MSG_USERPOD), pod)) p += path.Join("/pod/", kit.Keys(m.Option(ice.MSG_USERPOD), pod))

View File

@ -75,7 +75,7 @@ func _space_handle(m *ice.Message, safe bool, name string, conn *websocket.Conn)
} }
msg := m.Spawn(b) msg := m.Spawn(b)
source, target := kit.Simple(msg.Optionv(ice.MSG_SOURCE), name), kit.Simple(msg.Optionv(ice.MSG_TARGET)) source, target := kit.Simple(msg.Optionv(ice.MSG_SOURCE), name), kit.Simple(msg.Optionv(ice.MSG_TARGET))
msg.Log("recv", "%v->%v %v %v", source, target, msg.Detailv(), msg.FormatMeta()) // msg.Log("recv", "%v->%v %v %v", source, target, msg.Detailv(), msg.FormatMeta())
if next := msg.Option(ice.MSG_TARGET); next == "" || len(target) == 0 { if next := msg.Option(ice.MSG_TARGET); next == "" || len(target) == 0 {
if msg.Optionv(ice.MSG_HANDLE, ice.TRUE); safe { // 下行命令 if msg.Optionv(ice.MSG_HANDLE, ice.TRUE); safe { // 下行命令
gdb.Event(msg, SPACE_LOGIN) gdb.Event(msg, SPACE_LOGIN)
@ -184,13 +184,14 @@ func init() {
_space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) _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) { mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { if arg[0] == mdb.FOREACH && arg[1] == "" {
m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { m.Cmd("", ice.OptionFields(""), func(values ice.Maps) {
switch values[mdb.TYPE] { switch values[mdb.TYPE] {
case MASTER: case MASTER:
m.PushSearch(mdb.TEXT, m.Cmd(SPIDE, values[mdb.NAME], ice.Maps{ice.MSG_FIELDS: ""}).Append(CLIENT_ORIGIN), values) m.PushSearch(mdb.TEXT, m.Cmd(SPIDE, values[mdb.NAME], ice.Maps{ice.MSG_FIELDS: ""}).Append(CLIENT_ORIGIN), values)
case SERVER, WORKER: case SERVER:
m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, strings.Split(MergePod(m, values[mdb.NAME]), ice.QS)[0])), values) m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, strings.Split(MergePod(m, values[mdb.NAME]), ice.QS)[0])), values)
case aaa.LOGIN:
} }
}) })
} }

View File

@ -35,10 +35,15 @@ const FAVOR = "favor"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
FAVOR: {Name: "favor hash auto create getClipboardData getLocation scanQRCode record1 record2 upload", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ FAVOR: {Name: "favor hash auto create getClipboardData getLocation scanQRCode record1 record2 upload", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.Cmd("", ice.OptionFields("")).Tables(func(value ice.Maps) { m.PushSearch(value) })
}
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] { switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE: case mdb.TYPE:
m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL) m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL, cli.OPENS)
case mdb.NAME: case mdb.NAME:
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
case ctx.INDEX: case ctx.INDEX:
@ -59,11 +64,6 @@ func init() {
} }
mdb.HashCreate(m, m.OptionSimple()) 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) { web.UPLOAD: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd("", mdb.CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT)) m.Cmd("", mdb.CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT))
}}, }},
@ -95,7 +95,7 @@ func init() {
"xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { "xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessField(m, web.CODE_XTERM, []string{m.Option(mdb.TEXT)}, arg...) ctx.ProcessField(m, web.CODE_XTERM, []string{m.Option(mdb.TEXT)}, arg...)
}}, }},
"_open": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { cli.OPENS: {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(cli.DAEMON, cli.OPEN, "-a", m.Option(mdb.TEXT)).ProcessHold(m) m.Cmdy(cli.DAEMON, cli.OPEN, "-a", m.Option(mdb.TEXT)).ProcessHold(m)
}}, }},
"_new": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { "_new": {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
@ -131,8 +131,8 @@ func init() {
return return
} }
switch value[mdb.TYPE] { switch value[mdb.TYPE] {
case "_open": case cli.OPENS:
m.PushButton("_open", "_new", mdb.REMOVE) m.PushButton(cli.OPENS, "_new", mdb.REMOVE)
case ssh.SHELL: case ssh.SHELL:
m.PushButton("xterm", mdb.REMOVE) m.PushButton("xterm", mdb.REMOVE)
case ctx.INDEX: case ctx.INDEX:

View File

@ -1,7 +1,10 @@
package chat package chat
import ( import (
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
@ -11,7 +14,15 @@ const SEARCH = "search"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
web.P(SEARCH): {Name: "/search", Help: "搜索框", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) { web.P(SEARCH): {Name: "/search", Help: "搜索框", Actions: ice.MergeActions(ice.Actions{
cli.OPENS: {Hand: func(m *ice.Message, arg ...string) {
if strings.HasSuffix(arg[0], ".app") {
m.Cmd(cli.SYSTEM, cli.OPEN, "-a", arg[0])
} else {
m.Cmd(cli.SYSTEM, cli.OPEN, arg[0])
}
}},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount() m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount()
}}, }},
}) })

View File

@ -37,16 +37,19 @@ func _compile_target(m *ice.Message, arg ...string) (string, string, string, str
} }
const ( const (
SERVICE = "service"
VERSION = "version" VERSION = "version"
) )
const COMPILE = "compile" const COMPILE = "compile"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack webpack devpack upgrade", Help: "编译", Actions: ice.MergeActions(ice.Actions{ COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack webpack devpack upgrade install", Help: "编译", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.IsAlpine(m, GO, "go git") }}, ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.IsAlpine(m, GO, "go git") }},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case SERVICE:
m.Push(arg[0], m.Cmd(web.SPIDE, ice.DEV).Append(web.CLIENT_ORIGIN)+"/publish/")
case VERSION: case VERSION:
m.Push(arg[0], "1.15.15") m.Push(arg[0], "1.15.15")
default: default:
@ -57,10 +60,11 @@ func init() {
WEBPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, WEBPACK) }}, WEBPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, WEBPACK) }},
DEVPACK: {Help: "开发", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, DEVPACK) }}, DEVPACK: {Help: "开发", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, DEVPACK) }},
UPGRADE: {Help: "升级", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(UPGRADE, nfs.TARGET) }}, UPGRADE: {Help: "升级", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(UPGRADE, nfs.TARGET) }},
INSTALL: {Name: "install version=1.15.15", Help: "安装", Hand: func(m *ice.Message, arg ...string) { INSTALL: {Name: "install service*='https://golang.google.cn/dl/' version*=1.15.15", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(INSTALL, web.DOWNLOAD, kit.Format("https://golang.google.cn/dl/go%s.%s-%s.%s", m.Option(VERSION), runtime.GOOS, runtime.GOARCH, kit.Select("tar.gz", "zip", runtime.GOOS == cli.WINDOWS)), ice.USR_LOCAL) m.Cmdy(INSTALL, web.DOWNLOAD, kit.Format("%s/go%s.%s-%s.%s", m.Option(SERVICE), m.Option(VERSION), runtime.GOOS, runtime.GOARCH, kit.Select("tar.gz", "zip", runtime.GOOS == cli.WINDOWS)), ice.USR_LOCAL)
}}, }},
}, ctx.ConfAction(cli.ENV, kit.Dict("GOPRIVATE", "shylinux.com,github.com", "GOPROXY", "https://goproxy.cn,direct", "CGO_ENABLED", "0"))), Hand: func(m *ice.Message, arg ...string) { }, ctx.ConfAction(cli.ENV, kit.Dict("GOPRIVATE", "shylinux.com,github.com", "GOPROXY", "https://goproxy.cn,direct", "CGO_ENABLED", "0"))), Hand: func(m *ice.Message, arg ...string) {
defer web.ToastProcess(m)()
main, file, goos, arch := _compile_target(m, arg...) main, file, goos, arch := _compile_target(m, arg...)
env := kit.Simple(cli.PATH, kit.Env(cli.PATH), cli.HOME, kit.Select(kit.Path(""), kit.Env(cli.HOME)), m.Configv(cli.ENV), m.Optionv(cli.ENV), cli.GOOS, goos, cli.GOARCH, arch) env := kit.Simple(cli.PATH, kit.Env(cli.PATH), cli.HOME, kit.Select(kit.Path(""), kit.Env(cli.HOME)), m.Configv(cli.ENV), m.Optionv(cli.ENV), cli.GOOS, goos, cli.GOARCH, arch)
if runtime.GOOS == cli.WINDOWS { if runtime.GOOS == cli.WINDOWS {
@ -71,13 +75,13 @@ func init() {
m.Cmd(cli.SYSTEM, GO, "get", "shylinux.com/x/ice") m.Cmd(cli.SYSTEM, GO, "get", "shylinux.com/x/ice")
} }
m.Cmd(AUTOGEN, VERSION) m.Cmd(AUTOGEN, VERSION)
defer m.StatusTime(VERSION, strings.TrimPrefix(m.Cmdx(cli.SYSTEM, GO, VERSION), "go version ")) defer m.StatusTime(VERSION, strings.TrimPrefix(m.Cmdx(cli.SYSTEM, GO, VERSION), "go version"))
if msg := m.Cmd(cli.SYSTEM, GO, cli.BUILD, "-o", file, main, ice.SRC_VERSION_GO, ice.SRC_BINPACK_GO); !cli.IsSuccess(msg) { 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) m.Copy(msg)
return return
} }
m.Logs(COMPILE, nfs.TARGET, file, nfs.SOURCE, main) m.Logs(nfs.SAVE, nfs.TARGET, file, nfs.SOURCE, main)
if m.Cmdy(nfs.DIR, file, "time,path,size,hash,link"); strings.Contains(file, ice.ICE) { if m.Cmdy(nfs.DIR, file, "time,size,path,hash,link"); strings.Contains(file, ice.ICE) {
m.Cmdy(PUBLISH, ice.CONTEXTS) m.Cmdy(PUBLISH, ice.CONTEXTS)
} }
}}, }},

View File

@ -117,16 +117,13 @@ func init() {
arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0] arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0]
arg[0] = strings.TrimSuffix(arg[0], arg[1]) arg[0] = strings.TrimSuffix(arg[0], arg[1])
ctx.ProcessRewrite(m, nfs.PATH, arg[0], nfs.FILE, arg[1]) ctx.ProcessRewrite(m, nfs.PATH, arg[0], nfs.FILE, arg[1])
return
} else if len(arg) < 2 { } else if len(arg) < 2 {
nfs.Dir(m, nfs.PATH) nfs.Dir(m, nfs.PATH)
return } else {
arg[1] = strings.Split(arg[1], ice.FS)[0]
_inner_list(m, kit.Ext(arg[1]), arg[1], arg[0])
ctx.DisplayLocal(m, "").Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH)))
} }
arg[1] = strings.Split(arg[1], ice.FS)[0]
_inner_list(m, kit.Ext(arg[1]), arg[1], arg[0])
// m.Cmd(FAVOR, mdb.INSERT, mdb.ZONE, "_recent_file", nfs.PATH, arg[0], nfs.FILE, arg[1])
m.Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH)))
ctx.DisplayLocal(m, "")
}}, }},
}) })
ctx.AddRunChecker(func(m *ice.Message, cmd, check string, arg ...string) bool { ctx.AddRunChecker(func(m *ice.Message, cmd, check string, arg ...string) bool {

View File

@ -35,8 +35,7 @@ func _install_download(m *ice.Message) {
m.Cmdy(nfs.DIR, file) m.Cmdy(nfs.DIR, file)
return return
} }
m.Cmd(nfs.SAVE, file, "") mdb.HashCreate(m.Cmd(nfs.SAVE, file, ""), mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
web.GoToast(m, name, func(toast func(string, int, int)) { web.GoToast(m, name, func(toast func(string, int, int)) {
defer nfs.TarExport(m, file) defer nfs.TarExport(m, file)
begin := time.Now() begin := time.Now()

View File

@ -16,22 +16,23 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _publish_bin_list(m *ice.Message, p string) *ice.Message { func _publish_bin_list(m *ice.Message) *ice.Message {
m.Option(cli.CMD_DIR, p)
defer m.SortTimeR(mdb.TIME) defer m.SortTimeR(mdb.TIME)
m.Option(cli.CMD_DIR, ice.USR_PUBLISH)
for _, ls := range strings.Split(cli.SystemCmds(m, "ls |xargs file |grep executable"), ice.NL) { for _, ls := range strings.Split(cli.SystemCmds(m, "ls |xargs file |grep executable"), ice.NL) {
if file := strings.TrimSpace(strings.Split(ls, ice.DF)[0]); file != "" { if file := strings.TrimSpace(strings.Split(ls, ice.DF)[0]); file != "" {
if s, e := nfs.StatFile(m, path.Join(p, file)); e == nil { if s, e := nfs.StatFile(m, path.Join(ice.USR_PUBLISH, file)); e == nil {
m.Push(mdb.TIME, s.ModTime()).Push(nfs.SIZE, kit.FmtSize(s.Size())).Push(nfs.PATH, file) m.Push(mdb.TIME, s.ModTime()).Push(nfs.SIZE, kit.FmtSize(s.Size())).Push(nfs.PATH, file)
m.PushDownload(mdb.LINK, file, path.Join(p, file)).PushButton(nfs.TRASH) m.PushDownload(mdb.LINK, file, path.Join(ice.USR_PUBLISH, file)).PushButton(nfs.TRASH)
} }
} }
} }
return m return m
} }
func _publish_list(m *ice.Message, arg ...string) *ice.Message { func _publish_list(m *ice.Message, arg ...string) *ice.Message {
defer m.SortTimeR(mdb.TIME)
m.Option(nfs.DIR_REG, kit.Select("", arg, 0)) m.Option(nfs.DIR_REG, kit.Select("", arg, 0))
return nfs.DirDeepAll(m, ice.USR_PUBLISH, nfs.PWD, nil, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1)) return nfs.DirDeepAll(m, ice.USR_PUBLISH, nfs.PWD, nil, nfs.DIR_WEB_FIELDS)
} }
func _publish_file(m *ice.Message, file string, arg ...string) string { func _publish_file(m *ice.Message, file string, arg ...string) string {
if strings.HasSuffix(file, ice.ICE_BIN) { if strings.HasSuffix(file, ice.ICE_BIN) {
@ -40,15 +41,15 @@ func _publish_file(m *ice.Message, file string, arg ...string) string {
file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file) file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file)
defer func() { nfs.Remove(m, file) }() defer func() { nfs.Remove(m, file) }()
} }
target := path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0)) return m.Cmdx(nfs.LINK, path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0)), file)
return m.Logs(mdb.EXPORT, PUBLISH, target, nfs.FROM, file).Cmdx(nfs.LINK, target, file)
} }
func _publish_contexts(m *ice.Message, arg ...string) { func _publish_contexts(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_ROOT, "")
for _, k := range kit.Default(arg, ice.MISC) { for _, k := range kit.Default(arg, ice.MISC) {
m.Options(web.DOMAIN, m.Option(ice.MSG_USERHOST), cli.CTX_ENV, kit.Select("", ice.SP+kit.JoinKV(ice.EQ, ice.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != "")) m.Options(web.DOMAIN, m.Option(ice.MSG_USERHOST), cli.CTX_ENV, kit.Select("", ice.SP+kit.JoinKV(ice.EQ, ice.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != ""))
switch k { switch k {
case INSTALL: case INSTALL:
m.Echo(strings.TrimSpace(kit.Renders(m.Config(kit.Keys(ice.CONTEXTS, ice.MISC)), m))) m.Echo(strings.TrimSpace(nfs.Template(m, kit.Keys(ice.MISC, SH))))
return return
case ice.BASE: case ice.BASE:
m.Option(web.DOMAIN, m.Cmd(web.SPIDE, ice.SHY).Append(web.CLIENT_ORIGIN)) m.Option(web.DOMAIN, m.Cmd(web.SPIDE, ice.SHY).Append(web.CLIENT_ORIGIN))
@ -57,11 +58,7 @@ func _publish_contexts(m *ice.Message, arg ...string) {
default: default:
_publish_file(m, ice.ICE_BIN) _publish_file(m, ice.ICE_BIN)
} }
if s := strings.TrimSpace(kit.Renders(m.Config(kit.Keys(ice.CONTEXTS, k)), m)); k == INSTALL { m.EchoScript(strings.TrimSpace(nfs.Template(m, kit.Keys(k, SH))))
m.Echo(s)
} else {
m.EchoScript(s)
}
} }
} }
@ -70,33 +67,25 @@ const PUBLISH = "publish"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.MergeActions(ice.Actions{ PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(ice.CONTEXTS, _contexts) }},
ice.VOLCANOS: {Help: "火山架", Hand: func(m *ice.Message, arg ...string) { ice.VOLCANOS: {Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
_publish_list(m, kit.ExtReg(HTML, CSS, JS)).Cmdy("", ice.CONTEXTS, ice.MISC).Echo(ice.NL).EchoQRCode(m.Option(ice.MSG_USERWEB)) _publish_list(m, kit.ExtReg(HTML, CSS, JS)).Cmdy("", ice.CONTEXTS, ice.MISC).Echo(ice.NL).EchoQRCode(m.Option(ice.MSG_USERWEB))
}}, }},
ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) {
_publish_bin_list(m, ice.USR_PUBLISH).Cmdy("", ice.CONTEXTS, ice.CORE) _publish_bin_list(m).Cmdy("", ice.CONTEXTS, ice.CORE)
}}, }},
ice.INTSHELL: {Help: "神农架", Hand: func(m *ice.Message, arg ...string) { ice.INTSHELL: {Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
_publish_list(m, kit.ExtReg(SH, "vim", "conf")).Cmdy("", ice.CONTEXTS, ice.BASE) _publish_list(m, kit.ExtReg(SH, VIM, CONF)).Cmdy("", ice.CONTEXTS, ice.BASE)
}}, }},
ice.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }}, ice.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, arg[1:]).Cut("path,size,time") }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, arg[1:], nfs.DIR_CLI_FIELDS) }},
mdb.CREATE: {Name: "create file", Hand: func(m *ice.Message, arg ...string) { _publish_file(m, m.Option(nfs.FILE)) }}, mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { _publish_file(m, m.Option(nfs.PATH)) }},
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) }}, nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) }},
}, ctx.ConfAction(ice.CONTEXTS, _contexts), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { }, ctx.ConfAction(mdb.FIELD, nfs.PATH), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) {
if m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH); len(arg) == 0 { if m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH); len(arg) == 0 {
m.Cmdy(nfs.DIR, "", nfs.DIR_WEB_FIELDS).SortTimeR(mdb.TIME) _publish_list(m)
} else { } else {
m.OptionFields(mdb.DETAIL) m.Cmdy(nfs.DIR, arg[0], "time,size,path,hash,link,action", ice.OptionFields(mdb.DETAIL))
m.Cmdy(nfs.DIR, arg[0], "time,path,size,hash,link,action")
} }
}}, }},
}) })
} }
var _contexts = kit.Dict(
ice.MISC, `export ctx_dev={{.Option "domain"}}{{.Option "ctx_env"}}; temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL $ctx_dev; else wget -O $temp -q $ctx_dev; fi; source $temp app username {{.Option "user.name"}} usernick "{{.Option "user.nick"}}"`,
ice.CORE, `temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL {{.Option "domain"}}; else wget -O $temp -q {{.Option "domain"}}; fi; source $temp binary`,
ice.BASE, `temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL {{.Option "domain"}}; else wget -O $temp -q {{.Option "domain"}}; fi; source $temp source`,
)

View File

@ -20,6 +20,10 @@ func _sh_cmds(m *ice.Message, p string) (string, string) {
return cmds, text return cmds, text
} }
const (
VIM = "vim"
CONF = "conf"
)
const SH = nfs.SH const SH = nfs.SH
func init() { func init() {

View File

@ -21,9 +21,10 @@ func init() {
nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, ice.ICE_BIN)), nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, ice.ICE_BIN)),
nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")), nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")),
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")), nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")),
COMPILE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "go1.15.15", nfs.PATH, "usr/local/")),
), mdb.META, kit.Dict(mdb.FIELD, "type,file,path"))}, ), mdb.META, kit.Dict(mdb.FIELD, "type,file,path"))},
}, Commands: ice.Commands{ }, Commands: ice.Commands{
UPGRADE: {Name: "upgrade item=target,binary,source run restart", Help: "升级", Actions: ice.MergeActions(ice.Actions{ UPGRADE: {Name: "upgrade item=target,binary,source,compile run restart", Help: "升级", Actions: ice.MergeActions(ice.Actions{
cli.RESTART: {Hand: func(m *ice.Message, arg ...string) { m.Go(func() { m.Sleep300ms(ice.EXIT, 1) }) }}, cli.RESTART: {Hand: func(m *ice.Message, arg ...string) { m.Go(func() { m.Sleep300ms(ice.EXIT, 1) }) }},
}), Hand: func(m *ice.Message, arg ...string) { }), Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelect(m.Spawn(), kit.Select(nfs.TARGET, arg, 0)).Tables(func(value ice.Maps) { mdb.ZoneSelect(m.Spawn(), kit.Select(nfs.TARGET, arg, 0)).Tables(func(value ice.Maps) {
@ -32,14 +33,18 @@ func init() {
defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN) defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN)
m.Option(ice.EXIT, ice.TRUE) m.Option(ice.EXIT, ice.TRUE)
} }
dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH]) if kit.Select("", arg, 0) == COMPILE {
value[nfs.FILE] = kit.Keys(kit.Format(value[nfs.FILE]), runtime.GOOS+"-"+runtime.GOARCH, kit.Select("tar.gz", "zip", runtime.GOOS == cli.WINDOWS))
}
dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE]))
switch web.SpideSave(m, dir, "/publish/"+kit.Format(value[nfs.FILE]), nil); value[mdb.TYPE] { switch web.SpideSave(m, dir, "/publish/"+kit.Format(value[nfs.FILE]), nil); value[mdb.TYPE] {
case nfs.TAR: case nfs.TAR:
m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir)) m.Cmd(cli.SYSTEM, nfs.TAR, "xf", dir, "-C", path.Dir(dir))
// m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir))
case ice.BIN: case ice.BIN:
os.Chmod(dir, 0755) os.Chmod(dir, 0755)
} }
m.Cmdy(nfs.DIR, dir, "time,path,size,hash") m.Cmdy(nfs.DIR, dir, "time,size,path,hash")
}) })
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE { if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE {
m.Cmd("", cli.RESTART) m.Cmd("", cli.RESTART)

View File

@ -9,9 +9,11 @@ import (
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/log"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/ssh" "shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -52,6 +54,12 @@ const VIMER = "vimer"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
VIMER: {Name: "vimer path=src/@key file=main.go line=1 list", Help: "编辑器", Meta: kit.Dict(ctx.STYLE, INNER), Actions: ice.MergeActions(ice.Actions{ VIMER: {Name: "vimer path=src/@key file=main.go line=1 list", Help: "编辑器", Meta: kit.Dict(ctx.STYLE, INNER), Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.PushSearch(mdb.TYPE, web.LINK, mdb.TEXT, kit.MergeURL(m.Option(ice.MSG_USERHOST)+ice.PS, log.DEBUG, ice.TRUE))
m.PushSearch(mdb.TYPE, web.LINK, mdb.TEXT, web.MergePodCmds(m, "", web.CODE_VIMER, log.DEBUG, ice.TRUE))
}
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case web.DREAM, AUTOGEN, XTERM: case web.DREAM, AUTOGEN, XTERM:
@ -64,8 +72,8 @@ func init() {
for _, ext := range []string{SH, SHY, PY, JS, CSS, HTML} { for _, ext := range []string{SH, SHY, PY, JS, CSS, HTML} {
m.Push(nfs.PATH, kit.ExtChange(p, ext)) m.Push(nfs.PATH, kit.ExtChange(p, ext))
} }
m.Option(nfs.DIR_REG, kit.FileReg("(sh|shy|py|js|css|html)")) m.Option(nfs.DIR_REG, kit.FileReg(SH, SHY, PY, JS, CSS, HTML))
nfs.DirDeepAll(m, nfs.SRC, "./", nil, nfs.PATH) nfs.DirDeepAll(m, nfs.SRC, nfs.PWD, nil, nfs.PATH)
case web.WEBSITE: case web.WEBSITE:
m.Cmdy(COMPLETE, mdb.FOREACH, kit.Select("", arg, 1), m.Option(ctx.ACTION)) m.Cmdy(COMPLETE, mdb.FOREACH, kit.Select("", arg, 1), m.Option(ctx.ACTION))
case "extension": case "extension":
@ -79,40 +87,38 @@ func init() {
m.Cmdy(m.Option(ctx.INDEX)) m.Cmdy(m.Option(ctx.INDEX))
} }
case nfs.PATH: case nfs.PATH:
m.Cmdy(INNER, mdb.INPUTS, arg).Cut("path,size,time") m.Cmdy(INNER, mdb.INPUTS, arg).Cut(nfs.DIR_CLI_FIELDS)
case nfs.FILE: case nfs.FILE:
list := ice.Map{} list := ice.Map{}
push := func(k, p string) { push := func(k, p string) {
kit.IfNoKey(list, kit.Select(k, k+ice.DF, k != "")+p, func(p string) { m.Push(nfs.PATH, p) }) kit.IfNoKey(list, kit.Select(k, k+ice.DF, k != "")+p, func(p string) { m.Push(nfs.PATH, p) })
} }
m.Cmd(FAVOR, "_recent_file").Tables(func(value ice.Maps) { push("", value[nfs.PATH]+value[nfs.FILE]) }) mdb.HashSelect(m.Spawn()).TablesLimit(10, func(value ice.Maps) { push("", value[nfs.PATH]) })
m.Cmd(web.CHAT_FAVOR, func(value ice.Maps) { m.Cmd(mdb.SEARCH, mdb.FOREACH, "", ice.OptionFields("type,name,text")).Sort("type,name,text").Tables(func(value ice.Maps) {
switch value[mdb.TYPE] { switch value[mdb.TYPE] {
case web.LINK:
push(web.DREAM, value[mdb.TEXT])
case nfs.FILE: case nfs.FILE:
push("", value[mdb.TEXT]) push("", value[mdb.TEXT])
case tcp.GATEWAY:
push(web.SPACE, value[mdb.TEXT])
case web.LINK:
push(web.SPACE, value[mdb.TEXT])
case web.SERVER:
push(web.SPACE, value[mdb.TEXT])
case web.WORKER:
push(web.SPACE, value[mdb.NAME])
case ctx.INDEX: case ctx.INDEX:
push(ctx.INDEX, value[mdb.TEXT]) push(ctx.INDEX, value[mdb.TEXT])
case ssh.SHELL: case ssh.SHELL:
push(ctx.INDEX+ice.DF+web.CODE_XTERM, value[mdb.TEXT]) push(ssh.SHELL, value[mdb.TEXT])
case cli.OPENS:
push(cli.OPENS, value[mdb.TEXT])
} }
}) })
m.Cmd(web.DREAM, ice.Maps{nfs.DIR_DEEP: ice.FALSE}, func(value ice.Maps) { push(web.DREAM, value[mdb.NAME]) })
for _, p := range kit.Split(kit.Select(m.Option(nfs.PATH), m.Option("paths"))) { for _, p := range kit.Split(kit.Select(m.Option(nfs.PATH), m.Option("paths"))) {
nfs.DirDeepAll(m, nfs.PWD, p, func(value ice.Maps) { push("", value[nfs.PATH]) }, nfs.PATH) nfs.DirDeepAll(m.Spawn(), nfs.PWD, p, func(value ice.Maps) { push("", value[nfs.PATH]) }, nfs.PATH)
} }
m.Cmd(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX)).Tables(func(value ice.Maps) { push(ctx.INDEX, value[ctx.INDEX]) }) m.Cmd(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX)).Tables(func(value ice.Maps) { push(ctx.INDEX, value[ctx.INDEX]) })
m.Cmd(FAVOR, "_system_app").Tables(func(value ice.Maps) { push("_open", strings.ToLower(kit.Select(value[mdb.TEXT], value[mdb.NAME]))) }) m.Cmd(mdb.SEARCH, cli.SYSTEM, cli.OPENS, ice.OptionFields("type,name,text")).Sort("type,name,text").Tables(func(value ice.Maps) { push(cli.OPENS, value[nfs.NAME]) })
m.Cmd(nfs.DIR, "/Applications", mdb.NAME, ice.Maps{nfs.DIR_DEEP: ice.FALSE, nfs.DIR_TYPE: ""}, func(value ice.Maps) {
push("_open", value[nfs.NAME])
})
m.Cmd(nfs.DIR, "/System/Applications", mdb.NAME, ice.Maps{nfs.DIR_DEEP: ice.FALSE, nfs.DIR_TYPE: ""}, func(value ice.Maps) {
push("_open", value[nfs.NAME])
})
m.Cmd(nfs.DIR, "/System/Applications/Utilities", mdb.NAME, ice.Maps{nfs.DIR_DEEP: ice.FALSE, nfs.DIR_TYPE: ""}, func(value ice.Maps) {
push("_open", value[nfs.NAME])
})
} }
} }
}}, }},
@ -144,7 +150,7 @@ func init() {
}}, }},
web.DREAM: {Name: "dream name*=hi repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) { web.DREAM: {Name: "dream name*=hi repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.DREAM, cli.START, arg) m.Cmdy(web.DREAM, cli.START, arg)
}}, }}, web.SPACE: {Help: "空间"},
nfs.REPOS: {Help: "仓库", Hand: func(m *ice.Message, arg ...string) { nfs.REPOS: {Help: "仓库", Hand: func(m *ice.Message, arg ...string) {
m.Option("view", "change") m.Option("view", "change")
m.Cmd("web.code.git.status", func(value ice.Maps) { m.Cmd("web.code.git.status", func(value ice.Maps) {
@ -163,8 +169,12 @@ func init() {
} }
}) })
}}, }},
"_open": {Help: "打开", Hand: func(m *ice.Message, arg ...string) { cli.OPENS: {Help: "打开", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(cli.DAEMON, cli.OPEN, "-a", kit.Split(arg[0], ice.PT, ice.PT)[0]).ProcessHold(m) if strings.HasSuffix(arg[0], ".app") {
m.Cmd(cli.DAEMON, cli.OPEN, "-a", arg[0])
} else {
m.Cmd(cli.DAEMON, cli.OPEN, arg[0])
}
}}, }},
XTERM: {Name: "xterm type=sh name text", Help: "终端", Hand: func(m *ice.Message, arg ...string) { XTERM: {Name: "xterm type=sh name text", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(XTERM, mdb.CREATE, arg) m.Cmdy(XTERM, mdb.CREATE, arg)
@ -216,8 +226,11 @@ func init() {
web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) {
kit.If(arg[1] == m.CommandKey(), func() { web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) }) kit.If(arg[1] == m.CommandKey(), func() { web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) })
}}, }},
}, web.DreamAction(), aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) { }, web.DreamAction(), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path"), aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) {
if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION { if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION {
if len(arg) > 1 {
mdb.HashCreate(m.Spawn(), nfs.PATH, path.Join(kit.Slice(arg, 0, 2)...))
}
m.Action(AUTOGEN, nfs.SCRIPT, nfs.SAVE, COMPILE) m.Action(AUTOGEN, nfs.SCRIPT, nfs.SAVE, COMPILE)
m.Options("tabs", m.Config("show.tabs"), "plug", m.Config("show.plug"), "exts", m.Config("show.exts")) m.Options("tabs", m.Config("show.tabs"), "plug", m.Config("show.plug"), "exts", m.Config("show.exts"))
ctx.DisplayLocal(m, "") ctx.DisplayLocal(m, "")

View File

@ -38,7 +38,7 @@ func _xterm_get(m *ice.Message, h string) _xterm {
t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE) t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE)
mdb.HashModify(m, "view", m.Option(ice.MSG_DAEMON)) mdb.HashModify(m, "view", m.Option(ice.MSG_DAEMON))
return mdb.HashSelectTarget(m, h, func() ice.Any { return mdb.HashSelectTarget(m, h, func() ice.Any {
ls := kit.Split(kit.Select(nfs.SH, t)) ls := kit.Split(kit.Select(nfs.SH, strings.Split(t, " # ")[0]))
cmd := exec.Command(cli.SystemFind(m, ls[0]), ls[1:]...) cmd := exec.Command(cli.SystemFind(m, ls[0]), ls[1:]...)
cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, os.Environ()...)
cmd.Env = append(cmd.Env, "TERM=xterm") cmd.Env = append(cmd.Env, "TERM=xterm")
@ -48,7 +48,7 @@ func _xterm_get(m *ice.Message, h string) _xterm {
// defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) }) // defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
defer mdb.HashRemove(m, mdb.HASH, h) defer mdb.HashRemove(m, mdb.HASH, h)
defer tty.Close() defer tty.Close()
// m.Option("log.disable", ice.TRUE) m.Option(ice.LOG_DISABLE, ice.TRUE)
buf := make([]byte, ice.MOD_BUFS) buf := make([]byte, ice.MOD_BUFS)
for { for {
if n, e := tty.Read(buf); !m.Warn(e) && e == nil { if n, e := tty.Read(buf); !m.Warn(e) && e == nil {

View File

@ -56,7 +56,7 @@ const PLAN = "plan"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date place@province img@img list", Help: "任务计划", Actions: ice.MergeActions(ice.Actions{ PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date list prev next", Help: "任务计划", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TODO, mdb.INPUTS, arg) }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TODO, mdb.INPUTS, arg) }},
mdb.PLUGIN: {Name: "plugin extra.index extra.args", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TASK, mdb.MODIFY, arg) }}, mdb.PLUGIN: {Name: "plugin extra.index extra.args", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TASK, mdb.MODIFY, arg) }},
mdb.INSERT: {Name: "insert zone* type=once,step,week name* text begin_time@date close_time@date", Hand: func(m *ice.Message, arg ...string) { mdb.INSERT: {Name: "insert zone* type=once,step,week name* text begin_time@date close_time@date", Hand: func(m *ice.Message, arg ...string) {

23
meta.go
View File

@ -216,6 +216,17 @@ func (m *Message) Length() (max int) {
} }
return max return max
} }
func (m *Message) TablesLimit(count int, cbs ...func(value Maps)) *Message {
return m.Table(func(index int, value Maps, head []string) {
if index < count {
for _, cb := range cbs {
if cb != nil {
cb(value)
}
}
}
})
}
func (m *Message) Tables(cbs ...func(value Maps)) *Message { func (m *Message) Tables(cbs ...func(value Maps)) *Message {
return m.Table(func(index int, value Maps, head []string) { return m.Table(func(index int, value Maps, head []string) {
for _, cb := range cbs { for _, cb := range cbs {
@ -388,12 +399,12 @@ func (m *Message) Sort(key string, arg ...string) *Message {
} }
return m return m
} }
func (m *Message) SortInt(key string) { m.Sort(key, INT) } func (m *Message) SortInt(key string) { m.Sort(key, INT) }
func (m *Message) SortStr(key string) { m.Sort(key, STR) } func (m *Message) SortStr(key string) { m.Sort(key, STR) }
func (m *Message) SortTime(key string) { m.Sort(key, TIME) } func (m *Message) SortTime(key string) { m.Sort(key, TIME) }
func (m *Message) SortTimeR(key string) { m.Sort(key, TIME_R) } func (m *Message) SortTimeR(key string) *Message { return m.Sort(key, TIME_R) }
func (m *Message) SortStrR(key string) { m.Sort(key, STR_R) } func (m *Message) SortStrR(key string) { m.Sort(key, STR_R) }
func (m *Message) SortIntR(key string) { m.Sort(key, INT_R) } func (m *Message) SortIntR(key string) { m.Sort(key, INT_R) }
func (m *Message) Detail(arg ...Any) string { func (m *Message) Detail(arg ...Any) string {
return kit.Select("", m.meta[MSG_DETAIL], 0) return kit.Select("", m.meta[MSG_DETAIL], 0)

View File

@ -149,7 +149,7 @@ func init() {
_repos_cat(m, dir, arg[1], arg[2], kit.Select("", arg, 3)) _repos_cat(m, dir, arg[1], arg[2], kit.Select("", arg, 3))
} }
}}, }},
SERVER: {Name: "server repos branch commit path auto create import", Help: "代码", Actions: ice.MergeActions(ice.Actions{ SERVER: {Name: "server repos branch commit path auto create import", Help: "代码", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name*=demo", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create name*=demo", Hand: func(m *ice.Message, arg ...string) {
_repos_init(m, path.Join(ice.USR_LOCAL_REPOS, m.Option(mdb.NAME))) _repos_init(m, path.Join(ice.USR_LOCAL_REPOS, m.Option(mdb.NAME)))
}}, }},
@ -191,6 +191,8 @@ func init() {
m.Cmdy(nfs.DIR, nfs.PWD, "time,name,size,action", kit.Dict(nfs.DIR_TYPE, nfs.TYPE_DIR), func(value ice.Maps) { m.Cmdy(nfs.DIR, nfs.PWD, "time,name,size,action", kit.Dict(nfs.DIR_TYPE, nfs.TYPE_DIR), func(value ice.Maps) {
m.PushScript("git clone " + _git_url(m, value[mdb.NAME])) m.PushScript("git clone " + _git_url(m, value[mdb.NAME]))
}).Cut("time,name,size,script,action").RenameAppend(mdb.NAME, nfs.REPOS).SortStrR(mdb.TIME) }).Cut("time,name,size,script,action").RenameAppend(mdb.NAME, nfs.REPOS).SortStrR(mdb.TIME)
m.Debug("what %v", m.Cmdx("web.code.publish", "contexts"))
m.Debug("what %v", strings.ReplaceAll(m.Cmdx("web.code.publish", "contexts"), "app username", "dev username"))
m.Echo(strings.ReplaceAll(m.Cmdx("web.code.publish", "contexts"), "app username", "dev username")) m.Echo(strings.ReplaceAll(m.Cmdx("web.code.publish", "contexts"), "app username", "dev username"))
} else if dir := path.Join(m.Option(nfs.DIR_ROOT), arg[0]); len(arg) == 1 { } else if dir := path.Join(m.Option(nfs.DIR_ROOT), arg[0]); len(arg) == 1 {
_repos_branch(m, dir) _repos_branch(m, dir)

View File

@ -8,7 +8,9 @@ import (
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -77,8 +79,15 @@ func init() {
FIELDS, "id,tag,pane,tty,height,width,cmd", FIELDS, "id,tag,pane,tty,height,width,cmd",
)}, )},
}, Commands: ice.Commands{ }, Commands: ice.Commands{
SESSION: {Name: "session session window pane cmds auto", Help: "会话管理", Actions: ice.MergeActions(ice.Actions{ SESSION: {Name: "session session window pane cmds auto", Help: "会话", Actions: ice.MergeActions(ice.Actions{
web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("", mdb.CREATE) }}, web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("", mdb.CREATE) }},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.Cmd("", ice.OptionFields(""), func(value ice.Maps) {
m.PushSearch(mdb.TYPE, ssh.SHELL, mdb.NAME, value[SESSION], mdb.TEXT, "tmux attach -t "+value[SESSION], value)
})
}
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
if m.Option(ctx.ACTION) == SCRIPT { if m.Option(ctx.ACTION) == SCRIPT {
m.Cmdy(SCRIPT, mdb.INPUTS, arg) m.Cmdy(SCRIPT, mdb.INPUTS, arg)
@ -142,6 +151,11 @@ func init() {
_tmux_cmd(m, SELECT_PANE, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE))) _tmux_cmd(m, SELECT_PANE, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)))
} }
}}, }},
code.XTERM: {Help: "切入", Hand: func(m *ice.Message, arg ...string) {
if m.Option(WINDOW) == "" {
ctx.ProcessField(m, web.CODE_XTERM, []string{"tmux attach -t " + m.Option(SESSION)}, arg...)
}
}},
SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SCRIPT, m.Option(mdb.NAME), func(value ice.Maps) { m.Cmd(SCRIPT, m.Option(mdb.NAME), func(value ice.Maps) {
kit.Fetch(kit.SplitLine(value[mdb.TEXT]), func(line string) { kit.Fetch(kit.SplitLine(value[mdb.TEXT]), func(line string) {
@ -169,7 +183,7 @@ func init() {
m.Split(_tmux_cmd(m, LIST_SESSION, "-F", m.Config(FORMAT)).Result(), m.Config(FIELDS), ice.FS, ice.NL) m.Split(_tmux_cmd(m, LIST_SESSION, "-F", m.Config(FORMAT)).Result(), m.Config(FIELDS), ice.FS, ice.NL)
} }
m.Tables(func(value ice.Maps) { m.Tables(func(value ice.Maps) {
kit.If(value["tag"] == "1", func() { m.PushButton("") }, func() { m.PushButton(mdb.SELECT, mdb.REMOVE) }) kit.If(value["tag"] == "1", func() { m.PushButton("") }, func() { m.PushButton(code.XTERM, mdb.SELECT, mdb.REMOVE) })
}).StatusTimeCount() }).StatusTimeCount()
}}, }},
WINDOW: {Hand: func(m *ice.Message, arg ...string) { WINDOW: {Hand: func(m *ice.Message, arg ...string) {