1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-03-01 12:43:40 +08:00
parent f5573b92f1
commit f75b554fe3
8 changed files with 66 additions and 28 deletions

View File

@ -15,6 +15,7 @@ import (
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
kit "shylinux.com/x/toolkits"
)
@ -51,6 +52,8 @@ func (f *Frame) prompt(m *ice.Message, list ...string) *Frame {
switch v {
case mdb.COUNT:
fmt.Fprintf(f.stdout, "%d", f.count)
case tcp.HOSTNAME:
fmt.Fprintf(f.stdout, "%s", kit.Slice(kit.Split(ice.Info.Hostname, " -/."), -1)[0])
case mdb.TIME:
fmt.Fprintf(f.stdout, time.Now().Format("15:04:05"))
case TARGET:
@ -117,7 +120,7 @@ func (f *Frame) parse(m *ice.Message, h, line string) string {
func (f *Frame) scan(m *ice.Message, h, line string) *Frame {
f.ps1 = kit.Simple(m.Confv(PROMPT, kit.Keym(PS1)))
f.ps2 = kit.Simple(m.Confv(PROMPT, kit.Keym(PS2)))
// m.Options(MESSAGE, m, ice.LOG_DISABLE, ice.TRUE)
m.Options(MESSAGE, m, ice.LOG_DISABLE, ice.TRUE)
m.I, m.O = f.stdin, f.stdout
ps, bio := f.ps1, bufio.NewScanner(f.stdin)
for f.prompt(m, ps...); f.stdin != nil && bio.Scan(); f.prompt(m, ps...) {
@ -236,7 +239,7 @@ func init() {
}
}},
PROMPT: {Name: "prompt arg run", Help: "命令提示", Actions: ctx.ConfAction(
PS1, ice.List{"\033[33;44m", mdb.COUNT, "[", mdb.TIME, "]", "\033[5m", TARGET, "\033[0m", "\033[44m", ">", "\033[0m ", "\033[?25h", "\033[32m"},
PS1, ice.List{"\033[33;44m", mdb.COUNT, "@", tcp.HOSTNAME, "[", mdb.TIME, "]", "\033[5m", TARGET, "\033[0m", "\033[44m", ">", "\033[0m ", "\033[?25h", "\033[32m"},
PS2, ice.List{mdb.COUNT, " ", TARGET, "> "},
), Hand: func(m *ice.Message, arg ...string) {
if f, ok := m.Target().Server().(*Frame); ok {

View File

@ -2,6 +2,7 @@ package web
import (
"net"
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
@ -30,7 +31,7 @@ func _broad_serve(m *ice.Message, host, port string) {
m.Go(func() {
_broad_send(m.Sleep("100ms"), host, port, "255.255.255.255", "9020", mdb.TYPE, ice.Info.NodeType, mdb.NAME, ice.Info.NodeName)
})
if s, e := net.ListenUDP("udp4", _broad_addr(m, "0.0.0.0", port)); m.Assert(e) {
if s, e := net.ListenUDP("udp4", _broad_addr(m, host, port)); m.Assert(e) {
defer s.Close()
buf := make([]byte, ice.MOD_BUFS)
for {
@ -41,7 +42,7 @@ func _broad_serve(m *ice.Message, host, port string) {
m.Logs(mdb.IMPORT, BROAD, string(buf[:n]), "from", from)
msg := m.Spawn(buf[:n])
if msg.Option(mdb.ZONE) == "echo" {
mdb.HashCreate(m, msg.OptionSimple(kit.Simple(msg.Optionv(ice.MSG_OPTION))...))
_broad_save(m, msg)
continue
}
if remote := _broad_addr(m, msg.Option(tcp.HOST), msg.Option(tcp.PORT)); remote != nil {
@ -49,10 +50,21 @@ func _broad_serve(m *ice.Message, host, port string) {
m.Logs(mdb.EXPORT, BROAD, kit.Format(value), "to", kit.Format(remote))
s.WriteToUDP([]byte(m.Spawn(value, kit.Dict(mdb.ZONE, "echo")).FormatMeta()), remote)
})
_broad_save(m, msg)
}
}
}
}
func _broad_save(m, msg *ice.Message) {
save := false
m.Cmd(tcp.HOST, func(values ice.Maps) {
if strings.Split(msg.Option(tcp.HOST), ice.PT)[0] == strings.Split(values[aaa.IP], ice.PT)[0] {
save = true
}
})
if save {
mdb.HashCreate(m, msg.OptionSimple(kit.Simple(msg.Optionv(ice.MSG_OPTION))...))
}
}
}
}
const BROAD = "broad"
@ -61,7 +73,7 @@ func init() {
Index.MergeCommands(ice.Commands{
BROAD: {Name: "broad hash auto", Help: "广播", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == BROAD || arg[0] == mdb.FOREACH {
if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" {
host := m.Cmd(tcp.HOST).Append(aaa.IP)
domain := OptionUserWeb(m).Hostname()
m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) {
@ -79,7 +91,9 @@ func init() {
}
}},
SERVE: {Name: "serve port=9020", Hand: func(m *ice.Message, arg ...string) {
_broad_serve(m, m.Cmd(tcp.HOST).Append(aaa.IP), m.Option(tcp.PORT))
m.Cmd(tcp.HOST).TableGo(func(values ice.Maps) {
_broad_serve(m, values[aaa.IP], m.Option(tcp.PORT))
})
}},
OPEN: {Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessOpen(m, kit.Format("http://%s:%s", m.Option(tcp.HOST), m.Option(tcp.PORT)))

View File

@ -108,6 +108,9 @@ func init() {
case mdb.NAME, nfs.TEMPLATE:
_dream_list(m).Cut("name,status,time")
case nfs.REPOS:
if msg := m.Cmd(SPIDE, ice.OPS, SPIDE_MSG, m.Option(ice.MSG_USERHOST)+"/x/list"); !msg.IsErr() {
m.Copy(msg)
}
for _, dev := range []string{ice.OPS, ice.DEV, ice.SHY} {
if msg := m.Cmd(SPIDE, dev, SPIDE_MSG, "/x/list"); !msg.IsErr() {
m.Copy(msg)

View File

@ -26,8 +26,11 @@ func _serve_start(m *ice.Message) {
if cli.NodeInfo(m, kit.Select(ice.Info.Hostname, m.Option("nodename")), SERVER); m.Option(tcp.PORT) == tcp.RANDOM {
m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT))
}
if runtime.GOOS == cli.WINDOWS {
m.Cmd(SPIDE, ice.OPS, kit.Format("http://localhost:%s/exit", m.Option(tcp.PORT))).Sleep("100ms")
}
m.Target().Start(m, m.OptionSimple(tcp.HOST, tcp.PORT)...)
m.Go(func() { m.Cmd(BROAD, SERVE, m.OptionSimple(tcp.PORT)) })
defer m.Go(func() { m.Cmd(BROAD, SERVE, m.OptionSimple(tcp.PORT)) })
for _, v := range kit.Split(m.Option(ice.DEV)) {
m.Cmd(SPACE, tcp.DIAL, ice.DEV, v, mdb.NAME, ice.Info.NodeName)
}
@ -177,19 +180,23 @@ const SERVE = "serve"
func init() {
Index.MergeCommands(ice.Commands{
"/exit": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(ice.EXIT) }},
SERVE: {Name: "serve name auto start", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.NodeInfo(m, ice.Info.Pathname, WORKER) }},
cli.START: {Name: "start dev name proto host port=9020 nodename username usernick", Hand: func(m *ice.Message, arg ...string) {
cli.START: {Name: "start dev proto host port=9020 nodename username usernick", Hand: func(m *ice.Message, arg ...string) {
_serve_start(m)
}},
SERVE_START: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() {
go func() {
m.Option(ice.LOG_DISABLE, ice.TRUE)
opened := false
m.Sleep("2s").Cmd(SPACE, func(values ice.Maps) {
for i := 0; i < 3 && !opened; i++ {
m.Sleep("1s").Cmd(SPACE, func(values ice.Maps) {
if values[mdb.TYPE] == CHROME {
opened = true
}
})
}
if opened {
return
}
@ -199,7 +206,7 @@ func init() {
case cli.DARWIN:
m.Cmd(cli.SYSTEM, "open", host)
}
})
}()
}},
SERVE_REWRITE: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] != http.MethodGet {

View File

@ -33,9 +33,11 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
if conn, _, e := websocket.NewClient(c, uri, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !m.Warn(e, tcp.DIAL, dev, SPACE, uri.String()) {
defer mdb.HashCreateDeferRemove(m, kit.SimpleKV("", MASTER, dev, msg.Append(tcp.HOSTNAME)), kit.Dict(mdb.TARGET, conn))()
if !prints && ice.Info.Colors {
m.Go(func() {
m.Sleep30ms().Cmd(ssh.PRINTF, kit.Dict(nfs.CONTENT, "\r"+ice.Render(m, ice.RENDER_QRCODE, m.CmdAppend(SPACE, dev, cli.PWD, mdb.LINK)))).Cmd(ssh.PROMPT)
})
go func() {
m.Sleep("300ms").Cmd(ssh.PRINTF, kit.Dict(nfs.CONTENT, "\r"+ice.Render(m, ice.RENDER_QRCODE, m.CmdAppend(SPACE, dev, cli.PWD, mdb.LINK)))).Cmd(ssh.PROMPT, kit.Dict(
ice.LOG_DISABLE, ice.TRUE,
))
}()
prints = true
}
_space_handle(m.Spawn(), true, dev, conn)
@ -182,11 +184,11 @@ func init() {
_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) {
if arg[0] == SPACE || arg[0] == mdb.FOREACH {
if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" {
m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) {
switch values[mdb.TYPE] {
case WORKER:
m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, MergePod(m, values[mdb.NAME]))), values)
case SERVER, WORKER:
m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, strings.Split(MergePod(m, values[mdb.NAME]), ice.QS)[0])), values)
case MASTER:
m.PushSearch(mdb.TEXT, m.Cmd(SPIDE, values[mdb.NAME], ice.Maps{ice.MSG_FIELDS: ""}).Append(CLIENT_ORIGIN), values)
}

View File

@ -53,9 +53,16 @@ func init() {
"record1": {Name: "favor upload", Help: "截图"},
"record2": {Name: "favor upload", Help: "录屏"},
mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) {
if strings.HasPrefix(m.Option(mdb.TEXT), ice.HTTP) {
m.OptionDefault(mdb.TYPE, mdb.LINK, mdb.NAME, kit.ParseURL(m.Option(mdb.TEXT)).Host)
}
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) {
m.Cmd("", mdb.CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT))
}},

View File

@ -104,6 +104,8 @@ func Run(arg ...string) string {
Pulse.Option(ls[0], ls[1])
}
})
time.Local = time.FixedZone("Beijing", 28800)
Pulse.time = time.Now()
if Pulse._cmd == nil {
Pulse._cmd = &Command{RawHand: logs.FileLines(3)}
}

View File

@ -81,7 +81,7 @@ func _status_tags(m *ice.Message) {
})
}
func _status_each(m *ice.Message, title string, cmds ...string) {
web.GoToast(m, title, func(toast func(string, int, int)) {
web.GoToast(m, kit.Select(strings.Join(cmds, ice.SP), title), func(toast func(string, int, int)) {
list, count, total := []string{}, 0, len(m.Confm(REPOS, mdb.HASH))
ReposList(m).Tables(func(value ice.Maps) {
toast(value[REPOS], count, total)
@ -213,13 +213,13 @@ func init() {
m.Cmdy(REPOS, mdb.CREATE)
}},
PULL: {Help: "下载", Hand: func(m *ice.Message, arg ...string) {
_status_each(m, PULL, cli.SYSTEM, GIT, PULL)
_status_each(m, PULL, cli.SYSTEM, GIT, PULL, "--tags")
_status_each(m, "", cli.SYSTEM, GIT, PULL)
_status_each(m, "", cli.SYSTEM, GIT, PULL, "--tags")
}},
PUSH: {Help: "上传", Hand: func(m *ice.Message, arg ...string) {
if m.Option(REPOS) == "" {
_status_each(m, PUSH, cli.SYSTEM, GIT, PUSH)
_status_each(m, PUSH, cli.SYSTEM, GIT, PUSH, "--tags")
_status_each(m, "", cli.SYSTEM, GIT, PUSH)
_status_each(m, "", cli.SYSTEM, GIT, PUSH, "--tags")
return
}
m.Option(cli.CMD_DIR, _repos_path(m.Option(REPOS)))