1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-01-29 15:07:55 +08:00
parent 70e91d3822
commit 2f84ef4c0e
10 changed files with 55 additions and 49 deletions

View File

@ -49,7 +49,7 @@ func init() {
auth := smtp.PlainAuth("", msg.Append(USERNAME), msg.Append(PASSWORD), kit.Split(msg.Append(SERVICE), ice.DF)[0])
m.Logs(EMAIL, SEND, string(content)).Warn(smtp.SendMail(msg.Append(SERVICE), auth, msg.Append(USERNAME), kit.Split(m.Option(TO)), content))
}},
}, mdb.DevDataAction("name,service,username,password"), mdb.ImportantHashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,service,username", ice.ACTION, SEND)), Hand: func(m *ice.Message, arg ...string) {
}, mdb.DevDataAction("name,service,username,password"), mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,service,username", ice.ACTION, SEND)), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) == 0 && m.Length() == 0 {
m.EchoInfoButton(ice.Info.Template(m, "email.html"), mdb.CREATE, mdb.DEV_REQUEST)
} else if len(arg) == 0 {

View File

@ -125,7 +125,7 @@ func init() {
m.Push(ice.CMD, cmd).Push("actions", kit.Join(action))
})
}},
}, mdb.ImportantHashAction(mdb.SHORT, mdb.NAME)), Hand: func(m *ice.Message, arg ...string) {
}, mdb.HashAction(mdb.SHORT, mdb.NAME)), Hand: func(m *ice.Message, arg ...string) {
_role_list(m, kit.Select("", arg, 0), kit.Slice(arg, 1)...).PushAction(mdb.DELETE)
}},
})

View File

@ -1,6 +1,7 @@
package cli
import (
"os"
"runtime"
"strings"
@ -76,6 +77,7 @@ func init() {
case strings.Contains(_release, ALPINE):
m.Cmdy(nfs.CAT, ETC_APK_REPOS)
}
m.EchoScript(kit.Format("cd %s; %s", kit.Path(""), kit.JoinCmds(kit.Simple(kit.Path(os.Args[0]), os.Args[1:])...)))
}},
})
}

View File

