1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-25 17:18:05 +08:00

Compare commits

...

46 Commits

Author SHA1 Message Date
shy
7e5cff6b81 add some 2025-03-22 12:54:06 +08:00
shy
6c0e3a0a58 add some 2025-03-15 20:27:05 +08:00
shy
08f2f1626d add some 2025-03-10 18:38:39 +08:00
shy
5260027c9f add some 2025-03-08 08:38:13 +08:00
shy
26e62a1b22 add some 2025-03-05 23:33:47 +08:00
shy
e008f4d417 add some 2025-03-05 08:55:30 +08:00
shy
5fc5ccd0ea add some 2025-03-04 14:52:57 +08:00
shy
35c1407d29 add some 2025-03-03 22:13:05 +08:00
shy
55a0c3d120 add some 2025-03-03 18:39:51 +08:00
shy
968d9389c9 opt some 2025-03-02 22:10:17 +08:00
shy
7fea8e88a4 add some 2025-03-01 11:36:50 +08:00
shy
8fa2f6e8b3 add some 2025-02-28 14:17:28 +08:00
shy
fe1a6d30aa opt some 2025-02-27 17:56:24 +08:00
shy
02962f9d20 add some 2025-02-27 16:39:54 +08:00
shy
612ecdf4a6 add some 2025-02-27 16:29:06 +08:00
shy
c3f37f626b add some 2025-02-27 16:27:42 +08:00
shy
b4627b2975 add some 2025-02-26 21:51:32 +08:00
shy
f3bc5eb1e1 opt some 2025-02-25 21:57:33 +08:00
shy
03990b839e add some 2025-02-25 21:54:41 +08:00
shy
473826664a add some 2025-02-25 12:14:41 +08:00
root
be66627287 add some 2025-02-25 10:52:06 +08:00
shy
030c018877 add some 2025-02-25 09:59:30 +08:00
root
0071ba89d9 add some 2025-02-25 07:32:49 +08:00
shy
c067576dd6 add some 2025-02-23 09:58:37 +08:00
shy
96d812612b add some 2025-02-23 08:03:37 +08:00
root
a33bc88dcc add some 2025-02-19 21:00:50 +08:00
shy
2f715c5233 opt some 2025-02-18 11:26:19 +08:00
root
8a27ce7d66 add some 2025-02-18 11:18:22 +08:00
root
da81284b37 add some 2025-02-17 19:54:36 +08:00
root
bbb0ae9de9 add some 2025-02-16 08:44:53 +08:00
shy
7bb197ed94 add some 2025-02-16 08:27:23 +08:00
shy
bc94d8e1e4 add some 2025-02-15 18:35:15 +08:00
shy
942606d750 add some 2025-02-15 12:32:06 +08:00
shy
c418c8c070 add some 2025-02-13 22:35:33 +08:00
shy
87c96c880d opt some 2025-02-10 23:03:10 +08:00
shy
cdaa2d7984 opt some 2025-02-10 10:11:34 +08:00
root
38b7942c1b add some 2025-02-10 08:30:04 +08:00
root
240a0c88bf add some 2025-02-08 15:00:09 +08:00
root
297c299694 add some 2025-02-08 12:02:50 +08:00
root
324cd9dc57 add some 2025-02-06 16:21:11 +08:00
shy
1829822e43 add some 2025-02-05 17:37:25 +08:00
shy
a8b365dc31 add some 2025-02-05 09:49:32 +08:00
root
b64a3b5725 add some 2025-02-05 09:44:27 +08:00
root
0ef29edbad add some 2025-02-04 14:10:16 +08:00
shy
6fc5cbde02 add publish 2025-02-04 12:01:02 +08:00
shy
85e1f1dcb6 add some 2025-02-04 10:26:51 +08:00
59 changed files with 702 additions and 341 deletions

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 shylinux
Copyright (c) 2017-2025 shylinux
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,3 +1,3 @@
# icebergs
icebergs 是一个应用框架,通过模块化、集群化、自动化方式,在各种设备上,即可一键启动完整的云计算服务与云研发环境。
icebergs 是一个后端框架,通过集群化、模块化、自动化方式,在各种设备上,即可一键启动完整的云计算服务与云研发环境。

View File

