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

Compare commits

...

20 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
22 changed files with 251 additions and 248 deletions

View File

@ -105,7 +105,7 @@ func UserRoot(m *ice.Message, arg ...string) *ice.Message {
userzone := kit.Select(ice.OPS, arg, 4) userzone := kit.Select(ice.OPS, arg, 4)
email := kit.Select(UserEmail(m, username), arg, 5) email := kit.Select(UserEmail(m, username), arg, 5)
if len(arg) > 0 { 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) m.Cmd(USER, mdb.CREATE, userrole, username, usernick, language, userzone, email)
} }
return SessAuth(m, kit.Dict(USERROLE, userrole, USERNAME, username, USERNICK, usernick)) 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.Username)
kit.HashSeed = append(kit.HashSeed, ice.Info.Hostname) kit.HashSeed = append(kit.HashSeed, ice.Info.Hostname)
kit.HashSeed = append(kit.HashSeed, ice.Info.Pathname) 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.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() ice.Info.Time = m.Time()
m.Conf(RUNTIME, kit.Keys(BOOT, mdb.TIME), ice.Info.Time) m.Conf(RUNTIME, kit.Keys(BOOT, mdb.TIME), ice.Info.Time)
if runtime.GOARCH != MIPSLE { if runtime.GOARCH != MIPSLE {
@ -148,16 +149,15 @@ const (
) )
const ( const (
CTX_SHY = "ctx_shy" CTX_SHY = "ctx_shy"
CTX_WEB = "ctx_web"
CTX_GIT = "ctx_git"
CTX_DEV_IP = "ctx_dev_ip"
CTX_DEV = "ctx_dev" CTX_DEV = "ctx_dev"
CTX_DEV_IP = "ctx_dev_ip"
CTX_OPS = "ctx_ops" CTX_OPS = "ctx_ops"
CTX_REPOS = "ctx_repos" CTX_REPOS = "ctx_repos"
CTX_NAME = "ctx_name" CTX_NAME = "ctx_name"
CTX_DEMO = "ctx_demo" CTX_DEMO = "ctx_demo"
CTX_MAIL = "ctx_mail" CTX_MAIL = "ctx_mail"
CTX_ROOT = "ctx_root" CTX_ROOT = "ctx_root"
CTX_DOMAIN = "ctx_domain"
CTX_PID = "ctx_pid" CTX_PID = "ctx_pid"
CTX_LOG = "ctx_log" CTX_LOG = "ctx_log"

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 { func DisplayInputKey(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayInput(m, "key", arg...) 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 { func DisplayStoryPie(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayStory(m, "pie", arg...) return DisplayStory(m, "pie", arg...)
} }

View File

@ -155,6 +155,7 @@ const (
SRC_DOCUMENT = "src/document/" SRC_DOCUMENT = "src/document/"
SRC_PRIVATE = "src/private/" SRC_PRIVATE = "src/private/"
SRC_MAIN_PNG = "src/main.png" SRC_MAIN_PNG = "src/main.png"
SRC_OPTION_GO = "src/option.go"
SRC_TEMPLATE = ice.SRC_TEMPLATE SRC_TEMPLATE = ice.SRC_TEMPLATE
USR_TOOLKITS = ice.USR_TOOLKITS USR_TOOLKITS = ice.USR_TOOLKITS
USR_ICEBERGS = ice.USR_ICEBERGS USR_ICEBERGS = ice.USR_ICEBERGS

View File

@ -1,7 +1,6 @@
package web package web
import ( import (
"net/http"
"os" "os"
"path" "path"
"regexp" "regexp"
@ -22,7 +21,7 @@ import (
kit "shylinux.com/x/toolkits" 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) list := m.CmdMap(SPACE, mdb.NAME)
mdb.HashSelects(m.Spawn()).Table(func(value ice.Maps, index int, head []string) { 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)) { 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[ice.MAIN] = space[ice.MAIN]
value[mdb.ICONS] = space[mdb.ICONS] value[mdb.ICONS] = space[mdb.ICONS]
m.Push("", value, kit.Slice(head, 0, -1)) 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(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(nfs.MODULE, space[nfs.MODULE]).Push(nfs.VERSION, space[nfs.VERSION]) button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD}
// m.Push(mdb.TEXT, DreamStat(m, value[mdb.NAME])) text := space[nfs.MODULE]
m.Push(mdb.TEXT, "") kit.If(m.Option(ice.DREAM_SIMPLE) != ice.TRUE && aaa.IsTechOrRoot(m), func() {
button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD, OPEN} kit.If(m.IsDebug(), func() {
kit.If(aaa.IsTechOrRoot(m), func() { button = append(button, cli.STOP) }) button = append(button, VIMER, STATUS, COMPILE, cli.RUNTIME, XTERM)
m.PushButton(button...) text += "\n" + DreamStat(m, value[mdb.NAME])
} else { })
msg := gdb.Event(m.Spawn(value, space), DREAM_TABLES) button = append(button, "settings", cli.STOP)
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(mdb.TEXT, text)
m.Push(nfs.MODULE, space[nfs.MODULE]).Push(nfs.VERSION, space[nfs.VERSION]) m.PushButton(append(button, OPEN)...)
m.Push(mdb.TEXT, space[nfs.MODULE]+"\n"+msg.Append(mdb.TEXT))
m.PushButton(strings.Join(msg.Appendv(ctx.ACTION), ""))
}
} else if aaa.IsTechOrRoot(m) { } else if aaa.IsTechOrRoot(m) {
m.Push("", value, kit.Slice(head, 0, -1)) 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])) { 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, "") m.Push(cli.STATUS, cli.STOP).PushButton(cli.START, nfs.TRASH)
kit.If(aaa.IsTechOrRoot(m), func() { m.PushButton(cli.START, nfs.TRASH) }, func() { m.PushButton() })
} else { } else {
m.Push(cli.STATUS, cli.BEGIN).Push(nfs.MODULE, "").Push(nfs.VERSION, "").Push(mdb.TEXT, "") m.Push(cli.STATUS, cli.BEGIN).PushButton(cli.START, mdb.REMOVE)
kit.If(aaa.IsTechOrRoot(m), func() { m.PushButton(cli.START, mdb.REMOVE) }, func() { m.PushButton() })
} }
} }
}) })
m.RewriteAppend(func(value, key string, index int) string { m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.TIME { if key == mdb.TIME {
if space, ok := list[m.Appendv(mdb.NAME)[index]]; ok { if space, ok := list[m.Appendv(mdb.NAME)[index]]; ok {
value = space[mdb.TIME] return space[mdb.TIME]
} }
} } else if key == mdb.ICONS {
return value
})
return m
}
func _dream_list_icon(m *ice.Message) {
m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.ICONS {
if kit.HasPrefix(value, HTTP, nfs.PS) { if kit.HasPrefix(value, HTTP, nfs.PS) {
return value return value
} else if nfs.ExistsFile(m, path.Join(ice.USR_LOCAL_WORK, m.Appendv(mdb.NAME)[index], value)) { } else if nfs.ExistsFile(m, path.Join(ice.USR_LOCAL_WORK, m.Appendv(mdb.NAME)[index], value)) {
@ -82,34 +70,42 @@ func _dream_list_icon(m *ice.Message) {
} }
return value 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") field := kit.Split(mdb.Config(m, mdb.FIELD) + ",type,status,module,version,text")
m.Cmds(SPACE).Table(func(value ice.Maps) { m.Cmds(SPACE).Table(func(value ice.Maps) {
value[nfs.REPOS] = "https://" + value[nfs.MODULE] value[nfs.REPOS] = "https://" + value[nfs.MODULE]
value[aaa.ACCESS] = kit.Select("", value[aaa.USERROLE], value[aaa.USERROLE] != aaa.VOID) value[aaa.ACCESS] = kit.Select("", value[aaa.USERROLE], value[aaa.USERROLE] != aaa.VOID)
value[mdb.STATUS] = cli.START value[mdb.STATUS] = cli.START
button := []ice.Any{PORTAL, DESKTOP, ADMIN, WORD, VIMER, STATUS, COMPILE, cli.RUNTIME, XTERM, 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] { switch value[mdb.TYPE] {
case ORIGIN: case ORIGIN:
value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT]) if m.IsCliUA() {
button = append(button, "gettoken") return
if value[aaa.ACCESS] == "" {
defer m.PushButton(PORTAL, OPEN)
} else {
defer m.PushButton(button...)
} }
case SERVER:
button = append(button, "settoken")
value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT]) value[mdb.TEXT] = kit.JoinLine(value[nfs.MODULE], value[mdb.TEXT])
defer m.PushButton(button...) 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: 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]))) 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: default:
return return
} }
m.Push("", value, field) m.Push("", value, field)
m.PushButton(button...)
}) })
return m return m
} }
@ -178,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) { if bin := path.Join(m.Option(cli.CMD_DIR), ice.BIN_ICE_BIN); nfs.Exists(m, bin) {
return return
} else if kit.IsUrl(p) || strings.HasPrefix(p, S()) { } else if kit.IsUrl(p) || strings.HasPrefix(p, S()) {
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.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 { } else {
m.Cmd(nfs.LINK, bin, kit.Path(p)) m.Cmd(nfs.LINK, bin, kit.Path(p))
} }
@ -207,6 +204,8 @@ const (
STOPALL = "stopall" STOPALL = "stopall"
FOR_EACH = "forEach" FOR_EACH = "forEach"
FOR_FLOW = "forFlow" FOR_FLOW = "forFlow"
GETTOKEN = "gettoken"
SETTOKEN = "settoken"
DREAM_INPUTS = "dream.inputs" DREAM_INPUTS = "dream.inputs"
DREAM_CREATE = "dream.create" DREAM_CREATE = "dream.create"
@ -216,7 +215,6 @@ const (
DREAM_STOP = "dream.stop" DREAM_STOP = "dream.stop"
DREAM_OPEN = "dream.open" DREAM_OPEN = "dream.open"
DREAM_CLOSE = "dream.close" DREAM_CLOSE = "dream.close"
DREAM_TABLES = "dream.tables" DREAM_TABLES = "dream.tables"
DREAM_ACTION = "dream.action" DREAM_ACTION = "dream.action"
@ -237,66 +235,28 @@ func init() {
每个空间都自带软件开发工具也可以随时编程添加新的功能 每个空间都自带软件开发工具也可以随时编程添加新的功能
`, 200.0) `, 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) { mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if mdb.IsSearchPreview(m, arg) { 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.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) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) { switch arg[0] {
case mdb.CREATE: case mdb.NAME:
switch arg[0] { DreamEach(m, "", kit.Select(cli.START, cli.STOP, m.Option(ctx.ACTION) == STARTALL), func(name string) { m.Push(arg[0], name) })
case mdb.NAME: case tcp.NODENAME:
_dream_list(m, true).Cut("name,status,time") m.Cmdy(SPACE, m.Option(mdb.NAME), SPACE, ice.INFO).CutTo(mdb.NAME, arg[0])
case mdb.ICONS: case aaa.USERNAME:
mdb.HashInputs(m, arg) if aaa.IsTechOrRoot(m) && m.Option(ctx.ACTION) == GRANT {
case nfs.REPOS: m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK).Option(ice.TABLE_CHECKBOX, ice.FALSE)
defer ctx.DisplayInputKey(m, ctx.STYLE, "_nameicon") } else {
m.Cmd(STORE).Table(func(value ice.Maps) { m.Push(arg[0], m.Option(tcp.NODENAME))
m.Spawn().SplitIndex(m.Cmdx(SPIDE, value[mdb.NAME], SPIDE_RAW, http.MethodGet, C(DREAM))).Table(func(value ice.Maps) { m.Push(arg[0], m.Option(ice.MSG_USERNAME))
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])
})
})
} }
case STARTALL: case nfs.REPOS:
DreamEach(m, "", cli.STOP, func(name string) { m.Push(arg[0], name) }) case nfs.BINARY:
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]) })
})
default: default:
switch arg[0] { gdb.Event(m, DREAM_INPUTS, arg)
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)
}
} }
}}, }},
nfs.SCAN: {Hand: func(m *ice.Message, arg ...string) { nfs.SCAN: {Hand: func(m *ice.Message, arg ...string) {
@ -309,12 +269,9 @@ func init() {
}}, }},
mdb.CREATE: {Name: "create name*=hi repos binary", Hand: func(m *ice.Message, arg ...string) { 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(!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)) m.Option(nfs.REPOS, kit.Select("", kit.Split(m.Option(nfs.REPOS)), -1))
if mdb.HashCreate(m); ice.Info.Important == true { if mdb.HashCreate(m); ice.Info.Important == true {
_dream_start(m, m.Option(mdb.NAME)) _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)...) SpaceEvent(m, OPS_DREAM_CREATE, m.Option(mdb.NAME), m.OptionSimple(mdb.NAME, nfs.REPOS, nfs.BINARY)...)
} }
}}, }},
@ -342,15 +299,17 @@ func init() {
m.Cmd(SPACE, path.Base(p), cli.RUNTIME, UPGRADE) m.Cmd(SPACE, path.Base(p), cli.RUNTIME, UPGRADE)
return true return true
} }
}) }).Sleep3s()
m.Sleep("3s") m.ProcessHold()
// kit.If(m.Option(mdb.NAME) == "", func() { m.Sleep("5s").Cmdy(ROUTE, cli.BUILD).ProcessInner() })
}}, }},
PUBLISH: {Name: "publish name", Hand: func(m *ice.Message, arg ...string) { 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())) 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} list := []string{cli.LINUX, cli.DARWIN, cli.WINDOWS}
msg := m.Spawn(ice.Maps{ice.MSG_DAEMON: ""}) msg := m.Spawn(ice.Maps{ice.MSG_DAEMON: ""})
func() { func() {
if m.Option(mdb.NAME) != "" {
return
}
defer ToastProcess(m, PUBLISH, ice.Info.Pathname)() defer ToastProcess(m, PUBLISH, ice.Info.Pathname)()
m.Cmd(AUTOGEN, BINPACK) m.Cmd(AUTOGEN, BINPACK)
kit.For(list, func(goos string) { kit.For(list, func(goos string) {
@ -367,8 +326,7 @@ func init() {
list := []string{cli.AMD64} list := []string{cli.AMD64}
kit.If(goos == cli.DARWIN, func() { list = append(list, cli.ARM64) }) kit.If(goos == cli.DARWIN, func() { list = append(list, cli.ARM64) })
kit.For(list, func(arch string) { kit.For(list, func(arch string) {
PushNoticeRich(m.Options(ice.MSG_COUNT, "0", ice.LOG_DISABLE, ice.TRUE), mdb.NAME, name, 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())
msg.Cmd(SPACE, name, COMPILE, goos, arch, kit.Dict(ice.MSG_USERPOD, name)).AppendSimple())
}) })
}) })
}) })
@ -385,66 +343,46 @@ func init() {
if cb, ok := m.OptionCB("").(func(string) bool); ok && cb(p) { if cb, ok := m.OptionCB("").(func(string) bool); ok && cb(p) {
return return
} }
defer PushNoticeGrow(msg, "\r\n\r\n\r\n") defer PushNoticeGrow(msg, "\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))) 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() 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) { cli.START: {Hand: func(m *ice.Message, arg ...string) {
_dream_start(m, m.Option(mdb.NAME)) _dream_start(m, m.Option(mdb.NAME))
gdb.Event(m, DREAM_START, arg) gdb.Event(m, DREAM_START, arg)
}}, }},
cli.STOP: {Hand: func(m *ice.Message, arg ...string) { cli.STOP: {Hand: func(m *ice.Message, arg ...string) {
defer ToastProcess(m)()
gdb.Event(m, DREAM_STOP, arg) gdb.Event(m, DREAM_STOP, arg)
m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT).Sleep3s() 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) { nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) {
gdb.Event(m, DREAM_TRASH, arg) gdb.Event(m, DREAM_TRASH, arg)
nfs.Trash(m, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME))) 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) { cli.RUNTIME: {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)) ProcessPodCmd(m, m.Option(mdb.NAME), "", nil, arg...)
}}, }},
tcp.SEND: {Name: "send to*", 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) {
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) {
kit.If(m.Option(cli.RESTART) == "manual", func() { m.Option(cli.RESTART, "") }) 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, "") }) kit.If(m.Option(aaa.ACCESS) == aaa.PUBLIC, func() { m.Option(aaa.ACCESS, "") })
mdb.HashModify(m, m.OptionSimple(mdb.NAME, cli.RESTART, 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)) 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) 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) != "" { if aaa.IsTechOrRoot(m) && m.Option(aaa.USERNAME) != "" {
m.Option(ice.MSG_USERNAME, 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))) 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 strings.HasSuffix(m.Option(ice.MAIN), ".portal") || kit.HasPrefixList(arg, ctx.RUN) {
if !kit.HasPrefixList(arg, ctx.RUN) { if !kit.HasPrefixList(arg, ctx.RUN) {
defer m.Push(TITLE, m.Option(mdb.NAME)) defer m.Push(TITLE, m.Option(mdb.NAME))
@ -474,17 +412,15 @@ func init() {
button := []ice.Any{} button := []ice.Any{}
if aaa.IsTechOrRoot(m) { if aaa.IsTechOrRoot(m) {
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
case WORKER: case ORIGIN:
button = append(button, OPEN, "settings") button = append(button, DREAM, GETTOKEN)
case SERVER: case SERVER:
button = append(button, DREAM, OPEN, "settoken") button = append(button, DREAM, SETTOKEN)
default: case WORKER:
button = append(button, DREAM, OPEN, "gettoken") 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) { SERVE_START: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range kit.Reverse(kit.Split(mdb.Config(m, html.BUTTON))) { for _, cmd := range kit.Reverse(kit.Split(mdb.Config(m, html.BUTTON))) {
@ -499,7 +435,7 @@ func init() {
}) })
}}, }},
STATS_TABLES: {Hand: func(m *ice.Message, arg ...string) { 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{} stat := map[string]int{}
msg.Table(func(value ice.Maps) { stat[value[mdb.TYPE]]++; stat[value[mdb.STATUS]]++ }) 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], "", "已启动空间") PushStats(m, kit.Keys(m.CommandKey(), cli.START), stat[cli.START], "", "已启动空间")
@ -511,6 +447,8 @@ func init() {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []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...) }) 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...) })
}}, }},
SERVER: {Hand: func(m *ice.Message, arg ...string) { SERVER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) { m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) {
@ -542,53 +480,35 @@ func init() {
m.Cmd(cli.SYSTEM, cli.GO, "work", "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) }) 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)) }) 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( }, StatsAction(), DreamAction(), DreamTablesAction(), mdb.ImportantHashAction(
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,main,icons,repos,binary,template,restart,access", mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,main,icons,repos,binary,template,restart,access",
html.BUTTON, kit.JoinWord(PORTAL, DESKTOP, ADMIN, WORD, VIMER, STATUS, COMPILE, XTERM, DREAM), html.BUTTON, kit.JoinWord(PORTAL, DESKTOP, ADMIN, WORD, VIMER, STATUS, COMPILE, XTERM, DREAM),
ONLINE, ice.TRUE,
)), Hand: func(m *ice.Message, arg ...string) { )), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
simple := m.Option(ice.DREAM_SIMPLE) == ice.TRUE || m.Option(ice.MSG_DEBUG) != ice.TRUE if ice.Info.NodeType == WORKER {
if ice.Info.NodeType != WORKER { return
_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 !m.IsCliUA() && aaa.IsTechOrRoot(m) { _dream_list(m)
_dream_list_more(m, simple) if _dream_list_more(m); !aaa.IsTechOrRoot(m) || m.IsCliUA() {
} 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() {
m.Action() m.Action()
} else if m.IsDebug() && cli.SystemFindGo(m) { } else if m.IsDebug() && cli.SystemFindGo(m) {
m.Action(mdb.CREATE, STARTALL, STOPALL, cli.BUILD, PUBLISH) m.Action(mdb.CREATE, STARTALL, STOPALL, cli.BUILD, PUBLISH)
} else { } else {
m.Action(mdb.CREATE, STARTALL, STOPALL) 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.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) 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, "") })
m.Options(ice.MSG_TOOLKIT, "web.code.compose.insight")
} else if arg[0] == ctx.ACTION { } else if arg[0] == ctx.ACTION {
gdb.Event(m, DREAM_ACTION, arg) m.Cmdy(arg[1], DREAM_ACTION, arg)
} else { // gdb.Event(m, DREAM_ACTION, arg)
mdb.HashSelects(m, arg[0]).PushAction(PORTAL, DESKTOP, ADMIN, OPEN, mdb.REMOVE)
} }
}}, }},
}) })