@ -29,6 +29,14 @@ func _runtime_init(m *ice.Message) {
m.Conf(RUNTIME, kit.Keys(HOST, PWD), kit.Path(""))
m.Conf(RUNTIME, kit.Keys(HOST, HOME), kit.HomePath(""))
m.Conf(RUNTIME, kit.Keys(HOST, MAXPROCS), runtime.GOMAXPROCS(0))
nfs.Exists(m, "/proc/meminfo", func(p string) {
kit.For(kit.SplitLine(m.Cmdx(nfs.CAT, p)), func(p string) {
switch ls := kit.Split(p, ": "); ls[0] {
case "MemTotal", "MemFree", "MemAvailable", "Buffers", "Cached":
m.Conf(RUNTIME, kit.Keys(HOST, ls[0]), kit.FmtSize(kit.Int(ls[1])*1024))
}
})
})
kit.For(ENV_LIST, func(k string) {
m.Conf(RUNTIME, kit.Keys(CONF, k), kit.Env(k))
kit.If(k == CTX_PID, func() { ice.Info.PidPath = kit.Env(k) })
@ -50,9 +58,9 @@ func _runtime_init(m *ice.Message) {
ice.Info.System = m.Conf(RUNTIME, kit.Keys(HOST, OSID))
aaa.UserRoot(ice.Pulse, "", ice.Info.Make.Username, aaa.TECH, ice.DEV)
aaa.UserRoot(ice.Pulse, "", ice.Info.Username, aaa.ROOT, ice.OPS)
m.Conf(RUNTIME, kit.Keys(BOOT, mdb.TIME), m.Time())
if runtime.GOARCH != MIPSLE {
msg := m.Cmd(nfs.DIR, _system_find(m, os.Args[0]), "time,path,size,hash")
m.Conf(RUNTIME, kit.Keys(BOOT, mdb.TIME), msg.Append(mdb.TIME))
m.Conf(RUNTIME, kit.Keys(BOOT, mdb.HASH), msg.Append(mdb.HASH))
m.Conf(RUNTIME, kit.Keys(BOOT, nfs.SIZE), msg.Append(nfs.SIZE))
m.Conf(RUNTIME, kit.Keys(BOOT, ice.BIN), msg.Append(nfs.PATH))
@ -70,9 +78,17 @@ func _runtime_hostinfo(m *ice.Message) {
m.Push("NumGoroutine", runtime.NumGoroutine())
var stats runtime.MemStats
runtime.ReadMemStats(&stats)
m.Push("Sys", kit.FmtSize(int64(stats.Sys)))
m.Push("Alloc", kit.FmtSize(int64(stats.Alloc)))
m.Push("Sys", kit.FmtSize(stats.Sys))
m.Push("Alloc", kit.FmtSize(stats.Alloc))
m.Push("TotalAlloc", kit.FmtSize(stats.TotalAlloc))
m.Push("Objects", stats.HeapObjects)
m.Push("StackSys", kit.FmtSize(stats.StackSys))
m.Push("StackInuse", kit.FmtSize(stats.StackInuse))
m.Push("HeapSys", kit.FmtSize(stats.HeapSys))
m.Push("HeapInuse", kit.FmtSize(stats.HeapInuse))
m.Push("HeapIdle", kit.FmtSize(stats.HeapIdle))
m.Push("HeapReleased", kit.FmtSize(stats.HeapReleased))
m.Push("NumGC", stats.NumGC)
m.Push("LastGC", time.Unix(int64(stats.LastGC)/int64(time.Second), int64(stats.LastGC)%int64(time.Second)))
m.Push("uptime", kit.Split(m.Cmdx(SYSTEM, "uptime"), mdb.FS)[0])
@ -249,7 +265,14 @@ func init() {
}
var stats runtime.MemStats
runtime.ReadMemStats(&stats)
m.StatusTimeCount(status, "GOMAXPROCS", runtime.GOMAXPROCS(0), "NumGC", stats.NumGC, "Alloc", kit.FmtSize(int64(stats.Alloc)), "Sys", kit.FmtSize(int64(stats.Sys)))
m.StatusTimeCount(status, "GOMAXPROCS", runtime.GOMAXPROCS(0), "NumGC", stats.NumGC,
"Sys", kit.FmtSize(stats.Sys),
"Alloc", kit.FmtSize(stats.Alloc),
"StackSys", kit.FmtSize(stats.StackSys),
"StackInuse", kit.FmtSize(stats.StackInuse),
"HeapSys", kit.FmtSize(stats.HeapSys),
"HeapInuse", kit.FmtSize(stats.HeapInuse),
)
m.Echo("%v", string(buf))
}},
"upgrade": {Help: "升级", Hand: func(m *ice.Message, arg ...string) {

View File

@ -31,7 +31,7 @@ func _serve_start(m *ice.Message) {
kit.If(runtime.GOOS == cli.WINDOWS || m.Cmdx(cli.SYSTEM, "lsof", "-i", ":"+m.Option(tcp.PORT)) != "", func() {
m.Go(func() { m.Cmd(SPIDE, ice.OPS, _serve_address(m)+"/exit", ice.Maps{CLIENT_TIMEOUT: "30ms"}) }).Sleep300ms()
})
cli.NodeInfo(m, kit.Select(strings.TrimSuffix(ice.Info.Hostname, ".local"), m.Option(tcp.NODENAME)), SERVER)
cli.NodeInfo(m, kit.Select(kit.Split(ice.Info.Hostname, ".")[0], m.Option(tcp.NODENAME)), SERVER)
m.Start("", m.OptionSimple(tcp.HOST, tcp.PORT)...)
m.Cmd(nfs.SAVE, ice.VAR_LOG_ICE_PORT, m.Option(tcp.PORT))
kit.For(kit.Split(m.Option(ice.DEV)), func(dev string) {

View File

@ -120,7 +120,7 @@ func init() {
RenderMain(m)
}
}},
}, mdb.ImportantHashAction(mdb.FIELD, "time,hash,type,name,text,usernick,username,userrole", mdb.EXPIRE, mdb.DAYS)), Hand: func(m *ice.Message, arg ...string) {
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,usernick,username,userrole", mdb.EXPIRE, mdb.DAYS)), Hand: func(m *ice.Message, arg ...string) {
if kit.IsIn(m.Option(ice.MSG_USERROLE), aaa.ROOT, aaa.TECH) || len(arg) > 0 && arg[0] != "" {
mdb.HashSelect(m, arg...)
}

View File

@ -81,7 +81,7 @@ func _space_fork(m *ice.Message) {
} else if kit.IsIn(m.Option(mdb.TYPE), WORKER) && IsLocalHost(m) {
text = nfs.USR_LOCAL_WORK + name
} else {
name, text = kit.Hashs(name), kit.Select(addr, m.Option(mdb.NAME), m.Option(mdb.TEXT))
name, text = kit.Hashs(name), kit.Select(addr, m.Option(mdb.TEXT))
}
safe := false
if m.Option(ice.MSG_USERNAME, ""); kit.IsIn(m.Option(mdb.TYPE), WORKER, PORTAL) {

View File

@ -16,7 +16,7 @@ const TOKEN = "token"
func init() {
Index.MergeCommands(ice.Commands{
TOKEN: {Help: "令牌桶", Actions: mdb.ImportantHashAction(mdb.SHORT, mdb.UNIQ, mdb.EXPIRE, mdb.MONTH)},
TOKEN: {Help: "令牌桶", Actions: mdb.HashAction(mdb.SHORT, mdb.UNIQ, mdb.EXPIRE, mdb.MONTH)},
})
}

View File

@ -2,7 +2,6 @@ package relay
import (
"net/http"
"net/url"
"os"
"path"
"strings"
@ -62,7 +61,7 @@ type relay struct {
ice.Code
checkbox string `data:"true"`
short string `data:"machine"`
field string `data:"time,machine,username,host,port,portal,dream,module,version,commitTime,compileTime,bootTime,package,shell,kernel,arch,ncpu,vcpu,mhz,mem,disk,network,listen,socket,proc,vendor"`
field string `data:"time,machine,username,host,port,portal,dream,module,version,commitTime,compileTime,bootTime,go,git,package,shell,kernel,arch,ncpu,vcpu,mhz,mem,disk,network,listen,socket,proc,vendor"`
statsTables string `name:"statsTables" event:"stats.tables"`
create string `name:"create machine* username* host* port*=22"`
stats string `name:"stats machine" help:"采集" icon:"bi bi-pc-display"`
@ -73,7 +72,7 @@ type relay struct {
publish string `name:"publish" help:"发布" icon:"bi bi-send-check"`
list string `name:"list machine auto" help:"机器" icon:"relay.png"`
install string `name:"install dream param" help:"安装"`
pushbin string `name:"pushbin dream param" help:"部署"`
pushbin string `name:"pushbin dream param" help:"部署" icon:"bi bi-box-arrow-in-up"`
adminCmd string `name:"adminCmd cmd" help:"命令" icon:"bi bi-terminal-plus"`
}
@ -111,18 +110,20 @@ func (s relay) Inputs(m *ice.Message, arg ...string) {
}
func (s relay) Stats(m *ice.Message) {
m.Option(ice.MSG_TITLE, kit.Keys(m.CommandKey(), m.ActionKey()))
cmds := []string{
PACKAGE, `if yum -h &>/dev/null; then echo yum; elif apk version &>/dev/null; then echo apk; elif apt -h &>/dev/null; then echo apt; fi`,
cmds := []string{"go", `go version`, "git", `git version`,
PACKAGE, `if yum -h &>/dev/null; then echo yum; elif apk version &>/dev/null; then echo apk; elif opkg -v &>/dev/null; then echo opkg; elif apt -h &>/dev/null; then echo apt; fi`,
SHELL, `echo $SHELL`, KERNEL, `uname -s`, ARCH, `uname -m`,
NCPU, `cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`,
VCPU, `cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l`,
MHZ, `cat /proc/cpuinfo | grep "cpu MHz" | grep -o "[0-9.]\+" | sort -nr | head -n1`,
MHZ, `cat /proc/cpuinfo | grep "\(cpu MHz\|BogoMIPS\)" | grep -o "[0-9.]\+" | sort -nr | head -n1`,
MEM, `cat /proc/meminfo | head -n2 | grep -o "[0-9.]*"`, DISK, `df | grep "^/dev/"`,
NETWORK, `cat /proc/net/dev | grep "eth0\|eth1" | sort -r | head -n1`,
LISTEN, `netstat -ntl 2>/dev/null | grep "^tcp" | grep -o ":[0-9]\+" | grep -o "[0-9]\+" | sort -n | uniq`,
SOCKET, `netstat -nt 2>/dev/null | grep "^tcp" | wc -l`, PROC, `ps aux | wc -l`,
SOCKET, `netstat -nt 2>/dev/null | grep "^tcp" | wc -l`, PROC, `ps aux | wc -l 2>/dev/null`,
}
trans := map[string]func([]string) string{
"go": func(ls []string) string { return kit.Select("", ls, 2) },
"git": func(ls []string) string { return kit.Select("", ls, 2) },
MEM: func(ls []string) string {
return kit.FmtSize(kit.Int(kit.Select("", ls, 1))*1024, kit.Int(kit.Select("", ls, 0))*1024)
},
@ -132,6 +133,9 @@ func (s relay) Stats(m *ice.Message) {
NETWORK: func(ls []string) string {
return kit.FmtSize(kit.Int(kit.Select("", ls, 1)), kit.Int(kit.Select("", ls, 9)))
},
PROC: func(ls []string) string {
return kit.Format(kit.Int(ls[0]))
},
}
machine := m.Option(MACHINE)
web.GoToast(m.Message, "", func(toast func(string, int, int)) []string {
@ -247,7 +251,7 @@ func (s relay) List(m *ice.Message, arg ...string) *ice.Message {
return
}
m.Push(web.LINK, web.HostPort(m.Message, value[tcp.HOST], value[web.PORTAL]))
m.PushButton(s.Admin, s.Dream, s.Vimer, s.AdminCmd, s.Login, s.Upgrade, s.Pushbin, s.Xterm, s.Remove)
m.PushButton(s.Admin, s.Dream, s.Vimer, s.Login, s.Upgrade, s.Pushbin, s.AdminCmd, s.Xterm, s.Remove)
kit.If(len(arg) > 0, func() { m.PushQRCode(cli.QRCODE, m.Append(web.LINK)) })
})
_stats := kit.Dict(MEM, kit.FmtSize(stats[MEM_FREE], stats[MEM_TOTAL]), DISK, kit.FmtSize(stats[DISK_USED], stats[DISK_TOTAL]))
@ -299,7 +303,7 @@ func (s relay) Login(m *ice.Message, arg ...string) {
} else {
defer web.ToastProcess(m.Message)()
ssh.CombinedOutput(m.Message, s.admins(m, kit.JoinCmds(web.SHARE, mdb.CREATE, mdb.TYPE, aaa.LOGIN, "--", mdb.TEXT, m.Option(ice.BACK))), func(res string) {
m.ProcessReplace(MergeURL2(m, m.Option(ice.BACK), "/share/"+strings.TrimSpace(res)))
m.ProcessReplace(kit.MergeURL2(m.Option(ice.BACK), "/share/"+strings.TrimSpace(res)))
})
}
}
@ -316,6 +320,9 @@ func (s relay) Upgrade(m *ice.Message, arg ...string) {
m.Option(ice.MSG_TITLE, kit.Keys(m.CommandKey(), m.ActionKey()))
if len(arg) == 0 && (m.Option(MACHINE) == "" || strings.Contains(m.Option(MACHINE), ",")) {
s.foreach(m, func(msg *ice.Message, cmd []string) {
if msg.Option("go") == "" {
return
}
ssh.PushShell(msg.Message, strings.Split(msg.Template(UPGRADE_SH), lex.NL), func(res string) {
web.PushNoticeGrow(m.Options(ice.MSG_COUNT, "0", ctx.DISPLAY, web.PLUGIN_XTERM).Message, res)
})
@ -327,6 +334,9 @@ func (s relay) Upgrade(m *ice.Message, arg ...string) {
func (s relay) Version(m *ice.Message, arg ...string) {
m.Option(ice.MSG_TITLE, kit.Keys(m.CommandKey(), m.ActionKey()))
s.foreach(m, func(msg *ice.Message, cmd []string) {
if msg.Option("go") == "" {
return
}
ssh.PushShell(msg.Message, strings.Split(msg.Template(VERSION_SH), lex.NL), func(res string) {
web.PushNoticeGrow(m.Options(ctx.DISPLAY, web.PLUGIN_XTERM).Message, res)
})
@ -387,20 +397,3 @@ func (s relay) admin(m *ice.Message, arg ...string) string {
func (s relay) admins(m *ice.Message, arg ...string) string {
return kit.Select(ice.CONTEXTS, m.Option(web.DREAM)) + nfs.PS + s.admin(m, arg...)
}
func MergeURL2(m *ice.Message, str string, uri string, arg ...ice.Any) string {
raw, err := url.Parse(str)
m.Debug("what %v", err)
if err != nil {
return kit.MergeURL(uri, arg...)
}
get, err := url.Parse(uri)
m.Debug("what %v", err)
if err != nil {
return kit.MergeURL(str, arg...)
}
p := get.Path
m.Debug("what %v", p)
kit.If(!strings.HasPrefix(p, nfs.PS), func() { p = path.Join(raw.Path, get.Path) })
kit.If(p == nfs.PS, func() { p = "" })
return kit.MergeURL(kit.Select(raw.Scheme, get.Scheme)+"://"+kit.Select(raw.Host, get.Host)+p+"?"+kit.Select(raw.RawQuery, get.RawQuery), arg...)
}

View File

@ -1,9 +1,6 @@
package webview
import (
"fmt"
"io"
"os"
"path"
"strings"
@ -96,18 +93,9 @@ func Run(cb func(*WebView) ice.Any) {
}
kit.If(!view.Menu(), func() { view.navigate(ice.Pulse.Cmdv(web.SPIDE, ice.OPS, web.CLIENT_ORIGIN)) })
}
var log io.WriteCloser
func Log(str string, arg ...ice.Any) { fmt.Fprintln(log, kit.Format(str, arg...), kit.FileLine(2, 3)) }
func RunServe() {
kit.Setenv(cli.PATH, "/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin")
for _, p := range []string{ice.Info.Make.Path, kit.HomePath(ice.CONTEXTS)} {
kit.Chdir(p)
log, _ = os.Create(path.Join(p, "webview.log"))
Log("what %v", p)
}
kit.Chdir(kit.HomePath(ice.CONTEXTS))
wait := make(chan bool, 1)
ice.Pulse.Optionv(web.SERVE_START, func() { wait <- true })
go ice.Run(ice.SERVE, ice.START)