@ -32,7 +32,7 @@ func init() {
)
Index.MergeCommands(ice.Commands{
EMAIL: {Help: "邮件", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name*=admin service*='mail.shylinux.com:25' username*='shy@shylinux.com' password*"},
mdb.CREATE: {Name: "create name*=admin service*='smtp.163.com:25' username* password*"},
SEND: {Name: "send from=admin to*='shy@shylinux.com' cc subject*=hi content*:textarea=hello", Help: "发送", Icon: "bi bi-send-plus", Hand: func(m *ice.Message, arg ...string) {
msg := mdb.HashSelects(m.Spawn(), m.OptionDefault(FROM, ADMIN))
if m.WarnNotFound(msg.Append(SERVICE) == "", m.Option(FROM)) {

View File

@ -78,9 +78,11 @@ func (s apply) Login(m *ice.Message, arg ...string) {
}
m.Options(ice.MSG_USERNAME, m.Option(aaa.EMAIL))
space := kit.Keys(kit.Slice(kit.Split(m.Option(ice.MSG_DAEMON), nfs.PT), 0, -1))
share := m.Cmd(web.SHARE, mdb.CREATE, mdb.TYPE, web.FIELD, mdb.NAME, web.CHAT_GRANT, mdb.TEXT, space).Append(mdb.LINK)
share := m.Cmd(web.SHARE, mdb.CREATE, mdb.TYPE, web.FIELD, mdb.NAME, web.CHAT_GRANT, mdb.TEXT, space, web.SPACE, ice.OPS).Append(mdb.LINK)
m.Options(web.LINK, share).SendEmail("", "", "")
m.ProcessHold(m.Trans("please auth login in mailbox", "请注意查收邮件"))
// m.ProcessHold(m.Trans("please auth login in mailbox", "请注意查收邮件"))
m.Echo(m.Trans("please auth login in mailbox", "请注意查收邮件"))
m.ProcessInner()
}
}
func (s apply) List(m *ice.Message, arg ...string) *ice.Message {

View File

@ -105,7 +105,7 @@ func UserRoot(m *ice.Message, arg ...string) *ice.Message {
userzone := kit.Select(ice.OPS, arg, 4)
email := kit.Select(UserEmail(m, username), arg, 5)
if len(arg) > 0 {
ice.Info.Username = username
kit.If(username != ROOT, func() { ice.Info.Username = username })
m.Cmd(USER, mdb.CREATE, userrole, username, usernick, language, userzone, email)
}
return SessAuth(m, kit.Dict(USERROLE, userrole, USERNAME, username, USERNICK, usernick))

View File

@ -43,9 +43,10 @@ func _runtime_init(m *ice.Message) {
kit.HashSeed = append(kit.HashSeed, ice.Info.Username)
kit.HashSeed = append(kit.HashSeed, ice.Info.Hostname)
kit.HashSeed = append(kit.HashSeed, ice.Info.Pathname)
aaa.UserRoot(ice.Pulse, aaa.ROOT, aaa.ROOT)
aaa.UserRoot(ice.Pulse, aaa.TECH, ice.Info.Make.Author, "", "", ice.DEV, ice.Info.Make.Email)
aaa.UserRoot(ice.Pulse, aaa.TECH, ice.Info.Make.Username, "", "", ice.DEV, ice.Info.Make.Email)
aaa.UserRoot(ice.Pulse, aaa.TECH, ice.Info.Username)
aaa.UserRoot(ice.Pulse, aaa.ROOT, ice.Info.Username)
aaa.UserRoot(ice.Pulse, aaa.ROOT, aaa.ROOT)
ice.Info.Time = m.Time()
m.Conf(RUNTIME, kit.Keys(BOOT, mdb.TIME), ice.Info.Time)
if runtime.GOARCH != MIPSLE {
@ -134,6 +135,8 @@ const (
KERNEL = "kernel"
ARCH = "arch"
CPU = "cpu"
OS = "os"
)
const (
PATH = "PATH"
@ -154,6 +157,7 @@ const (
CTX_DEMO = "ctx_demo"
CTX_MAIL = "ctx_mail"
CTX_ROOT = "ctx_root"
CTX_DOMAIN = "ctx_domain"
CTX_PID = "ctx_pid"
CTX_LOG = "ctx_log"

View File

@ -65,6 +65,7 @@ func _system_cmd(m *ice.Message, arg ...string) *exec.Cmd {
}
kit.For(env, func(k, v string) { cmd.Env = append(cmd.Env, kit.Format("%s=%s", k, v)) })
kit.If(len(cmd.Env) > 0 && m.IsDebug(), func() { m.Logs(EXEC, CMD_ENV, kit.Format(cmd.Env)) })
kit.If(len(cmd.Env) > 0, func() { m.Logs(EXEC, CMD_ENV, kit.Format(cmd.Env)) })
_system_cmds(m, cmd, arg...)
return cmd
}
@ -159,6 +160,7 @@ const (
const (
SH = "sh"
LN = "ln"
CP = "cp"
MV = "mv"
RM = "rm"
CD = "cd"

View File

@ -51,6 +51,9 @@ func DisplayStoryForm(m *ice.Message, arg ...ice.Any) *ice.Message {
func DisplayInputKey(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayInput(m, "key", arg...)
}
func DisplayStoryWeight(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayStory(m, "weight", arg...)
}
func DisplayStoryPie(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayStory(m, "pie", arg...)
}

View File

@ -154,6 +154,8 @@ const (
ETC_CERT_PEM = "etc/cert/cert.pem"
SRC_DOCUMENT = "src/document/"
SRC_PRIVATE = "src/private/"
SRC_MAIN_PNG = "src/main.png"
SRC_OPTION_GO = "src/option.go"
SRC_TEMPLATE = ice.SRC_TEMPLATE
USR_TOOLKITS = ice.USR_TOOLKITS
USR_ICEBERGS = ice.USR_ICEBERGS
@ -162,6 +164,7 @@ const (
USR_LOCAL = ice.USR_LOCAL
USR_LOCAL_WORK = ice.USR_LOCAL_WORK
USR_IMAGE = "usr/image/"
USR_MATERIAL = "usr/material/"
USR_LOCAL_IMAGE = "usr/local/image/"
USR_LEARNING_PORTAL = "usr/learning/portal/"
USR_MODULES = "usr/node_modules/"
@ -191,6 +194,7 @@ const (
SHARE_LOCAL = "/share/local/"
PATHNAME = "pathname"
FILENAME = "filename"
CONTEXTS = "contexts"
TYPE_ALL = "all"
TYPE_BIN = "bin"

View File

@ -24,6 +24,9 @@ func _host_domain(m *ice.Message) string {
}
return ""
},
func() string {
return LOCALHOST
},
)
}
func _host_list(m *ice.Message, name string) *ice.Message {

View File

@ -176,11 +176,14 @@ func init() {
action.Hand = ice.MergeHand(func(m *ice.Message, arg ...string) {
up := Upload(m)
m.Assert(len(up) > 1)
if m.Cmd(CACHE, m.Option(ice.MSG_UPLOAD)).Table(func(value ice.Maps) { m.Options(value) }).Length() == 0 {
msg := m.Cmd(CACHE, m.Option(ice.MSG_UPLOAD))
// if m.Cmd(CACHE, m.Option(ice.MSG_UPLOAD)).Table(func(value ice.Maps) { m.Options(value) }).Length() == 0 {
if msg.Length() == 0 {
SpideCache(m.Spawn(), m.MergeLink(SHARE_CACHE+up[0]))
}
if m.Options(mdb.HASH, up[0], mdb.NAME, up[1]); watch {
m.Cmdy(CACHE, WATCH, m.Option(mdb.HASH), path.Join(m.Option(nfs.PATH), up[1]))
// if m.Options(mdb.HASH, up[0], mdb.NAME, up[1]); watch {
if watch {
m.Cmdy(CACHE, WATCH, up[0], path.Join(msg.Append(nfs.PATH), up[1]))
}
}, action.Hand)
}
@ -188,12 +191,13 @@ func init() {
}
func Upload(m *ice.Message) []string {
if up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)); len(up) == 1 {
if m.Cmdy(CACHE, UPLOAD).Optionv(ice.MSG_UPLOAD, kit.Simple(m.Append(mdb.HASH), m.Append(mdb.NAME), m.Append(nfs.SIZE))); m.Option(ice.MSG_USERPOD) != "" {
if nfs.Exists(m, "usr/local/work/"+m.Option(ice.MSG_USERPOD)) {
m.Cmd(nfs.LINK, path.Join("usr/local/work/"+m.Option(ice.MSG_USERPOD), m.Append(nfs.FILE)), m.Append(nfs.FILE))
m.Cmd(SPACE, m.Option(ice.MSG_USERPOD), CACHE, mdb.CREATE, m.AppendSimple(mdb.NAME, mdb.TEXT, nfs.FILE, nfs.SIZE))
msg := m.Cmd(CACHE, UPLOAD)
if m.Optionv(ice.MSG_UPLOAD, kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))); m.Option(ice.MSG_USERPOD) != "" {
if nfs.Exists(m, nfs.USR_LOCAL_WORK+m.Option(ice.MSG_USERPOD)) {
m.Cmd(nfs.LINK, path.Join(nfs.USR_LOCAL_WORK+m.Option(ice.MSG_USERPOD), msg.Append(nfs.FILE)), msg.Append(nfs.FILE))
m.Cmd(SPACE, m.Option(ice.MSG_USERPOD), CACHE, mdb.CREATE, msg.AppendSimple(mdb.NAME, mdb.TEXT, nfs.FILE, nfs.SIZE))
} else {
m.Cmd(SPACE, m.Option(ice.MSG_USERPOD), SPIDE, ice.DEV, SPIDE_CACHE, http.MethodGet, tcp.PublishLocalhost(m, m.MergeLink(PP(SHARE, CACHE, m.Append(mdb.HASH)))))
m.Cmd(SPACE, m.Option(ice.MSG_USERPOD), SPIDE, ice.DEV, SPIDE_CACHE, http.MethodGet, tcp.PublishLocalhost(m, m.MergeLink(PP(SHARE, CACHE, msg.Append(mdb.HASH)))))
}
}
return kit.Simple(m.Optionv(ice.MSG_UPLOAD))

View File

@ -1,7 +1,6 @@
package web
import (
"net/http"
"os"
"path"
"regexp"
@ -22,7 +21,7 @@ import (
kit "shylinux.com/x/toolkits"
)
func _dream_list(m *ice.Message, simple bool) *ice.Message {
func _dream_list(m *ice.Message) *ice.Message {
list := m.CmdMap(SPACE, mdb.NAME)
mdb.HashSelects(m.Spawn()).Table(func(value ice.Maps, index int, head []string) {
if value[aaa.ACCESS] == aaa.PRIVATE && (m.Option(ice.FROM_SPACE) != "" || !aaa.IsTechOrRoot(m)) {
@ -32,46 +31,35 @@ func _dream_list(m *ice.Message, simple bool) *ice.Message {
value[ice.MAIN] = space[ice.MAIN]
value[mdb.ICONS] = space[mdb.ICONS]
m.Push("", value, kit.Slice(head, 0, -1))
if m.IsCliUA() || simple {
m.Push(mdb.TYPE, space[mdb.TYPE]).Push(cli.STATUS, cli.START)
m.Push(nfs.MODULE, space[nfs.MODULE]).Push(nfs.VERSION, space[nfs.VERSION])
// m.Push(mdb.TEXT, DreamStat(m, value[mdb.NAME]))
m.Push(mdb.TEXT, "")
button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD, OPEN}
kit.If(aaa.IsTechOrRoot(m), func() { button = append(button, cli.STOP) })
m.PushButton(button...)
} else {
msg := gdb.Event(m.Spawn(value, space), DREAM_TABLES)
kit.If(aaa.IsTechOrRoot(m), func() { msg.Copy(m.Spawn().PushButton(cli.STOP)) })
m.Push(mdb.TYPE, space[mdb.TYPE]).Push(cli.STATUS, cli.START)
m.Push(nfs.MODULE, space[nfs.MODULE]).Push(nfs.VERSION, space[nfs.VERSION])
m.Push(mdb.TEXT, space[nfs.MODULE]+"\n"+msg.Append(mdb.TEXT))
m.PushButton(strings.Join(msg.Appendv(ctx.ACTION), ""))
}
m.Push(mdb.TYPE, space[mdb.TYPE]).Push(cli.STATUS, cli.START)
m.Push(nfs.MODULE, space[nfs.MODULE]).Push(nfs.VERSION, space[nfs.VERSION])
button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD}
text := space[nfs.MODULE]
kit.If(m.Option(ice.DREAM_SIMPLE) != ice.TRUE && aaa.IsTechOrRoot(m), func() {
kit.If(m.IsDebug(), func() {
button = append(button, VIMER, STATUS, COMPILE, cli.RUNTIME, XTERM)
text += "\n" + DreamStat(m, value[mdb.NAME])
})
button = append(button, "settings", cli.STOP)
})
m.Push(mdb.TEXT, text)
m.PushButton(append(button, OPEN)...)
} else if aaa.IsTechOrRoot(m) {
m.Push("", value, kit.Slice(head, 0, -1))
m.Push(nfs.MODULE, "").Push(nfs.VERSION, "").Push(mdb.TEXT, "")
if m.Push(mdb.TYPE, WORKER); nfs.Exists(m, path.Join(ice.USR_LOCAL_WORK, value[mdb.NAME])) {
m.Push(cli.STATUS, cli.STOP).Push(nfs.MODULE, "").Push(nfs.VERSION, "").Push(mdb.TEXT, "")
kit.If(aaa.IsTechOrRoot(m), func() { m.PushButton(cli.START, nfs.TRASH) }, func() { m.PushButton() })
m.Push(cli.STATUS, cli.STOP).PushButton(cli.START, nfs.TRASH)
} else {
m.Push(cli.STATUS, cli.BEGIN).Push(nfs.MODULE, "").Push(nfs.VERSION, "").Push(mdb.TEXT, "")
kit.If(aaa.IsTechOrRoot(m), func() { m.PushButton(cli.START, mdb.REMOVE) }, func() { m.PushButton() })
m.Push(cli.STATUS, cli.BEGIN).PushButton(cli.START, mdb.REMOVE)
}
}
})
m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.TIME {
if space, ok := list[m.Appendv(mdb.NAME)[index]]; ok {
value = space[mdb.TIME]
return space[mdb.TIME]
}
}
return value
})
return m
}
func _dream_list_icon(m *ice.Message) {
m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.ICONS {
} else if key == mdb.ICONS {
if kit.HasPrefix(value, HTTP, nfs.PS) {
return value
} else if nfs.ExistsFile(m, path.Join(ice.USR_LOCAL_WORK, m.Appendv(mdb.NAME)[index], value)) {
@ -82,40 +70,42 @@ func _dream_list_icon(m *ice.Message) {
}
return value
})
return m
}
func _dream_list_more(m *ice.Message, simple bool) *ice.Message {
func _dream_list_more(m *ice.Message) *ice.Message {
field := kit.Split(mdb.Config(m, mdb.FIELD) + ",type,status,module,version,text")
m.Cmds(SPACE).Table(func(value ice.Maps) {
value[nfs.REPOS] = "https://" + value[nfs.MODULE]
value[aaa.ACCESS] = kit.Select("", value[aaa.USERROLE], value[aaa.USERROLE] != aaa.VOID)
value[mdb.STATUS] = cli.START
button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD, DREAM, OPEN}
button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD}
kit.If(m.IsDebug(), func() { button = append(button, VIMER, STATUS, COMPILE, cli.RUNTIME, XTERM) })
switch value[mdb.TYPE] {
case SERVER:
value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT])
if simple {
defer m.PushButton(button...)
} else {
msg := gdb.Event(m.Spawn(value), DREAM_TABLES)
defer m.PushButton(strings.Join(msg.Appendv(ctx.ACTION), ""))
}
case ORIGIN:
value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT])
if simple {
defer m.PushButton(button...)
} else if value[aaa.ACCESS] == "" {
defer m.PushButton(PORTAL)
} else {
msg := gdb.Event(m.Spawn(value), DREAM_TABLES)
defer m.PushButton(strings.Join(msg.Appendv(ctx.ACTION), ""))
if m.IsCliUA() {
return
}
value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT])
button = append(button, GETTOKEN, OPEN)
kit.If(value[aaa.ACCESS] == "", func() { button = []ice.Any{PORTAL, OPEN} })
case SERVER:
if !m.IsCliUA() {
value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT])
} else if !strings.HasPrefix(value[mdb.TEXT], ice.HTTP) {
return
}
button = append(button, SETTOKEN, OPEN)
case aaa.LOGIN:
if m.IsCliUA() {
return
}
value[mdb.TEXT] = kit.JoinWord(value[AGENT], value[cli.SYSTEM], value[aaa.IP], kit.Format(PublicIP(m, value[aaa.IP])))
defer m.PushButton(GRANT)
button = []ice.Any{GRANT}
default:
return
}
m.Push("", value, field)
m.PushButton(button...)
})
return m
}
@ -184,7 +174,8 @@ func _dream_binary(m *ice.Message, p string) {
if bin := path.Join(m.Option(cli.CMD_DIR), ice.BIN_ICE_BIN); nfs.Exists(m, bin) {
return
} else if kit.IsUrl(p) || strings.HasPrefix(p, S()) {
m.Cmd(DREAM, DOWNLOAD, bin, p)
// m.Cmd(DREAM, DOWNLOAD, bin, kit.MergeURL2(p, kit.Format("/publish/ice.%s.%s", runtime.GOOS, runtime.GOARCH), ice.POD, m.Option(mdb.NAME)))
m.Cmd(DREAM, DOWNLOAD, bin, kit.MergeURL(p, cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH))
} else {
m.Cmd(nfs.LINK, bin, kit.Path(p))
}
@ -213,6 +204,8 @@ const (
STOPALL = "stopall"
FOR_EACH = "forEach"
FOR_FLOW = "forFlow"
GETTOKEN = "gettoken"
SETTOKEN = "settoken"
DREAM_INPUTS = "dream.inputs"
DREAM_CREATE = "dream.create"
@ -222,7 +215,6 @@ const (
DREAM_STOP = "dream.stop"
DREAM_OPEN = "dream.open"
DREAM_CLOSE = "dream.close"
DREAM_TABLES = "dream.tables"
DREAM_ACTION = "dream.action"
@ -243,66 +235,28 @@ func init() {
每个空间都自带软件开发工具也可以随时编程添加新的功能
`, 200.0)
}},
html.BUTTON: {Hand: func(m *ice.Message, arg ...string) {
mdb.Config(m, html.BUTTON, kit.Join(arg))
}},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if mdb.IsSearchPreview(m, arg) {
mdb.HashSelects(m.Spawn()).Table(func(value ice.Maps) { m.PushSearch(mdb.TYPE, WORKER, mdb.TEXT, m.MergePod(value[mdb.NAME]), value) })
}
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) {
case mdb.CREATE:
switch arg[0] {
case mdb.NAME:
_dream_list(m, true).Cut("name,status,time")
case mdb.ICONS:
mdb.HashInputs(m, arg)
case nfs.REPOS:
defer ctx.DisplayInputKey(m, ctx.STYLE, "_nameicon")
m.Cmd(STORE).Table(func(value ice.Maps) {
m.Spawn().SplitIndex(m.Cmdx(SPIDE, value[mdb.NAME], SPIDE_RAW, http.MethodGet, C(DREAM))).Table(func(value ice.Maps) {
m.PushRecord(value, mdb.ICONS, nfs.REPOS, nfs.VERSION, mdb.NAME)
})
})
case nfs.BINARY:
defer ctx.DisplayInputKey(m, ctx.STYLE, "_nameicon")
m.Cmd(STORE).Table(func(val ice.Maps) {
m.Spawn().SplitIndex(m.Cmdx(SPIDE, val[mdb.NAME], SPIDE_RAW, http.MethodGet, S(), cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH)).Table(func(value ice.Maps) {
m.Push(mdb.ICONS, value[mdb.ICONS])
m.Push(arg[0], val[ORIGIN]+S(value[mdb.NAME])).Push(nfs.SIZE, value[nfs.SIZE]).Push(mdb.TIME, value[mdb.TIME])
})
})
switch arg[0] {
case mdb.NAME:
DreamEach(m, "", kit.Select(cli.START, cli.STOP, m.Option(ctx.ACTION) == STARTALL), func(name string) { m.Push(arg[0], name) })
case tcp.NODENAME:
m.Cmdy(SPACE, m.Option(mdb.NAME), SPACE, ice.INFO).CutTo(mdb.NAME, arg[0])
case aaa.USERNAME:
if aaa.IsTechOrRoot(m) && m.Option(ctx.ACTION) == GRANT {
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK).Option(ice.TABLE_CHECKBOX, ice.FALSE)
} else {
m.Push(arg[0], m.Option(tcp.NODENAME))
m.Push(arg[0], m.Option(ice.MSG_USERNAME))
}
case STARTALL:
DreamEach(m, "", cli.STOP, func(name string) { m.Push(arg[0], name) })
case tcp.SEND:
m.Cmd(SPACE, func(value ice.Maps) {
kit.If(kit.IsIn(value[mdb.TYPE], SERVER), func() { m.Push(arg[0], value[mdb.NAME]) })
})
case nfs.REPOS:
case nfs.BINARY:
default:
switch arg[0] {
case mdb.NAME:
DreamEach(m, "", cli.START, func(name string) { m.Push(arg[0], name) })
case ctx.CMDS:
m.Cmdy(ctx.COMMAND)
case nfs.FILE:
m.Options(nfs.DIR_TYPE, nfs.TYPE_CAT, ice.MSG_FIELDS, nfs.PATH)
m.Cmdy(nfs.DIR, nfs.SRC).Cmdy(nfs.DIR, nfs.ETC).Cmdy(nfs.DIR, "")
case tcp.NODENAME:
m.Cmdy(SPACE, m.Option(mdb.NAME), SPACE, ice.INFO).CutTo(mdb.NAME, tcp.NODENAME)
case aaa.USERNAME:
if aaa.IsTechOrRoot(m) && m.Option(ctx.ACTION) == GRANT {
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK)
m.Option(ice.TABLE_CHECKBOX, ice.FALSE)
} else {
m.Push(arg[0], m.Option(ice.MSG_USERNAME))
m.Push(arg[0], m.Option(tcp.NODENAME))
}
default:
gdb.Event(m, DREAM_INPUTS, arg)
}
gdb.Event(m, DREAM_INPUTS, arg)
}
}},
nfs.SCAN: {Hand: func(m *ice.Message, arg ...string) {
@ -315,12 +269,9 @@ func init() {
}},
mdb.CREATE: {Name: "create name*=hi repos binary", Hand: func(m *ice.Message, arg ...string) {
kit.If(!strings.Contains(m.Option(mdb.NAME), "-") || !strings.HasPrefix(m.Option(mdb.NAME), "20"), func() { m.Option(mdb.NAME, m.Time("20060102-")+m.Option(mdb.NAME)) })
kit.If(mdb.Config(m, nfs.BINARY), func(p string) { m.OptionDefault(nfs.BINARY, p+m.Option(mdb.NAME)) })
kit.If(mdb.Config(m, nfs.REPOS), func(p string) { m.OptionDefault(nfs.REPOS, p+m.Option(mdb.NAME)) })
m.Option(nfs.REPOS, kit.Select("", kit.Split(m.Option(nfs.REPOS)), -1))
if mdb.HashCreate(m); ice.Info.Important == true {
_dream_start(m, m.Option(mdb.NAME))
StreamPushRefreshConfirm(m, m.Trans("refresh for new space ", "刷新列表查看新空间 ")+m.Option(mdb.NAME))
SpaceEvent(m, OPS_DREAM_CREATE, m.Option(mdb.NAME), m.OptionSimple(mdb.NAME, nfs.REPOS, nfs.BINARY)...)
}
}},
@ -348,24 +299,35 @@ func init() {
m.Cmd(SPACE, path.Base(p), cli.RUNTIME, UPGRADE)
return true
}
})
kit.If(m.Option(mdb.NAME) == "", func() { m.Sleep("5s").Cmdy(ROUTE, cli.BUILD).ProcessInner() })
}).Sleep3s()
m.ProcessHold()
}},
PUBLISH: {Name: "publish name", Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD0), m.Option(ice.MSG_USERPOD), m.CommandKey(), m.ActionKey()))
list := []string{cli.LINUX, cli.DARWIN, cli.WINDOWS}
msg := m.Spawn(ice.Maps{ice.MSG_DAEMON: ""})
func() {
if m.Option(mdb.NAME) != "" {
return
}
defer ToastProcess(m, PUBLISH, ice.Info.Pathname)()
m.Cmd(AUTOGEN, BINPACK)
kit.For(list, func(goos string) {
PushNoticeRich(m, mdb.NAME, ice.Info.NodeName, msg.Cmd(COMPILE, goos, cli.AMD64).AppendSimple())
list := []string{cli.AMD64}
kit.If(goos == cli.DARWIN, func() { list = append(list, cli.ARM64) })
kit.For(list, func(arch string) {
PushNoticeRich(m, mdb.NAME, ice.Info.NodeName, msg.Cmd(COMPILE, goos, arch).AppendSimple())
})
})
}()
DreamEach(m, m.Option(mdb.NAME), "", func(name string) {
m.Cmd(SPACE, name, AUTOGEN, BINPACK)
kit.For(list, func(goos string) {
PushNoticeRich(m.Options(ice.MSG_COUNT, "0", ice.LOG_DISABLE, ice.TRUE), mdb.NAME, name, msg.Cmd(SPACE, name, COMPILE, goos, cli.AMD64, kit.Dict(ice.MSG_USERPOD, name)).AppendSimple())
list := []string{cli.AMD64}
kit.If(goos == cli.DARWIN, func() { list = append(list, cli.ARM64) })
kit.For(list, func(arch string) {
PushNoticeRich(m.Options(ice.MSG_COUNT, "0", ice.LOG_DISABLE, ice.TRUE), mdb.NAME, name, msg.Cmd(SPACE, name, COMPILE, goos, arch, kit.Dict(ice.MSG_USERPOD, name)).AppendSimple())
})
})
})
m.ProcessHold()
@ -381,66 +343,46 @@ func init() {
if cb, ok := m.OptionCB("").(func(string) bool); ok && cb(p) {
return
}
defer PushNoticeGrow(msg, "\r\n\r\n\r\n")
PushNoticeGrow(msg, kit.Format("[%s]%s$ %s\r\n", time.Now().Format(ice.MOD_TIME_ONLY), name, m.Option(ice.CMD)))
defer PushNoticeGrow(msg, "\r\n\r\n")
PushNoticeGrow(msg, kit.Format("\033[33m[%s]%s$\033[0m %s\r\n", time.Now().Format(ice.MOD_TIME_ONLY), name, m.Option(ice.CMD)))
m.Cmd(cli.SYSTEM, kit.Split(m.Option(ice.CMD)), kit.Dict(cli.CMD_DIR, p)).Sleep300ms()
})
}},
ctx.CMDS: {Name: "cmds name cmds*", Help: "命令", Icon: "bi bi-terminal", Hand: func(m *ice.Message, arg ...string) {
DreamEach(m, m.Option(mdb.NAME), "", func(name string) {
m.Push(mdb.NAME, name).Push(mdb.TEXT, m.Cmdx(SPACE, name, kit.Split(m.Option(ctx.CMDS))))
}).StatusTimeCount(m.OptionSimple(ctx.CMDS)).ProcessInner()
}},
nfs.FILE: {Name: "file name file*", Help: "文件", Icon: "bi bi-file-earmark-code", Hand: func(m *ice.Message, arg ...string) {
DreamEach(m, m.Option(mdb.NAME), "", func(name string) {
m.Push(mdb.NAME, name).Push(mdb.TEXT, m.Cmdx(SPACE, name, nfs.CAT, m.Option(nfs.FILE)))
}).StatusTimeCount(m.OptionSimple(nfs.FILE)).ProcessInner()
}},
cli.START: {Hand: func(m *ice.Message, arg ...string) {
_dream_start(m, m.Option(mdb.NAME))
gdb.Event(m, DREAM_START, arg)
}},
cli.STOP: {Hand: func(m *ice.Message, arg ...string) {
defer ToastProcess(m)()
gdb.Event(m, DREAM_STOP, arg)
m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT).Sleep3s()
}},
cli.RUNTIME: {Hand: func(m *ice.Message, arg ...string) {
ProcessPodCmd(m, m.Option(mdb.NAME), "", nil, arg...)
}},
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) {
gdb.Event(m, DREAM_TRASH, arg)
nfs.Trash(m, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME)))
}},
nfs.COPY: {Name: "copy to*", Help: "复制", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("", mdb.CREATE, mdb.NAME, m.Option(nfs.TO), nfs.BINARY, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME), ice.BIN_ICE_BIN))
cli.RUNTIME: {Hand: func(m *ice.Message, arg ...string) {
ProcessPodCmd(m, m.Option(mdb.NAME), "", nil, arg...)
}},
tcp.SEND: {Name: "send to*", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE, m.Option(nfs.TO), DREAM, mdb.CREATE, m.OptionSimple(mdb.NAME, mdb.ICONS, nfs.REPOS, nfs.BINARY))
m.Cmd(SPACE, m.Option(nfs.TO), DREAM, cli.START, m.OptionSimple(mdb.NAME))
ProcessIframe(m, "", m.MergePod(kit.Keys(m.Option(nfs.TO), m.Option(mdb.NAME))))
}},
"settings": {Name: "settings restart=manual,always access=public,private", Help: "设置", Style: "danger", Hand: func(m *ice.Message, arg ...string) {
"settings": {Name: "settings restart=manual,always access=public,private", Help: "设置", Style: html.DANGER, Hand: func(m *ice.Message, arg ...string) {
kit.If(m.Option(cli.RESTART) == "manual", func() { m.Option(cli.RESTART, "") })
kit.If(m.Option(aaa.ACCESS) == aaa.PUBLIC, func() { m.Option(aaa.ACCESS, "") })
mdb.HashModify(m, m.OptionSimple(mdb.NAME, cli.RESTART, aaa.ACCESS))
}},
"settoken": {Name: "settoken nodename* username*", Help: "令牌", Style: "danger", Hand: func(m *ice.Message, arg ...string) {
SETTOKEN: {Name: "settoken nodename* username*", Help: "令牌", Style: html.DANGER, Hand: func(m *ice.Message, arg ...string) {
token := m.Cmdx(TOKEN, mdb.CREATE, mdb.TYPE, SERVER, mdb.NAME, m.Option(aaa.USERNAME), mdb.TEXT, m.Option(tcp.NODENAME))
m.Cmd(SPACE, m.Option(mdb.NAME), SPIDE, DEV_CREATE_TOKEN, ice.Maps{CLIENT_NAME: ice.DEV, TOKEN: token})
m.Cmd(SPACE, m.Option(mdb.NAME), SPIDE, DEV_CREATE_TOKEN, ice.Maps{TOKEN: token})
}},
"gettoken": {Help: "令牌", Style: "danger", Hand: func(m *ice.Message, arg ...string) {
GETTOKEN: {Help: "令牌", Style: html.DANGER, Hand: func(m *ice.Message, arg ...string) {
m.Options(m.Cmd(SPIDE, m.Option(mdb.NAME)).AppendSimple()).Cmdy(SPIDE, mdb.DEV_REQUEST)
}},
GRANT: {Name: "grant username", Hand: func(m *ice.Message, arg ...string) {
GRANT: {Name: "grant username", Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
if aaa.IsTechOrRoot(m) && m.Option(aaa.USERNAME) != "" {
m.Option(ice.MSG_USERNAME, m.Option(aaa.USERNAME))
}
m.Cmd(CHAT_GRANT, aaa.CONFIRM, kit.Dict(SPACE, m.Option(mdb.NAME)))
}},
OPEN: {Style: "notice", Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
OPEN: {Style: html.NOTICE, Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
if strings.HasSuffix(m.Option(ice.MAIN), ".portal") || kit.HasPrefixList(arg, ctx.RUN) {
if !kit.HasPrefixList(arg, ctx.RUN) {
defer m.Push(TITLE, m.Option(mdb.NAME))
@ -470,17 +412,15 @@ func init() {
button := []ice.Any{}
if aaa.IsTechOrRoot(m) {
switch m.Option(mdb.TYPE) {
case WORKER:
button = append(button, OPEN, "settings")
case ORIGIN:
button = append(button, DREAM, GETTOKEN)
case SERVER:
button = append(button, DREAM, OPEN, "settoken")
default:
button = append(button, DREAM, OPEN, "gettoken")
button = append(button, DREAM, SETTOKEN)
case WORKER:
button = append(button, "settings")
}
} else {
button = append(button, OPEN)
}
m.PushButton(button...)
m.PushButton(append(button, OPEN)...)
}},
SERVE_START: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range kit.Reverse(kit.Split(mdb.Config(m, html.BUTTON))) {
@ -495,7 +435,7 @@ func init() {
})
}},
STATS_TABLES: {Hand: func(m *ice.Message, arg ...string) {
if msg := _dream_list(m.Spawn(), true); msg.Length() > 0 {
if msg := _dream_list(m.Spawn()); msg.Length() > 0 {
stat := map[string]int{}
msg.Table(func(value ice.Maps) { stat[value[mdb.TYPE]]++; stat[value[mdb.STATUS]]++ })
PushStats(m, kit.Keys(m.CommandKey(), cli.START), stat[cli.START], "", "已启动空间")
@ -507,13 +447,22 @@ func init() {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) {
kit.If(value[mdb.TYPE] == m.ActionKey(), func() { m.PushRecord(value, head...) })
})
m.Sort(mdb.TIME, ice.STR_R)
m.SortStrR(mdb.NAME)
kit.If(len(arg) > 0, func() { m.Cut(arg...) })
}},
SERVER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) {
kit.If(value[mdb.TYPE] == m.ActionKey(), func() { m.PushRecord(value, head...) })
})
m.Sort(mdb.TIME, ice.STR_R)
m.SortStrR(mdb.NAME)
kit.If(len(arg) > 0, func() { m.Cut(arg...) })
}},
WORKER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) {
kit.If(value[mdb.TYPE] == m.ActionKey(), func() { m.PushRecord(value, head...) })
})
m.SortStrR(mdb.NAME)
kit.If(len(arg) > 0, func() { m.Cut(arg...) })
}},
DOWNLOAD: {Name: "download path link", Hand: func(m *ice.Message, arg ...string) {
GoToast(m, func(toast func(string, int, int)) []string {
@ -531,52 +480,35 @@ func init() {
m.Cmd(cli.SYSTEM, cli.GO, "work", "init")
kit.For([]string{".", nfs.USR_RELEASE, nfs.USR_ICEBERGS, nfs.USR_TOOLKITS}, func(p string) { m.Cmd(cli.SYSTEM, cli.GO, "work", "use", p) })
DreamEach(m, m.Option(mdb.NAME), "", func(name string) { m.Cmd(cli.SYSTEM, cli.GO, "work", "use", path.Join(ice.USR_LOCAL_WORK, name)) })
m.Cmdy(nfs.CAT, "go.work")
}},
}, StatsAction(), DreamAction(), DreamTablesAction(), mdb.ImportantHashAction(
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,main,icons,repos,binary,template,restart,access",
html.BUTTON, kit.JoinWord(PORTAL, DESKTOP, ADMIN, WORD, STATUS, VIMER, COMPILE, XTERM, DREAM),
ONLINE, ice.TRUE,
html.BUTTON, kit.JoinWord(PORTAL, DESKTOP, ADMIN, WORD, VIMER, STATUS, COMPILE, XTERM, DREAM),
)), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 {
simple := m.Option(ice.DREAM_SIMPLE) == ice.TRUE || m.Option(ice.MSG_DEBUG) != ice.TRUE
if ice.Info.NodeType != WORKER {
_dream_list(m, simple)
_dream_list_icon(m)
if m.Length() == 0 {
m.EchoInfoButton(m.Trans("please scan or create new dream", "请扫描或创建新空间"), mdb.CREATE, nfs.SCAN)
return
}
if ice.Info.NodeType == WORKER {
return
}
if !m.IsCliUA() && aaa.IsTechOrRoot(m) {
_dream_list_more(m, simple)
} else {
msg := m.Spawn(kit.Dict(ice.MSG_USERROLE, aaa.TECH))
m.Cmds(SPACE).Table(func(value ice.Maps) {
if value[mdb.TYPE] == SERVER {
if p := ProxyDomain(msg, value[mdb.NAME]); p != "" {
value[mdb.TEXT] = p
m.PushRecord(value, mdb.TIME, mdb.TYPE, mdb.NAME, mdb.ICONS, nfs.MODULE, nfs.VERSION, mdb.TEXT)
m.PushButton(PORTAL, DESKTOP)
}
}
})
}
if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) || m.IsCliUA() {
_dream_list(m)
if _dream_list_more(m); !aaa.IsTechOrRoot(m) || m.IsCliUA() {
m.Action()
} else if m.IsDebug() && cli.SystemFindGo(m) {
m.Action(mdb.CREATE, STARTALL, STOPALL, cli.BUILD, PUBLISH)
} else {
m.Action(mdb.CREATE, STARTALL, STOPALL)
}
if m.Length() == 0 {
m.EchoInfoButton(m.Trans("please scan or create new dream", "请扫描或创建新空间"), mdb.CREATE, nfs.SCAN)
return
}
ctx.DisplayTableCard(m)
m.Options(ice.MSG_TOOLKIT, "web.code.compose.insight")
m.Sort("type,status,name", []string{aaa.LOGIN, WORKER, SERVER, ORIGIN}, []string{cli.START, cli.STOP, cli.BEGIN}, ice.STR_R)
m.StatusTimeCountStats(mdb.TYPE, mdb.STATUS)
ctx.DisplayTableCard(m)
kit.If(!aaa.IsTechOrRoot(m), func() { m.Options(ice.MSG_TOOLKIT, "", ice.MSG_ONLINE, ice.FALSE) })
kit.If(!m.IsDebug(), func() { m.Options(ice.MSG_TOOLKIT, "") })
} else if arg[0] == ctx.ACTION {
gdb.Event(m, DREAM_ACTION, arg)
} else {
mdb.HashSelects(m, arg[0]).PushAction(PORTAL, DESKTOP, ADMIN, OPEN, mdb.REMOVE)
m.Cmdy(arg[1], DREAM_ACTION, arg)
// gdb.Event(m, DREAM_ACTION, arg)
}
}},
})

View File

@ -119,7 +119,7 @@ func init() {
}},
}, ctx.ConfAction(
mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version,access",
ctx.TOOLS, kit.Simple(VERSION), ONLINE, ice.TRUE, cli.TIMEOUT, "10s",
ctx.TOOLS, kit.Simple("web.code.compose.insight", VERSION), ONLINE, ice.TRUE, cli.TIMEOUT, "10s",
)), Hand: func(m *ice.Message, arg ...string) {
if kit.HasPrefixList(arg, ctx.ACTION) {
_matrix_action(m, arg[1], arg[2:]...)

View File

@ -15,7 +15,7 @@ import (
)
func UserWeb(m *ice.Message) *url.URL {
return kit.ParseURL(m.Option(ice.MSG_USERWEB))
return kit.ParseURL(m.OptionDefault(ice.MSG_USERWEB, "http://localhost:9020"))
}
func UserHost(m *ice.Message) string {
if p := m.Option(ice.MSG_USERHOST); p != "" {

View File

@ -75,14 +75,17 @@ func Render(m *ice.Message, cmd string, args ...ice.Any) bool {
res := m.Cmdx(nfs.CAT, arg[0])
fieldset := "fieldset." + m.Option(ctx.INDEX)
m.W.Write([]byte(kit.ReplaceAll(res,
"$content", fieldset+">div.output>div.layout>div.layout>div.content",
"$profile", fieldset+">div.output>div.layout>div.layout>div.profile",
"$display", fieldset+">div.output>div.layout>div.display",
"$project", fieldset+">div.output>div.project",
"$option", fieldset+">form.option",
"$action", fieldset+">div.action",
"$output", fieldset+">div.output",
"$project", fieldset+">div.output>div.project",
"$display", fieldset+">div.output>div.layout>div.display",
"$profile", fieldset+">div.output>div.layout>div.layout>div.profile",
"$content", fieldset+">div.output>div.layout>div.layout>div.content",
"$fieldset", fieldset, "$index", m.Option(ctx.INDEX),
"$status", fieldset+">div.status",
"$fieldset", fieldset,
"$body", "body.cmd."+m.Option(ctx.INDEX),
"$index", m.Option(ctx.INDEX),
"$input", "body>div.input.float."+m.Option(ctx.INDEX),
)))
break
@ -169,7 +172,7 @@ func RenderPodCmd(m *ice.Message, pod, cmd string, arg ...ice.Any) {
m.Option(mdb.ICONS, msg.Option(ice.MSG_NODEICON))
}
m.OptionDefault(mdb.ICONS, m.Resource(kit.Select(ice.Info.NodeIcon, msg.Option(ice.MSG_NODEICON), msg.Append(mdb.ICONS))))
serve := kit.Select("localhost:9020", UserWeb(m).Host)
serve := strings.Split(UserHost(m), "://")[1]
pod = kit.Select(pod, msg.Option(ice.MSG_NODENAME), m.Option(ice.MSG_USERPOD) != "")
m.OptionDefault(TITLE, kit.Select(cmd, msg.Append(mdb.HELP), !m.IsEnglish())+" "+kit.Select(serve, pod))
RenderCmds(m, kit.Dict(msg.AppendSimple(), ctx.ARGS, kit.Simple(arg), ctx.DISPLAY, m.Option(ice.MSG_DISPLAY)))

View File

@ -35,10 +35,6 @@ func _serve_start(m *ice.Message) {
}).Sleep(cli.TIME_1s)
cli.NodeInfo(m, kit.Select(kit.Split(ice.Info.Hostname, nfs.PT)[0], m.Option(tcp.NODENAME)), SERVER, mdb.Config(m, mdb.ICONS))
kit.If(ice.HasVar(), func() { m.Cmd(nfs.SAVE, ice.VAR_LOG_ICE_PORT, m.Option(tcp.PORT)) })
m.Spawn(ice.Maps{TOKEN: ""}).Start("", m.OptionSimple(tcp.HOST, tcp.PORT)...)
if m.Cmd(tcp.HOST).Length() == 0 {
return
}
kit.For(kit.Split(m.Option(ice.DEV)), func(dev string) {
if strings.HasPrefix(dev, HTTP) {
m.Cmd(SPIDE, mdb.CREATE, dev, ice.DEV, "", nfs.REPOS)
@ -47,12 +43,16 @@ func _serve_start(m *ice.Message) {
}
if msg := m.Cmd(SPIDE, dev); msg.Append(TOKEN) == "" {
if m.Option(TOKEN) != "" {
m.Sleep300ms(SPACE, tcp.DIAL, ice.DEV, dev, TOKEN, m.Option(TOKEN))
m.Cmd(SPACE, tcp.DIAL, ice.DEV, dev, TOKEN, m.Option(TOKEN))
} else {
m.Sleep300ms(SPACE, tcp.DIAL, ice.DEV, dev)
m.Cmd(SPACE, tcp.DIAL, ice.DEV, dev)
}
}
})
m.Spawn(ice.Maps{TOKEN: ""}).Start("", m.OptionSimple(tcp.HOST, tcp.PORT)...)
if m.Cmd(tcp.HOST).Length() == 0 {
return
}
}
func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
const (
@ -65,6 +65,10 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
} else {
return true
}
func() {
defer InfoLock.Lock()()
Info.ServeMainCount++
}()
if ip := r.Header.Get(X_REAL_IP); ip != "" {
if r.Header.Set(ice.MSG_USERIP, ip); r.Header.Get(X_REAL_PORT) != "" {
r.Header.Set(ice.MSG_USERADDR, ip+nfs.DF+r.Header.Get(X_REAL_PORT))
@ -214,6 +218,20 @@ func _serve_handle(key string, cmd *ice.Command, m *ice.Message, w http.Response
} else {
m.CmdHand(cmd, key, cmds...)
}
func() {
defer InfoLock.Lock()()
Info.Commands[kit.Select(kit.Select("", cmds, 0), m.Option(ice.MSG_INDEX))]++
switch r.Method {
case http.MethodGet:
Info.ServeGetCount++
case http.MethodPut:
Info.ServePutCount++
case http.MethodPost:
Info.ServePostCount++
case http.MethodDelete:
Info.ServeDeleteCount++
}
}()
}
}
func _serve_domain(m *ice.Message) string {
@ -274,11 +292,13 @@ const SERVE = "serve"
func init() {
Index.MergeCommands(ice.Commands{P(ice.EXIT): {Hand: func(m *ice.Message, arg ...string) { m.Cmd(ice.EXIT) }},
SERVE: {Name: "serve port auto main host system", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.MAIN: {Name: "main index", Help: "首页", Hand: func(m *ice.Message, arg ...string) {
ice.MAIN: {Name: "main index space", Help: "首页", Hand: func(m *ice.Message, arg ...string) {
if m.Option(ctx.INDEX) == "" {
mdb.Config(m, ice.MAIN, "")
} else {
} else if m.Option(SPACE) == "" {
mdb.Config(m, ice.MAIN, C(m.Option(ctx.INDEX)))
} else {
mdb.Config(m, ice.MAIN, S(m.Option(SPACE))+C(m.Option(ctx.INDEX)))
}
}},
mdb.ICONS: {Hand: func(m *ice.Message, arg ...string) { mdb.Config(m, mdb.ICONS, arg[0]) }},
@ -310,11 +330,14 @@ func init() {
ice.Info.Important = ice.HasVar()
}},
PROXY_CONF: {Name: "proxyConf name* port host path", Hand: func(m *ice.Message, arg ...string) {
if dir := m.OptionDefault(nfs.PATH, PROXY_PATH, tcp.HOST, "127.0.0.1", tcp.PORT, tcp.PORT_9020); true || nfs.Exists(m, dir) {
for _, p := range []string{"server.conf", "location.conf", "upstream.conf"} {
if dir := m.OptionDefault(nfs.PATH, PROXY_PATH, tcp.HOST, "127.0.0.1", tcp.PORT, tcp.PORT_9020); nfs.Exists(m, dir) {
for _, p := range []string{"upstream.conf"} {
m.Cmd(nfs.SAVE, kit.Format("%s/conf/portal/%s/%s", dir, m.Option(mdb.NAME), p), m.Template(p)+lex.NL)
}
m.Cmd(cli.SYSTEM, "sudo", kit.Path("usr/local/daemon/10000/sbin/nginx"), "-p", kit.Path("usr/local/daemon/10000/"), "-s", "reload")
for _, p := range []string{"server.conf", "location.conf"} {
m.Cmd(nfs.DEFS, kit.Format("%s/conf/portal/%s/%s", dir, m.Option(mdb.NAME), p), m.Template(p)+lex.NL)
}
m.Cmd(cli.SYSTEM, cli.SUDO, kit.Path(dir, "sbin/nginx"), "-p", kit.Path(dir), "-s", "reload")
}
}},
}, gdb.EventsAction(SERVE_START), mdb.HashAction(

View File

@ -91,7 +91,8 @@ func init() {
ctx.RUN: {Hand: func(m *ice.Message, arg ...string) {
if msg := mdb.HashSelects(m.Spawn(), m.Option(SHARE)); !IsNotValidFieldShare(m, msg) {
aaa.SessAuth(m, kit.Dict(msg.AppendSimple(aaa.USERNICK, aaa.USERNAME, aaa.USERROLE)))
m.Cmdy(Space(m, msg.Append(SPACE)), msg.Append(mdb.NAME), kit.UnMarshal(msg.Append(mdb.TEXT)), arg[1:], kit.Dict(ice.MSG_USERPOD, msg.Append(SPACE)))
// m.Cmdy(Space(m, msg.Append(SPACE)), msg.Append(mdb.NAME), kit.UnMarshal(msg.Append(mdb.TEXT)), arg[1:], kit.Dict(ice.MSG_USERPOD, msg.Append(SPACE)))
m.Cmdy(Space(m, msg.Append(SPACE)), msg.Append(mdb.NAME), arg[1:], kit.Dict(ice.MSG_USERPOD, msg.Append(SPACE)))
}
}},
nfs.PS: {Hand: func(m *ice.Message, arg ...string) {
@ -118,7 +119,11 @@ func init() {
RenderCookie(m, aaa.SessCreate(m, msg.Append(aaa.USERNAME)))
m.RenderRedirect(m.MergeLink(kit.Select(nfs.PS, msg.Append(mdb.TEXT)), msg.AppendSimple(RIVER, STORM)))
case FIELD:
RenderPodCmd(m, msg.Append(SPACE), msg.Append(mdb.NAME), kit.UnMarshal(msg.Append(mdb.TEXT)))
if msg.Append(mdb.NAME) == "web.chat.grant" {
RenderPodCmd(m, "", msg.Append(mdb.NAME), kit.UnMarshal(msg.Append(mdb.TEXT)))
} else {
RenderPodCmd(m, msg.Append(SPACE), msg.Append(mdb.NAME), kit.UnMarshal(msg.Append(mdb.TEXT)))
}
case DOWNLOAD:
m.RenderDownload(msg.Append(mdb.TEXT))
default:

View File

@ -23,8 +23,26 @@ import (
"shylinux.com/x/icebergs/base/web/html"
"shylinux.com/x/icebergs/misc/websocket"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/task"
)
var Info = struct {
ServeMainCount int
ServeGetCount int
ServePutCount int
ServePostCount int
ServeDeleteCount int
SpaceCmdCount int
SpaceReadCount int
SpaceReadByte int
SpaceWriteCount int
SpaceWriteByte int
Commands map[string]int
}{
Commands: map[string]int{},
}
var InfoLock = &task.Lock{}
func _space_qrcode(m *ice.Message, dev string) {
ssh.PrintQRCode(m, m.Cmdv(SPACE, dev, cli.PWD, mdb.LINK))
}
@ -80,6 +98,7 @@ func _space_fork(m *ice.Message) {
if msg := m.Cmd(TOKEN, m.Option(TOKEN)); msg.Append(mdb.TIME) > m.Time() && kit.IsIn(msg.Append(mdb.TYPE), SERVER, SPIDE) {
aaa.SessAuth(m, kit.Dict(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME, msg.Append(mdb.NAME))).AppendSimple()))
name = SpaceName(kit.Select(name, msg.Append(mdb.TEXT)))
// kit.If(ProxyDomain(m.Spawn(kit.Dict(ice.MSG_USERROLE, aaa.TECH)), name), func(p string) { text = p })
kit.If(ProxyDomain(m, name), func(p string) { text = p })
safe = aaa.IsTechOrRoot(m)
}
@ -127,6 +146,11 @@ func _space_handle(m *ice.Message, safe bool, name string, c *websocket.Conn) {
if e != nil {
break
}
func() {
defer InfoLock.Lock()()
Info.SpaceReadCount++
Info.SpaceReadByte += len(b)
}()
msg := m.Spawn(b)
if safe && msg.Option(ice.MSG_UNSAFE) != ice.TRUE { // 下行权限
if !aaa.IsTechOrRoot(msg) && msg.Option(ice.MSG_HANDLE) != ice.TRUE {
@ -208,6 +232,11 @@ func _space_exec(m *ice.Message, name string, source, target []string, c *websoc
if m.IsErr() {
return
}
func() {
defer InfoLock.Lock()()
Info.SpaceCmdCount++
Info.Commands[kit.Select(kit.Select("", m.Detailv(), 0), m.Option(ice.MSG_INDEX))]++
}()
m.Options(ice.MSG_ARGS, "", ice.MSG_COUNT, "0")
kit.If(m.Option(ice.MSG_DAEMON), func(p string) {
m.Option(ice.MSG_DAEMON0, m.Option(ice.MSG_DAEMON))
@ -229,6 +258,11 @@ func _space_echo(m *ice.Message, source, target []string, c *websocket.Conn) {
m.Options(ice.MSG_SOURCE, source, ice.MSG_TARGET, target[1:])
data := m.FormatMeta()
if !m.WarnNotValid(c.WriteMessage(1, []byte(data))) {
func() {
defer InfoLock.Lock()()
Info.SpaceWriteCount++
Info.SpaceWriteByte += len(data)
}()
if source != nil {
m.Log(kit.Select(tcp.SEND, tcp.DONE, m.Option(ice.MSG_HANDLE) == ice.TRUE), "%d %v->%v %v %v", len(data), source, target,
kit.ReplaceAll(kit.Format("%v", m.Detailv()), "\r\n", "\\r\\n", "\t", "\\t", "\n", "\\n"), data)
@ -462,7 +496,7 @@ func init() {
m.Cmdy(arg[1:])
return
}
if kit.IsIn(arg[0], "", ice.CONTEXTS, ice.Info.NodeName) {
if kit.IsIn(arg[0], "", ice.Info.NodeName) {
m.Cmdy(arg[1:])
return
}

View File

@ -40,7 +40,7 @@ func _spide_create(m *ice.Message, link, types, name, icons, token string) {
}
func _spide_show(m *ice.Message, name string, arg ...string) {
file := ""
action, arg := _spide_args(m, arg, SPIDE_RAW, SPIDE_DETAIL, SPIDE_MSG, SPIDE_SAVE, SPIDE_CACHE)
action, arg := _spide_args(m, arg, SPIDE_RAW, SPIDE_DETAIL, SPIDE_MSG, SPIDE_SAVE, SPIDE_CACHE, SPIDE_STREAM)
kit.If(action == SPIDE_SAVE, func() { file, arg = arg[0], arg[1:] })
msg := mdb.HashSelects(m.Spawn(), name)
method, arg := _spide_args(m, arg, http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete)
@ -214,6 +214,19 @@ func _spide_save(m *ice.Message, action, file, uri string, res *http.Response) {
case SPIDE_CACHE:
m.Cmdy(CACHE, DOWNLOAD, res.Header.Get(html.ContentType), uri, kit.Dict(RESPONSE, res), m.OptionCB(SPIDE))
m.Echo(m.Append(mdb.HASH))
case SPIDE_STREAM:
cb, ok := m.Optionv(SPIDE_STREAM).(func(string))
if !ok {
cb = func(text string) { PushNoticeGrow(m, m.Option("which"), text) }
}
b := make([]byte, 1024)
for {
if n, e := res.Body.Read(b); e != nil {
break
} else {
cb(string(b[:n]))
}
}
default:
var data ice.Any
if b, e := ioutil.ReadAll(res.Body); !m.WarnNotFound(e) {
@ -232,6 +245,7 @@ const (
SPIDE_MSG = "msg"
SPIDE_SAVE = "save"
SPIDE_CACHE = "cache"
SPIDE_STREAM = "stream"
SPIDE_BODY = "body"
SPIDE_FORM = "form"
@ -331,22 +345,22 @@ func init() {
default:
switch arg[0] {
case mdb.NAME, mdb.ICONS:
m.SplitIndex(m.Cmdx(SPIDE, ice.DEV, kit.MergeURL2(m.Option(ORIGIN), C(SPACE, "info")))).Cut(arg[0])
m.SplitIndex(m.Cmdx(SPIDE, ice.DEV, kit.MergeURL2(m.Option(ORIGIN), C(SPACE, ice.INFO)))).Cut(arg[0])
mdb.HashInputs(m, arg)
default:
mdb.HashSelectValue(m.Spawn(), func(value ice.Map) {
m.Push(kit.Select(ORIGIN, arg, 0), kit.Value(value, kit.Keys("client", arg[0])))
})
kit.If(arg[0] == mdb.TYPE, func() { m.Push(arg[0], nfs.REPOS) })
m.Sort(arg[0])
}
}
}},
mdb.CREATE: {Name: "create origin* name icons type token", Hand: func(m *ice.Message, arg ...string) {
if m.Option(mdb.NAME) == "" || m.Option(mdb.ICONS) == "" {
if m.Option(mdb.TYPE) == nfs.REPOS && (m.Option(mdb.NAME) == "" || m.Option(mdb.ICONS) == "") {
msg := m.Spawn().SplitIndex(m.Cmdx(SPIDE, ice.DEV, kit.MergeURL2(m.Option(ORIGIN), C(SPACE, ice.INFO))))
if m.OptionDefault(mdb.NAME, msg.Append(mdb.NAME)); msg.Append(mdb.ICONS) != "" {
m.OptionDefault(mdb.ICONS, m.Resource(msg.Append(mdb.ICONS), msg.Append(ORIGIN)))
m.OptionDefault(mdb.TYPE, nfs.REPOS)
}
}
if u, e := url.Parse(m.Option(ORIGIN)); m.WarnNotValid(e != nil || u.Host == "", m.Option(ORIGIN)) {
@ -374,8 +388,9 @@ func init() {
mdb.HashModify(m, mdb.NAME, m.Option(CLIENT_NAME), TOKEN, "")
}},
DEV_CREATE_TOKEN: {Hand: func(m *ice.Message, arg ...string) {
m.OptionDefault(CLIENT_NAME, m.Option(ice.FROM_SPACE))
mdb.HashModify(m, m.OptionSimple(CLIENT_NAME, TOKEN))
m.Cmd(SPACE, tcp.DIAL, ice.DEV, m.Option(CLIENT_NAME), m.OptionSimple(TOKEN)).Sleep300ms()
m.Cmd(SPACE, tcp.DIAL, m.Option(CLIENT_NAME)).Sleep300ms()
}},
DEV_REQUEST_TEXT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(SpaceName(ice.Info.NodeName)) }},
}, DevTokenAction(CLIENT_NAME, CLIENT_URL), mdb.ImportantHashAction(mdb.SHORT, CLIENT_NAME, mdb.FIELD, "time,icons,client.name,client.url,client.type,token")), Hand: func(m *ice.Message, arg ...string) {
@ -416,8 +431,17 @@ func init() {
return kit.Format(mdb.Cache(ice.Pulse, p, func() ice.Any { return m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, p) }))
} else if p == "" {
return ""
} else {
} else if nfs.Exists(m, p) {
return m.Cmdx(nfs.CAT, p)
} else if strings.Contains(p, "/pkg/mod/") {
ls := strings.Split(p, "/pkg/mod/")
return kit.Format(mdb.Cache(ice.Pulse, p, func() ice.Any { return m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, nfs.REQUIRE+ls[1]) }))
} else if strings.Contains(p, "/usr/local/work/") {
ls := strings.Split(strings.Split(p, "/usr/local/work/")[1], "/src/")
pp := kit.MergeURL2(ice.Info.Make.Domain, "/p/src/"+ls[1]+"?pod="+ls[0])
return kit.Format(mdb.Cache(ice.Pulse, p, func() ice.Any { return m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, pp) }))
} else {
return ""
}
}
nfs.TemplatePath = func(m *ice.Message, arg ...string) string {
@ -502,7 +526,12 @@ func HostPort(m *ice.Message, host, port string, arg ...string) string {
kit.If(kit.Select("", arg, 1), func(cmd string) { p += C(cmd) })
}
kit.If(m.Option(ice.LOG_DEBUG) == ice.TRUE, func() { p += "?debug=true" })
kit.If(host == "", func() { host = kit.ParseURL(UserHost(m)).Hostname() })
kit.If(host == "", func() {
if u := kit.ParseURL(UserHost(m)); u != nil {
host = u.Hostname()
}
})
host = kit.Select("localhost", host)
if port == tcp.PORT_443 {
return kit.Format("https://%s", host) + p
} else if port == tcp.PORT_80 {

View File

@ -22,13 +22,25 @@ func init() {
同样的每个用户也可以添加任意多个商店直接将空间下载到本机使用
`, 300.0)
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SPIDE, mdb.INPUTS, arg) }},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case ORIGIN:
m.Cmd(BROAD).Table(func(value ice.Maps) {
m.Push(arg[0], HostPort(m, value[tcp.HOST], value[tcp.PORT]))
})
}
m.Cmdy(SPIDE, mdb.INPUTS, arg)
}},
mdb.CREATE: {Name: "create origin* name icons", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPIDE, mdb.CREATE, m.OptionSimple("origin,name,icons"), mdb.TYPE, nfs.REPOS)
}},
mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPIDE, mdb.REMOVE, CLIENT_NAME, m.Option(mdb.NAME))
}},
tcp.DIAL: {Hand: func(m *ice.Message, arg ...string) {
m.Options(m.Cmd(SPIDE, m.Option(mdb.NAME)).AppendSimple())
m.Cmdy(SPIDE, mdb.DEV_REQUEST)
}},
INSTALL: {Name: "install name*", Hand: func(m *ice.Message, arg ...string) {
if !kit.HasPrefixList(arg, ctx.RUN) {
m.Cmdy(DREAM, mdb.CREATE, m.OptionSimple(mdb.NAME, nfs.REPOS, nfs.BINARY))
@ -39,12 +51,6 @@ func init() {
PORTAL: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
ProcessIframe(m, m.Option(mdb.NAME), m.Option(ORIGIN)+S(m.Option(mdb.NAME))+C(m.ActionKey()), arg...)
}},
DESKTOP: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
ProcessIframe(m, kit.Keys(m.Option(mdb.NAME), m.ActionKey()), S(m.Option(mdb.NAME))+C(m.ActionKey()), arg...)
}},
ADMIN: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
ProcessIframe(m, kit.Keys(m.Option(mdb.NAME), m.ActionKey()), S(m.Option(mdb.NAME))+C(m.ActionKey()), arg...)
}},
OPEN: {Hand: func(m *ice.Message, arg ...string) {
if m.Option(mdb.TYPE) == ORIGIN {
m.ProcessOpen(m.Option(ORIGIN))
@ -52,10 +58,6 @@ func init() {
m.ProcessOpen(S(m.Option(mdb.NAME)))
}
}},
"connect": {Help: "连接", Hand: func(m *ice.Message, arg ...string) {
m.Options(m.Cmd(SPIDE, m.Option(mdb.NAME)).AppendSimple())
m.Cmdy(SPIDE, mdb.DEV_REQUEST)
}},
}, ctx.ConfAction(CLIENT_TIMEOUT, cli.TIME_3s), DREAM), Hand: func(m *ice.Message, arg ...string) {
if kit.HasPrefixList(arg, ctx.ACTION) {
m.Cmdy(DREAM, arg)
@ -64,20 +66,18 @@ func init() {
m.Cmd(SPIDE, arg, kit.Dict(ice.MSG_FIELDS, "time,icons,client.type,client.name,client.origin")).Table(func(value ice.Maps) {
kit.If(value[CLIENT_TYPE] == nfs.REPOS && value[CLIENT_NAME] != ice.SHY, func() {
kit.If(value[CLIENT_NAME] == ice.OPS, func() { value[CLIENT_ORIGIN] = UserHost(m) })
m.Push(mdb.TYPE, ORIGIN)
m.Push(mdb.NAME, value[CLIENT_NAME]).Push(mdb.ICONS, value[mdb.ICONS]).Push(ORIGIN, value[CLIENT_ORIGIN])
m.Push(mdb.TYPE, ORIGIN).Push(mdb.NAME, value[CLIENT_NAME]).Push(mdb.ICONS, value[mdb.ICONS]).Push(ORIGIN, value[CLIENT_ORIGIN])
if _, ok := list[value[CLIENT_NAME]]; ok || kit.IsIn(value[CLIENT_NAME], ice.OPS, ice.DEV) {
m.Push("exists", ice.TRUE)
m.Push(mdb.STATUS, ice.TRUE)
} else {
m.Push("exists", ice.FALSE)
m.Push(mdb.STATUS, ice.FALSE)
}
})
})
m.SortStrR(mdb.NAME)
if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) {
if m.SortStrR(mdb.NAME); ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) {
m.Action()
} else {
m.PushAction(OPEN, "connect", mdb.REMOVE).Action(mdb.CREATE)
m.PushAction(OPEN, tcp.DIAL, mdb.REMOVE).Action(mdb.CREATE)
}
} else {
defer ToastProcess(m, ice.LIST, arg[0])()
@ -89,36 +89,40 @@ func init() {
origin := SpideOrigin(m, arg[0])
kit.If(origin == "", func() { arg[0], origin, dream = ice.DEV, arg[0], arg[0]+dream })
// if kit.IsIn(kit.ParseURL(origin).Hostname(), append(m.Cmds(tcp.HOST).Appendv(aaa.IP), tcp.LOCALHOST)...) {
if kit.IsIn(kit.ParseURL(origin).Hostname(), tcp.LOCALHOST) {
origin = m.Option(ice.MSG_USERHOST)
} else {
origin = tcp.PublishLocalhost(m, origin)
}
// if kit.IsIn(kit.ParseURL(origin).Hostname(), tcp.LOCALHOST) {
// origin = m.Option(ice.MSG_USERHOST)
// } else {
// origin = tcp.PublishLocalhost(m, origin)
// }
// origin = tcp.PublishLocalhost(m, origin)
stat := map[string]int{}
list := m.Spawn(ice.Maps{ice.MSG_FIELDS: ""}).CmdMap(SPACE, mdb.NAME)
m.SetAppend().Spawn().SplitIndex(m.Cmdx(SPIDE, arg[0], dream, kit.Dict(mdb.ConfigSimple(m, CLIENT_TIMEOUT)))).Table(func(value ice.Maps) {
if value[mdb.TYPE] == ORIGIN {
return
}
stat[value[mdb.TYPE]]++
// if value[nfs.BINARY] == "" {
value[nfs.BINARY] = origin + S(value[mdb.NAME])
// }
if value[nfs.BINARY] == "" {
value[nfs.BINARY] = origin + S(value[mdb.NAME])
}
m.Push("", value, kit.Split("time,type,name,icons,repos,binary,module,version"))
if _, ok := list[value[mdb.NAME]]; ok {
m.Push("exists", ice.TRUE)
m.Push(mdb.STATUS, ice.TRUE)
} else {
m.Push("exists", ice.FALSE)
m.Push(mdb.STATUS, ice.FALSE)
}
if value[mdb.TYPE] == SERVER {
m.Push(mdb.TEXT, value[mdb.TEXT]).Push(ORIGIN, value[mdb.TEXT]).PushButton()
return
}
m.Push(mdb.TEXT, value[nfs.REPOS]).Push(ORIGIN, origin)
if _, ok := list[value[mdb.NAME]]; ok || arg[0] == ice.OPS {
m.PushButton(PORTAL, INSTALL)
} else if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) {
m.PushButton(PORTAL)
} else {
m.PushButton(PORTAL, INSTALL)
button := []ice.Any{PORTAL}
if _, ok := list[value[mdb.NAME]]; ok {
button = append(button, OPEN)
} else if aaa.IsTechOrRoot(m) {
button = append(button, INSTALL)
}
m.PushButton(button...)
})
m.StatusTimeCount(ORIGIN, origin, stat)
}

View File

@ -6,7 +6,7 @@ Volcanos(chat.ONIMPORT, {
},
_project: function(can, msg, dev, target) {
msg.Table(function(value) { if (value.type == web.WORKER) { return }
value.nick = [{text: value.name}, value.exists == "true" && {text: ["●", "", "exists"]}]
value.nick = [{text: value.name}, value.status == "true" && {text: ["●", "", "exists"]}]
value._hash = dev.concat([value.name]).join(":"), value._select = can.base.beginWith(can.db.hash.join(":"), value._hash)
value.icons = can.misc.Resource(can, value.icons||"usr/icons/icebergs.png", "", value.origin)
can.onimport.itemlist(can, [value], function(event, item, show, target) {

View File

@ -25,7 +25,7 @@ func init() {
}
})
}},
}, mdb.ExportHashAction(mdb.SHORT, mdb.UNIQ, mdb.EXPIRE, mdb.MONTH, html.CHECKBOX, ice.TRUE)), Hand: func(m *ice.Message, arg ...string) {
}, mdb.HashAction(mdb.SHORT, mdb.UNIQ, mdb.EXPIRE, mdb.MONTH, html.CHECKBOX, ice.TRUE)), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) > 0 {
m.EchoScript(kit.MergeURL2(m.Option(ice.MSG_USERWEB), nfs.PS, TOKEN, arg[0]))
} else {

19
conf.go
View File

@ -28,6 +28,7 @@ const (
MAIL = "mail"
HELP = "help"
INFO = "info"
SHOW = "show"
MAIN = "main"
AUTO = "auto"
LIST = "list"
@ -61,15 +62,15 @@ const (
)
const ( // REPOS
CONTEXTOS = "ContextOS"
CONTEXTS = "contexts"
INTSHELL = "intshell"
LEARNING = "learning"
VOLCANOS = "volcanos"
TOOLKITS = "toolkits"
ICEBERGS = "icebergs"
RELEASE = "release"
MATRIX = "matrix"
ICONS = "icons"
// CONTEXTS = "contexts"
INTSHELL = "intshell"
LEARNING = "learning"
VOLCANOS = "volcanos"
TOOLKITS = "toolkits"
ICEBERGS = "icebergs"
RELEASE = "release"
MATRIX = "matrix"
ICONS = "icons"
INSTALL = "install"
REQUIRE = "require"

View File

@ -164,7 +164,12 @@ func init() {
}
m.Option(aaa.LANGUAGE, strings.ReplaceAll(strings.ToLower(kit.Select("", kit.Split(kit.GetValid(
func() string { return kit.Select("", "zh-cn", strings.Contains(m.Option(ice.MSG_USERUA), "zh_CN")) },
func() string { return kit.Select("", kit.Split(m.R.Header.Get(html.AcceptLanguage), ",;"), 0) },
func() string {
if m.R != nil {
return kit.Select("", kit.Split(m.R.Header.Get(html.AcceptLanguage), ",;"), 0)
}
return ""
},
func() string { return ice.Info.Lang },
), " ."), 0)), "_", "-"))
m.Option("language.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.LANGUAGE)+nfs.PS, nfs.FILE).Appendv(nfs.FILE))
@ -194,5 +199,7 @@ func init() {
})
}
func AddHeaderLogin(m *ice.Message, types, name, help, order string, arg ...string) {
m.Cmd(web.CHAT_HEADER, mdb.CREATE, mdb.TYPE, types, mdb.NAME, name, mdb.HELP, help, mdb.ORDER, order, arg)
m.Cmd(web.SPACE, ice.OPS, web.CHAT_HEADER, mdb.CREATE, mdb.TYPE, types, mdb.NAME, name, mdb.HELP, help, mdb.ORDER, order,
web.SPACE, m.Option(ice.MSG_USERPOD), ctx.INDEX, m.PrefixKey(), arg,
)
}

View File

@ -65,7 +65,10 @@ func init() {
kit.If(m.Option(mdb.TYPE) == web.LINK, func() { ctx.ProcessField(m, m.ShortKey(), m.Option(mdb.TEXT)) })
}},
}, FavorAction(), mdb.HashAction(mdb.SHORT, web.LINK, mdb.FIELD, "time,hash,type,name,link")), Hand: func(m *ice.Message, arg ...string) {
list := []string{m.MergePodCmd("", web.PORTAL), m.MergePodCmd("", web.ADMIN)}
list := []string{m.MergePodCmd("", web.PORTAL), m.MergePodCmd("", web.ADMIN), m.MergePodCmd("", web.DESKTOP)}
m.Cmd(web.SPACE).Table(func(value ice.Maps) {
kit.If(kit.IsIn(value[mdb.TYPE], web.WORKER, web.SERVER), func() { list = append(list, m.MergePod(value[mdb.NAME])) })
})
if mdb.HashSelect(m, arg...); len(arg) == 0 {
for _, link := range list {
if u := kit.ParseURL(link); u != nil {

View File

@ -6,7 +6,7 @@ Volcanos(chat.ONIMPORT, {
can.sup.onexport.link = function() { return can.misc.MergeURL(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD), cmd: web.DESKTOP}) }
can.onexport.title(can, can.ConfHelp(), can.user.titles)
},
_menu: function(can) { can.onappend.plugin(can, {index: "web.chat.macos.menu", style: html.OUTPUT}, function(sub) { can.ui.menu = sub, sub._desktop = can
_menu: function(can) { can.onappend.plugin(can, {index: "web.chat.macos.menu", style: html.OUTPUT, title: can.Conf("title")}, function(sub) { can.ui.menu = sub, sub._desktop = can
var tabs = can.misc.sessionStorage(can, [can.ConfIndex(), html.TABS])
sub.onexport.output = function() { can.onimport._desktop(can, can._msg)
var sess = can.misc.SearchHash(can)[0]||can.Conf("session")

View File

@ -8,6 +8,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.page.style(can, can._ou
{view: [[html.MENU, html.TITLE]], list: [
{img: can.misc.ResourceFavicon(can, msg.Option(html.FAVICON), can.ConfSpace())},
{text: decodeURIComponent(
can.Conf("title")||
(window == top? can.user.info.titles: "")||can.ConfSpace()||can.misc.Search(can, ice.POD)||location.host
)},
], onclick: function(event) { can.sup.onexport.record(can, html.DESKTOP) }},

View File

@ -49,6 +49,9 @@ func _autogen_import(m *ice.Message, main string, ctx string, mod string) string
_autogen_defs(m, ice.SRC_MAIN_GO, ice.ETC_MISS_SH, ice.README_MD, ice.MAKEFILE, ice.LICENSE)
begin, done, list := false, false, []string{}
imports := kit.Format(`_ "%s/src/%s"`, mod, ctx)
if mod == "shylinux.com/x/ice" {
imports = kit.Format(`_ "%s/%s"`, mod, ctx)
}
m.Cmd(nfs.CAT, main, func(line string, index int) {
if strings.HasSuffix(line, imports) {
done = true
@ -95,9 +98,17 @@ func _autogen_gits(m *ice.Message, arg ...string) string {
}
func _autogen_git(m *ice.Message, arg ...string) ice.Map {
msg := m.Cmd(REPOS, REMOTE)
m.Cmd(MOD, mdb.RENDER, MOD, "go.mod", "./").Table(func(value ice.Maps) {
if value["require"] == "shylinux.com/x/ice" {
msg.Append("release", value["version"])
}
if value["require"] == "shylinux.com/x/icebergs" {
msg.Append("icebergs", value["version"])
}
})
return kit.Dict(arg, aaa.USERNAME, m.Option(ice.MSG_USERNAME), tcp.HOSTNAME, ice.Info.Hostname, nfs.PATH, kit.Path("")+nfs.PS, mdb.TIME, m.Time(),
GIT, GitVersion(m), GO, GoVersion(m), nfs.MODULE, _autogen_mod(m, ice.GO_MOD),
msg.AppendSimple("remote,branch,version,forword,author,email,hash,when,message"),
msg.AppendSimple("remote,branch,version,forword,author,email,hash,when,message,release,icebergs"),
web.DOMAIN, m.Spawn(kit.Dict(ice.MSG_USERWEB, web.UserHost(m), ice.MSG_USERPOD, m.Option(ice.MSG_USERPOD))).MergePod(""),
cli.SYSTEM, ice.Info.System,
)
@ -186,20 +197,18 @@ func init() {
}
}},
DEVPACK: {Help: "开发", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(WEBPACK, mdb.REMOVE)
if ice.Info.NodeType == web.SERVER {
m.Cmd(web.DREAM, nfs.GOWORK)
if m.Cmdy(WEBPACK, mdb.REMOVE); ice.Info.NodeType == web.SERVER {
m.Cmdy(web.DREAM, nfs.GOWORK)
}
}},
WEBPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(WEBPACK, mdb.CREATE)
if ice.Info.NodeType == web.SERVER {
if m.Cmdy(WEBPACK, mdb.CREATE); ice.Info.NodeType == web.SERVER {
nfs.Trash(m, ice.GO_WORK_SUM)
nfs.Trash(m, ice.GO_WORK)
}
}},
IMPORT: {Hand: func(m *ice.Message, arg ...string) {
_autogen_import(m, ice.SRC_MAIN_GO, arg[0], kit.Select(_autogen_mod(m, ice.GO_MOD), arg, 1))
m.Echo(_autogen_import(m, kit.Select(ice.SRC_MAIN_GO, arg, 2), arg[0], kit.Select(_autogen_mod(m, ice.GO_MOD), arg, 1)))
}},
BINPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) {
kit.For([]string{"intshell", "volcanos", "node_modules", "learning", "icons"}, func(p string) {

View File

@ -1,7 +1,6 @@
package code
import (
"os"
"path"
"runtime"
"strings"
@ -119,17 +118,16 @@ func init() {
m.Options(cli.CMD_ENV, env).Cmd(AUTOGEN, VERSION)
_compile_get(m, main)
defer m.StatusTime(VERSION, strings.TrimPrefix(GoVersion(m), "go version"))
args := []string{main, ice.SRC_VERSION_GO, ice.SRC_BINPACK_GO, ice.SRC_BINPACK_USR_GO}
if _, e := os.Stat("src/option.go"); e == nil {
args = append(args, "src/option.go")
}
args := []string{main, ice.SRC_VERSION_GO}
nfs.Exists(m, "src/option.go", func(p string) { args = append(args, p) })
kit.If(file != ice.BIN_ICE_BIN, func() { args = append(args, ice.SRC_BINPACK_GO, ice.SRC_BINPACK_USR_GO) })
if msg := GoBuild(m.Spawn(), file, args...); !cli.IsSuccess(msg) {
m.Copy(msg)
} else {
m.Logs(nfs.SAVE, nfs.TARGET, file, nfs.SOURCE, main)
m.Cmdy(nfs.DIR, file, "time,path,size,hash,link")
web.MessageInsertJSON(m, cli.SYSTEM, "", m.Spawn().Copy(m).FormatMeta(), ctx.ARGS, m.Append(mdb.HASH))
kit.If(!m.IsCliUA() && strings.Contains(file, ice.ICE), func() { m.Cmdy(PUBLISH, ice.CONTEXTS, ice.APP) })
kit.If(!m.IsCliUA() && strings.Contains(file, ice.ICE), func() { m.Cmdy(PUBLISH, nfs.CONTEXTS, ice.APP) })
web.Count(m, "", file)
}
}},

View File

@ -0,0 +1,105 @@
package compose
import (
"os"
"path"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
type insight struct {
serveStart string `name:"serveStart path* port* repos binary" help:"启动服务" icon:"bi bi-plus-square-dotted"`
loadConfig string `name:"load path*=etc/compose/compose.shy type" help:"加载配置" icon:"bi bi-folder-plus"`
saveConfig string `name:"save path*=etc/compose/compose.shy type" help:"保存配置" icon:"bi bi-floppy"`
list string `name:"list list" help:"云游"`
}
func (s insight) Inputs(m *ice.Message, arg ...string) {
switch arg[0] {
case nfs.PATH:
m.Cmdy(nfs.DIR, "etc/compose/", arg[0])
case mdb.TYPE:
m.Push(arg[0], "local", "cluster", "docker", "kubectl")
}
}
func (s insight) ServeStart(m *ice.Message, arg ...string) {
pwd, _ := os.Getwd()
dir := path.Join(path.Dir(pwd), m.Option(nfs.PATH))
bin := path.Join(dir, ice.BIN_ICE_BIN)
if m.Echo(bin); bin == os.Args[0] {
return
}
if !nfs.Exists(m.Message, dir) {
m.Cmd(cli.SYSTEM, cli.GIT, "clone", m.OptionDefault(nfs.REPOS, ice.Info.Make.Remote), dir)
}
if !nfs.Exists(m.Message, bin) {
nfs.MkdirAll(m.Message, path.Dir(bin))
m.Cmd(cli.SYSTEM, cli.CP, os.Args[0], bin)
}
m.Info("serve start %v", bin)
m.Cmd(cli.DAEMON, bin, cli.FOREVER, cli.START, ice.DEV, m.Option(ice.MSG_USERHOST), tcp.NODENAME, path.Base(dir), m.OptionSimple(tcp.PORT), arg[4:], kit.Dict(cli.CMD_DIR, dir))
m.WaitEvent(web.OPS_SERVER_OPEN, func(msg *ice.Message, arg ...string) bool { return msg.Option(mdb.NAME) == path.Base(dir) })
}
func (s insight) LoadConfig(m *ice.Message, arg ...string) {
bin := ""
defer m.ToastProcess()()
cache := map[string][]string{}
m.Cmd(lex.SPLIT, m.Option(nfs.PATH), func(deep int, ls []string) {
switch deep {
case 1:
m.ToastProcess(ls[0] + " 服务启动中...")
bin = m.Cmdx("", s.ServeStart, nfs.PATH, ls[0], tcp.PORT, ls[1], cache["serve"], ls[2:])
cache["serve"] = append(cache["serve"], ls[2:]...)
case 2:
m.Info("dream start %v", bin)
m.Cmd(cli.SYSTEM, bin, web.ADMIN, web.DREAM, mdb.CREATE, "--", mdb.NAME, ls[0], cache[ls[0]], ls[1:], kit.Dict(cli.CMD_DIR, path.Dir(path.Dir(bin))))
// cache[ls[0]] = ls[1:]
cache[ls[0]] = append(cache[ls[0]], ls[1:]...)
}
})
}
func (s insight) SaveConfig(m *ice.Message, arg ...string) {
m.Cmd(nfs.SAVE, m.Option(nfs.PATH), kit.Format("%s %s username %q usernick %q language %q avatar %q\n", path.Base(kit.Pwd()), m.Option(tcp.PORT),
m.Option(ice.MSG_USERNAME), m.Option(ice.MSG_USERNICK), m.Option(ice.MSG_LANGUAGE), m.Option(ice.MSG_AVATAR)))
m.Cmd(web.DREAM).Table(func(value ice.Maps) {
if value[mdb.TYPE] == web.WORKER {
m.Cmd(nfs.PUSH, m.Option(nfs.PATH), kit.Format(" %s repos %q binary %q\n", value[mdb.NAME], value[nfs.REPOS], value[nfs.BINARY]))
}
if value[mdb.TYPE] == web.SERVER {
msg := m.Cmd(web.SPACE, value[mdb.NAME], web.SERVE)
m.Cmd(nfs.PUSH, m.Option(nfs.PATH), kit.Format("%s %s repos %q binary %q\n", value[mdb.NAME], msg.Append(tcp.PORT), value[nfs.REPOS], value[nfs.BINARY]))
m.Cmd(web.SPACE, value[mdb.NAME], web.DREAM).Table(func(value ice.Maps) {
if value[mdb.TYPE] == web.WORKER {
m.Cmd(nfs.PUSH, m.Option(nfs.PATH), kit.Format(" %s repos %q binary %q\n", value[mdb.NAME], value[nfs.REPOS], value[nfs.BINARY]))
}
})
}
})
}
func (s insight) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
m.Cmd(web.SPACE).Table(func(value ice.Maps) {
if value[mdb.TYPE] == web.SERVER {
m.PushRecord(value, mdb.NAME, mdb.ICONS, nfs.MODULE, nfs.VERSION)
}
})
m.Action(s.ServeStart, s.LoadConfig, s.SaveConfig)
m.Display("/plugin/story/spides.js?split=.").Option(nfs.DIR_ROOT, ice.Info.NodeName)
kit.If(m.Length() == 0, func() { m.EchoInfoButton("请加载配置创建集群", s.LoadConfig) })
} else {
m.Cmdy(web.SPACE, arg[0], m.PrefixKey()).Table(func(value ice.Maps) {
m.Push(nfs.FILE, kit.Keys(arg[0], value[mdb.NAME]))
})
kit.If(m.Length() == 0, func() { m.Push(web.SPACE, arg[0]).Push(ctx.INDEX, web.DESKTOP) })
}
}
func init() { ice.Cmd("web.code.compose.insight", insight{}) }

View File

@ -74,13 +74,16 @@ func _go_show(m *ice.Message, arg ...string) {
// ctx.ProcessField(m, "web.code.xterm", kit.Simple())
ctx.ProcessField(m, "log.debug", kit.Simple("bench"))
} else if cmd := ctx.GetFileCmd(path.Join(arg[2], arg[1])); cmd != "" {
if p := path.Join(arg[2], strings.Split(arg[1], "/")[0], "portal.go"); path.Base(arg[1]) != "portal.go" && nfs.Exists(m, p) &&
if p := path.Join(arg[2], strings.Split(arg[1], "/")[0], "portal.go"); path.Base(arg[1]) != "portal.go" &&
!kit.IsIn(arg[1],
"gonganxitong/user.go",
"gonganxitong/sess.go",
"gonganxitong/grant.go",
"gonganxitong/domain.go",
"gonganxitong/command.go",
"gonganxitong/quotalist.go",
) {
"operation/studio.go",
) && nfs.Exists(m, p) {
if cmd := ctx.GetFileCmd(p); cmd != "" {
if m.ActionKey() == mdb.RENDER {
ctx.ProcessField(m, cmd, kit.Simple())
@ -226,7 +229,7 @@ func TableName(model string) string {
}
if kit.IsIn(model, "sms", "equipment") {
} else if kit.HasSuffix(model, "y") {
} else if kit.HasSuffix(model, "y") && !kit.HasSuffix(model, "way") {
model = model[:len(model)-1] + "ies"
} else if kit.HasSuffix(model, "s") {
if !kit.HasSuffix(model, "os") {

View File

@ -22,7 +22,9 @@ func _js_show(m *ice.Message, arg ...string) {
ctx.ProcessField(m, kit.Select(ice.CAN_PLUGIN, "web."+strings.Replace(strings.TrimSuffix(strings.TrimPrefix(arg[1], "plugin/local/"), nfs.PT+JS), nfs.PS, nfs.PT, -1)), nil)
}
} else {
if p := path.Join(arg[2], strings.Split(arg[1], "/")[0], "portal.go"); nfs.Exists(m, p) {
if p := path.Join(arg[2], strings.Split(arg[1], "/")[0], "portal.go"); !kit.IsIn(arg[1],
"operation/studio.js",
) && nfs.Exists(m, p) {
if cmd := ctx.GetFileCmd(p); cmd != "" {
ctx.ProcessField(m, cmd, kit.Simple())
return

View File

@ -67,11 +67,12 @@ func _publish_contexts(m *ice.Message, arg ...string) {
}
if m.Option(ice.MSG_USERPOD) != "" {
env = append(env, cli.CTX_POD, m.Option(ice.MSG_USERPOD))
} else if name := msg.Append(nfs.PATHNAME); !kit.IsIn(name, path.Base(m.Option(nfs.SOURCE)), ice.CONTEXTS) {
} else if name := msg.Append(nfs.PATHNAME); !kit.IsIn(name, path.Base(m.Option(nfs.SOURCE))) {
env = append(env, cli.CTX_NAME, name)
}
case cli.CURL, cli.WGET:
}
env = append(env, kit.Simple(m.Optionv(cli.CTX_ENV))...)
kit.If(len(env) > 0, func() { m.Options(cli.CTX_ENV, lex.SP+kit.JoinKV(mdb.EQ, lex.SP, env...)) })
if template := strings.TrimSpace(nfs.Template(m, kit.Keys(k, SH))); m.Option(nfs.FORMAT) == "raw" {
m.Echo(template)
@ -93,9 +94,9 @@ func init() {
Index.MergeCommands(ice.Commands{
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Icon: "QuickTime Player.png", Role: aaa.VOID, Actions: ice.MergeActions(ice.Actions{
ice.VOLCANOS: {Help: "火山架", Hand: func(m *ice.Message, arg ...string) { _publish_list(m, kit.ExtReg(HTML, CSS, JS)) }},
ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { _publish_bin_list(m).Cmdy("", ice.CONTEXTS) }},
ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { _publish_bin_list(m).Cmdy("", nfs.CONTEXTS) }},
ice.INTSHELL: {Help: "神农架", Hand: func(m *ice.Message, arg ...string) { _publish_list(m, kit.ExtReg(SH, VIM, CONF)) }},
ice.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }},
nfs.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }},
nfs.SOURCE: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.SOURCE) }},
nfs.BINARY: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.BINARY) }},
cli.CURL: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, cli.CURL) }},
@ -131,7 +132,7 @@ func init() {
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) }},
}, ctx.ConfAction(mdb.FIELD, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
if m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH); len(arg) == 0 {
_publish_list(m).Cmdy("", ice.CONTEXTS, ice.APP)
_publish_list(m).Cmdy("", nfs.CONTEXTS, ice.APP)
} else {
m.Cmdy(nfs.DIR, arg[0], "time,path,size,hash,link,action", ice.OptionFields(mdb.DETAIL))
web.PushImages(m, web.P(PUBLISH, arg[0]))

View File

@ -0,0 +1,43 @@
package publish
import (
"path"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
)
type client struct {
create string `name:"create origin* name icons"`
list string `name:"list list" help:"软件包"`
}
func (s client) Create(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, m.OptionSimple("origin,name,icons"), mdb.TYPE, nfs.REPOS)
}
func (s client) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
m.Cmd(web.SPIDE).Table(func(value ice.Maps) {
if value[web.CLIENT_TYPE] == nfs.REPOS {
m.PushRecord(value, mdb.ICONS, web.CLIENT_NAME)
}
})
m.Action(s.Create).SortStrR(web.CLIENT_NAME).Display("")
} else {
m.SplitIndex(m.Cmdx(web.SPIDE, arg[0], web.C(m.Prefix(tcp.SERVER)))).PushAction(s.Download)
}
}
func (s client) Download(m *ice.Message, arg ...string) {
web.GoToast(m.Message, func(toast func(string, int, int)) (res []string) {
name := path.Base(m.Option(nfs.PATH))
m.Cmd(web.SPIDE, m.Option(web.CLIENT_NAME), web.SPIDE_SAVE, nfs.USR_PUBLISH+name, "/publish/"+name, func(count, total, value int) {
toast(name, count, total)
})
return nil
})
}
func init() { ice.Cmd("web.code.publish.client", client{}) }

View File

@ -0,0 +1,19 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.ui = can.onappend.layout(can)
msg.Table(function(value) {
can.onimport.item(can, {name: value[web.CLIENT_NAME], icons: value.icons}, function(event, item, show, target) { can.db.client_name = item.name
can.onimport.tabsCache(can, item, target, function(event) {
can.run(event, [item.name], function(msg) {
can.onappend.table(can, msg, null, can.ui.content), can.onappend._status(can, msg)
})
})
})
})
},
})
Volcanos(chat.ONACTION, {
download: function(event, can) {
var msg = can.request(event); msg.Option(web.CLIENT_NAME, can.db.client_name)
can.runAction(event, web.DOWNLOAD)
},
})

View File

@ -0,0 +1,51 @@
package publish
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/core/code"
)
type server struct {
ice.Hash
short string `data:"name"`
field string `data:"time,name*,text,path,version*,compile,runtime,os,cpu"`
list string `name:"list name auto" help:"软件源" role:"void"`
}
func (s server) Inputs(m *ice.Message, arg ...string) {
switch arg[0] {
case nfs.PATH:
m.Cmdy(nfs.DIR, nfs.USR_PUBLISH, nfs.PATH)
case code.COMPILE:
m.Push(arg[0], "go")
m.Push(arg[0], "javac")
case cli.RUNTIME:
m.Push(arg[0], "python")
m.Push(arg[0], "java")
m.Push(arg[0], "php")
case cli.OS:
m.Push(arg[0], "Linux")
m.Push(arg[0], "macOS")
m.Push(arg[0], "Windows")
case cli.CPU:
m.Push(arg[0], "amd64")
m.Push(arg[0], "x86")
m.Push(arg[0], "arm")
m.Push(arg[0], "arm64")
default:
s.Hash.Inputs(m, arg...)
}
}
func (s server) Upload(m *ice.Message, arg ...string) {
s.Modify(m, mdb.NAME, m.Option(mdb.NAME), nfs.PATH, m.UploadSave(nfs.USR_PUBLISH))
}
func (s server) List(m *ice.Message, arg ...string) {
if s.Hash.List(m, arg...); m.IsTech() {
m.PushAction(s.Detail, s.Upload, s.Remove)
}
}
func init() { ice.Cmd("web.code.publish.server", server{}) }

View File

@ -0,0 +1,10 @@
{
"icons": {},
"input": {
"compile": "编译器",
"runtime": "运行时",
"os": "操作系统",
"cpu": "芯片架构"
},
"value": {}
}

View File

@ -33,6 +33,7 @@ func init() {
uri := "/publish/" + kit.Format(value[nfs.FILE])
kit.If(m.Spawn().Options(ice.MSG_USERPOD, "").ParseLink(ice.Info.Make.Domain).Option(ice.MSG_USERPOD), func(p string) {
uri = kit.MergeURL(uri, ice.POD, p)
uri = kit.MergeURL2(ice.Info.Make.Domain, uri)
})
dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE]))
web.GoToast(m, func(toast func(name string, count, total int)) []string {

View File

@ -2,7 +2,6 @@ package core
import (
_ "shylinux.com/x/icebergs/core/chat"
_ "shylinux.com/x/icebergs/core/chat/location"
_ "shylinux.com/x/icebergs/core/chat/macos"
_ "shylinux.com/x/icebergs/core/code"
_ "shylinux.com/x/icebergs/core/mall"

View File

@ -16,9 +16,10 @@ func init() {
"usci", "统一社会信用代码",
"account", "对公账户",
"bank", "开户银行",
"record", "备案号",
),
), Actions: ice.MergeActions(ice.Actions{}, mdb.ExportHashAction(
mdb.SHORT, "username", mdb.FIELD, "time,username,mobile,idnumber,usci,account,bank,email,portal",
mdb.SHORT, "username", mdb.FIELD, "time,username,mobile,idnumber,usci,company,address,bank,account,email,portal,record",
)), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Action(mdb.CREATE)
web.PushPodCmd(m, "", arg...)

View File

@ -46,7 +46,7 @@ func init() {
}},
web.UPLOAD: {Hand: func(m *ice.Message, arg ...string) {
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
m.Cmdy(web.CACHE, web.WATCH, m.Option(mdb.HASH), path.Join(m.Option(nfs.PATH), up[1]))
m.Cmdy(web.CACHE, web.WATCH, up[0], path.Join(m.Option(nfs.PATH), up[1]))
}},
mdb.RENAME: {Name: "rename name*", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.MOVE, path.Join(path.Dir(m.Option(nfs.PATH)), m.Option(mdb.NAME)), m.Option(nfs.PATH))

View File

@ -21,7 +21,7 @@ func init() {
Index.MergeCommands(ice.Commands{
GEOAREA: {Name: "geoarea path auto", Help: "地区", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, "https://geo.datav.aliyun.com/areas_v3/bound/", GEOAREA)
// m.Cmd(web.SPIDE, mdb.CREATE, "https://geo.datav.aliyun.com/areas_v3/bound/", GEOAREA)
}},
nfs.PS: {Hand: func(m *ice.Message, arg ...string) {
p := path.Join(ice.USR_GEOAREA, path.Join(arg...))

View File

@ -22,8 +22,9 @@ func init() {
Index.MergeCommands(ice.Commands{
IMAGE: {Name: "image path", Help: "图片", Actions: ice.Actions{
"material": {Hand: func(m *ice.Message, arg ...string) {
m.Info("what %v", m.FormatChain())
m.Cmdy(IMAGE, path.Join("usr/material", strings.TrimPrefix(path.Dir(m.Option("_script")), "usr/"), arg[0]))
if nfs.Exists(m, nfs.USR_MATERIAL) {
m.Cmdy(IMAGE, path.Join(nfs.USR_MATERIAL, strings.TrimPrefix(path.Dir(m.Option("_script")), nfs.USR), arg[0]))
}
}},
}, Hand: func(m *ice.Message, arg ...string) {
arg = _name(m, arg)

View File

@ -47,7 +47,8 @@ fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spar
fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spark][data-name=shell]:hover { box-shadow:var(--notice-box-shadow); }
fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spark][data-name=shell] { padding:var(--button-padding); margin-top:var(--button-margin); }
fieldset.web.wiki.portal>div.output>div.layout>div.main table.content div.story[data-type=spark][data-name=shell] { margin-top:unset; }
fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { white-space:pre-wrap; text-align:center; }
fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { white-space:pre-wrap; }
div.story[data-type=qrcode] { text-align:center; }
fieldset.web.wiki.portal.home>div.output>div.layout>div.main p:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body.dark fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item:hover { background-color:var(--output-bg-color); }
body.dark fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item.select { background-color:var(--output-bg-color); }

View File

@ -142,6 +142,7 @@ open http://localhost:9020
}()
}()
if nfs.Exists(m, "src/qrcode.jpg") {
defer m.Echo(`<div class="story" data-type="qrcode">`).Echo("</div>")
m.Cmdy(IMAGE, "qrcode", "src/qrcode.jpg")
m.Cmdy(SPARK, "请使用微信扫码,打开公众号体验服务")
}

View File

@ -5,6 +5,7 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/nfs"
)
const VIDEO = "video"
@ -13,7 +14,9 @@ func init() {
Index.MergeCommands(ice.Commands{
VIDEO: {Name: "video path", Help: "视频", Actions: ice.Actions{
"material": {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(VIDEO, path.Join("usr/material", strings.TrimPrefix(path.Dir(m.Option("_script")), "usr/"), arg[0]))
if nfs.Exists(m, nfs.USR_MATERIAL) {
m.Cmdy(VIDEO, path.Join(nfs.USR_MATERIAL, strings.TrimPrefix(path.Dir(m.Option("_script")), nfs.USR), arg[0]))
}
}},
}, Hand: func(m *ice.Message, arg ...string) {
arg = _name(m, arg)

2
go.mod
View File

@ -5,6 +5,6 @@ go 1.13
require (
shylinux.com/x/go-git/v5 v5.6.7
shylinux.com/x/go-qrcode v0.0.3
shylinux.com/x/toolkits v1.0.16
shylinux.com/x/toolkits v1.0.19
shylinux.com/x/websocket v0.0.4
)

4
go.sum
View File

@ -4,7 +4,7 @@ shylinux.com/x/go-qrcode v0.0.3 h1:RMo+Vidbgq3HatLBj7DDXcTbTLFUwzis5K7TqBkD38U=
shylinux.com/x/go-qrcode v0.0.3/go.mod h1:KAbtU+KwiiABMZ/CJ0zh9PI2AX82Uf9rRYcQ4ODm4po=
shylinux.com/x/toolkits v0.7.10 h1:65d5rkQXQ71MD8FzYnZ9DFxb1XcOYSYfmRc4j8qQsUw=
shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.16 h1:7Oh454uAyBLfflIFEQooLNzml4pqXIReiaxEVA/YXaU=
shylinux.com/x/toolkits v1.0.16/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.19 h1:Nrx0xYRc5ph1WS66EZ1hJUCe+2FdSWQ4QP6tBlguikQ=
shylinux.com/x/toolkits v1.0.19/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/websocket v0.0.4 h1:AJpwblePoOpiE6C8NrvgNYpKTotXMLrDDX2chTvx44Q=
shylinux.com/x/websocket v0.0.4/go.mod h1:3UGWkjTu3ie5NAZen7J+uLPBrO7DFeKloj6Jxo13Oiw=

20
info.go
View File

@ -21,15 +21,17 @@ type MakeInfo struct {
Git string
Go string
Remote string
Branch string
Version string
Forword string
Message string
Author string
Email string
Hash string
When string
Icebergs string
Release string
Remote string
Branch string
Version string
Forword string
Message string
Author string
Email string
Hash string
When string
}
func (s MakeInfo) Versions() string {

View File

@ -130,6 +130,10 @@ func (m *Message) Push(key string, value Any, arg ...Any) *Message {
k = strings.TrimSuffix(k, "*")
m.Push(k, kit.Select(kit.Format(val[k]), value[k]))
})
case map[string]int:
kit.For(value, func(key string, value int) {
m.Push(key, value)
})
default:
keys := strings.Split(key, ",")
kit.For(kit.Simple(value, arg), func(v string, i int) {

View File

@ -52,4 +52,4 @@ func (s server) List(m *ice.Message, arg ...string) {
})
}
}
func init() { ice.CodeCtxCmd(server{}) }
func init() { ice.Cmd("web.code.coder.server", server{}) }

View File

@ -202,7 +202,7 @@ func init() {
m.Push(nfs.SIZE, kit.Split(m.Cmdx(cli.SYSTEM, "du", "-sh", path.Join(ice.USR_LOCAL_REPOS, value[REPOS])))[0])
m.PushScript(kit.Format("git clone %s", _service_link(m, value[REPOS])))
}).Sort(REPOS)
kit.If(!m.IsCliUA(), func() { m.Cmdy(web.CODE_PUBLISH, ice.CONTEXTS, ice.DEV) })
kit.If(!m.IsCliUA(), func() { m.Cmdy(web.CODE_PUBLISH, nfs.CONTEXTS, ice.DEV) })
kit.If(mdb.Config(m, aaa.AUTH) == aaa.PRIVATE, func() { m.StatusTimeCount(aaa.AUTH, aaa.PRIVATE) })
m.PushAction("settoken", mdb.REMOVE).Action(mdb.CREATE, aaa.AUTH)
} else if repos := _repos_open(m, arg[0]); len(arg) == 1 {

View File

@ -93,7 +93,7 @@ func init() {
} else {
m.Action(PULL, PUSH, INSTEADOF, mdb.DEV_REQUEST, ctx.CONFIG, STASH)
}
kit.If(!m.IsCliUA(), func() { m.Cmdy(code.PUBLISH, ice.CONTEXTS, ice.DEV) })
kit.If(!m.IsCliUA(), func() { m.Cmdy(code.PUBLISH, nfs.CONTEXTS, ice.DEV) })
ctx.Toolkit(m)
} else {
_repos_cmd(m, arg[0], DIFF)

View File

@ -118,9 +118,9 @@ func init() {
}
func TableGo(m *ice.Message, cb ice.Any) *ice.Message {
wg, lock := sync.WaitGroup{}, &task.Lock{}
wg.Add(m.Length())
defer wg.Wait()
m.Table(func(value ice.Maps) {
wg.Add(1)
task.Put(m.FormatTaskMeta(), logs.FileLine(cb), func(*task.Task) {
defer wg.Done()
switch cb := cb.(type) {

34
misc/md/md.go Normal file
View File

@ -0,0 +1,34 @@
package md
import (
"path"
"github.com/gomarkdown/markdown"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/nfs"
)
type md struct {
ice.Code
ice.Lang
list string `name:"list name auto" help:"示例"`
}
func (s md) Init(m *ice.Message, arg ...string) {
s.Lang.Init(m, nfs.SCRIPT, m.Resource(""))
}
func (s md) List(m *ice.Message, arg ...string) {
s.Code.Source(m, "", arg...)
}
func (s md) Render(m *ice.Message, arg ...string) {
md := []byte(m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1])))
html := markdown.ToHTML(md, nil, nil)
m.Echo(string(html))
}
func (s md) Engine(m *ice.Message, arg ...string) {
md := []byte(m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1])))
html := markdown.ToHTML(md, nil, nil)
m.Echo(string(html))
}
func init() { ice.Cmd("web.wiki.md", md{}) }

13
misc/md/md.js Normal file
View File

@ -0,0 +1,13 @@
Volcanos(chat.ONSYNTAX, {
md: {
prefix: {"//": code.COMMENT},
regexp: {"[A-Z_0-9]+": code.CONSTANT},
keyword: {
"package": code.KEYWORD,
"import": code.KEYWORD,
"public": code.KEYWORD,
"private": code.KEYWORD,
"static": code.KEYWORD,
},
},
})

View File

@ -1,8 +1,5 @@
package misc
import (
// _ "shylinux.com/x/icebergs/misc/bash"
_ "shylinux.com/x/icebergs/misc/git"
// _ "shylinux.com/x/icebergs/misc/tmux"
// _ "shylinux.com/x/icebergs/misc/vim"
)

View File

@ -228,18 +228,21 @@ func (s relay) List(m *ice.Message, arg ...string) *ice.Message {
stats[DISK_TOTAL] += kit.Int(ls[1])
}
if value[web.PORTAL] == "" {
m.Push(web.LINK, "").PushButton(s.Xterm, s.Pushbin, s.Install, s.Remove)
m.Push(web.LINK, "").PushButton(s.Xterm,
// s.Pushbin, s.Install,
s.Remove)
} else {
m.Push(web.LINK, m.HostPort(value[tcp.HOST], value[web.PORTAL]))
m.PushButton(s.Portal, s.Desktop, s.Admin, s.Open,
s.Status, s.Vimer, s.Login,
// s.Status, s.Vimer,
s.Login,
s.Spide,
s.AdminCmd,
s.Upgrade,
s.Pushbin,
s.Pushkey,
// s.AdminCmd,
// s.Upgrade,
// s.Pushbin,
// s.Pushkey,
s.Xterm,
s.SetIcon,
// s.SetIcon,
s.Remove)
kit.If(len(arg) > 0, func() { m.PushQRCode(cli.QRCODE, m.Append(web.LINK)) })
}

View File

@ -12,7 +12,6 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
// "shylinux.com/x/icebergs/base/web/html"
"shylinux.com/x/icebergs/core/chat"
"shylinux.com/x/icebergs/core/chat/location"
kit "shylinux.com/x/toolkits"
@ -21,7 +20,6 @@ import (
func _wx_sign(m *ice.Message, nonce, stamp string) string {
return kit.Format(sha1.Sum([]byte(kit.Join(kit.Sort(kit.Simple(
kit.Format("jsapi_ticket=%s", m.Cmdx(ACCESS, TICKET)),
// kit.Format("url=%s", m.R.Header.Get(html.Referer)),
kit.Format("url=%s", m.Option(ice.MSG_REFERER)),
kit.Format("timestamp=%s", stamp),
kit.Format("noncestr=%s", nonce),
@ -47,17 +45,15 @@ func init() {
m.Optionv(mdb.PLUGIN, m.PrefixKey(), mdb.Config(m, web.SPACE))
})
}},
"getLocation": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(location.LOCATION, mdb.CREATE, arg) }},
"scanQRCode1": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(chat.FAVOR, mdb.CREATE, arg) }},
"oauth": {Hand: func(m *ice.Message, arg ...string) { mdb.Config(m, "oauth", arg[0]) }},
"scanQRCode1": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(chat.FAVOR, mdb.CREATE, arg) }},
"getLocation": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(location.LOCATION, mdb.CREATE, arg) }},
}, gdb.EventsAction(chat.HEADER_AGENT), ctx.ConfAction(
"space", "", "oauth", "", nfs.SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js",
"oauth", "", web.SPACE, "", nfs.SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js",
)), Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(ACCESS, AGENT).Options(SIGNATURE, _wx_sign(m, m.Option(NONCESTR, ice.Info.Pathname), m.Option(TIMESTAMP, kit.Format(time.Now().Unix())))).Display("")
ctx.OptionFromConfig(m, nfs.SCRIPT, "oauth")
m.Option("oauth", strings.ReplaceAll(m.Option("oauth"),
"https%3A%2F%2Fyunxuanlinghang.com", strings.ReplaceAll(m.Option(ice.MSG_USERHOST), "://", "%3A%2F%2F"),
))
ctx.OptionFromConfig(m, "oauth", nfs.SCRIPT)
m.Option("oauth", strings.ReplaceAll(m.Option("oauth"), "https%3A%2F%2Fyunxuanlinghang.com", strings.ReplaceAll(m.Option(ice.MSG_USERHOST), "://", "%3A%2F%2F")))
}},
})
}