1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-03 12:07:00 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2022-08-21 15:56:48 +08:00
parent f06013c0c2
commit 0fa74bd96e
13 changed files with 92 additions and 61 deletions

View File

@ -3,6 +3,7 @@ package cli
import ( import (
"io" "io"
"os/exec" "os/exec"
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
@ -23,7 +24,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
cmd.Stderr = w cmd.Stderr = w
} }
h := mdb.HashCreate(m, ice.CMD, kit.Join(cmd.Args, ice.SP), h := mdb.HashCreate(m.Spawn(), ice.CMD, kit.Join(cmd.Args, ice.SP),
STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env), STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT), m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT),
) )
@ -128,15 +129,17 @@ func init() {
}) })
}}, }},
}, mdb.HashStatusAction(mdb.FIELD, "time,hash,status,pid,cmd,dir,env")), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashStatusAction(mdb.FIELD, "time,hash,status,pid,cmd,dir,env")), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { if len(arg) == 0 || !strings.Contains(arg[0], ice.PS) {
switch value[STATUS] { if mdb.HashSelect(m, kit.Slice(arg, 0, 1)...).Tables(func(value ice.Maps) {
case START: switch value[STATUS] {
m.PushButton(RESTART, STOP) case START:
default: m.PushButton(RESTART, STOP)
m.PushButton(mdb.REMOVE) default:
m.PushButton(mdb.REMOVE)
}
}); len(arg) == 0 || m.Length() > 0 {
return
} }
}); len(arg) == 0 || m.Length() > 0 {
return
} }
if len(arg) == 1 { if len(arg) == 1 {

View File

@ -37,8 +37,13 @@ func init() {
} }
m.Cmd(FOREVER, STOP) m.Cmd(FOREVER, STOP)
m.Cmdy(FOREVER, kit.Select(os.Args[0], nfs.PWD+ice.BIN_ICE_BIN, nfs.ExistsFile(m, ice.BIN_ICE_BIN)), if len(arg) > 0 && arg[0] == "space" {
"serve", START, ice.DEV, "", aaa.USERNAME, aaa.ROOT, aaa.PASSWORD, aaa.ROOT, arg) m.Cmdy(FOREVER, kit.Select(os.Args[0], nfs.PWD+ice.BIN_ICE_BIN, nfs.ExistsFile(m, ice.BIN_ICE_BIN)),
"space", "dial", ice.DEV, ice.OPS, arg[2:])
} else {
m.Cmdy(FOREVER, kit.Select(os.Args[0], nfs.PWD+ice.BIN_ICE_BIN, nfs.ExistsFile(m, ice.BIN_ICE_BIN)),
"serve", START, ice.DEV, "", aaa.USERNAME, aaa.ROOT, aaa.PASSWORD, aaa.ROOT, arg)
}
}}, }},
RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) { RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(gdb.SIGNAL, gdb.RESTART) m.Cmd(gdb.SIGNAL, gdb.RESTART)
@ -62,6 +67,9 @@ func init() {
if logs.Println(); nfs.ExistsFile(m, "var/log/bench.log") { if logs.Println(); nfs.ExistsFile(m, "var/log/bench.log") {
nfs.Rename(m, "var/log/bench.log", kit.Format("var/log/bench.%s.log", logs.Now().Format("20060102-150405"))) nfs.Rename(m, "var/log/bench.log", kit.Format("var/log/bench.%s.log", logs.Now().Format("20060102-150405")))
} }
if logs.Println(); nfs.ExistsFile(m, "var/log/error.log") {
nfs.Rename(m, "var/log/error.log", kit.Format("var/log/error.%s.log", logs.Now().Format("20060102-150405")))
}
} }
} }
}}, }},

View File

