forked from x/icebergs
opt code
This commit is contained in:
parent
f3e0b8bf58
commit
45c782207f
@ -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) {
|
||||||
|
@ -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))
|
||||||
|
@ -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"
|
||||||
|
@ -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)))
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}},
|
}},
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
@ -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))
|
||||||
|
@ -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:
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
@ -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()
|
||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
|
@ -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`,
|
|
||||||
)
|
|
||||||
|
@ -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() {
|
||||||
|
@ -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)
|
||||||
|
@ -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, "")
|
||||||
|
@ -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 {
|
||||||
|
@ -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
23
meta.go
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user