View File

@ -15,7 +15,7 @@ import (
) )
func UserWeb(m *ice.Message) *url.URL { 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 { func UserHost(m *ice.Message) string {
if p := m.Option(ice.MSG_USERHOST); p != "" { if p := m.Option(ice.MSG_USERHOST); p != "" {

View File

@ -84,6 +84,7 @@ func Render(m *ice.Message, cmd string, args ...ice.Any) bool {
"$output", fieldset+">div.output", "$output", fieldset+">div.output",
"$status", fieldset+">div.status", "$status", fieldset+">div.status",
"$fieldset", fieldset, "$fieldset", fieldset,
"$body", "body.cmd."+m.Option(ctx.INDEX),
"$index", m.Option(ctx.INDEX), "$index", m.Option(ctx.INDEX),
"$input", "body>div.input.float."+m.Option(ctx.INDEX), "$input", "body>div.input.float."+m.Option(ctx.INDEX),
))) )))
@ -171,7 +172,7 @@ func RenderPodCmd(m *ice.Message, pod, cmd string, arg ...ice.Any) {
m.Option(mdb.ICONS, msg.Option(ice.MSG_NODEICON)) 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)))) 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) != "") 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)) 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))) 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) }).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)) 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)) }) 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) { kit.For(kit.Split(m.Option(ice.DEV)), func(dev string) {
if strings.HasPrefix(dev, HTTP) { if strings.HasPrefix(dev, HTTP) {
m.Cmd(SPIDE, mdb.CREATE, dev, ice.DEV, "", nfs.REPOS) 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 msg := m.Cmd(SPIDE, dev); msg.Append(TOKEN) == "" {
if m.Option(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 { } 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 { func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
const ( const (
@ -65,6 +65,10 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
} else { } else {
return true return true
} }
func() {
defer InfoLock.Lock()()
Info.ServeMainCount++
}()
if ip := r.Header.Get(X_REAL_IP); ip != "" { if ip := r.Header.Get(X_REAL_IP); ip != "" {
if r.Header.Set(ice.MSG_USERIP, ip); r.Header.Get(X_REAL_PORT) != "" { 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)) 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 { } else {
m.CmdHand(cmd, key, cmds...) 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 { func _serve_domain(m *ice.Message) string {

View File

@ -23,8 +23,26 @@ import (
"shylinux.com/x/icebergs/base/web/html" "shylinux.com/x/icebergs/base/web/html"
"shylinux.com/x/icebergs/misc/websocket" "shylinux.com/x/icebergs/misc/websocket"
kit "shylinux.com/x/toolkits" 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) { func _space_qrcode(m *ice.Message, dev string) {
ssh.PrintQRCode(m, m.Cmdv(SPACE, dev, cli.PWD, mdb.LINK)) 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) { 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())) 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))) 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 }) kit.If(ProxyDomain(m, name), func(p string) { text = p })
safe = aaa.IsTechOrRoot(m) safe = aaa.IsTechOrRoot(m)
} }
@ -127,6 +146,11 @@ func _space_handle(m *ice.Message, safe bool, name string, c *websocket.Conn) {
if e != nil { if e != nil {
break break
} }
func() {
defer InfoLock.Lock()()
Info.SpaceReadCount++
Info.SpaceReadByte += len(b)
}()
msg := m.Spawn(b) msg := m.Spawn(b)
if safe && msg.Option(ice.MSG_UNSAFE) != ice.TRUE { // 下行权限 if safe && msg.Option(ice.MSG_UNSAFE) != ice.TRUE { // 下行权限
if !aaa.IsTechOrRoot(msg) && msg.Option(ice.MSG_HANDLE) != 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() { if m.IsErr() {
return 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") m.Options(ice.MSG_ARGS, "", ice.MSG_COUNT, "0")
kit.If(m.Option(ice.MSG_DAEMON), func(p string) { kit.If(m.Option(ice.MSG_DAEMON), func(p string) {
m.Option(ice.MSG_DAEMON0, m.Option(ice.MSG_DAEMON)) 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:]) m.Options(ice.MSG_SOURCE, source, ice.MSG_TARGET, target[1:])
data := m.FormatMeta() data := m.FormatMeta()
if !m.WarnNotValid(c.WriteMessage(1, []byte(data))) { if !m.WarnNotValid(c.WriteMessage(1, []byte(data))) {
func() {
defer InfoLock.Lock()()
Info.SpaceWriteCount++
Info.SpaceWriteByte += len(data)
}()
if source != nil { 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, 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) kit.ReplaceAll(kit.Format("%v", m.Detailv()), "\r\n", "\\r\\n", "\t", "\\t", "\n", "\\n"), data)

View File

@ -311,7 +311,6 @@ func init() {
m.Cmd("", mdb.CREATE, kit.Select(dev, os.Getenv("ctx_dev_ip")), ice.DEV_IP, ice.SRC_MAIN_ICO, "dev_ip") m.Cmd("", mdb.CREATE, kit.Select(dev, os.Getenv("ctx_dev_ip")), ice.DEV_IP, ice.SRC_MAIN_ICO, "dev_ip")
m.Cmd("", mdb.CREATE, kit.Select("http://localhost:9020", conf[cli.CTX_OPS]), ice.OPS, ice.SRC_MAIN_ICO, nfs.REPOS) m.Cmd("", mdb.CREATE, kit.Select("http://localhost:9020", conf[cli.CTX_OPS]), ice.OPS, ice.SRC_MAIN_ICO, nfs.REPOS)
m.Cmd("", mdb.CREATE, kit.Select("https://shylinux.com", conf[cli.CTX_SHY]), ice.SHY, ice.SRC_MAIN_ICO, nfs.REPOS) m.Cmd("", mdb.CREATE, kit.Select("https://shylinux.com", conf[cli.CTX_SHY]), ice.SHY, ice.SRC_MAIN_ICO, nfs.REPOS)
m.Cmd("", mdb.CREATE, kit.Select("https://web.shylinux.com", conf[cli.CTX_WEB]), ice.WEB, ice.SRC_MAIN_ICO, nfs.REPOS)
m.Cmd("", mdb.CREATE, kit.Select("https://mail.shylinux.com", conf[cli.CTX_MAIL]), ice.MAIL, "usr/icons/Mail.png", "mail") m.Cmd("", mdb.CREATE, kit.Select("https://mail.shylinux.com", conf[cli.CTX_MAIL]), ice.MAIL, "usr/icons/Mail.png", "mail")
m.Cmd("", mdb.CREATE, kit.Select("https://demo.shylinux.com", conf[cli.CTX_DEMO]), ice.DEMO, ice.SRC_MAIN_ICO, "demo") m.Cmd("", mdb.CREATE, kit.Select("https://demo.shylinux.com", conf[cli.CTX_DEMO]), ice.DEMO, ice.SRC_MAIN_ICO, "demo")
m.Cmd("", mdb.CREATE, "https://2023.shylinux.com", "2023-ContextOS", ice.SRC_MAIN_ICO, nfs.REPOS) m.Cmd("", mdb.CREATE, "https://2023.shylinux.com", "2023-ContextOS", ice.SRC_MAIN_ICO, nfs.REPOS)
@ -346,13 +345,14 @@ func init() {
default: default:
switch arg[0] { switch arg[0] {
case mdb.NAME, mdb.ICONS: 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) mdb.HashInputs(m, arg)
default: default:
mdb.HashSelectValue(m.Spawn(), func(value ice.Map) { mdb.HashSelectValue(m.Spawn(), func(value ice.Map) {
m.Push(kit.Select(ORIGIN, arg, 0), kit.Value(value, kit.Keys("client", arg[0]))) 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) }) kit.If(arg[0] == mdb.TYPE, func() { m.Push(arg[0], nfs.REPOS) })
m.Sort(arg[0])
} }
} }
}}, }},
@ -388,8 +388,9 @@ func init() {
mdb.HashModify(m, mdb.NAME, m.Option(CLIENT_NAME), TOKEN, "") mdb.HashModify(m, mdb.NAME, m.Option(CLIENT_NAME), TOKEN, "")
}}, }},
DEV_CREATE_TOKEN: {Hand: func(m *ice.Message, arg ...string) { 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)) 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)) }}, 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) { }, 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) {
@ -430,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) })) 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 == "" { } else if p == "" {
return "" return ""
} else { } else if nfs.Exists(m, p) {
return m.Cmdx(nfs.CAT, 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 { nfs.TemplatePath = func(m *ice.Message, arg ...string) string {

View File

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

View File

@ -6,7 +6,7 @@ Volcanos(chat.ONIMPORT, {
}, },
_project: function(can, msg, dev, target) { _project: function(can, msg, dev, target) {
msg.Table(function(value) { if (value.type == web.WORKER) { return } 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._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) value.icons = can.misc.Resource(can, value.icons||"usr/icons/icebergs.png", "", value.origin)
can.onimport.itemlist(can, [value], function(event, item, show, target) { can.onimport.itemlist(can, [value], function(event, item, show, target) {

View File

@ -164,7 +164,12 @@ func init() {
} }
m.Option(aaa.LANGUAGE, strings.ReplaceAll(strings.ToLower(kit.Select("", kit.Split(kit.GetValid( 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("", "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 }, func() string { return ice.Info.Lang },
), " ."), 0)), "_", "-")) ), " ."), 0)), "_", "-"))
m.Option("language.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.LANGUAGE)+nfs.PS, nfs.FILE).Appendv(nfs.FILE)) m.Option("language.list", m.Cmd(nfs.DIR, nfs.TemplatePath(m, aaa.LANGUAGE)+nfs.PS, nfs.FILE).Appendv(nfs.FILE))

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.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) 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]) var tabs = can.misc.sessionStorage(can, [can.ConfIndex(), html.TABS])
sub.onexport.output = function() { can.onimport._desktop(can, can._msg) sub.onexport.output = function() { can.onimport._desktop(can, can._msg)
var sess = can.misc.SearchHash(can)[0]||can.Conf("session") 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: [ {view: [[html.MENU, html.TITLE]], list: [
{img: can.misc.ResourceFavicon(can, msg.Option(html.FAVICON), can.ConfSpace())}, {img: can.misc.ResourceFavicon(can, msg.Option(html.FAVICON), can.ConfSpace())},
{text: decodeURIComponent( {text: decodeURIComponent(
can.Conf("title")||
(window == top? can.user.info.titles: "")||can.ConfSpace()||can.misc.Search(can, ice.POD)||location.host (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) }}, ], 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) _autogen_defs(m, ice.SRC_MAIN_GO, ice.ETC_MISS_SH, ice.README_MD, ice.MAKEFILE, ice.LICENSE)
begin, done, list := false, false, []string{} begin, done, list := false, false, []string{}
imports := kit.Format(`_ "%s/src/%s"`, mod, ctx) 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) { m.Cmd(nfs.CAT, main, func(line string, index int) {
if strings.HasSuffix(line, imports) { if strings.HasSuffix(line, imports) {
done = true done = true
@ -194,20 +197,18 @@ func init() {
} }
}}, }},
DEVPACK: {Help: "开发", Hand: func(m *ice.Message, arg ...string) { DEVPACK: {Help: "开发", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(WEBPACK, mdb.REMOVE) if m.Cmdy(WEBPACK, mdb.REMOVE); ice.Info.NodeType == web.SERVER {
if ice.Info.NodeType == web.SERVER { m.Cmdy(web.DREAM, nfs.GOWORK)
m.Cmd(web.DREAM, nfs.GOWORK)
} }
}}, }},
WEBPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) { WEBPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(WEBPACK, mdb.CREATE) if m.Cmdy(WEBPACK, mdb.CREATE); ice.Info.NodeType == web.SERVER {
if ice.Info.NodeType == web.SERVER {
nfs.Trash(m, ice.GO_WORK_SUM) nfs.Trash(m, ice.GO_WORK_SUM)
nfs.Trash(m, ice.GO_WORK) nfs.Trash(m, ice.GO_WORK)
} }
}}, }},
IMPORT: {Hand: func(m *ice.Message, arg ...string) { IMPORT: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(_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) { BINPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) {
kit.For([]string{"intshell", "volcanos", "node_modules", "learning", "icons"}, func(p string) { kit.For([]string{"intshell", "volcanos", "node_modules", "learning", "icons"}, func(p string) {

View File

@ -1,7 +1,6 @@
package code package code
import ( import (
"os"
"path" "path"
"runtime" "runtime"
"strings" "strings"
@ -119,10 +118,9 @@ func init() {
m.Options(cli.CMD_ENV, env).Cmd(AUTOGEN, VERSION) m.Options(cli.CMD_ENV, env).Cmd(AUTOGEN, VERSION)
_compile_get(m, main) _compile_get(m, main)
defer m.StatusTime(VERSION, strings.TrimPrefix(GoVersion(m), "go version")) 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} args := []string{main, ice.SRC_VERSION_GO}
if _, e := os.Stat("src/option.go"); e == nil { nfs.Exists(m, "src/option.go", func(p string) { args = append(args, p) })
args = append(args, "src/option.go") 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) { if msg := GoBuild(m.Spawn(), file, args...); !cli.IsSuccess(msg) {
m.Copy(msg) m.Copy(msg)
} else { } else {

View File

@ -74,7 +74,7 @@ func _go_show(m *ice.Message, arg ...string) {
// ctx.ProcessField(m, "web.code.xterm", kit.Simple()) // ctx.ProcessField(m, "web.code.xterm", kit.Simple())
ctx.ProcessField(m, "log.debug", kit.Simple("bench")) ctx.ProcessField(m, "log.debug", kit.Simple("bench"))
} else if cmd := ctx.GetFileCmd(path.Join(arg[2], arg[1])); cmd != "" { } 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], !kit.IsIn(arg[1],
"gonganxitong/user.go", "gonganxitong/user.go",
"gonganxitong/sess.go", "gonganxitong/sess.go",
@ -82,7 +82,8 @@ func _go_show(m *ice.Message, arg ...string) {
"gonganxitong/domain.go", "gonganxitong/domain.go",
"gonganxitong/command.go", "gonganxitong/command.go",
"gonganxitong/quotalist.go", "gonganxitong/quotalist.go",
) { "operation/studio.go",
) && nfs.Exists(m, p) {
if cmd := ctx.GetFileCmd(p); cmd != "" { if cmd := ctx.GetFileCmd(p); cmd != "" {
if m.ActionKey() == mdb.RENDER { if m.ActionKey() == mdb.RENDER {
ctx.ProcessField(m, cmd, kit.Simple()) ctx.ProcessField(m, cmd, kit.Simple())
@ -228,7 +229,7 @@ func TableName(model string) string {
} }
if kit.IsIn(model, "sms", "equipment") { 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" model = model[:len(model)-1] + "ies"
} else if kit.HasSuffix(model, "s") { } else if kit.HasSuffix(model, "s") {
if !kit.HasSuffix(model, "os") { 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) 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 { } 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 != "" { if cmd := ctx.GetFileCmd(p); cmd != "" {
ctx.ProcessField(m, cmd, kit.Simple()) ctx.ProcessField(m, cmd, kit.Simple())
return return

2
go.mod
View File

@ -5,6 +5,6 @@ go 1.13
require ( require (
shylinux.com/x/go-git/v5 v5.6.7 shylinux.com/x/go-git/v5 v5.6.7
shylinux.com/x/go-qrcode v0.0.3 shylinux.com/x/go-qrcode v0.0.3
shylinux.com/x/toolkits v1.0.17 shylinux.com/x/toolkits v1.0.19
shylinux.com/x/websocket v0.0.4 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/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 h1:65d5rkQXQ71MD8FzYnZ9DFxb1XcOYSYfmRc4j8qQsUw=
shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q= shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.17 h1:Y8QRUl0f36fgLfq+YPe7b5HxVlyY104PPVNGfLptb2I= shylinux.com/x/toolkits v1.0.19 h1:Nrx0xYRc5ph1WS66EZ1hJUCe+2FdSWQ4QP6tBlguikQ=
shylinux.com/x/toolkits v1.0.17/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q= 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 h1:AJpwblePoOpiE6C8NrvgNYpKTotXMLrDDX2chTvx44Q=
shylinux.com/x/websocket v0.0.4/go.mod h1:3UGWkjTu3ie5NAZen7J+uLPBrO7DFeKloj6Jxo13Oiw= shylinux.com/x/websocket v0.0.4/go.mod h1:3UGWkjTu3ie5NAZen7J+uLPBrO7DFeKloj6Jxo13Oiw=

View File

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