@ -31,7 +31,7 @@ func _system_cmd(m *ice.Message, arg ...string) *exec.Cmd {
} }
} }
} }
if _system_find(m, arg[0]) == "" { if _system_find(m, arg[0]) == "" && !strings.Contains(arg[0], ice.PS) {
m.Cmd(MIRRORS, CMD, arg[0]) m.Cmd(MIRRORS, CMD, arg[0])
if file := _system_find(m, arg[0]); file != "" { if file := _system_find(m, arg[0]); file != "" {
m.Logs(mdb.SELECT, "mirrors cmd", file) m.Logs(mdb.SELECT, "mirrors cmd", file)
@ -82,7 +82,7 @@ func _system_find(m *ice.Message, bin string, dir ...string) string {
} }
for _, p := range dir { for _, p := range dir {
if nfs.ExistsFile(m, path.Join(p, bin)) { if nfs.ExistsFile(m, path.Join(p, bin)) {
return kit.Path(path.Join(p, bin)) return kit.Path(p, bin)
} }
} }
return "" return ""

View File

@ -26,13 +26,15 @@ func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) {
defer RLock(m, prefix, chain)() defer RLock(m, prefix, chain)()
list := map[string]int{} list := map[string]int{}
Richs(m, prefix, chain, FOREACH, func(val Map) { Richs(m, prefix, chain, FOREACH, func(key string, val Map) {
val = kit.GetMeta(val) val = kit.GetMeta(val)
list[kit.Format(val[field])] += kit.Int(kit.Select("1", val[COUNT])) list[kit.Format(val[field])] += kit.Int(kit.Select("1", val[COUNT]))
}) })
for k, i := range list { for k, i := range list {
m.Push(field, k) if k != "" {
m.Push(COUNT, i) m.Push(field, k)
m.Push(COUNT, i)
}
} }
m.SortIntR(COUNT) m.SortIntR(COUNT)
} }
@ -203,6 +205,12 @@ func HashStatusCloseAction(args ...Any) ice.Actions {
}) })
} }
func HashKey(m *ice.Message) string {
if m.Option(HASH) != "" {
return HASH
}
return HashShort(m)
}
func HashShort(m *ice.Message) string { func HashShort(m *ice.Message) string {
return kit.Select(HASH, m.Config(SHORT), m.Config(SHORT) != UNIQ) return kit.Select(HASH, m.Config(SHORT), m.Config(SHORT) != UNIQ)
} }
@ -220,14 +228,18 @@ func HashCreate(m *ice.Message, arg ...Any) string {
func HashRemove(m *ice.Message, arg ...Any) *ice.Message { func HashRemove(m *ice.Message, arg ...Any) *ice.Message {
args := kit.Simple(arg) args := kit.Simple(arg)
if len(args) == 0 { if len(args) == 0 {
args = m.OptionSimple(HashShort(m)) args = m.OptionSimple(HashKey(m))
} else if len(args) == 1 { } else if len(args) == 1 {
args = []string{HashShort(m), args[0]} args = []string{HashKey(m), args[0]}
} }
return m.Cmdy(DELETE, m.PrefixKey(), "", HASH, args) return m.Cmdy(DELETE, m.PrefixKey(), "", HASH, args)
} }
func HashModify(m *ice.Message, arg ...Any) *ice.Message { func HashModify(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmd(MODIFY, m.PrefixKey(), "", HASH, m.OptionSimple(HashShort(m)), HashArgs(m, arg...)) args := HashArgs(m, arg...)
if args[0] != HashShort(m) && args[0] != HASH {
args = append(m.OptionSimple(HashKey(m)), args...)
}
return m.Cmd(MODIFY, m.PrefixKey(), "", HASH, args)
} }
func HashSelect(m *ice.Message, arg ...string) *ice.Message { func HashSelect(m *ice.Message, arg ...string) *ice.Message {
m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m)) m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m))

View File

@ -111,7 +111,7 @@ func (f *Frame) scan(m *ice.Message, h, line string) *Frame {
if m.I, m.O = f.stdin, f.stdout; h == STDIO { if m.I, m.O = f.stdin, f.stdout; h == STDIO {
gdb.Event(m, SOURCE_STDIO) gdb.Event(m, SOURCE_STDIO)
m.Sleep("1.1s") m.Sleep("2.1s")
} }
bio := bufio.NewScanner(f.stdin) bio := bufio.NewScanner(f.stdin)

View File

@ -3,6 +3,7 @@ package tcp
import ( import (
"net" "net"
"path" "path"
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
@ -76,7 +77,7 @@ func init() {
m.Push(mdb.TIME, value[mdb.TIME]) m.Push(mdb.TIME, value[mdb.TIME])
m.Push(PORT, port) m.Push(PORT, port)
m.Push(nfs.SIZE, value[nfs.SIZE]) m.Push(nfs.SIZE, value[nfs.SIZE])
m.Push(ice.BIN, bin) m.Push(ice.BIN, strings.TrimPrefix(bin, value[nfs.PATH]))
}) })
m.SortInt(PORT) m.SortInt(PORT)
m.PushAction(nfs.TRASH) m.PushAction(nfs.TRASH)

View File

@ -49,14 +49,12 @@ func _dream_list(m *ice.Message) *ice.Message {
func _dream_show(m *ice.Message, name string) { func _dream_show(m *ice.Message, name string) {
if m.Warn(name == "") { if m.Warn(name == "") {
return return
} }
if !strings.Contains(name, "-") || !strings.HasPrefix(name, "20") { if !strings.Contains(name, "-") || !strings.HasPrefix(name, "20") {
name = m.Time("20060102-") + name name = m.Time("20060102-") + name
} }
defer m.ProcessOpen(MergePod(m, m.Option(mdb.NAME, name))) defer m.ProcessOpen(MergePod(m, m.Option(mdb.NAME, name)))
defer m.Echo(MergePod(m, m.Option(mdb.NAME, name)))
// defer m.PushRefresh()
p := path.Join(ice.USR_LOCAL_WORK, name) p := path.Join(ice.USR_LOCAL_WORK, name)
if pid := m.Cmdx(nfs.CAT, path.Join(p, ice.Info.PidPath)); pid != "" && nfs.ExistsFile(m, "/proc/"+pid) { if pid := m.Cmdx(nfs.CAT, path.Join(p, ice.Info.PidPath)); pid != "" && nfs.ExistsFile(m, "/proc/"+pid) {
@ -102,8 +100,8 @@ func _dream_show(m *ice.Message, name string) {
m.Optionv(cli.CMD_OUTPUT, path.Join(p, ice.BIN_BOOT_LOG)) m.Optionv(cli.CMD_OUTPUT, path.Join(p, ice.BIN_BOOT_LOG))
defer ToastProcess(m)() defer ToastProcess(m)()
bin := kit.Select(os.Args[0], cli.SystemFind(m, ice.ICE_BIN, kit.Path(path.Join(p, ice.BIN)), kit.Path(ice.BIN))) bin := kit.Select(os.Args[0], cli.SystemFind(m, ice.ICE_BIN, nfs.PWD+path.Join(p, ice.BIN), nfs.PWD+ice.BIN))
m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER)) m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER), "daemon", "ops")
defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME)) defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME))
m.Option(cli.CMD_OUTPUT, "") m.Option(cli.CMD_OUTPUT, "")
@ -150,8 +148,8 @@ func init() {
}}, }},
cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT) m.Go(func() { m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT) })
m.ProcessRefresh3s() m.Sleep3s()
}}, }},
DREAM_STOP: {Name: "dream.stop type name", Help: "停止", Hand: func(m *ice.Message, arg ...string) { DREAM_STOP: {Name: "dream.stop type name", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
if m.CmdAppend(SPACE, m.Option(mdb.NAME), mdb.STATUS) == cli.STOP { if m.CmdAppend(SPACE, m.Option(mdb.NAME), mdb.STATUS) == cli.STOP {
@ -186,7 +184,7 @@ fi
require miss.sh require miss.sh
ish_miss_prepare_compile ish_miss_prepare_compile
ish_miss_prepare_develop ish_miss_prepare_develop
ish_miss_prepare_install ish_miss_prepare_operate
ish_miss_make; if [ -n "$*" ]; then ./bin/ice.bin forever serve "$@"; fi ish_miss_make; if [ -n "$*" ]; then ish_miss_serve "$@"; fi
` `

View File

@ -62,7 +62,7 @@ func _serve_rewrite(m *ice.Message) {
}) })
} }
func _serve_domain(m *ice.Message) string { func _serve_domain(m *ice.Message) string {
if p := m.Config(DOMAIN); p != "" { if p := ice.Info.Domain; p != "" {
return p return p
} }
if p := m.R.Header.Get("X-Host"); p != "" { if p := m.R.Header.Get("X-Host"); p != "" {
@ -332,7 +332,7 @@ func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Configs: ice.Configs{
SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data( SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev", mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev",
DOMAIN, "", tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE, tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE,
nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS), nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS),
ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html", ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html",
nfs.REPOS, "https://shylinux.com/x/volcanos", nfs.BRANCH, nfs.MASTER, nfs.REPOS, "https://shylinux.com/x/volcanos", nfs.BRANCH, nfs.MASTER,
@ -353,12 +353,13 @@ func init() {
}}, }},
ssh.SOURCE_STDIO: {Name: "source.stdio", Help: "终端", Hand: func(m *ice.Message, arg ...string) { ssh.SOURCE_STDIO: {Name: "source.stdio", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { m.Go(func() {
m.Sleep("1s") m.Sleep("2s")
m.Cmd(ssh.PRINTF, kit.Dict(nfs.CONTENT, ice.Render(m, ice.RENDER_QRCODE, m.Cmdx(SPACE, DOMAIN))+ice.NL)) m.Cmd(ssh.PRINTF, kit.Dict(nfs.CONTENT, ice.Render(m, ice.RENDER_QRCODE, m.Cmdx(SPACE, DOMAIN))+ice.NL))
}) })
}}, }},
DOMAIN: {Name: "domain", Help: "域名", Hand: func(m *ice.Message, arg ...string) { DOMAIN: {Name: "domain", Help: "域名", Hand: func(m *ice.Message, arg ...string) {
ice.Info.Domain = m.Conf(SHARE, kit.Keym(DOMAIN, m.Config(DOMAIN, arg[0]))) m.Config(tcp.LOCALHOST, ice.FALSE)
ice.Info.Domain = arg[0]
}}, }},
SPIDE: {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) { SPIDE: {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { // 模块列表 if len(arg) == 0 { // 模块列表

View File

@ -17,7 +17,7 @@ import (
) )
func _space_domain(m *ice.Message) (link string) { func _space_domain(m *ice.Message) (link string) {
if link = m.Config(DOMAIN); link == "" { if link = ice.Info.Domain; link == "" {
link = m.Cmd(SPACE, ice.OPS, cli.PWD).Append(mdb.LINK) link = m.Cmd(SPACE, ice.OPS, cli.PWD).Append(mdb.LINK)
} }
if link == "" { if link == "" {
@ -236,7 +236,9 @@ func _space_fork(m *ice.Message) {
case WORKER: // 工作节点 case WORKER: // 工作节点
gdb.Event(m, DREAM_START, args) gdb.Event(m, DREAM_START, args)
defer gdb.Event(m, DREAM_STOP, args) defer gdb.Event(m, DREAM_STOP, args)
defer m.Cmd(DREAM, DREAM_STOP, args) if m.Option("daemon") == "ops" {
defer m.Cmd(DREAM, DREAM_STOP, args)
}
default: // 服务节点 default: // 服务节点
gdb.Event(m, SPACE_START, args) gdb.Event(m, SPACE_START, args)
defer gdb.Event(m, SPACE_STOP, args) defer gdb.Event(m, SPACE_STOP, args)
@ -321,7 +323,7 @@ func init() {
m.EchoQRCode(m.Option(ice.MSG_USERWEB)) m.EchoQRCode(m.Option(ice.MSG_USERWEB))
}}, }},
tcp.DIAL: {Name: "dial dev=ops name", Help: "连接", Hand: func(m *ice.Message, arg ...string) { tcp.DIAL: {Name: "dial dev=ops name", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
_space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME))) _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...)
}}, }},
DOMAIN: {Name: "domain", Help: "域名", Hand: func(m *ice.Message, arg ...string) { DOMAIN: {Name: "domain", Help: "域名", Hand: func(m *ice.Message, arg ...string) {
m.Echo(_space_domain(m)) m.Echo(_space_domain(m))

View File

@ -24,15 +24,17 @@ func _xterm_socket(m *ice.Message, h, t string) {
m.Option(mdb.TEXT, t) m.Option(mdb.TEXT, t)
} }
func _xterm_get(m *ice.Message, h string, must bool) *os.File { func _xterm_get(m *ice.Message, h string, must bool) *os.File {
t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE)
if f, ok := mdb.HashTarget(m, h, func() ice.Any { if f, ok := mdb.HashTarget(m, h, func() ice.Any {
if !must { if !must {
return nil return nil
} }
ls := kit.Split(kit.Select("sh", m.Option(mdb.TYPE))) ls := kit.Split(kit.Select("sh", t))
m.Logs(cli.DAEMON, ice.CMD, ls)
cmd := exec.Command(cli.SystemFind(m, ls[0]), ls[1:]...) cmd := exec.Command(cli.SystemFind(m, ls[0]), ls[1:]...)
m.Logs(cli.DAEMON, ice.CMD, cmd.Path)
cmd.Env = append(os.Environ(), "TERM=xterm") cmd.Env = append(os.Environ(), "TERM=xterm")
m.Option(mdb.HASH, h)
tty, err := pty.Start(cmd) tty, err := pty.Start(cmd)
m.Assert(err) m.Assert(err)
@ -76,45 +78,41 @@ func init() {
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", 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], "python", "node", "bash", "sh") m.Push(arg[0], "ice.bin source stdio", "node", "python", "bash", "sh")
case mdb.NAME: case mdb.NAME:
m.Push(arg[0], path.Base(m.Option(mdb.TYPE))) m.Push(arg[0], path.Base(m.Option(mdb.TYPE)))
} }
}}, }},
mdb.CREATE: {Name: "create type name", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, arg, mdb.TEXT, m.Option(ice.MSG_DAEMON)) mdb.HashCreate(m, arg, mdb.TEXT, m.Option(ice.MSG_DAEMON))
_xterm_get(m, m.Result(), true)
}}, }},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
if f := _xterm_get(m, m.Option(mdb.HASH), false); f != nil { mdb.HashSelectDetail(m, m.Option(mdb.HASH), func(value ice.Map) {
f.Close() if c, ok := value["_cmd"].(io.Closer); ok {
} c.Close()
mdb.HashRemove(m, m.OptionSimple(mdb.HASH)) }
}}, })
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { mdb.HashRemove(m)
mdb.HashModify(m, m.OptionSimple(mdb.HASH), arg)
}},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
}},
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH), true), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
}}, }},
"rename": {Name: "rename", Help: "重命名", Hand: func(m *ice.Message, arg ...string) { "rename": {Name: "rename", Help: "重命名", Hand: func(m *ice.Message, arg ...string) {
mdb.HashModify(m, arg) mdb.HashModify(m, arg)
}}, }},
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH), true), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
}},
"select": {Name: "select", Help: "连接", Hand: func(m *ice.Message, arg ...string) { "select": {Name: "select", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
mdb.HashModify(m, mdb.TEXT, m.Option(ice.MSG_DAEMON)) mdb.HashModify(m, mdb.TEXT, m.Option(ice.MSG_DAEMON))
_xterm_get(m, m.Option(mdb.HASH), true)
m.Cmd("", "input", arg) m.Cmd("", "input", arg)
}}, }},
"input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) { "input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) {
mdb.HashModify(m, mdb.TIME, m.Time()) if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.Warn(e) {
if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); m.Assert(e) {
_xterm_get(m, m.Option(mdb.HASH), true).Write(b) _xterm_get(m, m.Option(mdb.HASH), true).Write(b)
mdb.HashModify(m, mdb.TIME, m.Time())
} }
}}, }},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,extra"), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text"), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, kit.Slice(arg, 0, 1)...) ctx.DisplayLocal(mdb.HashSelect(m, kit.Slice(arg, 0, 1)...), "")
ctx.DisplayLocal(m, "")
}}, }},
}) })
} }

View File

@ -18,7 +18,7 @@ const (
type compile struct { type compile struct {
ice.Code ice.Code
regexp string `data:".*.java"` regexp string `data:".*.java"`
linux string `data:"https://mirrors.tencent.com/repository/generic/konajdk/8/0/10/linux-x86_64/b1/TencentKona8.0.10.b1_jdk_linux-x86_64_8u332.tar.gz"` linux string `data:"https://github.com/Tencent/TencentKona-8/releases/download/8.0.11-GA/TencentKona8.0.11.b2_jdk_linux-x86_64_8u345.tar.gz"`
list string `name:"list path auto listScript order install" help:"编译器"` list string `name:"list path auto listScript order install" help:"编译器"`
} }

View File

@ -7,3 +7,8 @@ refer `
` `
field web.code.java.compile field web.code.java.compile
spark shell `
wget https://github.com/Tencent/TencentKona-8/releases/download/8.0.11-GA/TencentKona8.0.11.b2_jdk_linux-x86_64_8u345.tar.gz
tar xvf TencentKona8.0.11.b2_jdk_linux-x86_64_8u345.tar.gz && cd TencentKona-8.0.11-345/
`

View File

@ -117,8 +117,11 @@ func init() {
name = _tmux_key(m.Option(mdb.NAME), name) name = _tmux_key(m.Option(mdb.NAME), name)
_tmux_cmd(m, SPLIT_WINDOW, "-t", kit.Keys(name, "1"), "-p", "40") _tmux_cmd(m, SPLIT_WINDOW, "-t", kit.Keys(name, "1"), "-p", "40")
_tmux_cmd(m, SEND_KEYS, "-t", kit.Keys(name, "2"), "ish_miss_log", ENTER) m.Go(func() {
_tmux_cmd(m, SEND_KEYS, "-t", kit.Keys(name, "1"), "vi etc/miss.sh", ENTER) m.Sleep("1s")
_tmux_cmd(m, SEND_KEYS, "-t", kit.Keys(name, "2"), "ish_miss_log", ENTER)
_tmux_cmd(m, SEND_KEYS, "-t", kit.Keys(name, "1"), "vi etc/miss.sh", ENTER)
})
_tmux_cmd(m, LINK_WINDOW, "-s", name, "-t", "miss:") _tmux_cmd(m, LINK_WINDOW, "-s", name, "-t", "miss:")
} }