1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-25 17:18:05 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-02-09 11:30:20 +08:00
parent 29c1a023e3
commit 04ad921dd8
98 changed files with 701 additions and 838 deletions

View File

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

View File

@ -7,6 +7,7 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -37,12 +38,12 @@ func init() {
if m.WarnNotFound(msg.Append(SERVICE) == "", m.Option(FROM)) { if m.WarnNotFound(msg.Append(SERVICE) == "", m.Option(FROM)) {
return return
} }
m.Toast(ice.PROCESS, "", "-1") m.ToastProcess()
content := []byte(kit.JoinKV(DF, NL, kit.Simple(FROM, msg.Append(USERNAME), m.OptionSimple(TO, CC, SUBJECT), DATE, time.Now().Format(time.RFC1123Z), "Content-Type", "text/html; charset=UTF-8")...) + NL + NL + m.Option(CONTENT)) content := []byte(kit.JoinKV(DF, NL, kit.Simple(FROM, msg.Append(USERNAME), m.OptionSimple(TO, CC, SUBJECT), DATE, time.Now().Format(time.RFC1123Z), html.ContentType, "text/html; charset=UTF-8")...) + NL + NL + m.Option(CONTENT))
auth := smtp.PlainAuth("", msg.Append(USERNAME), msg.Append(PASSWORD), kit.Split(msg.Append(SERVICE), ice.DF)[0]) auth := smtp.PlainAuth("", msg.Append(USERNAME), msg.Append(PASSWORD), kit.Split(msg.Append(SERVICE), ice.DF)[0])
m.Logs(EMAIL, SEND, string(content)) m.Logs(EMAIL, SEND, string(content))
if !m.Warn(smtp.SendMail(msg.Append(SERVICE), auth, msg.Append(USERNAME), kit.Split(m.Option(TO)), content)) { if !m.WarnNotValid(smtp.SendMail(msg.Append(SERVICE), auth, msg.Append(USERNAME), kit.Split(m.Option(TO)), content)) {
m.Toast(ice.SUCCESS) m.ToastSuccess()
} }
}}, }},
}, mdb.DevDataAction("name,service,username,password"), mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,service,username", ice.ACTION, SEND)), Hand: func(m *ice.Message, arg ...string) { }, mdb.DevDataAction("name,service,username,password"), mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,service,username", ice.ACTION, SEND)), Hand: func(m *ice.Message, arg ...string) {

View File

@ -30,12 +30,12 @@ func init() {
m.Cmd("count", mdb.CREATE, OFFER, m.Option(FROM), kit.Dict(ice.LOG_DISABLE, ice.TRUE)) m.Cmd("count", mdb.CREATE, OFFER, m.Option(FROM), kit.Dict(ice.LOG_DISABLE, ice.TRUE))
}}, }},
ACCEPT: {Help: "接受", Role: VOID, Hand: func(m *ice.Message, arg ...string) { ACCEPT: {Help: "接受", Role: VOID, Hand: func(m *ice.Message, arg ...string) {
if m.WarnNotValid(m.Option(mdb.HASH) == "", mdb.HASH) { if m.WarnNotValid(m.Option(mdb.HASH), mdb.HASH) {
return return
} }
msg := mdb.HashSelect(m.Spawn(), m.Option(mdb.HASH)) msg := mdb.HashSelect(m.Spawn(), m.Option(mdb.HASH))
if ls := kit.Split(msg.Append(EMAIL), mdb.AT); !m.WarnNotFound(msg.Length() == 0 || len(ls) < 2, m.Option(mdb.HASH)) { if ls := kit.Split(msg.Append(EMAIL), mdb.AT); !m.WarnNotFound(msg.Length() == 0 || len(ls) < 2, m.Option(mdb.HASH)) {
ice.Info.AdminCmd(m.Spawn(), USER, mdb.CREATE, USERNICK, ls[0], USERNAME, msg.Append(EMAIL), USERZONE, ls[1]) m.Spawn().AdminCmd(USER, mdb.CREATE, USERNICK, ls[0], USERNAME, msg.Append(EMAIL), USERZONE, ls[1])
m.ProcessLocation(m.MergePod("", ice.MSG_SESSID, SessValid(m.Options(ice.MSG_USERNAME, msg.Append(EMAIL))))) m.ProcessLocation(m.MergePod("", ice.MSG_SESSID, SessValid(m.Options(ice.MSG_USERNAME, msg.Append(EMAIL)))))
mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.STATUS, ACCEPT) mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.STATUS, ACCEPT)
} }
@ -45,7 +45,7 @@ func init() {
kit.If(mdb.HashSelect(m, arg...).FieldsIsDetail(), func() { kit.If(mdb.HashSelect(m, arg...).FieldsIsDetail(), func() {
if m.Option(ice.MSG_USERNAME) == "" { if m.Option(ice.MSG_USERNAME) == "" {
m.Option(ice.MSG_USERHOST, strings.Split(m.Option(ice.MSG_USERHOST), "://")[1]) m.Option(ice.MSG_USERHOST, strings.Split(m.Option(ice.MSG_USERHOST), "://")[1])
m.SetAppend().EchoInfoButton(ice.Info.Template(m, SUBJECT_HTML), ACCEPT) m.SetAppend().EchoInfoButton(m.Template(SUBJECT_HTML), ACCEPT)
} else { } else {
m.ProcessLocation(m.MergePod("")) m.ProcessLocation(m.MergePod(""))
} }

View File

@ -160,7 +160,7 @@ func Right(m *ice.Message, key ...ice.Any) bool {
} else if len(key) > 0 && key[0] == ice.ETC_PATH { } else if len(key) > 0 && key[0] == ice.ETC_PATH {
return true return true
} }
return !ice.Info.Important || m.Option(ice.MSG_USERROLE) == ROOT || !m.Warn(m.Cmdx(ROLE, RIGHT, m.Option(ice.MSG_USERROLE), key, logs.FileLineMeta(-1)) != ice.OK, return !ice.Info.Important || m.Option(ice.MSG_USERROLE) == ROOT || !m.WarnNotRight(m.Cmdx(ROLE, RIGHT, m.Option(ice.MSG_USERROLE), key, logs.FileLineMeta(-1)) != ice.OK,
ice.ErrNotRight, kit.Keys(key...), USERROLE, m.Option(ice.MSG_USERROLE), logs.FileLineMeta(-1)) kit.Keys(key...), USERROLE, m.Option(ice.MSG_USERROLE), logs.FileLineMeta(-1))
} }
func IsTechOrRoot(m *ice.Message) bool { return kit.IsIn(m.Option(ice.MSG_USERROLE), TECH, ROOT) } func IsTechOrRoot(m *ice.Message) bool { return kit.IsIn(m.Option(ice.MSG_USERROLE), TECH, ROOT) }

View File

@ -50,8 +50,8 @@ func SessCheck(m *ice.Message, sessid string) bool {
return sessid != "" && m.Cmdy(SESS, CHECK, sessid, logs.FileLineMeta(-1)).Option(ice.MSG_USERNAME) != "" return sessid != "" && m.Cmdy(SESS, CHECK, sessid, logs.FileLineMeta(-1)).Option(ice.MSG_USERNAME) != ""
} }
func SessValid(m *ice.Message) string { func SessValid(m *ice.Message) string {
if m.Option(ice.MSG_SESSID) == "" || ice.Info.AdminCmd(m.Spawn(), SESS, m.Option(ice.MSG_SESSID)).Length() == 0 { if m.Option(ice.MSG_SESSID) == "" || m.Spawn().AdminCmd(SESS, m.Option(ice.MSG_SESSID)).Length() == 0 {
return m.Option(ice.MSG_SESSID, ice.Info.AdminCmd(m.Spawn(), SESS, mdb.CREATE, m.Option(ice.MSG_USERNAME)).Result()) return m.Option(ice.MSG_SESSID, m.Spawn().AdminCmd(SESS, mdb.CREATE, m.Option(ice.MSG_USERNAME)).Result())
} }
return m.Option(ice.MSG_SESSID) return m.Option(ice.MSG_SESSID)
} }

View File

@ -33,13 +33,13 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
ice.CMD, kit.JoinWord(cmd.Args...), DIR, cmd.Dir, ENV, kit.Select("", cmd.Env), ice.CMD, kit.JoinWord(cmd.Args...), DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ONEXIT), m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ONEXIT),
) )
if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args, err.String()) { if e := cmd.Start(); m.WarnNotValid(e, cmd.Args, err.String()) {
mdb.HashModify(m, h, STATUS, ERROR, ERROR, e) mdb.HashModify(m, h, STATUS, ERROR, ERROR, e)
return return
} }
mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[PID] = cmd.Process.Pid }) mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[PID] = cmd.Process.Pid })
m.Echo("%d", cmd.Process.Pid).Go(func() { m.Echo("%d", cmd.Process.Pid).Go(func() {
if e := cmd.Wait(); !m.Warn(e, ice.ErrNotStart, cmd.Args, err.String()) && cmd.ProcessState != nil && cmd.ProcessState.Success() { if e := cmd.Wait(); !m.WarnNotValid(e, cmd.Args, err.String()) && cmd.ProcessState != nil && cmd.ProcessState.Success() {
mdb.HashModify(m, mdb.HASH, h, STATUS, STOP) mdb.HashModify(m, mdb.HASH, h, STATUS, STOP)
m.Cost(CODE, "0", ctx.ARGS, cmd.Args) m.Cost(CODE, "0", ctx.ARGS, cmd.Args)
} else { } else {
@ -80,9 +80,11 @@ const (
STATUS = "status" STATUS = "status"
ERROR = "error" ERROR = "error"
CLEAR = "clear" CLEAR = "clear"
STASH = "stash"
DELAY = "delay" DELAY = "delay"
RELOAD = "reload"
RECORD = "record" RECORD = "record"
RELOAD = "reload"
REBOOT = "reboot"
RESTART = "restart" RESTART = "restart"
INTERVAL = "interval" INTERVAL = "interval"
@ -106,12 +108,16 @@ const DAEMON = "daemon"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
DAEMON: {Name: "daemon hash auto", Help: "守护进程", Actions: ice.MergeActions(ice.Actions{ DAEMON: {Name: "daemon hash auto", Help: "守护进程", Actions: ice.MergeActions(ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ONEXIT, ice.TRUE) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ONEXIT, ice.TRUE)
}},
START: {Name: "start cmd* dir env", Hand: func(m *ice.Message, arg ...string) { START: {Name: "start cmd* dir env", Hand: func(m *ice.Message, arg ...string) {
m.Options(CMD_DIR, m.Option(DIR), CMD_ENV, kit.Split(m.Option(ENV), " =")) m.Options(CMD_DIR, m.Option(DIR), CMD_ENV, kit.Split(m.Option(ENV), " ="))
_daemon_exec(m, _system_cmd(m, kit.Split(m.Option(ice.CMD))...)) _daemon_exec(m, _system_cmd(m, kit.Split(m.Option(ice.CMD))...))
}}, }},
RESTART: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy("", STOP).Sleep3s().Cmdy("", START) }}, RESTART: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("", STOP).Sleep3s().Cmdy("", START)
}},
STOP: {Hand: func(m *ice.Message, arg ...string) { STOP: {Hand: func(m *ice.Message, arg ...string) {
h, pid := m.Option(mdb.HASH), m.Option(PID) h, pid := m.Option(mdb.HASH), m.Option(PID)
mdb.HashSelects(m, h).Table(func(value ice.Maps) { mdb.HashSelects(m, h).Table(func(value ice.Maps) {

View File

@ -60,7 +60,7 @@ func init() {
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case FG, BG: case FG, BG:
m.Push(arg[0], BLACK, WHITE) m.Push(arg[0], kit.SortedKey(_color_map))
} }
}}, }},
}), Hand: func(m *ice.Message, arg ...string) { }), Hand: func(m *ice.Message, arg ...string) {

View File

@ -128,7 +128,14 @@ const (
LINUX = "linux" LINUX = "linux"
MACOS = "macos" MACOS = "macos"
DARWIN = "darwin" DARWIN = "darwin"
WINDOWS = ice.WINDOWS WINDOWS = "windows"
COMMIT_TIME = "commitTime"
COMPILE_TIME = "compileTime"
BOOT_TIME = "bootTime"
KERNEL = "kernel"
ARCH = "arch"
) )
const ( const (
PATH = "PATH" PATH = "PATH"
@ -194,7 +201,7 @@ func init() {
}}, }},
API: {Hand: func(m *ice.Message, arg ...string) { API: {Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 1 { if len(arg) > 1 {
m.Cmdy(ctx.COMMAND, "web.code.inner").Push(ctx.ARGS, kit.Format(nfs.SplitPath(m, m.Option(nfs.FILE)))) m.Cmdy(ctx.COMMAND, "inner").Push(ctx.ARGS, kit.Format(nfs.SplitPath(m, m.Option(nfs.FILE))))
return return
} }
ctx.DisplayStorySpide(m.Options(nfs.DIR_ROOT, nfs.PS), lex.PREFIX, kit.Fields(ctx.ACTION, m.ActionKey())) ctx.DisplayStorySpide(m.Options(nfs.DIR_ROOT, nfs.PS), lex.PREFIX, kit.Fields(ctx.ACTION, m.ActionKey()))
@ -203,7 +210,7 @@ func init() {
}}, }},
CLI: {Hand: func(m *ice.Message, arg ...string) { CLI: {Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 1 { if len(arg) > 1 {
m.Cmdy(ctx.COMMAND, "web.code.inner").Push(ctx.ARGS, kit.Format(nfs.SplitPath(m, m.Option(nfs.FILE)))) m.Cmdy(ctx.COMMAND, "inner").Push(ctx.ARGS, kit.Format(nfs.SplitPath(m, m.Option(nfs.FILE))))
return return
} }
ctx.DisplayStorySpide(m.Options(nfs.DIR_ROOT, "ice."), lex.PREFIX, kit.Fields(ctx.ACTION, m.ActionKey()), mdb.FIELD, mdb.NAME, lex.SPLIT, nfs.PT) ctx.DisplayStorySpide(m.Options(nfs.DIR_ROOT, "ice."), lex.PREFIX, kit.Fields(ctx.ACTION, m.ActionKey()), mdb.FIELD, mdb.NAME, lex.SPLIT, nfs.PT)
@ -227,18 +234,18 @@ func init() {
"chain": {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.FormatChain()) }}, "chain": {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.FormatChain()) }},
"upgrade": {Help: "升级", Hand: func(m *ice.Message, arg ...string) { "upgrade": {Help: "升级", Hand: func(m *ice.Message, arg ...string) {
if nfs.Exists(m, ice.SRC_MAIN_GO) && nfs.Exists(m, ".git") && SystemFind(m, "go") != "" { if nfs.Exists(m, ice.SRC_MAIN_GO) && nfs.Exists(m, ".git") && SystemFind(m, "go") != "" {
m.Cmdy("web.code.vimer", "compile") m.Cmdy("vimer", "compile")
} else if nfs.Exists(m, ice.BIN_ICE_BIN) { } else if nfs.Exists(m, ice.BIN_ICE_BIN) {
m.Cmdy("web.code.upgrade") m.Cmdy("upgrade")
} else { } else {
m.Cmdy("", "reboot") m.Cmdy("", REBOOT)
} }
}}, }},
"reboot": {Help: "重启", Icon: "bi bi-bootstrap-reboot", Hand: func(m *ice.Message, arg ...string) { REBOOT: {Help: "重启", Icon: "bi bi-bootstrap-reboot", Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { m.Sleep30ms(ice.EXIT, 1) }) m.Go(func() { m.Sleep30ms(ice.EXIT, 1) })
}}, }},
"stash": {Help: "清空", Icon: "bi bi-trash", Hand: func(m *ice.Message, arg ...string) { STASH: {Help: "清空", Icon: "bi bi-trash", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SYSTEM, "git", "stash") m.Cmd(SYSTEM, "git", STASH)
m.Cmd(SYSTEM, "git", "checkout", ".") m.Cmd(SYSTEM, "git", "checkout", ".")
m.Go(func() { m.Sleep30ms(ice.QUIT, 1) }) m.Go(func() { m.Sleep30ms(ice.QUIT, 1) })
}}, }},
@ -274,26 +281,26 @@ func ParseMake(str string) []string {
res := kit.UnMarshal(str) res := kit.UnMarshal(str)
data := kit.Value(res, MAKE) data := kit.Value(res, MAKE)
return kit.Simple( return kit.Simple(
mdb.TIME, kit.Format(kit.Value(res, "boot.time")), mdb.TIME, kit.Format(kit.Value(res, kit.Keys(BOOT, mdb.TIME))),
ice.SPACE, kit.Format(kit.Value(res, "node.name")), ice.SPACE, kit.Format(kit.Value(res, kit.Keys(NODE, mdb.NAME))),
nfs.MODULE, kit.Format(kit.Value(data, nfs.MODULE)), nfs.MODULE, kit.Format(kit.Value(data, nfs.MODULE)),
nfs.VERSION, kit.Join(kit.TrimArg(kit.Simple( nfs.VERSION, kit.Join(kit.TrimArg(kit.Simple(
kit.Format(kit.Value(data, nfs.VERSION)), kit.Format(kit.Value(data, nfs.VERSION)),
kit.Format(kit.Value(data, "forword")), kit.Format(kit.Value(data, "forword")),
kit.Cut(kit.Format(kit.Value(data, mdb.HASH)), 6), kit.Cut(kit.Format(kit.Value(data, mdb.HASH)), 6),
)...), "-"), )...), "-"),
"commitTime", kit.Format(kit.Value(data, "when")), COMMIT_TIME, kit.Format(kit.Value(data, "when")),
"compileTime", kit.Format(kit.Value(data, mdb.TIME)), COMPILE_TIME, kit.Format(kit.Value(data, mdb.TIME)),
"bootTime", kit.Format(kit.Value(res, "boot.time")), BOOT_TIME, kit.Format(kit.Value(res, kit.Keys(BOOT, mdb.TIME))),
SHELL, kit.Format(kit.Value(res, "conf.SHELL")), SHELL, kit.Format(kit.Value(res, kit.Keys(CONF, SHELL))),
"kernel", kit.Format(kit.Value(res, "host.GOOS")), KERNEL, kit.Format(kit.Value(res, kit.Keys(HOST, GOOS))),
"arch", kit.Format(kit.Value(res, "host.GOARCH")), ARCH, kit.Format(kit.Value(res, kit.Keys(HOST, GOARCH))),
) )
} }
func SimpleMake() []string { func SimpleMake() []string {
return []string{ return []string{
nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions(), nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions(),
"commitTime", ice.Info.Make.When, "compileTime", ice.Info.Make.Time, "bootTime", ice.Info.Time, COMMIT_TIME, ice.Info.Make.When, COMPILE_TIME, ice.Info.Make.Time, BOOT_TIME, ice.Info.Time,
"kernel", runtime.GOOS, "arch", runtime.GOARCH, KERNEL, runtime.GOOS, ARCH, runtime.GOARCH,
} }
} }

View File

@ -95,7 +95,7 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) {
} }
}() }()
} }
if e := cmd.Run(); !m.Warn(e, ice.ErrNotValid, cmd.Args) { if e := cmd.Run(); !m.WarnNotValid(e, cmd.Args) {
m.Cost(CODE, _system_code(cmd), EXEC, cmd.Args) m.Cost(CODE, _system_code(cmd), EXEC, cmd.Args)
} }
m.Push(mdb.TIME, m.Time()).Push(CODE, _system_code(cmd)).StatusTime() m.Push(mdb.TIME, m.Time()).Push(CODE, _system_code(cmd)).StatusTime()
@ -181,6 +181,9 @@ func init() {
} }
}}, }},
}) })
ice.Info.SystemCmd = func(m *ice.Message, arg ...ice.Any) *ice.Message {
return m.Cmd(append([]ice.Any{SYSTEM}, arg...)...)
}
} }
func SystemFind(m *ice.Message, bin string, dir ...string) string { func SystemFind(m *ice.Message, bin string, dir ...string) string {
@ -189,13 +192,13 @@ func SystemFind(m *ice.Message, bin string, dir ...string) string {
} }
func SystemExec(m *ice.Message, arg ...string) string { return strings.TrimSpace(m.Cmdx(SYSTEM, arg)) } func SystemExec(m *ice.Message, arg ...string) string { return strings.TrimSpace(m.Cmdx(SYSTEM, arg)) }
func SystemCmds(m *ice.Message, cmds string, args ...ice.Any) string { func SystemCmds(m *ice.Message, cmds string, args ...ice.Any) string {
return strings.TrimRight(m.Cmdx(SYSTEM, "sh", "-c", kit.Format(cmds, args...), ice.Option{CMD_OUTPUT, ""}), lex.NL) return strings.TrimRight(m.Cmdx(SYSTEM, SH, "-c", kit.Format(cmds, args...), ice.Option{CMD_OUTPUT, ""}), lex.NL)
} }
func IsSuccess(m *ice.Message) bool { return m.Append(CODE) == "" || m.Append(CODE) == "0" } func IsSuccess(m *ice.Message) bool { return m.Append(CODE) == "" || m.Append(CODE) == "0" }
var _cache_path []string var _cache_path []string
func Shell(m *ice.Message) string { return kit.Select("/bin/sh", os.Getenv("SHELL")) } func Shell(m *ice.Message) string { return kit.Select(SH, os.Getenv(SHELL)) }
func EtcPath(m *ice.Message) (res []string) { func EtcPath(m *ice.Message) (res []string) {
if len(_cache_path) > 0 { if len(_cache_path) > 0 {
return _cache_path return _cache_path

View File

@ -51,8 +51,8 @@ func _config_save(m *ice.Message, name string, arg ...string) {
} }
if f, _, e := miss.CreateFile(path.Join(ice.VAR_CONF, name)); m.Assert(e) { if f, _, e := miss.CreateFile(path.Join(ice.VAR_CONF, name)); m.Assert(e) {
defer f.Close() defer f.Close()
if s, e := json.MarshalIndent(data, "", " "); !m.Warn(e) { if s, e := json.MarshalIndent(data, "", " "); !m.WarnNotValid(e) {
if _, e := f.Write(s); !m.Warn(e) { if _, e := f.Write(s); !m.WarnNotValid(e) {
} }
} }
} }
@ -131,10 +131,6 @@ func Load(m *ice.Message, arg ...string) *ice.Message {
func ConfAction(arg ...ice.Any) ice.Actions { func ConfAction(arg ...ice.Any) ice.Actions {
return ice.Actions{ice.CTX_INIT: mdb.AutoConfig(arg...)} return ice.Actions{ice.CTX_INIT: mdb.AutoConfig(arg...)}
} }
func ConfigSimple(m *ice.Message, key ...string) (res []string) {
kit.For(kit.Split(kit.Join(key)), func(k string) { res = append(res, k, mdb.Config(m, k)) })
return
}
func ConfigFromOption(m *ice.Message, arg ...string) { func ConfigFromOption(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
kit.For(m.Target().Commands[m.CommandKey()].Actions[m.ActionKey()].List, func(value ice.Any) { kit.For(m.Target().Commands[m.CommandKey()].Actions[m.ActionKey()].List, func(value ice.Any) {

View File

@ -45,7 +45,8 @@ func ProcessField(m *ice.Message, cmd string, args ice.Any, arg ...string) *ice.
} }
func ProcessFloat(m *ice.Message, cmd string, args ice.Any, arg ...string) *ice.Message { func ProcessFloat(m *ice.Message, cmd string, args ice.Any, arg ...string) *ice.Message {
if m.IsMetaKey() { if m.IsMetaKey() {
return m.ProcessOpen(path.Join("/c/", cmd, path.Join(_process_args(m, args)...))) m.ProcessOpen(path.Join("/c/", cmd, path.Join(_process_args(m, args)...)))
return m
} }
if !kit.HasPrefixList(arg, RUN) { if !kit.HasPrefixList(arg, RUN) {
defer m.Push(STYLE, html.FLOAT) defer m.Push(STYLE, html.FLOAT)

View File

@ -30,8 +30,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) {
for { for {
select { select {
case <-t.C: case <-t.C:
m.Options(ice.LOG_DISABLE, ice.TRUE) m.Options(ice.LOG_DISABLE, ice.TRUE).Cmd(TIMER, HAPPEN)
m.Cmd(TIMER, HAPPEN)
case s, ok := <-f.s: case s, ok := <-f.s:
if !ok { if !ok {
return return

View File

@ -111,9 +111,7 @@ var Index = &ice.Context{Name: LOG, Help: "日志模块", Configs: ice.Configs{
kit.For(value[mdb.LIST], func(index int, k string) { m.Conf(SHOW, kit.Keys(k, VIEW), key) }) kit.For(value[mdb.LIST], func(index int, k string) { m.Conf(SHOW, kit.Keys(k, VIEW), key) })
}) })
}}, }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { ice.Info.Save(m, TAIL) }},
ice.Info.Save(m, TAIL)
}},
}} }}
func init() { ice.Index.Register(Index, &Frame{}, TAIL) } func init() { ice.Index.Register(Index, &Frame{}, TAIL) }

View File

@ -40,16 +40,11 @@ func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) string {
if arg[0] == HASH { if arg[0] == HASH {
m.Echo(arg[1]).Conf(prefix, kit.Keys(chain, HASH, arg[1]), kit.Data(arg[2:])) m.Echo(arg[1]).Conf(prefix, kit.Keys(chain, HASH, arg[1]), kit.Data(arg[2:]))
} else { } else {
func() { if target, ok := m.Optionv(TARGET).([]string); ok && len(target) == 0 {
switch target := m.Optionv(TARGET).(type) { m.Echo(Rich(m, prefix, chain, kit.Data(arg)))
case []string: } else {
if len(target) == 0 {
m.Echo(Rich(m, prefix, chain, kit.Data(arg)))
return
}
}
m.Echo(Rich(m, prefix, chain, kit.Data(arg, TARGET, m.Optionv(TARGET)))) m.Echo(Rich(m, prefix, chain, kit.Data(arg, TARGET, m.Optionv(TARGET))))
}() }
} }
saveImportant(m, prefix, chain, kit.Simple(INSERT, prefix, chain, HASH, HASH, m.Result(), TIME, m.Time(), arg)...) saveImportant(m, prefix, chain, kit.Simple(INSERT, prefix, chain, HASH, HASH, m.Result(), TIME, m.Time(), arg)...)
return m.Result() return m.Result()
@ -60,17 +55,17 @@ func _hash_delete(m *ice.Message, prefix, chain, field, value string) {
if target, ok := kit.GetMeta(val)[TARGET].(io.Closer); ok { if target, ok := kit.GetMeta(val)[TARGET].(io.Closer); ok {
target.Close() target.Close()
} }
saveImportant(m, prefix, chain, kit.Simple(DELETE, prefix, chain, HASH, HASH, key)...)
m.Logs(DELETE, KEY, path.Join(prefix, chain), field, value, VALUE, kit.Format(val)) m.Logs(DELETE, KEY, path.Join(prefix, chain), field, value, VALUE, kit.Format(val))
m.Conf(prefix, kit.Keys(chain, HASH, key), "") m.Conf(prefix, kit.Keys(chain, HASH, key), "")
saveImportant(m, prefix, chain, kit.Simple(DELETE, prefix, chain, HASH, HASH, key)...)
}) })
} }
func _hash_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) { func _hash_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) {
m.Logs(MODIFY, KEY, path.Join(prefix, chain), field, value, arg) m.Logs(MODIFY, KEY, path.Join(prefix, chain), field, value, arg)
defer Lock(m, prefix)() defer Lock(m, prefix)()
Richs(m, prefix, chain, value, func(key string, val Map) { Richs(m, prefix, chain, value, func(key string, val Map) {
saveImportant(m, prefix, chain, kit.Simple(MODIFY, prefix, chain, HASH, HASH, key, arg)...)
_mdb_modify(m, val, field, arg...) _mdb_modify(m, val, field, arg...)
saveImportant(m, prefix, chain, kit.Simple(MODIFY, prefix, chain, HASH, HASH, key, arg)...)
}) })
} }
func _hash_select(m *ice.Message, prefix, chain, field, value string) { func _hash_select(m *ice.Message, prefix, chain, field, value string) {
@ -82,9 +77,9 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) {
kit.For(kit.Split(value), func(value string) { kit.For(kit.Split(value), func(value string) {
Richs(m, prefix, chain, value, func(key string, value Map) { _mdb_select(m, m.OptionCB(""), key, value, fields, nil) }) Richs(m, prefix, chain, value, func(key string, value Map) { _mdb_select(m, m.OptionCB(""), key, value, fields, nil) })
}) })
return } else {
Richs(m, prefix, chain, value, func(key string, value Map) { _mdb_select(m, m.OptionCB(""), key, value, fields, nil) })
} }
Richs(m, prefix, chain, value, func(key string, value Map) { _mdb_select(m, m.OptionCB(""), key, value, fields, nil) })
} }
func _hash_select_field(m *ice.Message, prefix, chain string, key string, field string) (value string) { func _hash_select_field(m *ice.Message, prefix, chain string, key string, field string) (value string) {
defer RLock(m, prefix)() defer RLock(m, prefix)()
@ -108,8 +103,8 @@ func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) {
} }
func _hash_export(m *ice.Message, prefix, chain, file string) { func _hash_export(m *ice.Message, prefix, chain, file string) {
defer Lock(m, prefix)() defer Lock(m, prefix)()
count := len(Confm(m, prefix, kit.Keys(chain, HASH)))
p := kit.Keys(file, JSON) p := kit.Keys(file, JSON)
count := len(Confm(m, prefix, kit.Keys(chain, HASH)))
if count == 0 { if count == 0 {
if s, e := os.Stat(p); e == nil && !s.IsDir() { if s, e := os.Stat(p); e == nil && !s.IsDir() {
os.Remove(p) os.Remove(p)
@ -122,16 +117,16 @@ func _hash_export(m *ice.Message, prefix, chain, file string) {
defer m.Echo(p) defer m.Echo(p)
m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count) m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count)
en := json.NewEncoder(f) en := json.NewEncoder(f)
if en.SetIndent("", " "); !m.Warn(en.Encode(m.Confv(prefix, kit.Keys(chain, HASH))), EXPORT, prefix) { if en.SetIndent("", " "); !m.WarnNotValid(en.Encode(m.Confv(prefix, kit.Keys(chain, HASH))), EXPORT, prefix) {
m.Conf(prefix, kit.Keys(chain, HASH), "") m.Conf(prefix, kit.Keys(chain, HASH), "")
} }
} }
func _hash_import(m *ice.Message, prefix, chain, file string) { func _hash_import(m *ice.Message, prefix, chain, file string) {
defer Lock(m, prefix)() defer Lock(m, prefix)()
f, e := ice.Info.Open(m, kit.Keys(file, JSON)) f, e := miss.OpenFile(kit.Keys(file, JSON))
if e != nil && !ice.Info.Important { if e != nil && !ice.Info.Important {
return return
} else if m.Warn(e) { } else if m.WarnNotFound(e) {
return return
} }
defer f.Close() defer f.Close()
@ -212,7 +207,7 @@ func DevDataAction(fields ...string) ice.Actions {
HashSelect(m.Options(ice.MSG_FIELDS, kit.Join(fields))).PushAction(DEV_RESPONSE).Options(ice.MSG_ACTION, "") HashSelect(m.Options(ice.MSG_FIELDS, kit.Join(fields))).PushAction(DEV_RESPONSE).Options(ice.MSG_ACTION, "")
}}, }},
DEV_RESPONSE: {Help: "选择", Hand: func(m *ice.Message, arg ...string) { DEV_RESPONSE: {Help: "选择", Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(ice.MSG_METHOD) != http.MethodPost, ice.ErrNotAllow) { if !m.WarnNotAllow(m.Option(ice.MSG_METHOD) != http.MethodPost) {
m.ProcessReplace(m.ParseLink(m.Option(BACK)).MergePodCmd("", m.PrefixKey(), ACTION, DEV_CONFIRM, m.OptionSimple(DAEMON), m.OptionSimple(fields...))) m.ProcessReplace(m.ParseLink(m.Option(BACK)).MergePodCmd("", m.PrefixKey(), ACTION, DEV_CONFIRM, m.OptionSimple(DAEMON), m.OptionSimple(fields...)))
} }
}}, }},
@ -220,7 +215,7 @@ func DevDataAction(fields ...string) ice.Actions {
m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.Cmdx("nfs.cat", "src/template/mdb.hash/savefrom.html"), m.Option(kit.Split(fields[0])[0])), DEV_CREATE) m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.Cmdx("nfs.cat", "src/template/mdb.hash/savefrom.html"), m.Option(kit.Split(fields[0])[0])), DEV_CREATE)
}}, }},
DEV_CREATE: {Help: "创建", Hand: func(m *ice.Message, arg ...string) { DEV_CREATE: {Help: "创建", Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(ice.MSG_METHOD) != http.MethodPost, ice.ErrNotAllow) { if !m.WarnNotAllow(m.Option(ice.MSG_METHOD) != http.MethodPost) {
defer kit.If(m.Option(DAEMON), func(p string) { m.Cmd("space", p, "refresh") }) defer kit.If(m.Option(DAEMON), func(p string) { m.Cmd("space", p, "refresh") })
HashCreate(m.ProcessClose(), m.OptionSimple(fields...)) HashCreate(m.ProcessClose(), m.OptionSimple(fields...))
} }
@ -339,7 +334,7 @@ func HashSelectTarget(m *ice.Message, key string, create Any) (target Any) {
} }
switch create := create.(type) { switch create := create.(type) {
case func(Maps) Any: case func(Maps) Any:
target = create(ToMaps(value)) target = create(kit.ToMaps(value))
case func(Map) Any: case func(Map) Any:
target = create(value) target = create(value)
case func() Any: case func() Any:
@ -354,7 +349,7 @@ func HashSelectTarget(m *ice.Message, key string, create Any) (target Any) {
func HashSelectClose(m *ice.Message) *ice.Message { func HashSelectClose(m *ice.Message) *ice.Message {
HashSelectValue(m, func(value Map) { HashSelectValue(m, func(value Map) {
if c, ok := value[TARGET].(io.Closer); ok { if c, ok := value[TARGET].(io.Closer); ok {
m.Warn(c.Close()) m.WarnNotValid(c.Close())
} }
delete(value, TARGET) delete(value, TARGET)
}) })

View File

@ -2,6 +2,7 @@ package mdb
import ( import (
"encoding/csv" "encoding/csv"
"os"
"path" "path"
"strings" "strings"
@ -29,14 +30,14 @@ func _list_inputs(m *ice.Message, prefix, chain string, field, value string) {
func _list_insert(m *ice.Message, prefix, chain string, arg ...string) { func _list_insert(m *ice.Message, prefix, chain string, arg ...string) {
m.Logs(INSERT, KEY, path.Join(prefix, chain), arg) m.Logs(INSERT, KEY, path.Join(prefix, chain), arg)
defer Lock(m, prefix)() defer Lock(m, prefix)()
saveImportant(m, prefix, chain, kit.Simple(INSERT, prefix, chain, LIST, TIME, m.Time(), arg)...)
m.Echo("%d", Grow(m, prefix, chain, kit.Dict(arg, TARGET, m.Optionv(TARGET)))) m.Echo("%d", Grow(m, prefix, chain, kit.Dict(arg, TARGET, m.Optionv(TARGET))))
saveImportant(m, prefix, chain, kit.Simple(INSERT, prefix, chain, LIST, TIME, m.Time(), arg)...)
} }
func _list_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) { func _list_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) {
m.Logs(MODIFY, KEY, path.Join(prefix, chain), field, value, arg) m.Logs(MODIFY, KEY, path.Join(prefix, chain), field, value, arg)
defer Lock(m, prefix)() defer Lock(m, prefix)()
saveImportant(m, prefix, chain, kit.Simple(MODIFY, prefix, chain, LIST, field, value, arg)...)
Grows(m, prefix, chain, field, value, func(index int, val ice.Map) { _mdb_modify(m, val, field, arg...) }) Grows(m, prefix, chain, field, value, func(index int, val ice.Map) { _mdb_modify(m, val, field, arg...) })
saveImportant(m, prefix, chain, kit.Simple(MODIFY, prefix, chain, LIST, field, value, arg)...)
} }
func _list_select(m *ice.Message, prefix, chain, field, value string) { func _list_select(m *ice.Message, prefix, chain, field, value string) {
defer m.SortIntR(ID) defer m.SortIntR(ID)
@ -48,29 +49,40 @@ func _list_select(m *ice.Message, prefix, chain, field, value string) {
} }
func _list_export(m *ice.Message, prefix, chain, file string) { func _list_export(m *ice.Message, prefix, chain, file string) {
defer Lock(m, prefix)() defer Lock(m, prefix)()
f, p, e := miss.CreateFile(kit.Keys(file, CSV)) p := kit.Keys(file, CSV)
count := kit.Int(Conf(m, prefix, kit.Keys(chain, META, COUNT)))
if count == 0 {
if s, e := os.Stat(p); e == nil && !s.IsDir() {
os.Remove(p)
}
return
}
f, p, e := miss.CreateFile(p)
m.Assert(e) m.Assert(e)
defer f.Close() defer f.Close()
defer m.Echo(p) defer m.Echo(p)
m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count)
w := csv.NewWriter(f) w := csv.NewWriter(f)
defer w.Flush() defer w.Flush()
count, head := 0, kit.Split(ListField(m)) head := kit.Split(ListField(m))
Grows(m, prefix, chain, "", "", func(index int, value ice.Map) { Grows(m, prefix, chain, "", "", func(index int, value ice.Map) {
if value = kit.GetMeta(value); index == 0 { if value = kit.GetMeta(value); index == 0 {
kit.If(len(head) == 0 || head[0] == ice.FIELDS_DETAIL, func() { head = kit.SortedKey(value) }) kit.If(len(head) == 0 || head[0] == ice.FIELDS_DETAIL, func() { head = kit.SortedKey(value) })
w.Write(head) w.Write(head)
} }
w.Write(kit.Simple(head, func(k string) string { return kit.Format(value[k]) })) w.Write(kit.Simple(head, func(k string) string { return kit.Format(value[k]) }))
count++
}) })
m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count)
m.Conf(prefix, kit.Keys(chain, kit.Keym(COUNT)), 0) m.Conf(prefix, kit.Keys(chain, kit.Keym(COUNT)), 0)
m.Conf(prefix, kit.Keys(chain, LIST), "") m.Conf(prefix, kit.Keys(chain, LIST), "")
} }
func _list_import(m *ice.Message, prefix, chain, file string) { func _list_import(m *ice.Message, prefix, chain, file string) {
defer Lock(m, prefix)() defer Lock(m, prefix)()
f, e := miss.OpenFile(kit.Keys(file, CSV)) f, e := miss.OpenFile(kit.Keys(file, CSV))
m.Assert(e) if e != nil && !ice.Info.Important {
return
} else if m.WarnNotFound(e) {
return
}
defer f.Close() defer f.Close()
r := csv.NewReader(f) r := csv.NewReader(f)
head, _ := r.Read() head, _ := r.Read()
@ -195,12 +207,7 @@ const (
CACHE_FIELD = "cache.field" CACHE_FIELD = "cache.field"
) )
type Message interface { func Grows(m *ice.Message, prefix string, chain Any, match string, value string, cb Any) Map {
Confv(arg ...Any) (val Any)
Option(key string, arg ...Any) string
}
func Grows(m Message, prefix string, chain Any, match string, value string, cb Any) Map {
cache, ok := m.Confv(prefix, chain).(ice.Map) cache, ok := m.Confv(prefix, chain).(ice.Map)
if cache == nil || !ok { if cache == nil || !ok {
return nil return nil
@ -216,7 +223,7 @@ func Grows(m Message, prefix string, chain Any, match string, value string, cb A
kit.Int(kit.Select("0", strings.TrimPrefix(m.Option(CACHE_OFFEND), "-"))), kit.Int(kit.Select("0", strings.TrimPrefix(m.Option(CACHE_OFFEND), "-"))),
kit.Int(kit.Select("10", m.Option(CACHE_LIMIT))), match, value, cb) kit.Int(kit.Select("10", m.Option(CACHE_LIMIT))), match, value, cb)
} }
func Grow(m Message, prefix string, chain Any, data Any) int { func Grow(m *ice.Message, prefix string, chain Any, data Any) int {
cache, ok := m.Confv(prefix, chain).(ice.Map) cache, ok := m.Confv(prefix, chain).(ice.Map)
if cache == nil || !ok { if cache == nil || !ok {
cache = kit.Data() cache = kit.Data()

View File

@ -8,41 +8,33 @@ import (
"shylinux.com/x/toolkits/task" "shylinux.com/x/toolkits/task"
) )
type configMessage interface {
Option(key string, arg ...Any) string
PrefixKey() string
Confv(...Any) Any
}
var _lock = task.Lock{} var _lock = task.Lock{}
var _locks = map[string]*task.Lock{} var _locks = map[string]*task.Lock{}
func getLock(m configMessage, arg ...string) *task.Lock { func getLock(m *ice.Message, arg ...string) *task.Lock {
key := kit.Select(m.PrefixKey(), kit.Keys(arg)) key := kit.Select(m.PrefixKey(), kit.Keys(arg))
defer _lock.Lock()() defer _lock.Lock()()
l, ok := _locks[key] l, ok := _locks[key]
kit.If(!ok, func() { l = &task.Lock{}; _locks[key] = l }) kit.If(!ok, func() { l = &task.Lock{}; _locks[key] = l })
return l return l
} }
func Lock(m configMessage, arg ...string) func() { func Lock(m *ice.Message, arg ...string) func() { return getLock(m, arg...).Lock() }
return getLock(m, arg...).Lock() func RLock(m *ice.Message, arg ...string) func() { return getLock(m, arg...).RLock() }
}
func RLock(m configMessage, arg ...string) func() { return getLock(m, arg...).RLock() }
func Config(m configMessage, key string, arg ...Any) string { func ConfigSimple(m *ice.Message, key ...string) (res []string) {
return kit.Format(Configv(m, key, arg...))
}
func ConfigSimple(m configMessage, key ...string) (res []string) {
for _, key := range key { for _, key := range key {
res = append(res, key, kit.Format(Configv(m, key))) res = append(res, key, kit.Format(Configv(m, key)))
} }
return return
} }
func Configv(m configMessage, key string, arg ...Any) Any { func Config(m *ice.Message, key string, arg ...Any) string {
return kit.Format(Configv(m, key, arg...))
}
func Configv(m *ice.Message, key string, arg ...Any) Any {
kit.If(len(arg) > 0, func() { Confv(m, m.PrefixKey(), kit.Keym(key), arg[0]) }) kit.If(len(arg) > 0, func() { Confv(m, m.PrefixKey(), kit.Keym(key), arg[0]) })
return Confv(m, m.PrefixKey(), kit.Keym(key)) return Confv(m, m.PrefixKey(), kit.Keym(key))
} }
func Confv(m configMessage, arg ...Any) Any { func Confv(m *ice.Message, arg ...Any) Any {
key := kit.Select(m.PrefixKey(), kit.Format(arg[0])) key := kit.Select(m.PrefixKey(), kit.Format(arg[0]))
if ctx, ok := ice.Info.Index[key].(*ice.Context); ok { if ctx, ok := ice.Info.Index[key].(*ice.Context); ok {
key = ctx.Prefix(key) key = ctx.Prefix(key)
@ -54,10 +46,8 @@ func Confv(m configMessage, arg ...Any) Any {
} }
return m.Confv(arg...) return m.Confv(arg...)
} }
func Conf(m configMessage, arg ...Any) string { func Conf(m *ice.Message, arg ...Any) string { return kit.Format(Confv(m, arg...)) }
return kit.Format(Confv(m, arg...)) func Confm(m *ice.Message, key string, sub Any, cbs ...Any) Map {
}
func Confm(m configMessage, key string, sub Any, cbs ...Any) Map {
val := m.Confv(key, sub) val := m.Confv(key, sub)
kit.If(len(cbs) > 0, func() { kit.For(val, cbs[0]) }) kit.If(len(cbs) > 0, func() { kit.For(val, cbs[0]) })
value, _ := val.(Map) value, _ := val.(Map)
@ -70,13 +60,12 @@ func Cache(m *ice.Message, key string, add func() Any) Any {
if key = kit.Keys(m.PrefixKey(), key); add == nil { if key = kit.Keys(m.PrefixKey(), key); add == nil {
cache.Delete(key) cache.Delete(key)
return nil return nil
} } else if val, ok := cache.Load(key); ok {
if val, ok := cache.Load(key); ok {
return val return val
} } else if val := add(); val != nil {
if val := add(); val != nil {
cache.Store(key, val) cache.Store(key, val)
return val return val
} else {
return nil
} }
return nil
} }

View File

@ -32,7 +32,7 @@ func _mdb_select(m *ice.Message, cb Any, key string, value Map, fields []string,
case func(Any): case func(Any):
cb(value[TARGET]) cb(value[TARGET])
case func(Maps): case func(Maps):
cb(ToMaps(value)) cb(kit.ToMaps(value))
case string, []string, []Any, nil: case string, []string, []Any, nil:
if m.FieldsIsDetail() { if m.FieldsIsDetail() {
m.Push(ice.FIELDS_DETAIL, value) m.Push(ice.FIELDS_DETAIL, value)
@ -96,6 +96,7 @@ const (
ICONS = "icons" ICONS = "icons"
UNITS = "units" UNITS = "units"
ORDER = "order" ORDER = "order"
GROUP = "group"
VALID = "valid" VALID = "valid"
ENABLE = "enable" ENABLE = "enable"
DISABLE = "disable" DISABLE = "disable"
@ -217,26 +218,16 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: ice.Commands
m.OptionDefault(CACHE_LIMIT, "-1") m.OptionDefault(CACHE_LIMIT, "-1")
file := _mdb_export_file(m, arg...) file := _mdb_export_file(m, arg...)
kit.Switch(arg[2], kit.Switch(arg[2],
HASH, func() { HASH, func() { _hash_export(m, arg[0], arg[1], file) },
_hash_export(m, arg[0], arg[1], file) ZONE, func() { _zone_export(m, arg[0], arg[1], file); _hash_export(m, arg[0], arg[1], file) },
},
ZONE, func() {
_zone_export(m, arg[0], arg[1], file)
_hash_export(m, arg[0], arg[1], file)
},
LIST, func() { _list_export(m, arg[0], arg[1], file) }, LIST, func() { _list_export(m, arg[0], arg[1], file) },
) )
}}, }},
IMPORT: {Name: "import key sub type file", Hand: func(m *ice.Message, arg ...string) { IMPORT: {Name: "import key sub type file", Hand: func(m *ice.Message, arg ...string) {
file := _mdb_export_file(m, arg...) file := _mdb_export_file(m, arg...)
kit.Switch(arg[2], kit.Switch(arg[2],
HASH, func() { HASH, func() { _hash_import(m, arg[0], arg[1], file) },
_hash_import(m, arg[0], arg[1], file) ZONE, func() { _hash_import(m, arg[0], arg[1], file); _zone_import(m, arg[0], arg[1], file) },
},
ZONE, func() {
_hash_import(m, arg[0], arg[1], file)
_zone_import(m, arg[0], arg[1], file)
},
LIST, func() { _list_import(m, arg[0], arg[1], file) }, LIST, func() { _list_import(m, arg[0], arg[1], file) },
) )
}}, }},
@ -271,7 +262,7 @@ func AutoConfig(arg ...Any) *ice.Action {
add := func(list []string) (inputs []Any) { add := func(list []string) (inputs []Any) {
kit.For(list, func(k string) { kit.For(list, func(k string) {
kit.If(!kit.IsIn(k, TIME, HASH, COUNT, ID), func() { kit.If(!kit.IsIn(k, TIME, HASH, COUNT, ID), func() {
inputs = append(inputs, k+kit.Select("", "*", strings.Contains(s, k))) inputs = append(inputs, k+kit.Select("", FOREACH, strings.Contains(s, k)))
}) })
}) })
return return
@ -301,8 +292,3 @@ func saveImportant(m *ice.Message, key, sub string, arg ...string) {
} }
kit.If(m.Conf(key, kit.Keys(META, IMPORTANT)) == ice.TRUE, func() { ice.SaveImportant(m, arg...) }) kit.If(m.Conf(key, kit.Keys(META, IMPORTANT)) == ice.TRUE, func() { ice.SaveImportant(m, arg...) })
} }
func ToMaps(value Map) Maps {
res := Maps{}
kit.For(value, func(k, v string) { res[k] = v })
return res
}

View File

@ -83,19 +83,15 @@ func _zone_export(m *ice.Message, prefix, chain, file string) {
m.Conf(prefix, kit.Keys(chain, HASH, key, LIST), "") m.Conf(prefix, kit.Keys(chain, HASH, key, LIST), "")
m.Conf(prefix, kit.Keys(chain, HASH, key, META, COUNT), "") m.Conf(prefix, kit.Keys(chain, HASH, key, META, COUNT), "")
} }
if count == 0 { kit.If(count == 0, func() { os.Remove(p) })
os.Remove(p)
return
}
m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count) m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count)
} }
func _zone_import(m *ice.Message, prefix, chain, file string) { func _zone_import(m *ice.Message, prefix, chain, file string) {
defer Lock(m, prefix)() defer Lock(m, prefix)()
f, e := ice.Info.Open(m, kit.Keys(file, CSV)) f, e := miss.OpenFile(kit.Keys(file, CSV))
if os.IsNotExist(e) { if e != nil && !ice.Info.Important {
return return
} } else if m.WarnNotFound(e) {
if e != nil {
return return
} }
defer f.Close() defer f.Close()
@ -132,10 +128,7 @@ func _zone_import(m *ice.Message, prefix, chain, file string) {
list[zone] = Rich(m, prefix, chain, kit.Data(zkey, zone)) list[zone] = Rich(m, prefix, chain, kit.Data(zkey, zone))
kit.If(times[list[zone]], func(t string) { m.Confv(prefix, kit.Keys(chain, HASH, list[zone], META, TIME), t) }) kit.If(times[list[zone]], func(t string) { m.Confv(prefix, kit.Keys(chain, HASH, list[zone], META, TIME), t) })
} }
func() { func() { chain := kit.Keys(chain, HASH, list[zone]); Grow(m, prefix, chain, data) }()
chain := kit.Keys(chain, HASH, list[zone])
Grow(m, prefix, chain, data)
}()
count++ count++
} }
m.Logs(IMPORT, KEY, path.Join(prefix, chain), FILE, kit.Keys(file, CSV), COUNT, count) m.Logs(IMPORT, KEY, path.Join(prefix, chain), FILE, kit.Keys(file, CSV), COUNT, count)
@ -166,7 +159,7 @@ func ZoneConfig(arg ...Any) *ice.Action {
add := func(list []string) (inputs []Any) { add := func(list []string) (inputs []Any) {
kit.For(list, func(k string) { kit.For(list, func(k string) {
kit.If(!kit.IsIn(k, TIME, HASH, COUNT, ID), func() { kit.If(!kit.IsIn(k, TIME, HASH, COUNT, ID), func() {
inputs = append(inputs, k+kit.Select("", "*", strings.Contains(s, k))) inputs = append(inputs, k+kit.Select("", FOREACH, strings.Contains(s, k)))
}) })
}) })
return return
@ -279,7 +272,7 @@ func PageZoneSelect(m *ice.Message, arg ...string) *ice.Message {
if ZoneSelect(m, arg...); len(arg) == 0 { if ZoneSelect(m, arg...); len(arg) == 0 {
m.Action(CREATE) m.Action(CREATE)
} else if len(arg) == 1 { } else if len(arg) == 1 {
m.Action(INSERT, "page") m.Action(INSERT, PAGE)
} }
return m return m
} }

View File

@ -34,7 +34,7 @@ func _cat_list(m *ice.Message, p string) {
return return
} }
f, e := _cat_find(m, p) f, e := _cat_find(m, p)
if m.Warn(e, ice.ErrNotFound, p) { if m.WarnNotFound(e, p) {
return return
} }
defer f.Close() defer f.Close()
@ -52,7 +52,7 @@ func _cat_list(m *ice.Message, p string) {
case func([]string): case func([]string):
kit.For(f, cb) kit.For(f, cb)
case nil: case nil:
if b, e := ioutil.ReadAll(f); !m.Warn(e) { if b, e := ioutil.ReadAll(f); !m.WarnNotFound(e) {
m.Echo(string(b)).StatusTime(FILE, p, SIZE, len(b)) m.Echo(string(b)).StatusTime(FILE, p, SIZE, len(b))
} }
default: default:
@ -103,13 +103,12 @@ const (
PY = "py" PY = "py"
IMAGE = "image" IMAGE = "image"
JPEG = "jpeg"
PNG = "png" JPG = "jpg"
JPEG = "jpeg" PNG = "png"
JPG = "jpg" MP4 = "mp4"
MP4 = "mp4" MOV = "mov"
MOV = "mov" PDF = "pdf"
PDF = "pdf"
DF = ice.DF DF = ice.DF
PS = ice.PS PS = ice.PS
@ -139,8 +138,9 @@ func DirList(m *ice.Message, arg ...string) bool {
if len(arg) == 0 || strings.HasSuffix(arg[0], PS) { if len(arg) == 0 || strings.HasSuffix(arg[0], PS) {
m.Cmdy(DIR, kit.Slice(arg, 0, 1)) m.Cmdy(DIR, kit.Slice(arg, 0, 1))
return true return true
} else {
return false
} }
return false
} }
func IsSourceFile(m *ice.Message, ext string) bool { func IsSourceFile(m *ice.Message, ext string) bool {
@ -159,7 +159,7 @@ func Open(m *ice.Message, p string, cb ice.Any) {
return return
} else if strings.HasSuffix(p, PS) { } else if strings.HasSuffix(p, PS) {
kit.If(p == PS, func() { p = "" }) kit.If(p == PS, func() { p = "" })
if ls, e := ReadDir(m, p); !m.Warn(e) { if ls, e := ReadDir(m, p); !m.WarnNotFound(e) {
switch cb := cb.(type) { switch cb := cb.(type) {
case func([]os.FileInfo): case func([]os.FileInfo):
cb(ls) cb(ls)
@ -171,7 +171,7 @@ func Open(m *ice.Message, p string, cb ice.Any) {
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
} }
} }
} else if f, e := OpenFile(m, p); !m.Warn(e, ice.ErrNotFound, p) { } else if f, e := OpenFile(m, p); !m.WarnNotFound(e, p) {
defer f.Close() defer f.Close()
switch cb := cb.(type) { switch cb := cb.(type) {
case func(io.Reader, os.FileInfo): case func(io.Reader, os.FileInfo):
@ -182,7 +182,7 @@ func Open(m *ice.Message, p string, cb ice.Any) {
case func(io.Reader): case func(io.Reader):
cb(f) cb(f)
case func(string): case func(string):
if b, e := ioutil.ReadAll(f); !m.Warn(e) { if b, e := ioutil.ReadAll(f); !m.WarnNotFound(e) {
cb(string(b)) cb(string(b))
} }
default: default:
@ -191,7 +191,7 @@ func Open(m *ice.Message, p string, cb ice.Any) {
} }
} }
func ReadAll(m *ice.Message, r io.Reader) []byte { func ReadAll(m *ice.Message, r io.Reader) []byte {
if b, e := ioutil.ReadAll(r); !m.Warn(e) { if b, e := ioutil.ReadAll(r); !m.WarnNotFound(e) {
return b return b
} }
return nil return nil

View File

@ -51,9 +51,7 @@ func _dir_list(m *ice.Message, root string, dir string, level int, deep bool, di
default: default:
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
} }
if s.ModTime().After(last) { kit.If(s.ModTime().After(last), func() { last = s.ModTime() })
last = s.ModTime()
}
for _, field := range fields { for _, field := range fields {
switch field { switch field {
case mdb.TIME: case mdb.TIME:
@ -144,29 +142,29 @@ const (
VAR = "var/" VAR = "var/"
USR = "usr/" USR = "usr/"
USR_PORTAL = ice.USR_PORTAL SRC_TEMPLATE = ice.SRC_TEMPLATE
USR_PUBLISH = ice.USR_PUBLISH USR_ICEBERGS = ice.USR_ICEBERGS
USR_ICEBERGS = ice.USR_ICEBERGS USR_PUBLISH = ice.USR_PUBLISH
USR_LOCAL_WORK = ice.USR_LOCAL_WORK USR_PORTAL = ice.USR_PORTAL
USR_LOCAL = ice.USR_LOCAL USR_LOCAL = ice.USR_LOCAL
SRC_TEMPLATE = ice.SRC_TEMPLATE USR_LOCAL_WORK = ice.USR_LOCAL_WORK
USR_LEARNING_PORTAL = "usr/learning/portal/" USR_PACKAGE = "usr/package.json"
USR_PACKAGE = "usr/package.json" USR_MODULES = "usr/node_modules/"
USR_MODULES = "usr/node_modules/" REQUIRE_MODULES = "/require/modules/"
REQUIRE_MODULES = "/require/modules/" REQUIRE_USR = "/require/usr/"
REQUIRE_SRC = "/require/src/" REQUIRE_SRC = "/require/src/"
REQUIRE_USR = "/require/usr/" REQUIRE = "/require/"
REQUIRE = "/require/" VOLCANOS = "/volcanos/"
VOLCANOS = "/volcanos/" INTSHELL = "/intshell/"
INTSHELL = "/intshell/" SHARE_LOCAL = "/share/local/"
SHARE_LOCAL = "/share/local/" PATHNAME = "pathname"
PATHNAME = "pathname" FILENAME = "filename"
FILENAME = "filename"
USR_ICONS_AVATAR = "usr/icons/avatar.jpg" USR_LEARNING_PORTAL = "usr/learning/portal/"
USR_ICONS_CONTEXTS = "usr/icons/contexts.png" USR_ICONS_AVATAR = "usr/icons/avatar.jpg"
USR_ICONS_ICEBERGS = "usr/icons/icebergs.jpg" USR_ICONS_CONTEXTS = "usr/icons/contexts.png"
USR_ICONS_VOLCANOS = "usr/icons/volcanos.jpg" USR_ICONS_ICEBERGS = "usr/icons/icebergs.jpg"
USR_ICONS_VOLCANOS = "usr/icons/volcanos.jpg"
TYPE_ALL = "all" TYPE_ALL = "all"
TYPE_BIN = "bin" TYPE_BIN = "bin"
@ -204,14 +202,14 @@ func init() {
ice.APP: {Help: "本机", Hand: func(m *ice.Message, arg ...string) { ice.APP: {Help: "本机", Hand: func(m *ice.Message, arg ...string) {
switch runtime.GOOS { switch runtime.GOOS {
case "darwin": case "darwin":
m.Cmd("cli.system", "open", kit.Path(m.Option(PATH))) m.System("open", kit.Path(m.Option(PATH)))
} }
}}, }},
mdb.SHOW: {Help: "预览", Hand: func(m *ice.Message, arg ...string) { mdb.SHOW: {Help: "预览", Hand: func(m *ice.Message, arg ...string) {
Show(m.ProcessInner(), path.Join(m.Option(DIR_ROOT), m.Option(PATH))) Show(m.ProcessInner(), path.Join(m.Option(DIR_ROOT), m.Option(PATH)))
}}, mdb.UPLOAD: {}, }}, mdb.UPLOAD: {},
SIZE: {Hand: func(m *ice.Message, arg ...string) { SIZE: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(kit.Select("", kit.Split(m.Cmdx("cli.system", "du", "-sh")), 0)) m.Echo(kit.Select("", kit.Split(m.System("du", "-sh").Result()), 0))
}}, }},
TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(TRASH, mdb.CREATE, m.Option(PATH)) }}, TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(TRASH, mdb.CREATE, m.Option(PATH)) }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
@ -272,9 +270,7 @@ func DirDeepAll(m *ice.Message, root, dir string, cb func(ice.Maps), arg ...stri
} }
func Show(m *ice.Message, file string) bool { func Show(m *ice.Message, file string) bool {
p := SHARE_LOCAL + file p := SHARE_LOCAL + file
kit.If(m.Option(ice.MSG_USERPOD), func(pod string) { kit.If(m.Option(ice.MSG_USERPOD), func(pod string) { p = kit.MergeURL(p, ice.POD, pod) })
p += "?" + kit.JoinKV("=", "&", ice.POD, pod)
})
switch strings.ToLower(kit.Ext(file)) { switch strings.ToLower(kit.Ext(file)) {
case PNG, JPG, JPEG: case PNG, JPG, JPEG:
m.EchoImages(p) m.EchoImages(p)

View File

@ -4,6 +4,7 @@ import (
"path" "path"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -11,9 +12,9 @@ const DOCUMENT = "document"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
DOCUMENT: {Name: "document index path auto", Help: "文档", Actions: ice.MergeActions(ice.Actions{}), Hand: func(m *ice.Message, arg ...string) { DOCUMENT: {Name: "document index path auto", Help: "文档", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
m.Cmdy(ice.COMMAND).Action("filter:text").Option(ice.MSG_DISPLAY, "") m.Cmdy(ice.COMMAND).Action(html.FILTER).Option(ice.MSG_DISPLAY, "")
return return
} }
m.Search(arg[0], func(p *ice.Context, c *ice.Context, key string, cmd *ice.Command) { m.Search(arg[0], func(p *ice.Context, c *ice.Context, key string, cmd *ice.Command) {
@ -36,9 +37,5 @@ var DocumentText = func(m *ice.Message, p string) string {
return m.Cmdx(CAT, DocumentPath(m, path.Base(p))) return m.Cmdx(CAT, DocumentPath(m, path.Base(p)))
} }
var DocumentPath = func(m *ice.Message, arg ...string) string { var DocumentPath = func(m *ice.Message, arg ...string) string {
if p := path.Join(USR_LEARNING_PORTAL, m.PrefixKey(), path.Join(arg...)); Exists(m, p) { return path.Join(USR_LEARNING_PORTAL, m.PrefixKey(), path.Join(arg...))
return p
} else {
return p
}
} }

View File

@ -16,7 +16,7 @@ func init() {
FIND: {Name: "find word file auto", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { FIND: {Name: "find word file auto", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
kit.If(len(arg) == 0, func() { arg = append(arg, "main.go") }) kit.If(len(arg) == 0, func() { arg = append(arg, "main.go") })
m.Options(mdb.VALUE, arg[0], CMD_DIR, kit.Select("", arg, 2)) m.Options(mdb.VALUE, arg[0], CMD_DIR, kit.Select("", arg, 2))
msg := m.Cmd("cli.system", FIND, kit.Select(SRC, arg, 1), "-name", arg[0]) msg := m.System(FIND, kit.Select(SRC, arg, 1), "-name", arg[0])
m.Echo(msg.FormatsMeta(nil)) m.Echo(msg.FormatsMeta(nil))
kit.For(strings.Split(msg.Result(), ice.NL), func(s string) { m.Push(FILE, s) }) kit.For(strings.Split(msg.Result(), ice.NL), func(s string) { m.Push(FILE, s) })
m.StatusTimeCount(kit.Dict(PATH, m.Option(CMD_DIR))) m.StatusTimeCount(kit.Dict(PATH, m.Option(CMD_DIR)))

View File

@ -21,7 +21,7 @@ func init() {
GREP: {Name: "grep word file auto", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { GREP: {Name: "grep word file auto", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
kit.If(len(arg) == 0, func() { arg = append(arg, ice.MAIN) }) kit.If(len(arg) == 0, func() { arg = append(arg, ice.MAIN) })
m.Options(mdb.VALUE, arg[0], CMD_DIR, kit.Select("", arg, 2)) m.Options(mdb.VALUE, arg[0], CMD_DIR, kit.Select("", arg, 2))
kit.For(strings.Split(m.Cmdx("cli.system", GREP, "--exclude=.[a-z]*", "--exclude-dir=.[a-z]*", "-rni", arg[0], path.Join(kit.Select(SRC, arg, 1))), ice.NL), func(s string) { kit.For(strings.Split(m.System(GREP, "--exclude=.[a-z]*", "--exclude-dir=.[a-z]*", "-rni", arg[0], path.Join(kit.Select(SRC, arg, 1))).Result(), ice.NL), func(s string) {
if ls := strings.SplitN(s, DF, 3); len(ls) > 2 { if ls := strings.SplitN(s, DF, 3); len(ls) > 2 {
m.Push(FILE, strings.TrimPrefix(ls[0], PWD)).Push(LINE, ls[1]).Push(mdb.TEXT, ls[2]) m.Push(FILE, strings.TrimPrefix(ls[0], PWD)).Push(LINE, ls[1]).Push(mdb.TEXT, ls[2])
} }

View File

@ -22,11 +22,11 @@ func init() {
Open(m, arg[0], func(r io.Reader, s os.FileInfo) { Open(m, arg[0], func(r io.Reader, s os.FileInfo) {
switch arg[1] { switch arg[1] {
case "gzip": case "gzip":
if g, e := gzip.NewReader(r); !m.Warn(e) { if g, e := gzip.NewReader(r); !m.WarnNotFound(e) {
r = g r = g
} }
case "zlib": case "zlib":
if z, e := zlib.NewReader(r); !m.Warn(e) { if z, e := zlib.NewReader(r); !m.WarnNotFound(e) {
r = z r = z
} }
} }

View File

@ -17,20 +17,6 @@ const PACK = "pack"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
PACK: {Name: "pack path auto create upload", Help: "文件系统", Actions: ice.Actions{ PACK: {Name: "pack path auto create upload", Help: "文件系统", Actions: ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] != "" {
m.Cmd(DIR, SRC, PATH, kit.Dict(DIR_REG, arg[1], DIR_DEEP, ice.TRUE, DIR_TYPE, CAT), func(value ice.Maps) {
if strings.HasPrefix(value[PATH], ice.SRC_TEMPLATE) {
return
}
m.PushSearch(mdb.TYPE, kit.Ext(value[PATH]), mdb.NAME, path.Base(value[PATH]), mdb.TEXT, value[PATH])
})
OptionFiles(m, PackFile)
m.Cmd(DIR, USR, PATH, kit.Dict(DIR_REG, arg[1], DIR_DEEP, ice.TRUE, DIR_TYPE, CAT), func(value ice.Maps) {
m.PushSearch(mdb.TYPE, kit.Ext(value[PATH]), mdb.NAME, path.Base(value[PATH]), mdb.TEXT, value[PATH])
})
}
}},
mdb.CREATE: {Name: "create path*=src/hi/hi.txt text*=hello", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create path*=src/hi/hi.txt text*=hello", Hand: func(m *ice.Message, arg ...string) {
OptionFiles(m, PackFile) OptionFiles(m, PackFile)
Create(m, m.Option(PATH), func(w io.Writer, p string) { Create(m, m.Option(PATH), func(w io.Writer, p string) {
@ -72,13 +58,8 @@ var DiskFile = file.NewDiskFile()
var PackFile = file.NewPackFile() var PackFile = file.NewPackFile()
func init() { file.Init(OptionFiles(ice.Pulse, DiskFile, PackFile)) } func init() { file.Init(OptionFiles(ice.Pulse, DiskFile, PackFile)) }
func init() { ice.Info.Open = OpenFile }
type optionMessage interface { func OptionFiles(m *ice.Message, f ...file.File) file.File {
Optionv(key string, arg ...ice.Any) ice.Any
}
func OptionFiles(m optionMessage, f ...file.File) file.File {
if len(f) > 1 { if len(f) > 1 {
m.Optionv(ice.MSG_FILES, file.NewMultiFile(f...)) m.Optionv(ice.MSG_FILES, file.NewMultiFile(f...))
} else if len(f) > 0 { } else if len(f) > 0 {
@ -86,18 +67,18 @@ func OptionFiles(m optionMessage, f ...file.File) file.File {
} }
return m.Optionv(ice.MSG_FILES).(file.File) return m.Optionv(ice.MSG_FILES).(file.File)
} }
func StatFile(m optionMessage, p string) (os.FileInfo, error) { return OptionFiles(m).StatFile(p) } func StatFile(m *ice.Message, p string) (os.FileInfo, error) { return OptionFiles(m).StatFile(p) }
func OpenFile(m *ice.Message, p string) (io.ReadCloser, error) { return OptionFiles(m).OpenFile(p) } func OpenFile(m *ice.Message, p string) (io.ReadCloser, error) { return OptionFiles(m).OpenFile(p) }
func CreateFile(m optionMessage, p string) (io.WriteCloser, string, error) { func CreateFile(m *ice.Message, p string) (io.WriteCloser, string, error) {
return OptionFiles(m).CreateFile(p) return OptionFiles(m).CreateFile(p)
} }
func AppendFile(m optionMessage, p string) (io.ReadWriteCloser, string, error) { func AppendFile(m *ice.Message, p string) (io.ReadWriteCloser, string, error) {
w, e := OptionFiles(m).AppendFile(p) w, e := OptionFiles(m).AppendFile(p)
return w, p, e return w, p, e
} }
func WriteFile(m optionMessage, p string, b []byte) error { return OptionFiles(m).WriteFile(p, b) } func WriteFile(m *ice.Message, p string, b []byte) error { return OptionFiles(m).WriteFile(p, b) }
func ReadDir(m optionMessage, p string) ([]os.FileInfo, error) { func ReadDir(m *ice.Message, p string) ([]os.FileInfo, error) {
list, e := OptionFiles(m).ReadDir(p) list, e := OptionFiles(m).ReadDir(p)
for i := 0; i < len(list)-1; i++ { for i := 0; i < len(list)-1; i++ {
for j := i + 1; j < len(list); j++ { for j := i + 1; j < len(list); j++ {
@ -110,24 +91,24 @@ func ReadDir(m optionMessage, p string) ([]os.FileInfo, error) {
} }
return list, e return list, e
} }
func MkdirAll(m optionMessage, p string) string { func MkdirAll(m *ice.Message, p string) string {
OptionFiles(m).MkdirAll(p, ice.MOD_DIR) OptionFiles(m).MkdirAll(p, ice.MOD_DIR)
return p return p
} }
func RemoveAll(m optionMessage, p string) error { return OptionFiles(m).RemoveAll(p) } func RemoveAll(m *ice.Message, p string) error { return OptionFiles(m).RemoveAll(p) }
func Remove(m optionMessage, p string) error { return OptionFiles(m).Remove(p) } func Remove(m *ice.Message, p string) error { return OptionFiles(m).Remove(p) }
func Rename(m optionMessage, oldname string, newname string) error { func Rename(m *ice.Message, oldname string, newname string) error {
MkdirAll(m, path.Dir(newname)) MkdirAll(m, path.Dir(newname))
return OptionFiles(m).Rename(oldname, newname) return OptionFiles(m).Rename(oldname, newname)
} }
func Symlink(m optionMessage, oldname string, newname string) error { func Symlink(m *ice.Message, oldname string, newname string) error {
return OptionFiles(m).Symlink(oldname, newname) return OptionFiles(m).Symlink(oldname, newname)
} }
func Link(m optionMessage, oldname string, newname string) error { func Link(m *ice.Message, oldname string, newname string) error {
return OptionFiles(m).Link(oldname, newname) return OptionFiles(m).Link(oldname, newname)
} }
func Exists(m optionMessage, p string, cb ...func(string)) bool { func Exists(m *ice.Message, p string, cb ...func(string)) bool {
if _, e := OptionFiles(m).StatFile(p); e == nil { if _, e := OptionFiles(m).StatFile(p); e == nil {
for _, cb := range cb { for _, cb := range cb {
cb(p) cb(p)
@ -136,7 +117,7 @@ func Exists(m optionMessage, p string, cb ...func(string)) bool {
} }
return false return false
} }
func ExistsFile(m optionMessage, p string) bool { func ExistsFile(m *ice.Message, p string) bool {
if s, e := OptionFiles(m).StatFile(p); e == nil && !s.IsDir() { if s, e := OptionFiles(m).StatFile(p); e == nil && !s.IsDir() {
return true return true
} }
@ -146,7 +127,7 @@ func NewReadCloser(r io.Reader) io.ReadCloser { return file.NewReadCloser(r) }
func NewWriteCloser(w func([]byte) (int, error), c func() error) io.WriteCloser { func NewWriteCloser(w func([]byte) (int, error), c func() error) io.WriteCloser {
return file.NewWriteCloser(w, c) return file.NewWriteCloser(w, c)
} }
func Close(m optionMessage, p ice.Any) { func Close(m *ice.Message, p ice.Any) {
if w, ok := p.(io.Closer); ok { if w, ok := p.(io.Closer); ok {
w.Close() w.Close()
} }

View File

@ -16,7 +16,7 @@ func _defs_file(m *ice.Message, name string, text ...string) {
return return
} }
for i, v := range text { for i, v := range text {
if b, e := kit.Render(v, m); !m.Warn(e) { if b, e := kit.Render(v, m); !m.WarnNotValid(e) {
text[i] = string(b) text[i] = string(b)
} }
} }
@ -45,16 +45,16 @@ func _copy_file(m *ice.Message, name string, from ...string) {
}) })
} }
func _link_file(m *ice.Message, name string, from string) { func _link_file(m *ice.Message, name string, from string) {
if m.Warn(from == "", ice.ErrNotValid, FROM) { if m.WarnNotValid(from == "", FROM) {
return return
} }
name = path.Join(m.Option(DIR_ROOT), name) name = path.Join(m.Option(DIR_ROOT), name)
from = path.Join(m.Option(DIR_ROOT), from) from = path.Join(m.Option(DIR_ROOT), from)
if m.Warn(!Exists(m, from), ice.ErrNotFound, from) { if m.WarnNotFound(!Exists(m, from), from) {
return return
} }
Remove(m, name) Remove(m, name)
if MkdirAll(m, path.Dir(name)); m.Warn(Link(m, from, name)) && m.Warn(Symlink(m, from, name), ice.ErrWarn, from) { if MkdirAll(m, path.Dir(name)); m.WarnNotValid(Link(m, from, name)) && m.WarnNotValid(Symlink(m, from, name), from) {
return return
} }
m.Logs(SAVE, FILE, name, FROM, from).Echo(name) m.Logs(SAVE, FILE, name, FROM, from).Echo(name)
@ -103,7 +103,7 @@ func init() {
}) })
} }
func Create(m *ice.Message, p string, cb ice.Any) { func Create(m *ice.Message, p string, cb ice.Any) {
if f, p, e := CreateFile(m, p); !m.Warn(e) { if f, p, e := CreateFile(m, p); !m.WarnNotValid(e) {
defer f.Close() defer f.Close()
switch cb := cb.(type) { switch cb := cb.(type) {
case func(io.Writer, string): case func(io.Writer, string):
@ -116,7 +116,7 @@ func Create(m *ice.Message, p string, cb ice.Any) {
} }
} }
func Append(m *ice.Message, p string, cb ice.Any) { func Append(m *ice.Message, p string, cb ice.Any) {
if f, p, e := AppendFile(m, p); !m.Warn(e) { if f, p, e := AppendFile(m, p); !m.WarnNotValid(e) {
defer f.Close() defer f.Close()
switch cb := cb.(type) { switch cb := cb.(type) {
case func(io.Writer, string): case func(io.Writer, string):
@ -134,7 +134,7 @@ func Save(m *ice.Message, w io.Writer, s string, cb ice.Any) {
io.Copy(w, content) io.Copy(w, content)
return return
} }
if n, e := fmt.Fprint(w, s); !m.Warn(e) { if n, e := fmt.Fprint(w, s); !m.WarnNotValid(e) {
switch cb := cb.(type) { switch cb := cb.(type) {
case func(int): case func(int):
cb(n) cb(n)
@ -144,7 +144,7 @@ func Save(m *ice.Message, w io.Writer, s string, cb ice.Any) {
} }
} }
func Copy(m *ice.Message, w io.Writer, r io.Reader, cb ice.Any) { func Copy(m *ice.Message, w io.Writer, r io.Reader, cb ice.Any) {
if n, e := io.Copy(w, r); !m.Warn(e) { if n, e := io.Copy(w, r); !m.WarnNotValid(e) {
switch cb := cb.(type) { switch cb := cb.(type) {
case func(int): case func(int):
cb(int(n)) cb(int(n))
@ -171,7 +171,7 @@ func CopyStream(m *ice.Message, to io.Writer, from io.Reader, cache, total int,
default: default:
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
} }
if e == io.EOF || m.Warn(e) { if e == io.EOF || m.WarnNotValid(e) {
break break
} }
} }

View File

@ -20,7 +20,7 @@ func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) {
case TGZ: case TGZ:
p = kit.Keys(kit.TrimExt(p, kit.Ext(p)), TAR, GZ) p = kit.Keys(kit.TrimExt(p, kit.Ext(p)), TAR, GZ)
case GZ: case GZ:
if f, e := gzip.NewReader(r); m.Warn(e, ice.ErrNotValid, p) { if f, e := gzip.NewReader(r); m.WarnNotValid(e, p) {
return return
} else { } else {
defer f.Close() defer f.Close()
@ -30,7 +30,7 @@ func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) {
i := 0 i := 0
for r := tar.NewReader(r); ; i++ { for r := tar.NewReader(r); ; i++ {
h, e := r.Next() h, e := r.Next()
if m.Warn(e) || e == io.EOF { if m.WarnNotValid(e) || e == io.EOF {
break break
} }
if h.Size == 0 { if h.Size == 0 {

View File

@ -4,6 +4,7 @@ import (
"path" "path"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -19,7 +20,7 @@ func init() {
}}, }},
}), Hand: func(m *ice.Message, arg ...string) { }), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
m.Cmdy(ice.COMMAND).Action("filter:text").Option(ice.MSG_DISPLAY, "") m.Cmdy(ice.COMMAND).Action(html.FILTER).Option(ice.MSG_DISPLAY, "")
return return
} }
m.Search(arg[0], func(p *ice.Context, c *ice.Context, key string, cmd *ice.Command) { m.Search(arg[0], func(p *ice.Context, c *ice.Context, key string, cmd *ice.Command) {
@ -36,6 +37,7 @@ func init() {
} }
func init() { ice.Info.Template = Template } func init() { ice.Info.Template = Template }
func Template(m *ice.Message, p string, data ...ice.Any) string { func Template(m *ice.Message, p string, data ...ice.Any) string {
if len(data) == 0 { if len(data) == 0 {
return kit.Renders(TemplateText(m, p), m) return kit.Renders(TemplateText(m, p), m)
@ -47,9 +49,5 @@ var TemplateText = func(m *ice.Message, p string) string {
return m.Cmdx(CAT, kit.Select(TemplatePath(m, path.Base(p)), m.Option("_template"))) return m.Cmdx(CAT, kit.Select(TemplatePath(m, path.Base(p)), m.Option("_template")))
} }
var TemplatePath = func(m *ice.Message, arg ...string) string { var TemplatePath = func(m *ice.Message, arg ...string) string {
if p := path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Join(arg...)); Exists(m, p) { return path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Join(arg...))
return p
} else {
return p
}
} }

View File

@ -10,18 +10,18 @@ import (
) )
func _trash_create(m *ice.Message, from string) { func _trash_create(m *ice.Message, from string) {
if m.Warn(from == "", ice.ErrNotValid, FROM) { if m.WarnNotValid(from == "", FROM) {
return return
} }
s, e := StatFile(m, from) s, e := StatFile(m, from)
defer Remove(m, from) defer Remove(m, from)
if m.Warn(e, ice.ErrNotFound, from) { if m.WarnNotFound(e, from) {
return return
} }
p := path.Join(ice.VAR_TRASH, path.Base(from)) p := path.Join(ice.VAR_TRASH, path.Base(from))
kit.If(!s.IsDir(), func() { Open(m, from, func(r io.Reader) { p = path.Join(ice.VAR_TRASH, kit.HashsPath(r)) }) }) kit.If(!s.IsDir(), func() { Open(m, from, func(r io.Reader) { p = path.Join(ice.VAR_TRASH, kit.HashsPath(r)) }) })
RemoveAll(m, p) RemoveAll(m, p)
kit.If(!m.Warn(Rename(m, from, p)), func() { mdb.HashCreate(m, FROM, kit.Paths(from), FILE, p) }) kit.If(!m.WarnNotValid(Rename(m, from, p)), func() { mdb.HashCreate(m, FROM, kit.Paths(from), FILE, p) })
} }
const TRASH = "trash" const TRASH = "trash"

View File

@ -13,7 +13,7 @@ import (
) )
func _zip_list(m *ice.Message, p string, cb func(zip.FileHeader, io.Reader, int)) { func _zip_list(m *ice.Message, p string, cb func(zip.FileHeader, io.Reader, int)) {
if f, e := zip.OpenReader(p); m.Warn(e, ice.ErrNotValid, p) { if f, e := zip.OpenReader(p); m.WarnNotFound(e, p) {
return return
} else { } else {
defer f.Close() defer f.Close()

View File

@ -184,7 +184,6 @@ func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server
const ( const (
FRAME = "frame" FRAME = "frame"
SHELL = "shell" SHELL = "shell"
WEBIO = "webio"
STDIO = "stdio" STDIO = "stdio"
PS1 = "PS1" PS1 = "PS1"
PS2 = "PS2" PS2 = "PS2"
@ -195,7 +194,6 @@ const (
TARGET = "target" TARGET = "target"
PROMPT = "prompt" PROMPT = "prompt"
PRINTF = "printf" PRINTF = "printf"
SCREEN = "screen"
) )
func init() { func init() {
@ -229,16 +227,6 @@ func init() {
f.printf(m, kit.Select(m.Option(nfs.CONTENT), arg, 0)) f.printf(m, kit.Select(m.Option(nfs.CONTENT), arg, 0))
} }
}}, }},
SCREEN: {Name: "screen run text", Help: "输出命令", Hand: func(m *ice.Message, arg ...string) {
if f, ok := m.Target().Server().(*Frame); ok {
for _, line := range kit.Split(arg[0], lex.NL, lex.NL) {
fmt.Fprintf(f.pipe, line+lex.NL)
f.printf(m, line+lex.NL)
m.Sleep300ms()
}
m.Echo(f.res)
}
}},
}) })
} }

View File

@ -6,4 +6,4 @@ const SSH = "ssh"
var Index = &ice.Context{Name: SSH, Help: "终端模块"} var Index = &ice.Context{Name: SSH, Help: "终端模块"}
func init() { ice.Index.Register(Index, &Frame{}, SOURCE, RETURN, TARGET, PROMPT, PRINTF, SCREEN) } func init() { ice.Index.Register(Index, &Frame{}, SOURCE, RETURN, TARGET, PROMPT, PRINTF) }

View File

@ -19,7 +19,7 @@ func _server_udp(m *ice.Message, arg ...string) {
m.Assert(e) m.Assert(e)
buf := make([]byte, 2*ice.MOD_BUFS) buf := make([]byte, 2*ice.MOD_BUFS)
for { for {
if n, from, e := l.ReadFromUDP(buf[:]); !m.Warn(e) { if n, from, e := l.ReadFromUDP(buf[:]); !m.WarnNotValid(e) {
cb(from, buf[:n]) cb(from, buf[:n])
} else { } else {
break break
@ -34,7 +34,7 @@ func _client_dial_udp4(m *ice.Message, arg ...string) {
defer kit.If(e == nil, func() { c.Close() }) defer kit.If(e == nil, func() { c.Close() })
switch cb := m.OptionCB("").(type) { switch cb := m.OptionCB("").(type) {
case func(*net.UDPConn): case func(*net.UDPConn):
kit.If(!m.Warn(e), func() { cb(c) }) kit.If(!m.WarnNotValid(e), func() { cb(c) })
default: default:
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
} }
@ -47,7 +47,7 @@ const (
) )
func UDPAddr(m *ice.Message, host, port string) *net.UDPAddr { func UDPAddr(m *ice.Message, host, port string) *net.UDPAddr {
if addr, e := net.ResolveUDPAddr(UDP4, host+nfs.DF+port); !m.Warn(e, ice.ErrNotValid, host, port, logs.FileLineMeta(2)) { if addr, e := net.ResolveUDPAddr(UDP4, host+nfs.DF+port); !m.WarnNotValid(e, host, port, logs.FileLineMeta(2)) {
return addr return addr
} }
return nil return nil

View File

@ -35,7 +35,7 @@ func _client_dial(m *ice.Message, arg ...string) {
defer kit.If(e == nil, func() { c.Close() }) defer kit.If(e == nil, func() { c.Close() })
switch cb := m.OptionCB("").(type) { switch cb := m.OptionCB("").(type) {
case func(net.Conn): case func(net.Conn):
kit.If(!m.Warn(e), func() { cb(c) }) kit.If(!m.WarnNotValid(e), func() { cb(c) })
default: default:
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
} }

View File

@ -1,7 +1,6 @@
package tcp package tcp
import ( import (
"fmt"
"net" "net"
"os" "os"
"strings" "strings"
@ -44,9 +43,6 @@ func _host_list(m *ice.Message, name string) *ice.Message {
} }
} }
} }
// if len(m.Appendv(aaa.IP)) == 0 {
// m.Push(mdb.INDEX, -1).Push(mdb.NAME, LOCALHOST).Push(aaa.IP, "127.0.0.1").Push(MASK, "255.0.0.0").Push(MAC_ADDRESS, "")
// }
return m.SortInt(mdb.INDEX).StatusTimeCount(DOMAIN, _host_domain(m)) return m.SortInt(mdb.INDEX).StatusTimeCount(DOMAIN, _host_domain(m))
} }
@ -87,8 +83,8 @@ func init() {
ISLOCAL: {Hand: func(m *ice.Message, arg ...string) { ISLOCAL: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] = strings.Split(strings.TrimPrefix(arg[0], "["), "]")[0]; arg[0] == "::1" || strings.HasPrefix(arg[0], "127.") || arg[0] == LOCALHOST { if arg[0] = strings.Split(strings.TrimPrefix(arg[0], "["), "]")[0]; arg[0] == "::1" || strings.HasPrefix(arg[0], "127.") || arg[0] == LOCALHOST {
m.Echo(ice.OK) m.Echo(ice.OK)
// } else if mdb.HashSelectField(m, strings.Split(arg[0], nfs.DF)[0], mdb.TYPE) == aaa.WHITE { } else if mdb.HashSelectField(m, strings.Split(arg[0], nfs.DF)[0], mdb.TYPE) == aaa.WHITE {
// m.Echo(ice.OK) m.Echo(ice.OK)
} }
}}, }},
PUBLISH: {Hand: func(m *ice.Message, arg ...string) { PUBLISH: {Hand: func(m *ice.Message, arg ...string) {
@ -119,6 +115,5 @@ func init() {
}) })
} }
func Address(host, port string) string { return fmt.Sprintf("%s:%s", host, port) }
func IsLocalHost(m *ice.Message, ip string) bool { return m.Cmdx(HOST, ISLOCAL, ip) == ice.OK } func IsLocalHost(m *ice.Message, ip string) bool { return m.Cmdx(HOST, ISLOCAL, ip) == ice.OK }
func PublishLocalhost(m *ice.Message, url string) string { return m.Cmdx(HOST, PUBLISH, url) } func PublishLocalhost(m *ice.Message, url string) string { return m.Cmdx(HOST, PUBLISH, url) }

View File

@ -8,7 +8,6 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
@ -105,10 +104,8 @@ func init() {
m.Assert(m.Option(PORT) != "") m.Assert(m.Option(PORT) != "")
nfs.Trash(m, path.Join(ice.USR_LOCAL_DAEMON, m.Option(PORT))) nfs.Trash(m, path.Join(ice.USR_LOCAL_DAEMON, m.Option(PORT)))
}}, }},
aaa.RIGHT: {Hand: func(m *ice.Message, arg ...string) { aaa.RIGHT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(PortRight(m, arg...)) }},
m.Echo(PortRight(m, arg...)) CURRENT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(mdb.Config(m, CURRENT)) }},
}},
CURRENT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(mdb.Config(m, CURRENT)) }},
}, mdb.HashAction(BEGIN, 10000, END, 20000)), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(BEGIN, 10000, END, 20000)), Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 { if len(arg) > 0 {
m.Cmdy(nfs.DIR, arg[1:], kit.Dict(nfs.DIR_ROOT, path.Join(ice.USR_LOCAL_DAEMON, arg[0]))) m.Cmdy(nfs.DIR, arg[1:], kit.Dict(nfs.DIR_ROOT, path.Join(ice.USR_LOCAL_DAEMON, arg[0])))
@ -122,7 +119,7 @@ func init() {
m.Push(mdb.TIME, value[mdb.TIME]).Push(PORT, port).Push(nfs.SIZE, value[nfs.SIZE]).Push(ice.BIN, strings.TrimPrefix(bin, value[nfs.PATH])) m.Push(mdb.TIME, value[mdb.TIME]).Push(PORT, port).Push(nfs.SIZE, value[nfs.SIZE]).Push(ice.BIN, strings.TrimPrefix(bin, value[nfs.PATH]))
current = kit.Max(current, port) current = kit.Max(current, port)
}) })
m.PushAction(nfs.TRASH).StatusTimeCount(ctx.ConfigSimple(m, BEGIN, CURRENT, END)).SortInt(PORT) m.PushAction(nfs.TRASH).StatusTimeCount(mdb.ConfigSimple(m, BEGIN, CURRENT, END)).SortInt(PORT)
mdb.Config(m, CURRENT, current) mdb.Config(m, CURRENT, current)
}}, }},
}) })

View File

@ -30,7 +30,7 @@ func (l Listener) Close() error {
func _server_listen(m *ice.Message, arg ...string) { func _server_listen(m *ice.Message, arg ...string) {
l, e := net.Listen(TCP, m.Option(HOST)+nfs.DF+m.Option(PORT)) l, e := net.Listen(TCP, m.Option(HOST)+nfs.DF+m.Option(PORT))
if m.Warn(e) { if m.WarnNotValid(e) {
return return
} }
l = &Listener{Listener: l, m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)), s: &Stat{}} l = &Listener{Listener: l, m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)), s: &Stat{}}
@ -40,7 +40,7 @@ func _server_listen(m *ice.Message, arg ...string) {
cb(l) cb(l)
case func(net.Conn): case func(net.Conn):
for { for {
if c, e := l.Accept(); !m.Warn(e) { if c, e := l.Accept(); !m.WarnNotValid(e) {
cb(c) cb(c)
} else { } else {
break break

View File

@ -17,7 +17,6 @@ const WIFI = "wifi"
func init() { func init() {
const ( const (
SYSTEM = "cli.system"
NETWORKSETUP = "networksetup" NETWORKSETUP = "networksetup"
DISCOVER = "discover" DISCOVER = "discover"
CONNECT = "connect" CONNECT = "connect"
@ -25,12 +24,12 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
WIFI: {Help: "无线", Actions: ice.MergeActions(ice.Actions{ WIFI: {Help: "无线", Actions: ice.MergeActions(ice.Actions{
DISCOVER: {Help: "查找", Hand: func(m *ice.Message, arg ...string) { DISCOVER: {Help: "查找", Hand: func(m *ice.Message, arg ...string) {
m.Push(SSID, strings.Split(m.Cmdx(SYSTEM, NETWORKSETUP, "-listpreferredwirelessnetworks", "en0"), lex.NL)[1:]) m.Push(SSID, strings.Split(m.System(NETWORKSETUP, "-listpreferredwirelessnetworks", "en0").Result(), lex.NL)[1:])
m.PushAction(CONNECT) m.PushAction(CONNECT)
}}, }},
CONNECT: {Help: "连接", Hand: func(m *ice.Message, arg ...string) { CONNECT: {Help: "连接", Hand: func(m *ice.Message, arg ...string) {
msg := mdb.HashSelect(m.Spawn(), m.Option(SSID, strings.TrimSpace(m.Option(SSID)))) msg := mdb.HashSelect(m.Spawn(), m.Option(SSID, strings.TrimSpace(m.Option(SSID))))
m.Cmd(SYSTEM, NETWORKSETUP, "-setairportnetwork", "en0", kit.Select(m.Option(SSID), msg.Append(SSID)), msg.Append(aaa.PASSWORD)) m.System(NETWORKSETUP, "-setairportnetwork", "en0", kit.Select(m.Option(SSID), msg.Append(SSID)), msg.Append(aaa.PASSWORD))
m.ProcessHold() m.ProcessHold()
}}, }},
}, mdb.HashAction(mdb.SHORT, SSID, mdb.FIELD, "time,ssid,password")), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, SSID, mdb.FIELD, "time,ssid,password")), Hand: func(m *ice.Message, arg ...string) {

View File

@ -41,7 +41,7 @@ func init() {
RenderMain(m) RenderMain(m)
} else { } else {
kit.If(len(arg) == 0, func() { arg = append(arg, SPACE, DOMAIN) }) kit.If(len(arg) == 0, func() { arg = append(arg, SPACE, DOMAIN) })
m.Cmd(SPIDE, mdb.CREATE, ice.OPS, kit.Format("http://localhost:%s", kit.GetValid( m.Cmd(SPIDE, mdb.CREATE, ice.OPS, HostPort(m, tcp.LOCALHOST, kit.GetValid(
func() string { return m.Cmdx(nfs.CAT, ice.VAR_LOG_ICE_PORT) }, func() string { return m.Cmdx(nfs.CAT, ice.VAR_LOG_ICE_PORT) },
func() string { return m.Cmdx(nfs.CAT, kit.Path(os.Args[0], "../", ice.VAR_LOG_ICE_PORT)) }, func() string { return m.Cmdx(nfs.CAT, kit.Path(os.Args[0], "../", ice.VAR_LOG_ICE_PORT)) },
func() string { return m.Cmdx(nfs.CAT, kit.Path(os.Args[0], "../../", ice.VAR_LOG_ICE_PORT)) }, func() string { return m.Cmdx(nfs.CAT, kit.Path(os.Args[0], "../../", ice.VAR_LOG_ICE_PORT)) },
@ -59,10 +59,10 @@ func init() {
}}, }},
}) })
} }
func AdminCmd(m *ice.Message, cmd string, arg ...ice.Any) string { func AdminCmd(m *ice.Message, cmd string, arg ...ice.Any) *ice.Message {
if ice.Info.NodeType == WORKER { if ice.Info.NodeType == WORKER {
return m.Cmdx(append([]ice.Any{SPACE, ice.OPS, cmd}, arg...)...) return m.Cmd(append([]ice.Any{SPACE, ice.OPS, cmd}, arg...)...)
} else { } else {
return m.Cmdx(append([]ice.Any{cmd}, arg...)...) return m.Cmd(append([]ice.Any{cmd}, arg...)...)
} }
} }

View File

@ -1 +0,0 @@
package web

View File

@ -36,9 +36,9 @@ func BasicSess(m *ice.Message) {
func BasicCheck(m *ice.Message, realm string, check ...func(*ice.Message) bool) bool { func BasicCheck(m *ice.Message, realm string, check ...func(*ice.Message) bool) bool {
switch ls := kit.Split(m.R.Header.Get(html.Authorization)); kit.Select("", ls, 0) { switch ls := kit.Split(m.R.Header.Get(html.Authorization)); kit.Select("", ls, 0) {
case html.Basic: case html.Basic:
if buf, err := base64.StdEncoding.DecodeString(kit.Select("", ls, 1)); !m.Warn(err) { if buf, err := base64.StdEncoding.DecodeString(kit.Select("", ls, 1)); !m.WarnNotValid(err) {
if ls := strings.SplitN(string(buf), ":", 2); !m.Warn(len(ls) < 2 || ls[1] == "", ice.ErrNotValid, html.Basic) { if ls := strings.SplitN(string(buf), ":", 2); !m.WarnNotValid(len(ls) < 2 || ls[1] == "", html.Basic) {
if msg := m.Cmd(TOKEN, ls[1]); !m.Warn(msg.Time() > msg.Append(mdb.TIME), ice.ErrNotValid) { if msg := m.Cmd(TOKEN, ls[1]); !m.WarnNotValid(msg.Time() > msg.Append(mdb.TIME)) {
if len(check) == 0 || check[0](msg) { if len(check) == 0 || check[0](msg) {
return true return true
} }

View File

@ -31,7 +31,7 @@ func _broad_serve(m *ice.Message) {
}) })
}) })
m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, tcp.UDP4, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(from *net.UDPAddr, buf []byte) { m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, tcp.UDP4, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(from *net.UDPAddr, buf []byte) {
if m.Warn(len(buf) > 1024, "broad recv buf size too large") { if m.WarnNotValid(len(buf) > 1024, "broad recv buf size too large") {
return return
} }
msg := m.Spawn(buf).Logs(tcp.RECV, BROAD, string(buf), nfs.FROM, from) msg := m.Spawn(buf).Logs(tcp.RECV, BROAD, string(buf), nfs.FROM, from)
@ -58,9 +58,9 @@ func init() {
m.Cmds("", func(value ice.Maps) { m.Cmds("", func(value ice.Maps) {
switch kit.If(value[tcp.HOST] == host, func() { value[tcp.HOST] = domain }); value[mdb.TYPE] { switch kit.If(value[tcp.HOST] == host, func() { value[tcp.HOST] = domain }); value[mdb.TYPE] {
case "sshd": case "sshd":
m.PushSearch(mdb.NAME, Script(m, "ssh -p %s %s@%s", value[tcp.PORT], m.Option(ice.MSG_USERNAME), value[tcp.HOST]), mdb.TEXT, Domain(value[tcp.HOST], value[tcp.PORT]), value) m.PushSearch(mdb.NAME, Script(m, "ssh -p %s %s@%s", value[tcp.PORT], m.Option(ice.MSG_USERNAME), value[tcp.HOST]), mdb.TEXT, HostPort(m, value[tcp.HOST], value[tcp.PORT]), value)
default: default:
m.PushSearch(mdb.TEXT, Domain(value[tcp.HOST], value[tcp.PORT]), value) m.PushSearch(mdb.TEXT, HostPort(m, value[tcp.HOST], value[tcp.PORT]), value)
} }
}) })
} }
@ -70,9 +70,11 @@ func init() {
DREAM: {Hand: func(m *ice.Message, arg ...string) { broadOpen(m) }}, DREAM: {Hand: func(m *ice.Message, arg ...string) { broadOpen(m) }},
VIMER: {Hand: func(m *ice.Message, arg ...string) { broadOpen(m) }}, VIMER: {Hand: func(m *ice.Message, arg ...string) { broadOpen(m) }},
SPIDE: {Name: "spide name type=repos", Icon: "bi bi-house-add", Hand: func(m *ice.Message, arg ...string) { SPIDE: {Name: "spide name type=repos", Icon: "bi bi-house-add", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPIDE, mdb.CREATE, m.OptionSimple(mdb.NAME), ORIGIN, Domain(m.Option(mdb.NAME), m.Option(tcp.PORT))) m.Cmd(SPIDE, mdb.CREATE, m.OptionSimple(mdb.NAME), ORIGIN, HostPort(m, m.Option(mdb.NAME), m.Option(tcp.PORT)))
}},
OPEN: {Hand: func(m *ice.Message, arg ...string) {
m.ProcessOpen(HostPort(m, m.Option(mdb.NAME), m.Option(tcp.PORT)))
}}, }},
OPEN: {Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(Domain(m.Option(mdb.NAME), m.Option(tcp.PORT))) }},
tcp.SEND: {Hand: func(m *ice.Message, arg ...string) { _broad_send(m, "", "", "", "", arg...) }}, tcp.SEND: {Hand: func(m *ice.Message, arg ...string) { _broad_send(m, "", "", "", "", arg...) }},
}, gdb.EventsAction(SERVE_START), mdb.HashAction(mdb.SHORT, "host,port", }, gdb.EventsAction(SERVE_START), mdb.HashAction(mdb.SHORT, "host,port",
mdb.FIELD, "time,hash,type,name,host,port,module,version,commitTime,compileTime,bootTime,kernel,arch", mdb.FIELD, "time,hash,type,name,host,port,module,version,commitTime,compileTime,bootTime,kernel,arch",
@ -80,5 +82,5 @@ func init() {
}) })
} }
func broadOpen(m *ice.Message) { func broadOpen(m *ice.Message) {
m.ProcessOpen(Domain(m.Option(mdb.NAME), m.Option(tcp.PORT)) + C(m.ActionKey())) m.ProcessOpen(HostPort(m, m.Option(mdb.NAME), m.Option(tcp.PORT)) + C(m.ActionKey()))
} }

View File

@ -30,7 +30,7 @@ func _cache_mime(m *ice.Message, mime, name string) string {
return mime return mime
} }
func _cache_save(m *ice.Message, mime, name, text string, arg ...string) { func _cache_save(m *ice.Message, mime, name, text string, arg ...string) {
if m.Warn(name == "", ice.ErrNotValid, mdb.NAME) { if m.WarnNotValid(name == "", mdb.NAME) {
return return
} else if len(text) > 512 { } else if len(text) > 512 {
p := m.Cmdx(nfs.SAVE, _cache_name(m, kit.Hashs(text)), kit.Dict(nfs.CONTENT, text)) p := m.Cmdx(nfs.SAVE, _cache_name(m, kit.Hashs(text)), kit.Dict(nfs.CONTENT, text))
@ -57,12 +57,12 @@ func _cache_catch(m *ice.Message, path string) (file string, size string) {
return "", "0" return "", "0"
} }
func _cache_upload(m *ice.Message, r *http.Request) (mime, name, file, size string) { func _cache_upload(m *ice.Message, r *http.Request) (mime, name, file, size string) {
if b, h, e := r.FormFile(UPLOAD); !m.Warn(e, ice.ErrNotValid, UPLOAD) { if b, h, e := r.FormFile(UPLOAD); !m.WarnNotValid(e, UPLOAD) {
defer b.Close() defer b.Close()
if f, p, e := miss.CreateFile(_cache_name(m, kit.Hashs(b))); !m.Warn(e, ice.ErrNotValid, UPLOAD) { if f, p, e := miss.CreateFile(_cache_name(m, kit.Hashs(b))); !m.WarnNotValid(e, UPLOAD) {
defer f.Close() defer f.Close()
b.Seek(0, os.SEEK_SET) b.Seek(0, os.SEEK_SET)
if n, e := io.Copy(f, b); !m.Warn(e, ice.ErrNotValid, UPLOAD) { if n, e := io.Copy(f, b); !m.WarnNotValid(e, UPLOAD) {
m.Logs(nfs.SAVE, nfs.FILE, p, nfs.SIZE, kit.FmtSize(int64(n))) m.Logs(nfs.SAVE, nfs.FILE, p, nfs.SIZE, kit.FmtSize(int64(n)))
return h.Header.Get(html.ContentType), h.Filename, p, kit.Format(n) return h.Header.Get(html.ContentType), h.Filename, p, kit.Format(n)
} }
@ -71,7 +71,7 @@ func _cache_upload(m *ice.Message, r *http.Request) (mime, name, file, size stri
return "", "", "", "0" return "", "", "", "0"
} }
func _cache_download(m *ice.Message, r *http.Response, file string, cb ice.Any) string { func _cache_download(m *ice.Message, r *http.Response, file string, cb ice.Any) string {
if f, p, e := miss.CreateFile(file); !m.Warn(e, ice.ErrNotValid, DOWNLOAD) { if f, p, e := miss.CreateFile(file); !m.WarnNotValid(e, DOWNLOAD) {
defer func() { defer func() {
if s, e := os.Stat(file); e == nil && s.Size() == 0 { if s, e := os.Stat(file); e == nil && s.Size() == 0 {
nfs.Remove(m, file) nfs.Remove(m, file)
@ -117,9 +117,6 @@ func init() {
ice.RENDER_DOWNLOAD: {Hand: func(m *ice.Message, arg ...string) { ice.RENDER_DOWNLOAD: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(_share_link(m, kit.Select(arg[0], arg, 1), ice.POD, m.Option(ice.MSG_USERPOD), nfs.FILENAME, kit.Select("", arg[0], len(arg) > 1))) m.Echo(_share_link(m, kit.Select(arg[0], arg, 1), ice.POD, m.Option(ice.MSG_USERPOD), nfs.FILENAME, kit.Select("", arg[0], len(arg) > 1)))
}}, }},
WATCH: {Name: "watch hash* path*", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
_cache_watch(m, m.Option(mdb.HASH), m.Option(nfs.PATH))
}},
WRITE: {Name: "write type name* text*", Help: "添加", Hand: func(m *ice.Message, arg ...string) { WRITE: {Name: "write type name* text*", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
_cache_save(m, m.Option(mdb.TYPE), m.Option(mdb.NAME), m.Option(mdb.TEXT)) _cache_save(m, m.Option(mdb.TYPE), m.Option(mdb.NAME), m.Option(mdb.TEXT))
}}, }},
@ -127,12 +124,15 @@ func init() {
file, size := _cache_catch(m, m.Option(nfs.PATH)) file, size := _cache_catch(m, m.Option(nfs.PATH))
_cache_save(m, m.Option(mdb.TYPE), m.Option(nfs.PATH), "", file, size) _cache_save(m, m.Option(mdb.TYPE), m.Option(nfs.PATH), "", file, size)
}}, }},
WATCH: {Name: "watch hash* path*", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
_cache_watch(m, m.Option(mdb.HASH), m.Option(nfs.PATH))
}},
UPLOAD: {Hand: func(m *ice.Message, arg ...string) { UPLOAD: {Hand: func(m *ice.Message, arg ...string) {
mime, name, file, size := _cache_upload(m, m.R) mime, name, file, size := _cache_upload(m, m.R)
_cache_save(m, mime, name, "", file, size) _cache_save(m, mime, name, "", file, size)
}}, }},
DOWNLOAD: {Name: "download type name*", Hand: func(m *ice.Message, arg ...string) { DOWNLOAD: {Name: "download type name*", Hand: func(m *ice.Message, arg ...string) {
if res, ok := m.Optionv(RESPONSE).(*http.Response); !m.Warn(!ok, ice.ErrNotValid, RESPONSE) { if res, ok := m.Optionv(RESPONSE).(*http.Response); !m.WarnNotValid(!ok, RESPONSE) {
nfs.Temp(m, func(p string) { nfs.Temp(m, func(p string) {
file, size := _cache_catch(m, _cache_download(m, res, p, m.OptionCB(""))) file, size := _cache_catch(m, _cache_download(m, res, p, m.OptionCB("")))
_cache_save(m, m.Option(mdb.TYPE), m.Option(mdb.NAME), "", file, size) _cache_save(m, m.Option(mdb.TYPE), m.Option(mdb.NAME), "", file, size)

View File

@ -22,19 +22,19 @@ func _count_stat(m *ice.Message, arg ...string) map[string]int {
break break
} }
} }
for _, agent := range []string{"Go-http-client", "GoModuleMirror", "git", "compatible"} { for _, agent := range []string{"GoModuleMirror", "Go-http-client", "git", "compatible"} {
if strings.Contains(value[mdb.TEXT], agent) { if strings.Contains(value[mdb.TEXT], agent) {
stat[agent] += count stat[agent] += count
return return
} }
} }
for _, agent := range []string{"Edg", "Chrome", "Safari", "MSIE", "Firefox"} { for _, agent := range html.AgentList {
if strings.Contains(value[mdb.TEXT], agent) { if strings.Contains(value[mdb.TEXT], agent) {
stat[agent] += count stat[agent] += count
break break
} }
} }
for _, agent := range []string{"Android", "iPhone", "Mac", "Linux", "Windows"} { for _, agent := range html.SystemList {
if strings.Contains(value[mdb.TEXT], agent) { if strings.Contains(value[mdb.TEXT], agent) {
stat[agent] += count stat[agent] += count
break break
@ -66,7 +66,7 @@ func init() {
}) })
m.StatusTimeCount(_count_stat(m)) m.StatusTimeCount(_count_stat(m))
}}, }},
"group": {Hand: func(m *ice.Message, arg ...string) { mdb.GROUP: {Hand: func(m *ice.Message, arg ...string) {
count := map[string]int{} count := map[string]int{}
list := map[string]map[string]string{} list := map[string]map[string]string{}
m.Cmd("", mdb.VALID).Table(func(value ice.Maps) { m.Cmd("", mdb.VALID).Table(func(value ice.Maps) {

View File

@ -61,6 +61,22 @@ func _dream_list(m *ice.Message) *ice.Message {
}) })
return m return m
} }
func _dream_list_icon(m *ice.Message) {
m.RewriteAppend(func(value, key string, index int) string {
if key == mdb.ICON {
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)) {
return m.Spawn(kit.Dict(ice.MSG_USERPOD, m.Appendv(mdb.NAME)[index])).FileURI(value)
} else if nfs.ExistsFile(m, value) {
return m.FileURI(value)
} else {
return m.FileURI(nfs.USR_ICONS_ICEBERGS)
}
}
return value
})
}
func _dream_more_list(m *ice.Message) *ice.Message { func _dream_more_list(m *ice.Message) *ice.Message {
if m.IsCliUA() { if m.IsCliUA() {
return m return m
@ -95,7 +111,7 @@ func _dream_more_list(m *ice.Message) *ice.Message {
return m return m
} }
func _dream_start(m *ice.Message, name string) { func _dream_start(m *ice.Message, name string) {
if m.Warn(name == "", ice.ErrNotValid, mdb.NAME) { if m.WarnNotValid(name == "", mdb.NAME) {
return return
} }
defer ToastProcess(m)() defer ToastProcess(m)()
@ -117,7 +133,7 @@ func _dream_start(m *ice.Message, name string) {
} }
defer m.Options(cli.CMD_DIR, "", cli.CMD_ENV, "", cli.CMD_OUTPUT, "") defer m.Options(cli.CMD_DIR, "", cli.CMD_ENV, "", cli.CMD_OUTPUT, "")
m.Options(cli.CMD_DIR, kit.Path(p), cli.CMD_ENV, kit.EnvList(kit.Simple(m.OptionSimple(ice.TCP_DOMAIN), m.Options(cli.CMD_DIR, kit.Path(p), cli.CMD_ENV, kit.EnvList(kit.Simple(m.OptionSimple(ice.TCP_DOMAIN),
cli.CTX_OPS, Domain(tcp.LOCALHOST, m.Cmdv(SERVE, tcp.PORT)), cli.CTX_LOG, ice.VAR_LOG_BOOT_LOG, cli.CTX_PID, ice.VAR_LOG_ICE_PID, cli.CTX_OPS, HostPort(m, tcp.LOCALHOST, m.Cmdv(SERVE, tcp.PORT)), cli.CTX_LOG, ice.VAR_LOG_BOOT_LOG, cli.CTX_PID, ice.VAR_LOG_ICE_PID,
cli.CTX_ROOT, kit.Path(""), cli.PATH, cli.BinPath(p, ""), cli.USER, ice.Info.Username, cli.CTX_ROOT, kit.Path(""), cli.PATH, cli.BinPath(p, ""), cli.USER, ice.Info.Username,
)...), cli.CMD_OUTPUT, path.Join(p, ice.VAR_LOG_BOOT_LOG), mdb.CACHE_CLEAR_ONEXIT, ice.TRUE) )...), cli.CMD_OUTPUT, path.Join(p, ice.VAR_LOG_BOOT_LOG), mdb.CACHE_CLEAR_ONEXIT, ice.TRUE)
gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.NAME, mdb.TYPE, cli.CMD_DIR)) gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.NAME, mdb.TYPE, cli.CMD_DIR))
@ -168,9 +184,9 @@ const (
ALWAYS = "always" ALWAYS = "always"
STARTALL = "startall" STARTALL = "startall"
STOPALL = "stopall" STOPALL = "stopall"
PUBLISH = "publish"
FOR_EACH = "forEach" FOR_EACH = "forEach"
FOR_FLOW = "forFlow" FOR_FLOW = "forFlow"
PUBLISH = "publish"
DREAM_CREATE = "dream.create" DREAM_CREATE = "dream.create"
DREAM_REMOVE = "dream.remove" DREAM_REMOVE = "dream.remove"
@ -189,9 +205,7 @@ const DREAM = "dream"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
DREAM: {Name: "dream refresh", Help: "梦想家", Icon: "Launchpad.png", Role: aaa.VOID, Meta: kit.Dict( DREAM: {Name: "dream refresh", Help: "梦想家", Icon: "Launchpad.png", Role: aaa.VOID, Meta: kit.Dict(
ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict( ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(WORKER, "空间", SERVER, "机器", MASTER, "服务")),
WORKER, "空间", SERVER, "机器", MASTER, "服务",
)),
), Actions: ice.MergeActions(ice.Actions{ ), Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m = m.Spawn() m = m.Spawn()
@ -284,8 +298,8 @@ func init() {
}) })
}}, }},
cli.BUILD: {Name: "build name", Hand: func(m *ice.Message, arg ...string) { cli.BUILD: {Name: "build name", Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD), m.CommandKey(), m.ActionKey()))
compile := cli.SystemFind(m, "go") != "" compile := cli.SystemFind(m, "go") != ""
m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD), m.CommandKey(), m.ActionKey()))
m.Cmd("", FOR_FLOW, m.Option(mdb.NAME), kit.JoinWord(cli.SH, ice.ETC_MISS_SH), func(p string) bool { m.Cmd("", FOR_FLOW, m.Option(mdb.NAME), kit.JoinWord(cli.SH, ice.ETC_MISS_SH), func(p string) bool {
if compile && nfs.Exists(m, path.Join(p, ice.SRC_MAIN_GO)) { if compile && nfs.Exists(m, path.Join(p, ice.SRC_MAIN_GO)) {
return false return false
@ -362,14 +376,14 @@ func init() {
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)))
}}, }},
"grant": {Help: "授权", Hand: func(m *ice.Message, arg ...string) { tcp.SEND: {Name: "send space*", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(CHAT_GRANT, aaa.CONFIRM, kit.Dict(SPACE, m.Option(mdb.NAME)))
}},
"send": {Name: "send space*", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE, m.Option(SPACE), DREAM, mdb.CREATE, m.OptionSimple(mdb.NAME, mdb.ICON, nfs.REPOS, nfs.BINARY)) m.Cmd(SPACE, m.Option(SPACE), DREAM, mdb.CREATE, m.OptionSimple(mdb.NAME, mdb.ICON, nfs.REPOS, nfs.BINARY))
m.Cmd(SPACE, m.Option(SPACE), DREAM, cli.START, m.OptionSimple(mdb.NAME)) m.Cmd(SPACE, m.Option(SPACE), DREAM, cli.START, m.OptionSimple(mdb.NAME))
ProcessIframe(m, "", m.MergePod(kit.Keys(m.Option(SPACE), m.Option(mdb.NAME)))) ProcessIframe(m, "", m.MergePod(kit.Keys(m.Option(SPACE), m.Option(mdb.NAME))))
}}, }},
GRANT: {Help: "授权", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(CHAT_GRANT, aaa.CONFIRM, kit.Dict(SPACE, m.Option(mdb.NAME)))
}},
OPEN: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) { OPEN: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
ProcessIframe(m, m.Option(mdb.NAME), kit.Select(m.MergePod(m.Option(mdb.NAME), SpideOrigin(m, m.Option(mdb.NAME))+C(ADMIN)), m.Option(mdb.TYPE) == MASTER), arg...) ProcessIframe(m, m.Option(mdb.NAME), kit.Select(m.MergePod(m.Option(mdb.NAME), SpideOrigin(m, m.Option(mdb.NAME))+C(ADMIN)), m.Option(mdb.TYPE) == MASTER), arg...)
}}, }},
@ -385,7 +399,7 @@ func init() {
DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
case WORKER: case WORKER:
m.PushButton("send", OPEN) m.PushButton(tcp.SEND, OPEN)
default: default:
m.PushButton(OPEN) m.PushButton(OPEN)
} }
@ -408,20 +422,8 @@ func init() {
html.BUTTON, kit.JoinWord(PORTAL, ADMIN, DESKTOP, WIKI_WORD, STATUS, VIMER, XTERM, COMPILE), html.BUTTON, kit.JoinWord(PORTAL, ADMIN, DESKTOP, WIKI_WORD, STATUS, VIMER, XTERM, COMPILE),
)), Hand: func(m *ice.Message, arg ...string) { )), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
_dream_list(m).RewriteAppend(func(value, key string, index int) string { _dream_list(m)
if key == mdb.ICON { _dream_list_icon(m)
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)) {
return m.Spawn(kit.Dict(ice.MSG_USERPOD, m.Appendv(mdb.NAME)[index])).FileURI(value)
} else if nfs.ExistsFile(m, value) {
return m.FileURI(value)
} else {
return m.FileURI(nfs.USR_ICONS_ICEBERGS)
}
}
return value
})
_dream_more_list(m) _dream_more_list(m)
stat := map[string]int{} stat := map[string]int{}
m.Table(func(value ice.Maps) { stat[value[mdb.TYPE]]++; stat[value[mdb.STATUS]]++ }) m.Table(func(value ice.Maps) { stat[value[mdb.TYPE]]++; stat[value[mdb.STATUS]]++ })
@ -469,7 +471,7 @@ func DreamProcess(m *ice.Message, args ice.Any, arg ...string) {
} }
func DreamEach(m *ice.Message, name string, status string, cb func(string)) *ice.Message { func DreamEach(m *ice.Message, name string, status string, cb func(string)) *ice.Message {
reg, err := regexp.Compile(name) reg, err := regexp.Compile(name)
if m.Warn(err) { if m.WarnNotValid(err) {
return m return m
} }
list := []string{} list := []string{}
@ -488,7 +490,7 @@ func DreamEach(m *ice.Message, name string, status string, cb func(string)) *ice
return m return m
} }
func DreamList(m *ice.Message) *ice.Message { func DreamList(m *ice.Message) *ice.Message {
return m.SplitIndex(AdminCmd(m, DREAM)) return m.SplitIndex(AdminCmd(m, DREAM).Result())
} }
func DreamWhiteHandle(m *ice.Message, arg ...string) { func DreamWhiteHandle(m *ice.Message, arg ...string) {
aaa.White(m, kit.Keys(DREAM, ctx.ACTION, m.CommandKey())) aaa.White(m, kit.Keys(DREAM, ctx.ACTION, m.CommandKey()))

View File

@ -7,8 +7,23 @@ import (
) )
const ( const (
Mozilla = "Mozilla" Mozilla = "Mozilla"
Firefox = "Firefox"
Safari = "Safari"
Chrome = "Chrome"
Edg = "Edg"
Mobile = "Mobile"
Alipay = "Alipay"
MicroMessenger = "MicroMessenger"
Android = "Android"
IPhone = "iPhone"
Mac = "Mac"
Linux = "Linux"
Windows = "Windows"
UserAgent = "User-Agent" UserAgent = "User-Agent"
XForwardedFor = "X-Forwarded-For"
XHost = "X-Host"
Referer = "Referer" Referer = "Referer"
Authorization = "Authorization" Authorization = "Authorization"
Bearer = "Bearer" Bearer = "Bearer"
@ -18,8 +33,6 @@ const (
ContentEncoding = "Content-Encoding" ContentEncoding = "Content-Encoding"
ContentLength = "Content-Length" ContentLength = "Content-Length"
ContentType = "Content-Type" ContentType = "Content-Type"
XForwardedFor = "X-Forwarded-For"
XHost = "X-Host"
ApplicationForm = "application/x-www-form-urlencoded" ApplicationForm = "application/x-www-form-urlencoded"
ApplicationOctet = "application/octet-stream" ApplicationOctet = "application/octet-stream"
@ -36,9 +49,8 @@ const (
WIDTH = "width" WIDTH = "width"
HEIGHT = "height" HEIGHT = "height"
BACKGROUND_COLOR = "background-color" BG_COLOR = "background-color"
FG_COLOR = "color"
COLOR = "color"
) )
const ( const (
DARK = "dark" DARK = "dark"
@ -98,5 +110,22 @@ func FormatA(inner string, arg ...string) string {
return kit.Format(`<a href="%s">%s</a>`, kit.Select(inner, arg, 0), inner) return kit.Format(`<a href="%s">%s</a>`, kit.Select(inner, arg, 0), inner)
} }
func FormatDanger(value string) string { func FormatDanger(value string) string {
return Format(SPAN, value, STYLE, kit.JoinCSS(BACKGROUND_COLOR, "var(--danger-bg-color)", COLOR, "var(--danger-fg-color)")) return Format(SPAN, value, STYLE, kit.JoinCSS(BG_COLOR, "var(--danger-bg-color)", FG_COLOR, "var(--danger-fg-color)"))
}
var SystemList = []string{
Android,
IPhone,
Mac,
Linux,
Windows,
}
var AgentList = []string{
MicroMessenger,
Alipay,
Edg,
Chrome,
Safari,
Firefox,
"Go-http-client",
} }

View File

@ -15,7 +15,7 @@ import (
"shylinux.com/x/toolkits/file" "shylinux.com/x/toolkits/file"
) )
func UserWeb(m ice.IMessage) *url.URL { func UserWeb(m *ice.Message) *url.URL {
return kit.ParseURL(m.Option(ice.MSG_USERWEB)) return kit.ParseURL(m.Option(ice.MSG_USERWEB))
} }
func UserHost(m *ice.Message) string { func UserHost(m *ice.Message) string {
@ -27,7 +27,7 @@ func UserHost(m *ice.Message) string {
return m.Option(ice.MSG_USERHOST, u.Scheme+"://"+u.Host) return m.Option(ice.MSG_USERHOST, u.Scheme+"://"+u.Host)
} }
} }
func AgentIs(m ice.IMessage, arg ...string) bool { func AgentIs(m *ice.Message, arg ...string) bool {
for _, k := range arg { for _, k := range arg {
if strings.HasPrefix(strings.ToLower(m.Option(ice.MSG_USERUA)), k) { if strings.HasPrefix(strings.ToLower(m.Option(ice.MSG_USERUA)), k) {
return true return true
@ -90,12 +90,10 @@ func PushNotice(m *ice.Message, arg ...ice.Any) {
func PushNoticeRefresh(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("refresh", arg)...) } func PushNoticeRefresh(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("refresh", arg)...) }
func PushNoticeToast(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("toast", arg)...) } func PushNoticeToast(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("toast", arg)...) }
func PushNoticeGrow(m *ice.Message, arg ...ice.Any) { func PushNoticeGrow(m *ice.Message, arg ...ice.Any) {
m.StatusTimeCount() PushNotice(m.StatusTimeCount(), kit.List("grow", arg)...)
PushNotice(m, kit.List("grow", arg)...)
} }
func PushNoticeRich(m *ice.Message, arg ...ice.Any) { func PushNoticeRich(m *ice.Message, arg ...ice.Any) {
m.StatusTimeCount() PushNotice(m.StatusTimeCount(), kit.Simple("rich", arg))
PushNotice(m, kit.Simple("rich", arg))
} }
func PushStream(m *ice.Message) *ice.Message { func PushStream(m *ice.Message) *ice.Message {
m.Options(cli.CMD_OUTPUT, file.NewWriteCloser(func(buf []byte) { PushNoticeGrow(m, string(buf)) }, nil)).ProcessHold(toastContent(m, ice.SUCCESS)) m.Options(cli.CMD_OUTPUT, file.NewWriteCloser(func(buf []byte) { PushNoticeGrow(m, string(buf)) }, nil)).ProcessHold(toastContent(m, ice.SUCCESS))
@ -129,10 +127,10 @@ func toastContent(m *ice.Message, state string, arg ...ice.Any) string {
} }
} }
func ToastSuccess(m *ice.Message, arg ...ice.Any) { func ToastSuccess(m *ice.Message, arg ...ice.Any) {
Toast(m, toastContent(m, ice.SUCCESS, arg...), "", "1s") Toast(m, toastContent(m, ice.SUCCESS, arg...), "", cli.TIME_3s)
} }
func ToastFailure(m *ice.Message, arg ...ice.Any) { func ToastFailure(m *ice.Message, arg ...ice.Any) {
Toast(m, toastContent(m, ice.FAILURE, arg...), "", m.OptionDefault(ice.TOAST_DURATION, "3s")).Sleep(m.OptionDefault(ice.TOAST_DURATION, "3s")) Toast(m, toastContent(m, ice.FAILURE, arg...), "", m.OptionDefault(ice.TOAST_DURATION, cli.TIME_3s)).Sleep(m.OptionDefault(ice.TOAST_DURATION, cli.TIME_3s))
} }
func ToastProcess(m *ice.Message, arg ...ice.Any) func(...ice.Any) { func ToastProcess(m *ice.Message, arg ...ice.Any) func(...ice.Any) {
Toast(m, toastContent(m, ice.PROCESS, arg...), "", cli.TIME_30s) Toast(m, toastContent(m, ice.PROCESS, arg...), "", cli.TIME_30s)
@ -149,11 +147,11 @@ func GoToast(m *ice.Message, title string, cb func(toast func(name string, count
} }
if list := cb(toast); len(list) > 0 { if list := cb(toast); len(list) > 0 {
icon = Icons[ice.FAILURE] icon = Icons[ice.FAILURE]
m.Option(ice.TOAST_DURATION, "10s") m.Option(ice.TOAST_DURATION, cli.TIME_30s)
toast(kit.JoinWord(list...), len(list), _total) toast(kit.JoinWord(list...), len(list), _total)
} else { } else {
icon = Icons[ice.SUCCESS] icon = Icons[ice.SUCCESS]
m.Option(ice.TOAST_DURATION, "1s") m.Option(ice.TOAST_DURATION, cli.TIME_3s)
toast(ice.SUCCESS, _total, _total) toast(ice.SUCCESS, _total, _total)
} }
m.Sleep(m.Option(ice.TOAST_DURATION)) m.Sleep(m.Option(ice.TOAST_DURATION))

View File

@ -24,8 +24,8 @@ const (
COOKIE = "cookie" COOKIE = "cookie"
REQUEST = "request" REQUEST = "request"
RESPONSE = "response" RESPONSE = "response"
TITLE = "title"
CONTENT = "content" CONTENT = "content"
TITLE = "title"
) )
func Render(m *ice.Message, cmd string, args ...ice.Any) bool { func Render(m *ice.Message, cmd string, args ...ice.Any) bool {
@ -107,22 +107,14 @@ func RenderType(w http.ResponseWriter, name, mime string) {
func RenderOrigin(w http.ResponseWriter, origin string) { func RenderOrigin(w http.ResponseWriter, origin string) {
RenderHeader(w, "Access-Control-Allow-Origin", origin) RenderHeader(w, "Access-Control-Allow-Origin", origin)
} }
func RenderHeader(w http.ResponseWriter, key, value string) { func RenderHeader(w http.ResponseWriter, key, value string) { w.Header().Set(key, value) }
w.Header().Set(key, value)
}
func RenderStatus(w http.ResponseWriter, code int, text string) { func RenderStatus(w http.ResponseWriter, code int, text string) {
w.WriteHeader(code) w.WriteHeader(code)
w.Write([]byte(text)) w.Write([]byte(text))
} }
func RenderRedirect(m *ice.Message, arg ...ice.Any) { func RenderRedirect(m *ice.Message, arg ...ice.Any) { Render(m, ice.RENDER_REDIRECT, arg...) }
Render(m, ice.RENDER_REDIRECT, arg...) func RenderDownload(m *ice.Message, arg ...ice.Any) { Render(m, ice.RENDER_DOWNLOAD, arg...) }
} func RenderResult(m *ice.Message, arg ...ice.Any) { Render(m, ice.RENDER_RESULT, arg...) }
func RenderDownload(m *ice.Message, arg ...ice.Any) {
Render(m, ice.RENDER_DOWNLOAD, arg...)
}
func RenderResult(m *ice.Message, arg ...ice.Any) {
Render(m, ice.RENDER_RESULT, arg...)
}
func RenderTemplate(m *ice.Message, file string, arg ...ice.Any) *ice.Message { func RenderTemplate(m *ice.Message, file string, arg ...ice.Any) *ice.Message {
return m.RenderResult(kit.Renders(kit.Format(m.Cmdx(nfs.CAT, path.Join(ice.SRC_TEMPLATE, WEB, file)), arg...), m)) return m.RenderResult(kit.Renders(kit.Format(m.Cmdx(nfs.CAT, path.Join(ice.SRC_TEMPLATE, WEB, file)), arg...), m))
} }
@ -143,9 +135,7 @@ func RenderPodCmd(m *ice.Message, pod, cmd string, arg ...ice.Any) {
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)))
} }
} }
func RenderCmd(m *ice.Message, cmd string, arg ...ice.Any) { func RenderCmd(m *ice.Message, cmd string, arg ...ice.Any) { RenderPodCmd(m, "", cmd, arg...) }
RenderPodCmd(m, "", cmd, arg...)
}
func RenderVersion(m *ice.Message) string { func RenderVersion(m *ice.Message) string {
if ice.Info.Make.Hash == "" { if ice.Info.Make.Hash == "" {
@ -191,6 +181,8 @@ const (
CHAT_FAVOR = "web.chat.favor" CHAT_FAVOR = "web.chat.favor"
CHAT_FLOWS = "web.chat.flows" CHAT_FLOWS = "web.chat.flows"
CHAT_GRANT = "web.chat.grant" CHAT_GRANT = "web.chat.grant"
CHAT_POD = "web.chat.pod"
CHAT_CMD = "web.chat.cmd"
TEAM_PLAN = "web.team.plan" TEAM_PLAN = "web.team.plan"
PLUGIN_XTERM = "/plugin/local/code/xterm.js" PLUGIN_XTERM = "/plugin/local/code/xterm.js"

View File

@ -23,7 +23,7 @@ func _route_push(m *ice.Message, space string, msg *ice.Message) *ice.Message {
} }
func _route_match(m *ice.Message, space string, cb func(ice.Maps, int, []ice.Maps)) { func _route_match(m *ice.Message, space string, cb func(ice.Maps, int, []ice.Maps)) {
reg, err := regexp.Compile(space) reg, err := regexp.Compile(space)
if m.Warn(err) { if m.WarnNotValid(err) {
return return
} }
res := []ice.Maps{} res := []ice.Maps{}
@ -88,9 +88,6 @@ func init() {
func() { defer ToastProcess(m)(); m.Sleep3s() }() func() { defer ToastProcess(m)(); m.Sleep3s() }()
m.SetAppend().Cmdy("", "travel") m.SetAppend().Cmdy("", "travel")
}}, }},
"diagram": {Help: "导图", Icon: "bi bi-diagram-3", Hand: func(m *ice.Message, arg ...string) {
ctx.DisplayStorySpide(m.Cmdy(""), nfs.DIR_ROOT, ice.Info.NodeName, mdb.FIELD, SPACE, lex.SPLIT, nfs.PT, ctx.ACTION, ice.MAIN)
}},
"travel": {Help: "遍历", Icon: "bi bi-card-list", Hand: func(m *ice.Message, arg ...string) { "travel": {Help: "遍历", Icon: "bi bi-card-list", Hand: func(m *ice.Message, arg ...string) {
kit.For(kit.Split(m.OptionDefault(ice.MSG_FIELDS, mdb.Config(m, mdb.FIELD))), func(key string) { kit.For(kit.Split(m.OptionDefault(ice.MSG_FIELDS, mdb.Config(m, mdb.FIELD))), func(key string) {
switch key { switch key {
@ -129,6 +126,9 @@ func init() {
PushPodCmd(m, "", m.ActionKey()) PushPodCmd(m, "", m.ActionKey())
m.Table(func(value ice.Maps) { kit.If(value[SPACE], func() { mdb.HashCreate(m.Spawn(), kit.Simple(value)) }) }) m.Table(func(value ice.Maps) { kit.If(value[SPACE], func() { mdb.HashCreate(m.Spawn(), kit.Simple(value)) }) })
}}, }},
"diagram": {Help: "导图", Icon: "bi bi-diagram-3", Hand: func(m *ice.Message, arg ...string) {
ctx.DisplayStorySpide(m.Cmdy(""), nfs.DIR_ROOT, ice.Info.NodeName, mdb.FIELD, SPACE, lex.SPLIT, nfs.PT, ctx.ACTION, ice.MAIN)
}},
mdb.PRUNES: &ice.Action{Name: "prunes status=offline", Hand: func(m *ice.Message, arg ...string) { mdb.PRUNES: &ice.Action{Name: "prunes status=offline", Hand: func(m *ice.Message, arg ...string) {
m.Cmd("", func(value ice.Maps) { m.Cmd("", func(value ice.Maps) {
kit.If(value[mdb.STATUS] == OFFLINE, func() { mdb.HashRemove(m, SPACE, value[SPACE]) }) kit.If(value[mdb.STATUS] == OFFLINE, func() { mdb.HashRemove(m, SPACE, value[SPACE]) })

View File

@ -23,11 +23,11 @@ import (
"shylinux.com/x/toolkits/logs" "shylinux.com/x/toolkits/logs"
) )
func _serve_address(m *ice.Message) string { return Domain(tcp.LOCALHOST, m.Option(tcp.PORT)) } func _serve_address(m *ice.Message) string { return HostPort(m, tcp.LOCALHOST, m.Option(tcp.PORT)) }
func _serve_start(m *ice.Message) { func _serve_start(m *ice.Message) {
kit.If(m.Option(aaa.USERNAME), func() { aaa.UserRoot(m, m.Option(aaa.USERNICK), m.Option(aaa.USERNAME)) }) kit.If(m.Option(aaa.USERNAME), func() { aaa.UserRoot(m, m.Option(aaa.USERNICK), m.Option(aaa.USERNAME)) })
kit.If(m.Option(tcp.PORT) == tcp.RANDOM, func() { m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT)) }) kit.If(m.Option(tcp.PORT) == tcp.RANDOM, func() { m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT)) })
cli.NodeInfo(m, kit.Select(kit.Split(ice.Info.Hostname, ".")[0], m.Option(tcp.NODENAME)), SERVER) cli.NodeInfo(m, kit.Select(kit.Split(ice.Info.Hostname, nfs.PT)[0], m.Option(tcp.NODENAME)), SERVER)
m.Go(func() { m.Go(func() {
m.Cmd(SPIDE, ice.OPS, _serve_address(m)+"/exit", ice.Maps{CLIENT_TIMEOUT: cli.TIME_30ms, ice.LOG_DISABLE: ice.TRUE}) m.Cmd(SPIDE, ice.OPS, _serve_address(m)+"/exit", ice.Maps{CLIENT_TIMEOUT: cli.TIME_30ms, ice.LOG_DISABLE: ice.TRUE})
}).Sleep300ms() }).Sleep300ms()
@ -72,8 +72,7 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
r.URL.Path = kit.Select(nfs.PS, mdb.Config(m, ice.MAIN)) r.URL.Path = kit.Select(nfs.PS, mdb.Config(m, ice.MAIN))
} }
if r.Method == http.MethodGet { if r.Method == http.MethodGet {
msg := m.Spawn(w, r).Options(ice.MSG_USERUA, r.UserAgent(), ice.LOG_TRACEID, r.Header.Get(ice.LOG_TRACEID), msg := m.Spawn(w, r).Options(ice.MSG_USERUA, r.UserAgent(), ice.LOG_TRACEID, r.Header.Get(ice.LOG_TRACEID), ParseLink(m, kit.Select(r.URL.String(), r.Referer())))
ParseLink(m, kit.Select(r.URL.String(), r.Referer())))
if path.Join(r.URL.Path) == nfs.PS { if path.Join(r.URL.Path) == nfs.PS {
if Render(RenderMain(msg), msg.Option(ice.MSG_OUTPUT), kit.List(msg.Optionv(ice.MSG_ARGS))...) { if Render(RenderMain(msg), msg.Option(ice.MSG_OUTPUT), kit.List(msg.Optionv(ice.MSG_ARGS))...) {
return false return false
@ -90,7 +89,7 @@ func _serve_static(msg *ice.Message, w http.ResponseWriter, r *http.Request) boo
} else if p = path.Join(nfs.USR, r.URL.Path); kit.HasPrefix(r.URL.Path, nfs.VOLCANOS, nfs.INTSHELL) && nfs.Exists(msg, p) { } else if p = path.Join(nfs.USR, r.URL.Path); kit.HasPrefix(r.URL.Path, nfs.VOLCANOS, nfs.INTSHELL) && nfs.Exists(msg, p) {
return Render(msg, ice.RENDER_DOWNLOAD, p) return Render(msg, ice.RENDER_DOWNLOAD, p)
} else if p = strings.TrimPrefix(r.URL.Path, nfs.REQUIRE); kit.HasPrefix(r.URL.Path, nfs.REQUIRE_SRC, nfs.REQUIRE+ice.USR_ICONS, nfs.REQUIRE+ice.USR_ICEBERGS) && nfs.Exists(msg, p) { } else if p = strings.TrimPrefix(r.URL.Path, nfs.REQUIRE); kit.HasPrefix(r.URL.Path, nfs.REQUIRE_SRC, nfs.REQUIRE+ice.USR_ICONS, nfs.REQUIRE+ice.USR_ICEBERGS) && nfs.Exists(msg, p) {
ispod := kit.Contains(r.URL.String(), "/s/", "pod=") || kit.Contains(r.Header.Get(html.Referer), "/s/", "pod=") ispod := kit.Contains(r.URL.String(), S(), "pod=") || kit.Contains(r.Header.Get(html.Referer), S(), "pod=")
return !ispod && Render(msg, ice.RENDER_DOWNLOAD, p) return !ispod && Render(msg, ice.RENDER_DOWNLOAD, p)
} else if p = path.Join(nfs.USR_MODULES, strings.TrimPrefix(r.URL.Path, nfs.REQUIRE_MODULES)); kit.HasPrefix(r.URL.Path, nfs.REQUIRE_MODULES) && nfs.Exists(msg, p) { } else if p = path.Join(nfs.USR_MODULES, strings.TrimPrefix(r.URL.Path, nfs.REQUIRE_MODULES)); kit.HasPrefix(r.URL.Path, nfs.REQUIRE_MODULES) && nfs.Exists(msg, p) {
return Render(msg, ice.RENDER_DOWNLOAD, p) return Render(msg, ice.RENDER_DOWNLOAD, p)
@ -151,7 +150,7 @@ func _serve_handle(key string, cmd *ice.Command, m *ice.Message, w http.Response
}() }()
m.Option(ice.MSG_OPTS, kit.Simple(m.Optionv(ice.MSG_OPTION), func(k string) bool { return !strings.HasPrefix(k, ice.MSG_SESSID) })) m.Option(ice.MSG_OPTS, kit.Simple(m.Optionv(ice.MSG_OPTION), func(k string) bool { return !strings.HasPrefix(k, ice.MSG_SESSID) }))
if m.Detailv(m.PrefixKey(), cmds); len(cmds) > 1 && cmds[0] == ctx.ACTION && cmds[1] != ctx.ACTION { if m.Detailv(m.PrefixKey(), cmds); len(cmds) > 1 && cmds[0] == ctx.ACTION && cmds[1] != ctx.ACTION {
if !kit.IsIn(cmds[1], aaa.LOGIN, ctx.RUN, ctx.COMMAND) && m.Warn(r.Method == http.MethodGet, ice.ErrNotAllow) { if !kit.IsIn(cmds[1], aaa.LOGIN, ctx.RUN, ctx.COMMAND) && m.WarnNotAllow(r.Method == http.MethodGet) {
return return
} }
m.ActionHand(cmd, key, cmds[1], cmds[2:]...) m.ActionHand(cmd, key, cmds[1], cmds[2:]...)
@ -213,7 +212,7 @@ const SERVE = "serve"
func init() { func init() {
Index.MergeCommands(ice.Commands{P(ice.EXIT): {Hand: func(m *ice.Message, arg ...string) { m.Cmd(ice.EXIT) }}, Index.MergeCommands(ice.Commands{P(ice.EXIT): {Hand: func(m *ice.Message, arg ...string) { m.Cmd(ice.EXIT) }},
SERVE: {Name: "serve name auto main host dark system", Help: "服务器", Actions: ice.MergeActions(ice.Actions{ SERVE: {Name: "serve name auto main host system", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.NodeInfo(m, ice.Info.Pathname, WORKER) }}, ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.NodeInfo(m, ice.Info.Pathname, WORKER) }},
ice.MAIN: {Name: "main index", Help: "首页", Hand: func(m *ice.Message, arg ...string) { ice.MAIN: {Name: "main index", Help: "首页", Hand: func(m *ice.Message, arg ...string) {
if m.Option(ctx.INDEX) == "" { if m.Option(ctx.INDEX) == "" {
@ -222,16 +221,7 @@ func init() {
mdb.Config(m, ice.MAIN, C(m.Option(ctx.INDEX)+nfs.PS)) mdb.Config(m, ice.MAIN, C(m.Option(ctx.INDEX)+nfs.PS))
} }
}}, }},
log.TRACEID: {Help: "日志", Hand: func(m *ice.Message, arg ...string) { tcp.HOST: {Help: "公网", Hand: func(m *ice.Message, arg ...string) { m.Echo(kit.Formats(PublicIP(m))) }},
kit.If(len(arg) > 0, func() { ice.Info.Traceid = arg[0] })
m.Echo(ice.Info.Traceid)
}},
tcp.HOST: {Help: "公网", Hand: func(m *ice.Message, arg ...string) { m.Echo(kit.Formats(PublicIP(m))) }},
cli.DARK: {Help: "主题", Hand: func(m *ice.Message, arg ...string) {
kit.If(tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)), func() {
m.Cmd(cli.SYSTEM, "osascript", "-e", `tell app "System Events" to tell appearance preferences to set dark mode to not dark mode`)
})
}},
cli.SYSTEM: {Help: "系统", Hand: func(m *ice.Message, arg ...string) { cli.Opens(m, "System Settings.app") }}, cli.SYSTEM: {Help: "系统", Hand: func(m *ice.Message, arg ...string) { cli.Opens(m, "System Settings.app") }},
cli.START: {Name: "start dev proto host port=9020 nodename username usernick", Hand: func(m *ice.Message, arg ...string) { _serve_start(m) }}, cli.START: {Name: "start dev proto host port=9020 nodename username usernick", Hand: func(m *ice.Message, arg ...string) { _serve_start(m) }},
SERVE_START: {Hand: func(m *ice.Message, arg ...string) { SERVE_START: {Hand: func(m *ice.Message, arg ...string) {
@ -247,7 +237,7 @@ func init() {
}) })
}}, }},
}, gdb.EventsAction(SERVE_START), mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port"), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { }, gdb.EventsAction(SERVE_START), mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port"), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Options(ice.MSG_ACTION, "").StatusTimeCount(kit.Dict(ice.MAIN, mdb.Config(m, ice.MAIN))) mdb.HashSelect(m, arg...).Action().StatusTimeCount(kit.Dict(ice.MAIN, mdb.Config(m, ice.MAIN)))
}}, }},
}) })
ice.AddMergeAction(func(c *ice.Context, key string, cmd *ice.Command, sub string, action *ice.Action) { ice.AddMergeAction(func(c *ice.Context, key string, cmd *ice.Command, sub string, action *ice.Action) {
@ -267,21 +257,18 @@ func init() {
}) })
} }
func Domain(host, port string) string { func IsLocalHost(m *ice.Message) bool {
return kit.Format("%s://%s:%s", HTTP, host, port) return (m.R == nil || m.R.Header.Get(html.XForwardedFor) == "") && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP))
}
func Script(m *ice.Message, str string, arg ...ice.Any) string {
return ice.Render(m, ice.RENDER_SCRIPT, kit.Format(str, arg...))
} }
func ParseUA(m *ice.Message) (res []string) { func ParseUA(m *ice.Message) (res []string) {
res = append(res, aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA)) res = append(res, aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA))
for _, p := range []string{"Android", "iPhone", "Mac", "Windows"} { for _, p := range html.SystemList {
if strings.Contains(m.Option(ice.MSG_USERUA), p) { if strings.Contains(m.Option(ice.MSG_USERUA), p) {
res = append(res, cli.SYSTEM, p) res = append(res, cli.SYSTEM, p)
break break
} }
} }
for _, p := range []string{"MicroMessenger", "Alipay", "Edg", "Chrome", "Safari", "Go-http-client"} { for _, p := range html.AgentList {
if strings.Contains(m.Option(ice.MSG_USERUA), p) { if strings.Contains(m.Option(ice.MSG_USERUA), p) {
res = append(res, AGENT, p, mdb.ICONS, agentIcons[p]) res = append(res, AGENT, p, mdb.ICONS, agentIcons[p])
break break
@ -289,6 +276,9 @@ func ParseUA(m *ice.Message) (res []string) {
} }
return return
} }
func Script(m *ice.Message, str string, arg ...ice.Any) string {
return ice.Render(m, ice.RENDER_SCRIPT, kit.Format(str, arg...))
}
func ChatCmdPath(m *ice.Message, arg ...string) string { func ChatCmdPath(m *ice.Message, arg ...string) string {
return m.MergePodCmd("", kit.Select(m.PrefixKey(), path.Join(arg...))) return m.MergePodCmd("", kit.Select(m.PrefixKey(), path.Join(arg...)))
} }
@ -300,6 +290,3 @@ func RequireFile(m *ice.Message, file string) string {
} }
return "" return ""
} }
func IsLocalHost(m *ice.Message) bool {
return (m.R == nil || m.R.Header.Get(html.XForwardedFor) == "") && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP))
}

View File

@ -39,12 +39,12 @@ func _share_cache(m *ice.Message, arg ...string) {
} }
} }
func _share_proxy(m *ice.Message) { func _share_proxy(m *ice.Message) {
if m.Warn(m.Option(SHARE) == "", ice.ErrNotValid) { if m.WarnNotValid(m.Option(SHARE) == "") {
return return
} }
msg := m.Cmd(SHARE, m.Option(SHARE)) msg := m.Cmd(SHARE, m.Option(SHARE))
defer m.Cmd(SHARE, mdb.REMOVE, mdb.HASH, m.Option(SHARE)) defer m.Cmd(SHARE, mdb.REMOVE, mdb.HASH, m.Option(SHARE))
if m.Warn(msg.Append(mdb.TEXT) == "", ice.ErrNotValid) { if m.WarnNotValid(msg.Append(mdb.TEXT) == "") {
return return
} }
p := path.Join(ice.VAR_PROXY, msg.Append(mdb.TEXT), msg.Append(mdb.NAME)) p := path.Join(ice.VAR_PROXY, msg.Append(mdb.TEXT), msg.Append(mdb.NAME))
@ -82,7 +82,7 @@ func init() {
m.EchoQRCode(m.Cmd(SHARE, mdb.CREATE, mdb.TYPE, LOGIN).Option(mdb.LINK)).ProcessInner() m.EchoQRCode(m.Cmd(SHARE, mdb.CREATE, mdb.TYPE, LOGIN).Option(mdb.LINK)).ProcessInner()
}}, }},
OPEN: {Hand: func(m *ice.Message, arg ...string) { OPEN: {Hand: func(m *ice.Message, arg ...string) {
m.ProcessOpen(m.MergeLink("/share/" + m.Option(mdb.HASH))) m.ProcessOpen(m.MergeLink(P(SHARE, m.Option(mdb.HASH))))
}}, }},
ctx.COMMAND: {Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Hand: func(m *ice.Message, arg ...string) {
if msg := mdb.HashSelects(m.Spawn(), m.Option(SHARE)); !IsNotValidFieldShare(m, msg) { if msg := mdb.HashSelects(m.Spawn(), m.Option(SHARE)); !IsNotValidFieldShare(m, msg) {
@ -96,7 +96,7 @@ func init() {
} }
}}, }},
nfs.PS: {Hand: func(m *ice.Message, arg ...string) { nfs.PS: {Hand: func(m *ice.Message, arg ...string) {
if m.Warn(len(arg) == 0 || arg[0] == "", ice.ErrNotValid, SHARE) { if m.WarnNotValid(len(arg) == 0 || arg[0] == "", SHARE) {
return return
} }
msg := m.Cmd(SHARE, m.Option(SHARE, arg[0])) msg := m.Cmd(SHARE, m.Option(SHARE, arg[0]))
@ -124,7 +124,7 @@ func init() {
} }
}}, }},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,space,usernick,username,userrole", mdb.EXPIRE, mdb.DAYS)), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,space,usernick,username,userrole", mdb.EXPIRE, mdb.DAYS)), Hand: func(m *ice.Message, arg ...string) {
if kit.IsIn(m.Option(ice.MSG_USERROLE), aaa.ROOT, aaa.TECH) || len(arg) > 0 && arg[0] != "" { if aaa.IsTechOrRoot(m) || len(arg) > 0 && arg[0] != "" {
mdb.HashSelect(m, arg...).PushAction(OPEN, mdb.REMOVE) mdb.HashSelect(m, arg...).PushAction(OPEN, mdb.REMOVE)
} }
}}, }},
@ -137,13 +137,13 @@ func init() {
}) })
} }
func IsNotValidShare(m *ice.Message, time string) bool { func IsNotValidShare(m *ice.Message, time string) bool {
return m.Warn(time < m.Time(), ice.ErrNotValid, m.Option(SHARE), time, m.Time(), logs.FileLineMeta(2)) return m.WarnNotValid(time < m.Time(), ice.ErrNotValid, m.Option(SHARE), time, m.Time(), logs.FileLineMeta(2))
} }
func IsNotValidFieldShare(m *ice.Message, msg *ice.Message) bool { func IsNotValidFieldShare(m *ice.Message, msg *ice.Message) bool {
if m.Warn(IsNotValidShare(m, msg.Append(mdb.TIME)), kit.Format("共享超时, 请联系 %s(%s), 重新分享 %s %s %s", msg.Append(aaa.USERNICK), msg.Append(aaa.USERNAME), msg.Append(mdb.TYPE), msg.Append(mdb.NAME), msg.Append(mdb.TEXT))) { if m.Warn(IsNotValidShare(m, msg.Append(mdb.TIME)), kit.Format("共享超时, 请联系 %s(%s), 重新分享 %s %s %s", msg.Append(aaa.USERNICK), msg.Append(aaa.USERNAME), msg.Append(mdb.TYPE), msg.Append(mdb.NAME), msg.Append(mdb.TEXT))) {
return true return true
} }
if m.Warn(msg.Append(mdb.NAME) == "") { if m.WarnNotValid(msg.Append(mdb.NAME) == "") {
return true return true
} }
return false return false
@ -162,7 +162,7 @@ func ShareLocalFile(m *ice.Message, arg ...string) {
p := path.Join(arg...) p := path.Join(arg...)
switch ls := strings.Split(p, nfs.PS); ls[0] { switch ls := strings.Split(p, nfs.PS); ls[0] {
case ice.ETC, ice.VAR: case ice.ETC, ice.VAR:
if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, p) { if m.WarnNotRight(m.Option(ice.MSG_USERROLE) == aaa.VOID, p) {
return return
} }
default: default:
@ -180,6 +180,15 @@ func ShareLocalFile(m *ice.Message, arg ...string) {
m.RenderDownload(ProxyUpload(m, m.Option(ice.POD), p)) m.RenderDownload(ProxyUpload(m, m.Option(ice.POD), p))
} }
} }
func ShareLocal(m *ice.Message, p string) string {
if kit.HasPrefix(p, nfs.PS, HTTP) {
return p
}
return m.MergeLink(PP(SHARE, LOCAL, p))
}
func ShareField(m *ice.Message, cmd string, arg ...ice.Any) *ice.Message {
return m.EchoQRCode(tcp.PublishLocalhost(m, m.MergeLink(P(SHARE, AdminCmd(m, SHARE, mdb.CREATE, mdb.TYPE, FIELD, mdb.NAME, kit.Select(m.PrefixKey(), cmd), mdb.TEXT, kit.Format(kit.Simple(arg...)), SPACE, m.Option(ice.MSG_USERPOD)).Result()))))
}
func ProxyUpload(m *ice.Message, pod string, p string) string { func ProxyUpload(m *ice.Message, pod string, p string) string {
pp := path.Join(ice.VAR_PROXY, pod, p) pp := path.Join(ice.VAR_PROXY, pod, p)
size, cache := int64(0), time.Now().Add(-time.Hour*24) size, cache := int64(0), time.Now().Add(-time.Hour*24)
@ -195,12 +204,3 @@ func ProxyUpload(m *ice.Message, pod string, p string) string {
m.Cmd(SPACE, pod, SPIDE, PROXY, URL, url, nfs.SIZE, size, CACHE, cache.Format(ice.MOD_TIME), UPLOAD, mdb.AT+p) m.Cmd(SPACE, pod, SPIDE, PROXY, URL, url, nfs.SIZE, size, CACHE, cache.Format(ice.MOD_TIME), UPLOAD, mdb.AT+p)
return kit.Select(p, pp, file.ExistsFile(pp)) return kit.Select(p, pp, file.ExistsFile(pp))
} }
func ShareLocal(m *ice.Message, p string) string {
if kit.HasPrefix(p, nfs.PS, HTTP) {
return p
}
return m.MergeLink(PP(SHARE, LOCAL, p))
}
func ShareField(m *ice.Message, cmd string, arg ...ice.Any) *ice.Message {
return m.EchoQRCode(tcp.PublishLocalhost(m, m.MergeLink("/share/"+AdminCmd(m, SHARE, mdb.CREATE, mdb.TYPE, FIELD, mdb.NAME, kit.Select(m.PrefixKey(), cmd), mdb.TEXT, kit.Format(kit.Simple(arg...)), SPACE, m.Option(ice.MSG_USERPOD)))))
}

View File

@ -40,7 +40,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
for i := 1; i < _c; i++ { for i := 1; i < _c; i++ {
next := time.Duration(rand.Intn(a*(i+1))+b*i) * time.Millisecond next := time.Duration(rand.Intn(a*(i+1))+b*i) * time.Millisecond
m.Cmd(tcp.CLIENT, tcp.DIAL, args, func(c net.Conn) { m.Cmd(tcp.CLIENT, tcp.DIAL, args, func(c net.Conn) {
if c, e := websocket.NewClient(c, u); !m.Warn(e, tcp.DIAL, dev, SPACE, u.String()) { if c, e := websocket.NewClient(c, u); !m.WarnNotValid(e, tcp.DIAL, dev, SPACE, u.String()) {
defer mdb.HashCreateDeferRemove(m, kit.SimpleKV("", MASTER, dev, origin), kit.Dict(mdb.TARGET, c))() defer mdb.HashCreateDeferRemove(m, kit.SimpleKV("", MASTER, dev, origin), kit.Dict(mdb.TARGET, c))()
kit.If(ice.Info.Colors, func() { once.Do(func() { m.Go(func() { _space_qrcode(m, dev) }) }) }) kit.If(ice.Info.Colors, func() { once.Do(func() { m.Go(func() { _space_qrcode(m, dev) }) }) })
_space_handle(m.Spawn(), true, dev, c) _space_handle(m.Spawn(), true, dev, c)
@ -50,22 +50,6 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
} }
}, kit.JoinWord(SPACE, dev)) }, kit.JoinWord(SPACE, dev))
} }
func _space_agent(m *ice.Message, args ...string) []string {
kit.If(m.Option(cli.GOOS), func(p string) { args = append(args, cli.SYSTEM, p) })
for _, p := range []string{"Android", "iPhone", "Mac", "Windows"} {
if strings.Contains(m.Option(ice.MSG_USERUA), p) {
args = append(args, cli.SYSTEM, p)
break
}
}
for _, p := range []string{"MicroMessenger", "Alipay", "Edg", "Chrome", "Safari", "Go-http-client"} {
if strings.Contains(m.Option(ice.MSG_USERUA), p) {
args = append(args, AGENT, p)
break
}
}
return args
}
func _space_fork(m *ice.Message) { func _space_fork(m *ice.Message) {
addr := kit.Select(m.R.RemoteAddr, m.R.Header.Get(ice.MSG_USERADDR)) addr := kit.Select(m.R.RemoteAddr, m.R.Header.Get(ice.MSG_USERADDR))
text := strings.ReplaceAll(kit.Select(addr, m.Option(mdb.TEXT)), "%2F", nfs.PS) text := strings.ReplaceAll(kit.Select(addr, m.Option(mdb.TEXT)), "%2F", nfs.PS)
@ -97,7 +81,7 @@ func _space_fork(m *ice.Message) {
args := kit.Simple(mdb.TYPE, m.Option(mdb.TYPE), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(mdb.TIME, nfs.MODULE, nfs.VERSION, cli.DAEMON)) args := kit.Simple(mdb.TYPE, m.Option(mdb.TYPE), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(mdb.TIME, nfs.MODULE, nfs.VERSION, cli.DAEMON))
args = append(args, aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE)) args = append(args, aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE))
args = append(args, ParseUA(m)...) args = append(args, ParseUA(m)...)
if c, e := websocket.Upgrade(m.W, m.R); !m.Warn(e) { if c, e := websocket.Upgrade(m.W, m.R); !m.WarnNotValid(e) {
gdb.Go(m, func() { gdb.Go(m, func() {
defer mdb.HashCreateDeferRemove(m, args, kit.Dict(mdb.TARGET, c))() defer mdb.HashCreateDeferRemove(m, args, kit.Dict(mdb.TARGET, c))()
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
@ -153,14 +137,14 @@ func _space_handle(m *ice.Message, safe bool, name string, c *websocket.Conn) {
_space_exec(msg, name, source, target, c) _space_exec(msg, name, source, target, c)
}, strings.Join(kit.Simple(SPACE, name, msg.Detailv()), lex.SP)) }, strings.Join(kit.Simple(SPACE, name, msg.Detailv()), lex.SP))
} else { } else {
m.Warn(!mdb.HashSelectDetail(m, next, func(value ice.Map) { m.WarnNotFound(!mdb.HashSelectDetail(m, next, func(value ice.Map) {
switch c := value[mdb.TARGET].(type) { switch c := value[mdb.TARGET].(type) {
case (*websocket.Conn): // 转发报文 case (*websocket.Conn): // 转发报文
_space_echo(msg, source, target, c) _space_echo(msg, source, target, c)
case ice.Handler: // 接收响应 case ice.Handler: // 接收响应
msg.Go(func() { c(msg) }) msg.Go(func() { c(msg) })
} }
}), ice.ErrNotFound, next) }), next)
} }
} }
} }
@ -175,7 +159,7 @@ func _space_domain(m *ice.Message) (link string) {
return "" return ""
}, },
func() string { return tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB)) }, func() string { return tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB)) },
func() string { return Domain(m.Cmdv(tcp.HOST, aaa.IP), m.Cmdv(SERVE, tcp.PORT)) }, func() string { return HostPort(m, m.Cmdv(tcp.HOST, aaa.IP), m.Cmdv(SERVE, tcp.PORT)) },
) )
} }
func _space_exec(m *ice.Message, name string, source, target []string, c *websocket.Conn) { func _space_exec(m *ice.Message, name string, source, target []string, c *websocket.Conn) {
@ -183,7 +167,7 @@ func _space_exec(m *ice.Message, name string, source, target []string, c *websoc
case cli.PWD: case cli.PWD:
mdb.HashModify(m, mdb.HASH, name, mdb.HashModify(m, mdb.HASH, name,
aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE),
aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA), m.OptionSimple(mdb.TIME, nfs.MODULE, nfs.VERSION, AGENT, cli.SYSTEM), ParseUA(m), m.OptionSimple(mdb.TIME, nfs.MODULE, nfs.VERSION, AGENT, cli.SYSTEM),
) )
m.Push(mdb.LINK, m.MergePod(kit.Select("", source, -1))) m.Push(mdb.LINK, m.MergePod(kit.Select("", source, -1)))
default: default:
@ -201,8 +185,8 @@ func _space_exec(m *ice.Message, name string, source, target []string, c *websoc
_space_echo(m.Set(ice.MSG_OPTS).Options(m.OptionSimple(ice.LOG_DEBUG, ice.LOG_TRACEID)), []string{}, kit.Reverse(kit.Simple(source)), c) _space_echo(m.Set(ice.MSG_OPTS).Options(m.OptionSimple(ice.LOG_DEBUG, ice.LOG_TRACEID)), []string{}, kit.Reverse(kit.Simple(source)), c)
} }
func _space_echo(m *ice.Message, source, target []string, c *websocket.Conn) { func _space_echo(m *ice.Message, source, target []string, c *websocket.Conn) {
defer func() { m.Warn(recover()) }() defer func() { m.WarnNotValid(recover()) }()
if m.Options(ice.MSG_SOURCE, source, ice.MSG_TARGET, target[1:]); !m.Warn(c.WriteMessage(1, []byte(m.FormatMeta()))) { if m.Options(ice.MSG_SOURCE, source, ice.MSG_TARGET, target[1:]); !m.WarnNotValid(c.WriteMessage(1, []byte(m.FormatMeta()))) {
if source != nil { if source != nil {
m.Log(tcp.SEND, "%v->%v %v %v", source, target, m.Detailv(), m.FormatsMeta(nil)) m.Log(tcp.SEND, "%v->%v %v %v", source, target, m.Detailv(), m.FormatsMeta(nil))
} }
@ -219,7 +203,7 @@ func _space_send(m *ice.Message, name string, arg ...string) (h string) {
defer mdb.HashRemove(m.Spawn(), mdb.HASH, h) defer mdb.HashRemove(m.Spawn(), mdb.HASH, h)
} }
if target := kit.Split(name, nfs.PT, nfs.PT); !mdb.HashSelectDetail(m, target[0], func(value ice.Map) { if target := kit.Split(name, nfs.PT, nfs.PT); !mdb.HashSelectDetail(m, target[0], func(value ice.Map) {
if c, ok := value[mdb.TARGET].(*websocket.Conn); !m.Warn(!ok, ice.ErrNotValid, mdb.TARGET) { if c, ok := value[mdb.TARGET].(*websocket.Conn); !m.WarnNotValid(!ok, mdb.TARGET) {
kit.If(kit.Format(value[mdb.TYPE]) == MASTER, func() { kit.If(kit.Format(value[mdb.TYPE]) == MASTER, func() {
m.Options(ice.MSG_USERWEB, value[mdb.TEXT], ice.MSG_USERPOD, "", ice.MSG_USERHOST, "") m.Options(ice.MSG_USERWEB, value[mdb.TEXT], ice.MSG_USERPOD, "", ice.MSG_USERHOST, "")
}) })
@ -233,10 +217,10 @@ func _space_send(m *ice.Message, name string, arg ...string) (h string) {
} }
}) { }) {
kit.If(m.IsDebug(), func() { kit.If(m.IsDebug(), func() {
m.Warn(kit.IndexOf([]string{ice.OPS, ice.DEV}, target[0]) == -1, ice.ErrNotFound, SPACE, name) m.WarnNotFound(kit.IndexOf([]string{ice.OPS, ice.DEV}, target[0]) == -1, SPACE, name)
}) })
} else if withecho { } else if withecho {
m.Warn(!wait(), "time out") m.WarnNotValid(!wait(), "time out")
} }
return return
} }
@ -261,77 +245,9 @@ const (
const SPACE = "space" const SPACE = "space"
func init() { func init() {
ice.Info.AdminCmd = func(m *ice.Message, cmd string, arg ...string) *ice.Message {
if ice.Info.NodeType == WORKER {
return m.Cmdy(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, path.Join(C(cmd), path.Join(arg...)))
} else {
return m.Cmdy(cmd, arg)
}
}
ice.Info.Inputs = append(ice.Info.Inputs, func(m *ice.Message, arg ...string) {
switch kit.TrimPrefix(arg[0], "extra.") {
case DREAM:
m.SplitIndex(m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, C(DREAM))).CutTo(mdb.NAME, DREAM)
case "message":
m.Cmdy("web.chat.message").Cut(mdb.HASH, mdb.NAME, mdb.ICONS)
case SPACE:
m.Cmd(SPACE, func(value ice.Maps) {
kit.If(kit.IsIn(value[mdb.TYPE], WORKER, SERVER), func() { m.Push(arg[0], value[mdb.NAME]) })
})
case ORIGIN:
m.SetAppend()
m.Push(arg[0], SpideOrigin(m, ice.DEV))
m.Copy(m.Cmd(SPIDE, kit.Dict(ice.MSG_FIELDS, CLIENT_ORIGIN)).CutTo(CLIENT_ORIGIN, arg[0]).Sort(arg[0]))
case mdb.ICONS:
m.Options(nfs.DIR_REG, kit.ExtReg(nfs.PNG, nfs.JPG, nfs.JPEG), nfs.DIR_DEEP, ice.TRUE)
m.Cmdy(nfs.DIR, nfs.SRC, nfs.PATH)
m.Cmdy(nfs.DIR, ice.USR_LOCAL_IMAGE, nfs.PATH)
m.Cmdy(nfs.DIR, ice.USR_ICONS, nfs.PATH)
m.CutTo(nfs.PATH, arg[0])
case ctx.INDEX, ice.CMD:
if space := m.Option(SPACE); space != "" {
m.Options(SPACE, []string{}).Cmdy(SPACE, space, ctx.COMMAND)
} else {
m.Cmdy(ctx.COMMAND)
}
case ctx.ARGS:
m.OptionDefault(ctx.INDEX, m.Option("extra.index"))
if space := m.Option(SPACE); space != "" {
m.Options(SPACE, []string{}).Cmdy(SPACE, space, ctx.COMMAND, mdb.INPUTS, m.Option(ctx.INDEX))
} else {
m.Cmdy(ctx.COMMAND, mdb.INPUTS, m.Option(ctx.INDEX))
}
case tcp.WIFI:
m.Cmdy(tcp.WIFI).CutTo(tcp.SSID, arg[0])
case aaa.TO:
if m.Option(ctx.ACTION) != aaa.EMAIL {
break
}
fallthrough
case aaa.EMAIL:
m.Push(arg[0], "shy@shylinux.com", "shylinux@163.com")
case aaa.PASSWORD:
m.SetAppend()
}
})
ctx.PodCmd = func(m *ice.Message, arg ...ice.Any) bool {
Upload(m)
for _, key := range []string{ice.POD} {
if pod := m.Option(key); pod != "" {
if ls := kit.Simple(m.Optionv(ice.MSG_UPLOAD)); len(ls) > 1 {
m.Cmd(SPACE, pod, SPIDE, ice.DEV, CACHE, SHARE_CACHE+ls[0])
}
msg := m.Options(key, []string{}, ice.MSG_USERPOD, pod).Cmd(append(kit.List(ice.SPACE, pod), arg...)...)
m.Copy(msg)
// kit.If(!msg.IsErr(), func() { m.Copy(msg) })
return true
}
}
return false
}
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
"s": {Help: "空间", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.chat.pod", arg) }}, "s": {Help: "空间", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy(CHAT_POD, arg) }},
"c": {Help: "命令", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.chat.cmd", arg) }}, "c": {Help: "命令", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy(CHAT_CMD, arg) }},
SPACE: {Name: "space name cmds auto", Help: "空间站", Actions: ice.MergeActions(ice.Actions{ SPACE: {Name: "space name cmds auto", Help: "空间站", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { aaa.White(m, SPACE, ice.MAIN) }}, ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { aaa.White(m, SPACE, ice.MAIN) }},
ice.MAIN: {Name: "main index", Help: "首页", Hand: func(m *ice.Message, arg ...string) { ice.MAIN: {Name: "main index", Help: "首页", Hand: func(m *ice.Message, arg ...string) {
@ -362,14 +278,11 @@ func init() {
} }
_space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...)
}}, }},
cli.CLOSE: {Hand: func(m *ice.Message, arg ...string) { cli.CLOSE: {Hand: func(m *ice.Message, arg ...string) { mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) }},
mdb.HashRemove(m, m.OptionSimple(mdb.NAME))
}},
mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) {
defer ToastProcess(m)() defer ToastProcess(m)()
mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
m.Cmd("", m.Option(mdb.NAME), ice.EXIT) m.Cmd("", m.Option(mdb.NAME), ice.EXIT).Sleep3s()
m.Sleep3s()
}}, }},
DOMAIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_space_domain(m)) }}, DOMAIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_space_domain(m)) }},
LOGIN: {Help: "授权", Hand: func(m *ice.Message, arg ...string) { LOGIN: {Help: "授权", Hand: func(m *ice.Message, arg ...string) {
@ -380,7 +293,7 @@ func init() {
OPEN: {Hand: func(m *ice.Message, arg ...string) { OPEN: {Hand: func(m *ice.Message, arg ...string) {
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
case MASTER: case MASTER:
ProcessIframe(m, m.Option(mdb.NAME), m.Cmdv(SPIDE, m.Option(mdb.NAME), CLIENT_ORIGIN), arg...) ProcessIframe(m, m.Option(mdb.NAME), SpideOrigin(m, m.Option(mdb.NAME)), arg...)
default: default:
ProcessIframe(m, m.Option(mdb.NAME), m.MergePod(m.Option(mdb.NAME)), arg...) ProcessIframe(m, m.Option(mdb.NAME), m.MergePod(m.Option(mdb.NAME)), arg...)
} }
@ -397,8 +310,7 @@ func init() {
kit.If(len(arg) > 0 && arg[0] != "", func() { m.OptionFields(ice.MSG_DETAIL) }) kit.If(len(arg) > 0 && arg[0] != "", func() { m.OptionFields(ice.MSG_DETAIL) })
mdb.HashSelect(m.Spawn(), arg...).Table(func(index int, value ice.Maps, field []string) { mdb.HashSelect(m.Spawn(), arg...).Table(func(index int, value ice.Maps, field []string) {
if m.Push("", value, kit.Split(mdb.Config(m, mdb.FIELD))); len(arg) > 0 && arg[0] != "" { if m.Push("", value, kit.Split(mdb.Config(m, mdb.FIELD))); len(arg) > 0 && arg[0] != "" {
m.Push(mdb.STATUS, value[mdb.STATUS]) m.Push(mdb.STATUS, value[mdb.STATUS]).Push(aaa.UA, value[aaa.UA])
m.Push(aaa.UA, value[aaa.UA])
} }
if kit.IsIn(value[mdb.TYPE], WEIXIN, PORTAL) && value[mdb.NAME] != html.CHROME { if kit.IsIn(value[mdb.TYPE], WEIXIN, PORTAL) && value[mdb.NAME] != html.CHROME {
m.Push(mdb.LINK, m.MergeLink(value[mdb.TEXT])) m.Push(mdb.LINK, m.MergeLink(value[mdb.TEXT]))
@ -417,6 +329,65 @@ func init() {
} }
}}, }},
}) })
ice.Info.Inputs = append(ice.Info.Inputs, func(m *ice.Message, arg ...string) {
switch kit.TrimPrefix(arg[0], "extra.") {
case DREAM:
m.SplitIndex(m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, C(DREAM))).CutTo(mdb.NAME, DREAM)
case SPACE:
m.Cmd(SPACE, func(value ice.Maps) {
kit.If(kit.IsIn(value[mdb.TYPE], WORKER, SERVER), func() { m.Push(arg[0], value[mdb.NAME]) })
})
case ORIGIN:
m.SetAppend().Push(arg[0], SpideOrigin(m, ice.DEV))
m.Copy(m.Cmd(SPIDE, kit.Dict(ice.MSG_FIELDS, CLIENT_ORIGIN)).CutTo(CLIENT_ORIGIN, arg[0]).Sort(arg[0]))
case mdb.ICONS:
m.Options(nfs.DIR_REG, kit.ExtReg(nfs.PNG, nfs.JPG, nfs.JPEG), nfs.DIR_DEEP, ice.TRUE)
m.Cmdy(nfs.DIR, nfs.SRC, nfs.PATH)
m.Cmdy(nfs.DIR, ice.USR_LOCAL_IMAGE, nfs.PATH)
m.Cmdy(nfs.DIR, ice.USR_ICONS, nfs.PATH)
m.CutTo(nfs.PATH, arg[0])
case ctx.INDEX, ice.CMD:
if space := m.Option(SPACE); space != "" {
m.Options(SPACE, []string{}).Cmdy(SPACE, space, ctx.COMMAND)
} else {
m.Cmdy(ctx.COMMAND)
}
case ctx.ARGS:
m.OptionDefault(ctx.INDEX, m.Option("extra.index"))
if space := m.Option(SPACE); space != "" {
m.Options(SPACE, []string{}).Cmdy(SPACE, space, ctx.COMMAND, mdb.INPUTS, m.Option(ctx.INDEX))
} else {
m.Cmdy(ctx.COMMAND, mdb.INPUTS, m.Option(ctx.INDEX))
}
case aaa.TO:
if m.Option(ctx.ACTION) != aaa.EMAIL {
break
}
fallthrough
case aaa.EMAIL:
m.Push(arg[0], "shy@shylinux.com", "shylinux@163.com")
case aaa.PASSWORD:
m.SetAppend()
case tcp.WIFI:
m.Cmdy(tcp.WIFI).CutTo(tcp.SSID, arg[0])
case "message":
m.Cmdy("web.chat.message").Cut(mdb.HASH, mdb.NAME, mdb.ICONS)
}
})
ice.Info.AdminCmd = AdminCmd
ctx.PodCmd = func(m *ice.Message, arg ...ice.Any) bool {
Upload(m)
for _, key := range []string{ice.POD} {
if pod := m.Option(key); pod != "" {
if ls := kit.Simple(m.Optionv(ice.MSG_UPLOAD)); len(ls) > 1 {
m.Cmd(SPACE, pod, SPIDE, ice.DEV, CACHE, SHARE_CACHE+ls[0])
}
m.Options(key, []string{}, ice.MSG_USERPOD, pod).Cmdy(append(kit.List(ice.SPACE, pod), arg...)...)
return true
}
}
return false
}
} }
func Space(m *ice.Message, arg ice.Any) []string { func Space(m *ice.Message, arg ice.Any) []string {
if arg == nil || arg == "" { if arg == nil || arg == "" {

View File

@ -25,13 +25,12 @@ import (
) )
func _spide_create(m *ice.Message, name, link, types, icons string) { func _spide_create(m *ice.Message, name, link, types, icons string) {
if u, e := url.Parse(link); !m.Warn(e != nil || link == "", ice.ErrNotValid, link) { if u, e := url.Parse(link); !m.WarnNotValid(e != nil || link == "", link) {
dir, file := path.Split(u.EscapedPath()) dir, file := path.Split(u.EscapedPath())
m.Logs(mdb.INSERT, SPIDE, name, LINK, link) m.Logs(mdb.INSERT, SPIDE, name, LINK, link)
mdb.HashSelectUpdate(m, mdb.HashCreate(m, CLIENT_NAME, name), func(value ice.Map) { mdb.HashSelectUpdate(m, mdb.HashCreate(m, CLIENT_NAME, name), func(value ice.Map) {
value[mdb.ICONS] = icons value[mdb.ICONS] = icons
value[SPIDE_CLIENT] = kit.Dict( value[SPIDE_CLIENT] = kit.Dict(mdb.NAME, name, mdb.TYPE, types,
mdb.NAME, name, mdb.TYPE, types,
SPIDE_METHOD, http.MethodGet, URL, link, ORIGIN, u.Scheme+"://"+u.Host, SPIDE_METHOD, http.MethodGet, URL, link, ORIGIN, u.Scheme+"://"+u.Host,
tcp.PROTOCOL, u.Scheme, tcp.HOSTNAME, u.Hostname(), tcp.HOST, u.Host, nfs.PATH, dir, nfs.FILE, file, cli.TIMEOUT, "300s", tcp.PROTOCOL, u.Scheme, tcp.HOSTNAME, u.Hostname(), tcp.HOST, u.Host, nfs.PATH, dir, nfs.FILE, file, cli.TIMEOUT, "300s",
) )
@ -55,7 +54,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) {
} }
_uri := kit.MergeURL2(msg.Append(CLIENT_URL), uri, arg) _uri := kit.MergeURL2(msg.Append(CLIENT_URL), uri, arg)
req, e := http.NewRequest(method, _uri, body) req, e := http.NewRequest(method, _uri, body)
if m.Warn(e, ice.ErrNotValid, uri) { if m.WarnNotValid(e, uri) {
return return
} }
mdb.HashSelectDetail(m, name, func(value ice.Map) { _spide_head(m, req, head, value) }) mdb.HashSelectDetail(m, name, func(value ice.Map) { _spide_head(m, req, head, value) })
@ -63,7 +62,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) {
kit.For(req.Header, func(k string, v []string) { m.Logs(REQUEST, k, v) }) kit.For(req.Header, func(k string, v []string) { m.Logs(REQUEST, k, v) })
} }
res, e := _spide_send(m, name, req, kit.Format(m.OptionDefault(CLIENT_TIMEOUT, msg.Append(CLIENT_TIMEOUT)))) res, e := _spide_send(m, name, req, kit.Format(m.OptionDefault(CLIENT_TIMEOUT, msg.Append(CLIENT_TIMEOUT))))
if m.Warn(e, ice.ErrNotFound, uri) { if m.WarnNotFound(e, uri) {
return return
} }
defer res.Body.Close() defer res.Body.Close()
@ -76,8 +75,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) {
if m.Option(log.DEBUG) == ice.TRUE { if m.Option(log.DEBUG) == ice.TRUE {
m.Logs(RESPONSE, k, v) m.Logs(RESPONSE, k, v)
} }
m.Options(k, v) if m.Options(k, v); action != SPIDE_RAW {
if action != SPIDE_RAW {
m.Push(mdb.TYPE, SPIDE_HEADER).Push(mdb.NAME, k).Push(mdb.VALUE, v[0]) m.Push(mdb.TYPE, SPIDE_HEADER).Push(mdb.NAME, k).Push(mdb.VALUE, v[0])
} }
}) })
@ -92,7 +90,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) {
} }
}) })
}) })
if m.Warn(res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated, ice.ErrNotValid, uri, cli.STATUS, res.Status) { if m.WarnNotValid(res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated, uri, cli.STATUS, res.Status) {
switch res.StatusCode { switch res.StatusCode {
case http.StatusNotFound, http.StatusUnauthorized: case http.StatusNotFound, http.StatusUnauthorized:
return return
@ -115,8 +113,7 @@ func _spide_body(m *ice.Message, method string, arg ...string) (io.Reader, ice.M
switch kit.If(len(arg) == 1, func() { arg = []string{SPIDE_DATA, arg[0]} }); arg[0] { switch kit.If(len(arg) == 1, func() { arg = []string{SPIDE_DATA, arg[0]} }); arg[0] {
case SPIDE_FORM: case SPIDE_FORM:
arg = kit.Simple(arg, func(v string) string { return url.QueryEscape(v) }) arg = kit.Simple(arg, func(v string) string { return url.QueryEscape(v) })
_data := kit.JoinKV("=", "&", arg[1:]...) head[html.ContentType], body = html.ApplicationForm, bytes.NewBufferString(kit.JoinQuery(arg[1:]...))
head[html.ContentType], body = html.ApplicationForm, bytes.NewBufferString(_data)
case SPIDE_PART: case SPIDE_PART:
head[html.ContentType], body = _spide_part(m, arg...) head[html.ContentType], body = _spide_part(m, arg...)
case SPIDE_FILE: case SPIDE_FILE:
@ -132,8 +129,7 @@ func _spide_body(m *ice.Message, method string, arg ...string) (io.Reader, ice.M
default: default:
data := ice.Map{} data := ice.Map{}
kit.For(arg, func(k, v string) { kit.Value(data, k, v) }) kit.For(arg, func(k, v string) { kit.Value(data, k, v) })
_data := kit.Format(data) head[html.ContentType], body = html.ApplicationJSON, bytes.NewBufferString(kit.Format(data))
head[html.ContentType], body = html.ApplicationJSON, bytes.NewBufferString(_data)
} }
return body, head, arg[:0] return body, head, arg[:0]
} }
@ -146,12 +142,12 @@ func _spide_part(m *ice.Message, arg ...string) (string, io.Reader) {
if arg[i] == nfs.SIZE { if arg[i] == nfs.SIZE {
size = kit.Int64(arg[i+1]) size = kit.Int64(arg[i+1])
} else if arg[i] == SPIDE_CACHE { } else if arg[i] == SPIDE_CACHE {
if t, e := time.ParseInLocation(ice.MOD_TIME, arg[i+1], time.Local); !m.Warn(e, ice.ErrNotValid) { if t, e := time.ParseInLocation(ice.MOD_TIME, arg[i+1], time.Local); !m.WarnNotValid(e) {
cache = t cache = t
} }
} else if strings.HasPrefix(arg[i+1], mdb.AT) { } else if strings.HasPrefix(arg[i+1], mdb.AT) {
p := arg[i+1][1:] p := arg[i+1][1:]
if s, e := nfs.StatFile(m, p); !m.Warn(e, ice.ErrNotValid) { if s, e := nfs.StatFile(m, p); !m.WarnNotValid(e) {
if s.Size() == size && s.ModTime().Before(cache) { if s.Size() == size && s.ModTime().Before(cache) {
m.Option("spide.break", ice.TRUE) m.Option("spide.break", ice.TRUE)
continue continue
@ -161,10 +157,10 @@ func _spide_part(m *ice.Message, arg ...string) (string, io.Reader) {
} }
m.Logs(nfs.FIND, LOCAL, s.ModTime(), nfs.SIZE, s.Size(), CACHE, cache, nfs.SIZE, size) m.Logs(nfs.FIND, LOCAL, s.ModTime(), nfs.SIZE, s.Size(), CACHE, cache, nfs.SIZE, size)
} }
if f, e := nfs.OpenFile(m, p); !m.Warn(e, ice.ErrNotValid, arg[i+1]) { if f, e := nfs.OpenFile(m, p); !m.WarnNotValid(e, arg[i+1]) {
defer f.Close() defer f.Close()
if p, e := mp.CreateFormFile(arg[i], path.Base(p)); !m.Warn(e, ice.ErrNotValid, arg[i+1]) { if p, e := mp.CreateFormFile(arg[i], path.Base(p)); !m.WarnNotValid(e, arg[i+1]) {
if n, e := io.Copy(p, f); !m.Warn(e, ice.ErrNotValid, arg[i+1]) { if n, e := io.Copy(p, f); !m.WarnNotValid(e, arg[i+1]) {
m.Logs(nfs.LOAD, nfs.FILE, arg[i+1], nfs.SIZE, n) m.Logs(nfs.LOAD, nfs.FILE, arg[i+1], nfs.SIZE, n)
} }
} }
@ -198,12 +194,8 @@ func _spide_save(m *ice.Message, action, file, uri string, res *http.Response) {
} }
switch action { switch action {
case SPIDE_RAW: case SPIDE_RAW:
if b, _ := ioutil.ReadAll(res.Body); strings.HasPrefix(res.Header.Get(html.ContentType), html.ApplicationJSON) { b, _ := ioutil.ReadAll(res.Body)
// m.Echo(kit.Formats(kit.UnMarshal(string(b)))) m.Echo(string(b))
m.Echo(string(b))
} else {
m.Echo(string(b))
}
case SPIDE_MSG: case SPIDE_MSG:
var data map[string][]string var data map[string][]string
m.Assert(json.NewDecoder(res.Body).Decode(&data)) m.Assert(json.NewDecoder(res.Body).Decode(&data))
@ -216,7 +208,7 @@ func _spide_save(m *ice.Message, action, file, uri string, res *http.Response) {
m.Echo(m.Append(mdb.HASH)) m.Echo(m.Append(mdb.HASH))
default: default:
var data ice.Any var data ice.Any
if b, e := ioutil.ReadAll(res.Body); !m.Warn(e) { if b, e := ioutil.ReadAll(res.Body); !m.WarnNotFound(e) {
if json.Unmarshal(b, &data) == nil { if json.Unmarshal(b, &data) == nil {
m.Push("", kit.KeyValue(ice.Map{}, "", m.Optionv(SPIDE_RES, data))) m.Push("", kit.KeyValue(ice.Map{}, "", m.Optionv(SPIDE_RES, data)))
} else { } else {
@ -272,48 +264,15 @@ const (
) )
var agentIcons = map[string]string{ var agentIcons = map[string]string{
"Safari": "usr/icons/Safari.png", html.Safari: "usr/icons/Safari.png",
"Chrome": "usr/icons/Chrome.png", html.Chrome: "usr/icons/Chrome.png",
"Edg": "usr/icons/Edg.png", html.Edg: "usr/icons/Edg.png",
"MicroMessenger": "usr/icons/wechat.png", html.MicroMessenger: "usr/icons/wechat.png",
} }
const SPIDE = "spide" const SPIDE = "spide"
func init() { func init() {
nfs.TemplatePath = func(m *ice.Message, arg ...string) string {
if p := path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Join(arg...)); nfs.Exists(m, p) {
return p + kit.Select("", nfs.PS, len(arg) == 0)
} else {
m.Debug("what %v", p)
what := kit.MergeURL2(UserHost(m)+ctx.GetCmdFile(m, m.PrefixKey()), path.Join(arg...))
m.Debug("what %v", what)
return what
// return path.Join(path.Dir(ctx.GetCmdFile(m, m.PrefixKey())), path.Join(arg...)) + kit.Select("", nfs.PS, len(arg) == 0)
}
}
nfs.TemplateText = func(m *ice.Message, p string) string {
if p := kit.Select(nfs.TemplatePath(m, path.Base(p)), m.Option("_template")); kit.HasPrefix(p, "/require/", ice.HTTP) {
m.Debug("what %v", p)
return m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, p)
} else {
return m.Cmdx(nfs.CAT, p)
}
}
nfs.DocumentPath = func(m *ice.Message, arg ...string) string {
if p := path.Join(nfs.USR_LEARNING_PORTAL, m.PrefixKey(), path.Join(arg...)); nfs.Exists(m, p) {
return p + kit.Select("", nfs.PS, len(arg) == 0)
} else {
return path.Join(path.Dir(ctx.GetCmdFile(m, m.PrefixKey())), path.Join(arg...)) + kit.Select("", nfs.PS, len(arg) == 0)
}
}
nfs.DocumentText = func(m *ice.Message, p string) string {
if p := nfs.DocumentPath(m, path.Base(p)); kit.HasPrefix(p, "/require/", ice.HTTP) {
return m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, http.MethodGet, p)
} else {
return m.Cmdx(nfs.CAT, p)
}
}
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
// SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeActions(ice.Actions{ // SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeActions(ice.Actions{
SPIDE: {Help: "蜘蛛侠", Meta: kit.Dict(ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict( SPIDE: {Help: "蜘蛛侠", Meta: kit.Dict(ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(
@ -397,17 +356,14 @@ func init() {
}}, }},
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)) }},
DEV_CREATE_TOKEN: {Hand: func(m *ice.Message, arg ...string) { DEV_CREATE_TOKEN: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE, tcp.DIAL, ice.DEV, m.Option(CLIENT_NAME), m.OptionSimple(TOKEN)) m.Cmd(SPACE, tcp.DIAL, ice.DEV, m.Option(CLIENT_NAME), m.OptionSimple(TOKEN)).Sleep300ms()
m.Sleep300ms()
}}, }},
}, DevTokenAction(CLIENT_NAME, CLIENT_URL), mdb.HashAction(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.HashAction(mdb.SHORT, CLIENT_NAME, mdb.FIELD, "time,icons,client.name,client.url,client.type,token")), Hand: func(m *ice.Message, arg ...string) {
if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") { if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") {
list := m.CmdMap(SPACE, mdb.NAME) list := m.CmdMap(SPACE, mdb.NAME)
mdb.HashSelect(m, kit.Slice(arg, 0, 1)...).Sort("client.type,client.name", []string{nfs.REPOS, ""}) mdb.HashSelect(m, kit.Slice(arg, 0, 1)...).Sort("client.type,client.name", []string{nfs.REPOS, ""})
m.RewriteAppend(func(value, key string, index int) string { m.RewriteAppend(func(value, key string, index int) string {
if key == CLIENT_URL { kit.If(key == CLIENT_URL, func() { value = kit.MergeURL(value, m.OptionSimple(ice.MSG_DEBUG)) })
value = kit.MergeURL(value, m.OptionSimple(ice.MSG_DEBUG))
}
return value return value
}) })
m.Table(func(value ice.Maps) { m.Table(func(value ice.Maps) {
@ -439,6 +395,34 @@ func init() {
m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, http.MethodDelete, arg[0], arg[1:])))) m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, http.MethodDelete, arg[0], arg[1:]))))
}}, }},
}) })
nfs.TemplateText = func(m *ice.Message, p string) string {
if p := kit.Select(nfs.TemplatePath(m, path.Base(p)), m.Option("_template")); kit.HasPrefix(p, "/require/", ice.HTTP) {
return m.Cmdx(SPIDE, ice.OPS, SPIDE_RAW, http.MethodGet, p)
} else {
return m.Cmdx(nfs.CAT, p)
}
}
nfs.TemplatePath = func(m *ice.Message, arg ...string) string {
if p := path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Join(arg...)); nfs.Exists(m, p) {
return p + kit.Select("", nfs.PS, len(arg) == 0)
} else {
return kit.MergeURL2(UserHost(m)+ctx.GetCmdFile(m, m.PrefixKey()), path.Join(arg...))
}
}
nfs.DocumentPath = func(m *ice.Message, arg ...string) string {
if p := path.Join(nfs.USR_LEARNING_PORTAL, m.PrefixKey(), path.Join(arg...)); nfs.Exists(m, p) {
return p + kit.Select("", nfs.PS, len(arg) == 0)
} else {
return kit.MergeURL2(UserHost(m)+ctx.GetCmdFile(m, m.PrefixKey()), path.Join(arg...))
}
}
nfs.DocumentText = func(m *ice.Message, p string) string {
if p := nfs.DocumentPath(m, path.Base(p)); kit.HasPrefix(p, "/require/", ice.HTTP) {
return m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, http.MethodGet, p)
} else {
return m.Cmdx(nfs.CAT, p)
}
}
} }
func HostPort(m *ice.Message, host, port string, arg ...string) string { func HostPort(m *ice.Message, host, port string, arg ...string) string {
@ -479,15 +463,12 @@ func SpideSave(m *ice.Message, file, link string, cb func(count, total, value in
func SpideCache(m *ice.Message, link string) *ice.Message { func SpideCache(m *ice.Message, link string) *ice.Message {
return m.Cmd(Prefix(SPIDE), ice.DEV, SPIDE_CACHE, http.MethodGet, link) return m.Cmd(Prefix(SPIDE), ice.DEV, SPIDE_CACHE, http.MethodGet, link)
} }
func SpideOrigin(m *ice.Message, name string) string { func SpideOrigin(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_ORIGIN) }
return m.Cmdv(SPIDE, name, CLIENT_ORIGIN) func SpideURL(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_URL) }
}
func SpideURL(m *ice.Message, name string) string {
return m.Cmdv(SPIDE, name, CLIENT_URL)
}
func ProcessIframe(m *ice.Message, title, link string, arg ...string) *ice.Message { func ProcessIframe(m *ice.Message, title, link string, arg ...string) *ice.Message {
if m.IsMetaKey() || m.IsMobileUA() { if m.IsMetaKey() || m.IsMobileUA() {
return m.ProcessOpen(link) m.ProcessOpen(link)
return m
} }
if !kit.HasPrefixList(arg, ctx.RUN) { if !kit.HasPrefixList(arg, ctx.RUN) {
defer m.Push(TITLE, title) defer m.Push(TITLE, title)

View File

@ -20,6 +20,8 @@ func init() {
STATS: {Help: "汇总量", Hand: func(m *ice.Message, arg ...string) { STATS: {Help: "汇总量", Hand: func(m *ice.Message, arg ...string) {
defer ctx.DisplayStory(m, "") defer ctx.DisplayStory(m, "")
if m.Option(ice.MSG_USERPOD) == "" { if m.Option(ice.MSG_USERPOD) == "" {
PushStats(m, "", "", "", "共享总数", SHARE)
PushStats(m, "", "", "", "令牌总数", TOKEN)
PushStats(m, "", "", "", "注册总数", aaa.APPLY) PushStats(m, "", "", "", "注册总数", aaa.APPLY)
PushStats(m, "", "", "", "邀请总数", aaa.OFFER) PushStats(m, "", "", "", "邀请总数", aaa.OFFER)
if ice.Info.Username == ice.Info.Make.Username { if ice.Info.Username == ice.Info.Make.Username {
@ -29,8 +31,6 @@ func init() {
} }
PushStats(m, "", "", "", "会话总数", aaa.SESS) PushStats(m, "", "", "", "会话总数", aaa.SESS)
PushStats(m, "", m.Cmd(mdb.SELECT, aaa.ROLE, "", mdb.HASH).Length(), "", "角色总数", aaa.ROLE) PushStats(m, "", m.Cmd(mdb.SELECT, aaa.ROLE, "", mdb.HASH).Length(), "", "角色总数", aaa.ROLE)
PushStats(m, "", "", "", "令牌总数", TOKEN)
PushStats(m, "", "", "", "共享总数", SHARE)
PushStats(m, "", "", "", "命令总数", ctx.COMMAND) PushStats(m, "", "", "", "命令总数", ctx.COMMAND)
} }
gdb.Event(m, STATS_TABLES) gdb.Event(m, STATS_TABLES)

View File

@ -43,7 +43,7 @@ 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(PORTAL), arg...) ProcessIframe(m, m.Option(mdb.NAME), m.Option(ORIGIN)+S(m.Option(mdb.NAME))+C(PORTAL), arg...)
}}, }},
}, ctx.ConfAction(CLIENT_TIMEOUT, "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)
return return
@ -55,17 +55,16 @@ func init() {
if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) { if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) {
m.Action() m.Action()
} else { } else {
m.Action(html.FILTER, mdb.CREATE) m.PushAction(mdb.REMOVE).Action(html.FILTER, mdb.CREATE)
m.PushAction(mdb.REMOVE)
} }
} else { } else {
if arg[0] == ice.OPS && ice.Info.NodeType == SERVER { if arg[0] == ice.OPS && ice.Info.NodeType == SERVER {
m.Cmdy(DREAM) m.Cmdy(DREAM)
return return
} }
defer ToastProcess(m, "查询中,请稍候")("查询成功") defer ToastProcess(m, m.Trans("querying, please wait", "查询中,请稍候"))(m.Trans("query succsess", "查询成功"))
origin := SpideOrigin(m, arg[0]) origin := SpideOrigin(m, arg[0])
kit.If(arg[0] == ice.OPS, func() { origin = tcp.PublishLocalhost(m, origin) }) kit.If(kit.IsIn(arg[0], ice.OPS, ice.DEV), func() { origin = tcp.PublishLocalhost(m, origin) })
list := m.Spawn(ice.Maps{ice.MSG_FIELDS: ""}).CmdMap(DREAM, mdb.NAME) list := m.Spawn(ice.Maps{ice.MSG_FIELDS: ""}).CmdMap(DREAM, mdb.NAME)
m.SetAppend().Spawn().SplitIndex(m.Cmdx(SPIDE, arg[0], C(DREAM), kit.Dict(mdb.ConfigSimple(m, CLIENT_TIMEOUT)))).Table(func(value ice.Maps) { m.SetAppend().Spawn().SplitIndex(m.Cmdx(SPIDE, arg[0], C(DREAM), kit.Dict(mdb.ConfigSimple(m, CLIENT_TIMEOUT)))).Table(func(value ice.Maps) {
if value[mdb.TYPE] != WORKER { if value[mdb.TYPE] != WORKER {

View File

@ -37,11 +37,10 @@ func DevTokenAction(name, origin string) ice.Actions {
)) ))
}}, }},
mdb.DEV_CHOOSE: {Hand: func(m *ice.Message, arg ...string) { mdb.DEV_CHOOSE: {Hand: func(m *ice.Message, arg ...string) {
m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.Cmdx(nfs.CAT, nfs.SRC_TEMPLATE+"web.token/saveto.html"), m.Option(cli.BACK)), mdb.DEV_RESPONSE)
m.Cmdx(nfs.CAT, nfs.SRC_TEMPLATE+"web.token/saveto.html"), m.Option(cli.BACK)), mdb.DEV_RESPONSE)
}}, }},
mdb.DEV_RESPONSE: {Help: "确认", Hand: func(m *ice.Message, arg ...string) { mdb.DEV_RESPONSE: {Help: "确认", Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(ice.MSG_METHOD) != http.MethodPost, ice.ErrNotAllow) { if !m.WarnNotAllow(m.Option(ice.MSG_METHOD) != http.MethodPost) {
m.ProcessReplace(m.ParseLink(m.Option(cli.BACK)).MergePodCmd("", m.PrefixKey(), ctx.ACTION, mdb.DEV_CONFIRM, m.OptionSimple(cli.DAEMON), m.ProcessReplace(m.ParseLink(m.Option(cli.BACK)).MergePodCmd("", m.PrefixKey(), ctx.ACTION, mdb.DEV_CONFIRM, m.OptionSimple(cli.DAEMON),
m.OptionSimple(name), TOKEN, m.Cmdx(TOKEN, mdb.CREATE, mdb.TYPE, m.CommandKey(), mdb.NAME, m.Option(ice.MSG_USERNAME), m.OptionSimple(mdb.TEXT)))) m.OptionSimple(name), TOKEN, m.Cmdx(TOKEN, mdb.CREATE, mdb.TYPE, m.CommandKey(), mdb.NAME, m.Option(ice.MSG_USERNAME), m.OptionSimple(mdb.TEXT))))
} }
@ -50,7 +49,7 @@ func DevTokenAction(name, origin string) ice.Actions {
m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.Cmdx(nfs.CAT, nfs.SRC_TEMPLATE+"web.token/savefrom.html"), m.Option(name)), mdb.DEV_CREATE) m.EchoInfoButton(kit.JoinWord(m.PrefixKey(), m.Cmdx(nfs.CAT, nfs.SRC_TEMPLATE+"web.token/savefrom.html"), m.Option(name)), mdb.DEV_CREATE)
}}, }},
mdb.DEV_CREATE: {Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.DEV_CREATE: {Help: "创建", Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(ice.MSG_METHOD) != http.MethodPost, ice.ErrNotAllow) { if !m.WarnNotAllow(m.Option(ice.MSG_METHOD) != http.MethodPost) {
defer kit.If(m.Option(cli.DAEMON), func(p string) { m.Cmd(SPACE, p, html.REFRESH) }) defer kit.If(m.Option(cli.DAEMON), func(p string) { m.Cmd(SPACE, p, html.REFRESH) })
mdb.HashModify(m, m.OptionSimple(name, TOKEN)) mdb.HashModify(m, m.OptionSimple(name, TOKEN))
m.Cmdy("", DEV_CREATE_TOKEN).ProcessClose() m.Cmdy("", DEV_CREATE_TOKEN).ProcessClose()

View File

@ -63,7 +63,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) {
m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, HTTP, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(l net.Listener) { m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, HTTP, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(l net.Listener) {
defer mdb.HashCreateDeferRemove(m, m.OptionSimple(mdb.NAME, tcp.PROTO), arg, cli.STATUS, tcp.START)() defer mdb.HashCreateDeferRemove(m, m.OptionSimple(mdb.NAME, tcp.PROTO), arg, cli.STATUS, tcp.START)()
gdb.Event(m.Spawn(), SERVE_START, arg) gdb.Event(m.Spawn(), SERVE_START, arg)
m.Warn(f.Server.Serve(l)) m.WarnNotValid(f.Server.Serve(l))
}) })
kit.If(m.IsErr(), func() { fmt.Println(); fmt.Println(m.Result()); m.Cmd(ice.QUIT) }) kit.If(m.IsErr(), func() { fmt.Println(); fmt.Println(m.Result()); m.Cmd(ice.QUIT) })
} }

24
conf.go
View File

@ -56,8 +56,8 @@ const (
const ( // REPOS const ( // REPOS
CONTEXTS = "contexts" CONTEXTS = "contexts"
INTSHELL = "intshell" INTSHELL = "intshell"
VOLCANOS = "volcanos"
LEARNING = "learning" LEARNING = "learning"
VOLCANOS = "volcanos"
TOOLKITS = "toolkits" TOOLKITS = "toolkits"
ICEBERGS = "icebergs" ICEBERGS = "icebergs"
RELEASE = "release" RELEASE = "release"
@ -117,15 +117,15 @@ const ( // DIR
USR_REQUIRE = "usr/require/" USR_REQUIRE = "usr/require/"
USR_PUBLISH = "usr/publish/" USR_PUBLISH = "usr/publish/"
USR_INTSHELL = "usr/intshell/" USR_INTSHELL = "usr/intshell/"
USR_VOLCANOS = "usr/volcanos/"
USR_LEARNING = "usr/learning/" USR_LEARNING = "usr/learning/"
USR_VOLCANOS = "usr/volcanos/"
USR_TOOLKITS = "usr/toolkits/" USR_TOOLKITS = "usr/toolkits/"
USR_ICEBERGS = "usr/icebergs/" USR_ICEBERGS = "usr/icebergs/"
USR_RELEASE = "usr/release/" USR_RELEASE = "usr/release/"
USR_ICONS = "usr/icons/"
USR_PROGRAM = "usr/program/" USR_PROGRAM = "usr/program/"
USR_GEOAREA = "usr/geoarea/" USR_GEOAREA = "usr/geoarea/"
USR_PORTAL = "usr/portal/" USR_PORTAL = "usr/portal/"
USR_ICONS = "usr/icons/"
USR_LOCAL = "usr/local/" USR_LOCAL = "usr/local/"
USR_LOCAL_GO = "usr/local/go/" USR_LOCAL_GO = "usr/local/go/"
@ -242,17 +242,16 @@ const ( // MSG
TABLE_CHECKBOX = "table.checkbox" TABLE_CHECKBOX = "table.checkbox"
TOAST_DURATION = "toast.duration" TOAST_DURATION = "toast.duration"
TCP_DOMAIN = "tcp_domain"
) )
const ( // RENDER const ( // RENDER
RENDER_BUTTON = "_button" RENDER_BUTTON = "_button"
RENDER_ANCHOR = "_anchor" RENDER_ANCHOR = "_anchor"
RENDER_QRCODE = "_qrcode" RENDER_QRCODE = "_qrcode"
RENDER_SCRIPT = "_script"
RENDER_IMAGES = "_images" RENDER_IMAGES = "_images"
RENDER_VIDEOS = "_videos" RENDER_VIDEOS = "_videos"
RENDER_AUDIOS = "_audios" RENDER_AUDIOS = "_audios"
RENDER_IFRAME = "_iframe" RENDER_IFRAME = "_iframe"
RENDER_SCRIPT = "_script"
RENDER_STATUS = "_status" RENDER_STATUS = "_status"
RENDER_REDIRECT = "_redirect" RENDER_REDIRECT = "_redirect"
@ -298,11 +297,11 @@ const ( // CTX
CTX_CLOSE = "close" CTX_CLOSE = "close"
CTX_INIT = "_init" CTX_INIT = "_init"
CTX_OPEN = "_open"
CTX_EXIT = "_exit" CTX_EXIT = "_exit"
CTX_ICONS = "_icons" CTX_OPEN = "_open"
CTX_TRANS = "_trans"
CTX_TITLE = "_title" CTX_TITLE = "_title"
CTX_TRANS = "_trans"
CTX_ICONS = "_icons"
) )
const ( // LOG const ( // LOG
LOG_CMDS = "cmds" LOG_CMDS = "cmds"
@ -319,8 +318,8 @@ const ( // Err
ErrNotLogin = "not login: " ErrNotLogin = "not login: "
ErrNotRight = "not right: " ErrNotRight = "not right: "
ErrNotAllow = "not allow: " ErrNotAllow = "not allow: "
ErrNotValid = "not valid: "
ErrNotFound = "not found: " ErrNotFound = "not found: "
ErrNotValid = "not valid: "
ErrNotStart = "not start: " ErrNotStart = "not start: "
ErrAlreadyExists = "already exists: " ErrAlreadyExists = "already exists: "
@ -340,8 +339,8 @@ const ( // mdb
SELECT = "select" SELECT = "select"
KEY = "key" KEY = "key"
FIELD = "field"
VALUE = "value" VALUE = "value"
FIELD = "field"
EXTRA = "extra" EXTRA = "extra"
META = "meta" META = "meta"
TIME = "time" TIME = "time"
@ -355,8 +354,8 @@ const ( // web
SERVE = "serve" SERVE = "serve"
SPACE = "space" SPACE = "space"
THEME = "theme"
TITLE = "title" TITLE = "title"
THEME = "theme"
) )
const ( // gdb const ( // gdb
EVENT = "event" EVENT = "event"
@ -390,5 +389,6 @@ const ( // ice
LOG = "log" LOG = "log"
) )
const ( // env const ( // env
LOG_TRACE = "log_trace" LOG_TRACE = "log_trace"
TCP_DOMAIN = "tcp_domain"
) )

View File

@ -14,11 +14,11 @@ func _action_list(m *ice.Message, river, storm string) {
} }
func _action_exec(m *ice.Message, river, storm, index string, arg ...string) { func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
m.Options(ice.MSG_RIVER, river, ice.MSG_STORM, storm) m.Options(ice.MSG_RIVER, river, ice.MSG_STORM, storm)
if m.Warn(m.Cmd(STORM, index, arg, func(value ice.Maps) { if m.WarnNotRight(m.Cmd(STORM, index, arg, func(value ice.Maps) {
if index = value[ctx.INDEX]; value[web.SPACE] != "" { if index = value[ctx.INDEX]; value[web.SPACE] != "" {
m.Option(ice.POD, value[web.SPACE]) m.Option(ice.POD, value[web.SPACE])
} }
}).Length() == 0, ice.ErrNotRight, index, arg) { }).Length() == 0, index, arg) {
return return
} }
kit.If(!ctx.PodCmd(m, index, arg), func() { m.Cmdy(index, arg) }) kit.If(!ctx.PodCmd(m, index, arg), func() { m.Cmdy(index, arg) })
@ -32,7 +32,7 @@ func _action_auth(m *ice.Message, share string) *ice.Message {
m.Table(func(value ice.Maps) { m.Table(func(value ice.Maps) {
aaa.SessAuth(m, kit.Dict(value), RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)), STORM, m.Option(ice.MSG_STORM, msg.Append(STORM))) aaa.SessAuth(m, kit.Dict(value), RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)), STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)))
}) })
if m.Warn(!_river_right(m, msg.Append(web.RIVER)), ice.ErrNotRight) { if m.WarnNotRight(!_river_right(m, msg.Append(web.RIVER))) {
msg.Append(mdb.TYPE, "") msg.Append(mdb.TYPE, "")
return msg return msg
} }
@ -69,14 +69,11 @@ func init() {
}}, }},
web.SHARE: {Hand: func(m *ice.Message, arg ...string) { _action_share(m, arg...) }}, web.SHARE: {Hand: func(m *ice.Message, arg ...string) { _action_share(m, arg...) }},
}, web.ApiAction(""), aaa.WhiteAction("", web.SHARE)), Hand: func(m *ice.Message, arg ...string) { }, web.ApiAction(""), aaa.WhiteAction("", web.SHARE)), Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) { if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "", arg) {
return return
} else if m.Warn(!_river_right(m, arg[0]), ice.ErrNotRight, arg) { } else if m.WarnNotRight(!_river_right(m, arg[0]), arg) {
return return
} }
// if web.PodCmd(m, ice.POD, arg...) {
// // m.Table(func(value ice.Maps) { m.Push(web.SPACE, m.Option(ice.MSG_USERPOD)) })
// } else
if len(arg) == 2 { if len(arg) == 2 {
ctx.OptionFromConfig(m, MENUS) ctx.OptionFromConfig(m, MENUS)
_action_list(m, arg[0], arg[1]) _action_list(m, arg[0], arg[1])

View File

@ -1,6 +1,8 @@
package chat package chat
import ( import (
"net/http"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
@ -26,12 +28,11 @@ func init() {
}}, }},
web.HOME: {Help: "首页", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(web.C(web.ADMIN)) }}, web.HOME: {Help: "首页", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(web.C(web.ADMIN)) }},
aaa.CONFIRM: {Help: "授权", Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) { aaa.CONFIRM: {Help: "授权", Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
// if m.Warn(m.R.Method == http.MethodGet, ice.ErrNotAllow) { if m.WarnNotAllow(m.R.Method == http.MethodGet) {
// return
// } else
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) || m.Warn(m.Option(web.SPACE) == "", ice.ErrNotValid, web.SPACE) {
return return
} else if msg := m.Cmd(web.SPACE, m.Option(web.SPACE)); m.Warn(msg.Append(mdb.TYPE) == "", ice.ErrNotFound, m.Option(web.SPACE)) { } else if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "") || m.WarnNotValid(m.Option(web.SPACE) == "", web.SPACE) {
return
} else if msg := m.Cmd(web.SPACE, m.Option(web.SPACE)); m.WarnNotFound(msg.Append(mdb.TYPE) == "", m.Option(web.SPACE)) {
return return
} else { } else {
web.RenderCookie(m, aaa.SessValid(m)) web.RenderCookie(m, aaa.SessValid(m))
@ -50,7 +51,7 @@ func init() {
}, gdb.EventsAction(web.SPACE_LOGIN)), Hand: func(m *ice.Message, arg ...string) { }, gdb.EventsAction(web.SPACE_LOGIN)), Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.SPACE, m.Option(web.SPACE, arg[0])) msg := m.Cmd(web.SPACE, m.Option(web.SPACE, arg[0]))
m.Options(tcp.HOSTNAME, ice.Info.Hostname, nfs.PATH, msg.Append(mdb.TEXT)) m.Options(tcp.HOSTNAME, ice.Info.Hostname, nfs.PATH, msg.Append(mdb.TEXT))
if !m.Warn(m.Option(nfs.PATH) == "", ice.ErrNotFound, arg[0]) { if !m.WarnNotValid(m.Option(nfs.PATH) == "", arg[0]) {
if m.EchoInfoButton(nfs.Template(m, "auth.html"), aaa.CONFIRM); m.IsWeixinUA() { if m.EchoInfoButton(nfs.Template(m, "auth.html"), aaa.CONFIRM); m.IsWeixinUA() {
m.OptionFields(mdb.DETAIL) m.OptionFields(mdb.DETAIL)
m.Push(web.SPACE, arg[0]) m.Push(web.SPACE, arg[0])

View File

@ -17,18 +17,18 @@ import (
) )
func _header_users(m *ice.Message, arg ...string) { func _header_users(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "") {
return return
} else if m.Warn(m.Option(web.SHARE) != "", ice.ErrNotRight, "没有权限") { } else if m.WarnNotRight(m.Option(web.SHARE) != "", "没有权限") {
return return
} else { } else {
m.Cmdy(aaa.USER, mdb.MODIFY, aaa.USERNAME, m.Option(ice.MSG_USERNAME), m.ActionKey(), m.Option(m.ActionKey(), arg[0])) m.Cmdy(aaa.USER, mdb.MODIFY, aaa.USERNAME, m.Option(ice.MSG_USERNAME), m.ActionKey(), m.Option(m.ActionKey(), arg[0]))
} }
} }
func _header_share(m *ice.Message, arg ...string) { func _header_share(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, "没有登录") { if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "", "没有登录") {
return return
} else if m.Warn(m.Option(web.SHARE) != "", ice.ErrNotRight, "没有权限") { } else if m.WarnNotRight(m.Option(web.SHARE) != "", "没有权限") {
return return
} else if kit.For(arg, func(k, v string) { m.Option(k, v) }); m.Option(mdb.LINK) == "" { } else if kit.For(arg, func(k, v string) { m.Option(k, v) }); m.Option(mdb.LINK) == "" {
m.Cmdy(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN, arg) m.Cmdy(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN, arg)

View File

@ -24,7 +24,7 @@ func init() {
get := func(m *ice.Message, api string, arg ...ice.Any) string { get := func(m *ice.Message, api string, arg ...ice.Any) string {
return kit.Format(mdb.Cache(m, kit.Join(kit.Simple(api, arg)), func() ice.Any { return kit.Format(mdb.Cache(m, kit.Join(kit.Simple(api, arg)), func() ice.Any {
res := kit.UnMarshal(m.Cmdx(web.SPIDE, TMAP, web.SPIDE_RAW, http.MethodGet, api, mdb.KEY, mdb.Config(m, aaa.SECRET), arg)) res := kit.UnMarshal(m.Cmdx(web.SPIDE, TMAP, web.SPIDE_RAW, http.MethodGet, api, mdb.KEY, mdb.Config(m, aaa.SECRET), arg))
m.Warn(kit.Format(kit.Value(res, mdb.STATUS)) != "0", kit.Format(res)) m.WarnNotValid(kit.Format(kit.Value(res, mdb.STATUS)) != "0", kit.Format(res))
m.Debug("what %v %v", api, kit.Formats(res)) m.Debug("what %v %v", api, kit.Formats(res))
return res return res
})) }))

View File

@ -112,13 +112,13 @@ func (s Client) List(m *ice.Message, arg ...string) {
func init() { ice.ChatCtxCmd(Client{}) } func init() { ice.ChatCtxCmd(Client{}) }
func (s Client) Login(m *ice.Message, arg ...string) { func (s Client) Login(m *ice.Message, arg ...string) {
if state, code := m.Option(STATE), m.Option(CODE); !m.Warn(state == "" || code == "") { if state, code := m.Option(STATE), m.Option(CODE); !m.WarnNotValid(state == "" || code == "") {
s.Hash.List(m.Spawn(), m.Option(mdb.HASH, state)).Table(func(value ice.Maps) { m.Options(value) }) s.Hash.List(m.Spawn(), m.Option(mdb.HASH, state)).Table(func(value ice.Maps) { m.Options(value) })
m.Options(GRANT_TYPE, AUTHORIZATION_CODE, REDIRECT_URI, s.RedirectURI(m)) m.Options(GRANT_TYPE, AUTHORIZATION_CODE, REDIRECT_URI, s.RedirectURI(m))
if res := s.Post(m, m.Option(mdb.HASH), m.Option(GRANT_URL), m.OptionSimple(GRANT_TYPE, CODE, CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)...); !m.Warn(res == nil) { if res := s.Post(m, m.Option(mdb.HASH), m.Option(GRANT_URL), m.OptionSimple(GRANT_TYPE, CODE, CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)...); !m.WarnNotValid(res == nil) {
kit.Value(res, EXPIRES_IN, m.Time(kit.Format("%vs", kit.Int(kit.Value(res, EXPIRES_IN))))) kit.Value(res, EXPIRES_IN, m.Time(kit.Format("%vs", kit.Int(kit.Value(res, EXPIRES_IN)))))
m.Options(res) m.Options(res)
if s.User(m); !m.Warn(m.Option(aaa.USERNAME) == "") && m.R != nil { if s.User(m); !m.WarnNotValid(m.Option(aaa.USERNAME) == "") && m.R != nil {
m.Cmd(aaa.USER, mdb.MODIFY, m.OptionSimple(aaa.USERNAME), kit.Simple(res)) m.Cmd(aaa.USER, mdb.MODIFY, m.OptionSimple(aaa.USERNAME), kit.Simple(res))
web.RenderCookie(m.Message, aaa.SessCreate(m.Message, m.Option(aaa.USERNAME))) web.RenderCookie(m.Message, aaa.SessCreate(m.Message, m.Option(aaa.USERNAME)))
m.ProcessHistory() m.ProcessHistory()
@ -129,13 +129,13 @@ func (s Client) Login(m *ice.Message, arg ...string) {
} }
} }
func (s Client) Login2(m *ice.Message, arg ...string) { func (s Client) Login2(m *ice.Message, arg ...string) {
if state, code := m.Option(STATE), m.Option(CODE); !m.Warn(state == "" || code == "") { if state, code := m.Option(STATE), m.Option(CODE); !m.WarnNotValid(state == "" || code == "") {
s.Hash.List(m.Spawn(), m.Option(mdb.HASH, state)).Table(func(value ice.Maps) { m.Options(value) }) s.Hash.List(m.Spawn(), m.Option(mdb.HASH, state)).Table(func(value ice.Maps) { m.Options(value) })
m.Options(GRANT_TYPE, AUTHORIZATION_CODE, REDIRECT_URI, s.RedirectURI(m)) m.Options(GRANT_TYPE, AUTHORIZATION_CODE, REDIRECT_URI, s.RedirectURI(m))
if res := s.Get(m, m.Option(mdb.HASH), m.Option(GRANT_URL), m.OptionSimple(GRANT_TYPE, CODE, CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)...); !m.Warn(res == nil) { if res := s.Get(m, m.Option(mdb.HASH), m.Option(GRANT_URL), m.OptionSimple(GRANT_TYPE, CODE, CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)...); !m.WarnNotValid(res == nil) {
kit.Value(res, EXPIRES_IN, m.Time(kit.Format("%vs", kit.Int(kit.Value(res, EXPIRES_IN))))) kit.Value(res, EXPIRES_IN, m.Time(kit.Format("%vs", kit.Int(kit.Value(res, EXPIRES_IN)))))
m.Options(res) m.Options(res)
if s.User(m); !m.Warn(m.Option(aaa.USERNAME) == "") && m.R != nil { if s.User(m); !m.WarnNotValid(m.Option(aaa.USERNAME) == "") && m.R != nil {
m.Cmd(aaa.USER, mdb.MODIFY, m.OptionSimple(aaa.USERNAME), kit.Simple(res)) m.Cmd(aaa.USER, mdb.MODIFY, m.OptionSimple(aaa.USERNAME), kit.Simple(res))
web.RenderCookie(m.Message, aaa.SessCreate(m.Message, m.Option(aaa.USERNAME))) web.RenderCookie(m.Message, aaa.SessCreate(m.Message, m.Option(aaa.USERNAME)))
m.ProcessHistory() m.ProcessHistory()

View File

@ -47,7 +47,7 @@ func init() {
gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg) gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg)
}}, }},
}, web.ApiWhiteAction(), mdb.ImportantHashAction(mdb.FIELD, "time,hash,type,icon,name,text,template"), mdb.ExportHashAction()), Hand: func(m *ice.Message, arg ...string) { }, web.ApiWhiteAction(), mdb.ImportantHashAction(mdb.FIELD, "time,hash,type,icon,name,text,template"), mdb.ExportHashAction()), Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) || !aaa.Right(m, RIVER, arg) { if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "") || !aaa.Right(m, RIVER, arg) {
return return
} else if len(arg) == 0 { } else if len(arg) == 0 {
_river_list(m) _river_list(m)

View File

@ -18,7 +18,7 @@ const SSO = "sso"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
SSO: {Help: "授权", Actions: web.ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { SSO: {Help: "授权", Actions: web.ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) || m.Warn(m.Option(web.SPACE) == "", ice.ErrNotValid) || m.Warn(m.Option(cli.BACK) == "", ice.ErrNotValid) { if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "") || m.WarnNotValid(m.Option(web.SPACE) == "") || m.WarnNotValid(m.Option(cli.BACK) == "") {
web.RenderMain(m) web.RenderMain(m)
return return
} }

View File

@ -135,7 +135,7 @@ func init() {
m.Cmdy(nfs.DIR, ice.ETC_MISS_SH).Cmdy(nfs.CAT, ice.ETC_MISS_SH) m.Cmdy(nfs.DIR, ice.ETC_MISS_SH).Cmdy(nfs.CAT, ice.ETC_MISS_SH)
}}, }},
nfs.MODULE: {Name: "module name*=hi help type*=Hash,Zone,Data,Lang,Code main*=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) { nfs.MODULE: {Name: "module name*=hi help type*=Hash,Zone,Data,Lang,Code main*=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
if m.Warn(!nfs.Exists(m, kit.Path(".git")), ice.ErrNotValid, "未初始化代码库") { if m.WarnNotFound(!nfs.Exists(m, kit.Path(".git")), "未初始化代码库") {
return return
} }
m.OptionDefault(mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME)) m.OptionDefault(mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))

View File

@ -30,10 +30,10 @@ func _binpack_file(m *ice.Message, w io.Writer, arg ...string) {
fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "") fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "")
return return
} }
if f, e := nfs.OpenFile(m, arg[0]); !m.Warn(e, ice.ErrNotFound, arg[0]) { if f, e := nfs.OpenFile(m, arg[0]); !m.WarnNotFound(e, arg[0]) {
defer f.Close() defer f.Close()
if b, e := ioutil.ReadAll(f); !m.Warn(e, ice.ErrNotValid, arg[0]) { if b, e := ioutil.ReadAll(f); !m.WarnNotValid(e, arg[0]) {
kit.If(len(b) > 1<<20, func() { m.Warn("too large %s %s", arg[0], len(b)) }) kit.If(len(b) > 1<<20, func() { m.WarnNotValid("too large %s %s", arg[0], len(b)) })
fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b)) fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
} }
} }

View File

@ -174,7 +174,7 @@ func init() {
web.DOWNLOAD: {Name: "download link* path", Hand: func(m *ice.Message, arg ...string) { _install_download(m, arg...) }}, web.DOWNLOAD: {Name: "download link* path", Hand: func(m *ice.Message, arg ...string) { _install_download(m, arg...) }},
cli.BUILD: {Name: "build link*", Hand: func(m *ice.Message, arg ...string) { cli.BUILD: {Name: "build link*", Hand: func(m *ice.Message, arg ...string) {
web.PushStream(m) web.PushStream(m)
if err := _install_build(m, arg...); m.Warn(err != "", err) { if err := _install_build(m, arg...); m.WarnNotValid(err != "", err) {
web.ToastFailure(m, err) web.ToastFailure(m, err)
} else { } else {
web.ToastSuccess(m) web.ToastSuccess(m)
@ -225,7 +225,7 @@ func InstallAction(args ...ice.Any) ice.Actions {
nfs.Trash(m, m.Option(nfs.PATH)) nfs.Trash(m, m.Option(nfs.PATH))
}}, }},
mdb.SELECT: {Name: "select path auto order build download", Hand: func(m *ice.Message, arg ...string) { mdb.SELECT: {Name: "select path auto order build download", Hand: func(m *ice.Message, arg ...string) {
m.Options(nfs.PATH, "").Cmdy(INSTALL, ctx.ConfigSimple(m, nfs.SOURCE), arg) m.Options(nfs.PATH, "").Cmdy(INSTALL, mdb.ConfigSimple(m, nfs.SOURCE), arg)
}}, }},
} }
} }

View File

@ -29,7 +29,7 @@ func _xterm_get(m *ice.Message, h string) xterm.XTerm {
ls := kit.Split(strings.Split(kit.Select(ISH, value[mdb.TYPE]), " # ")[0]) ls := kit.Split(strings.Split(kit.Select(ISH, value[mdb.TYPE]), " # ")[0])
kit.If(value[nfs.PATH] != "" && !strings.HasSuffix(value[nfs.PATH], nfs.PS), func() { value[nfs.PATH] = path.Dir(value[nfs.PATH]) }) kit.If(value[nfs.PATH] != "" && !strings.HasSuffix(value[nfs.PATH], nfs.PS), func() { value[nfs.PATH] = path.Dir(value[nfs.PATH]) })
term, e := xterm.Command(m, value[nfs.PATH], kit.Select(ls[0], cli.SystemFind(m, ls[0], value[nfs.PATH])), ls[1:]...) term, e := xterm.Command(m, value[nfs.PATH], kit.Select(ls[0], cli.SystemFind(m, ls[0], value[nfs.PATH])), ls[1:]...)
if m.Warn(e) { if m.WarnNotValid(e) {
return nil return nil
} }
m.Go(func() { m.Go(func() {
@ -37,7 +37,7 @@ func _xterm_get(m *ice.Message, h string) xterm.XTerm {
defer mdb.HashRemove(m, mdb.HASH, h) defer mdb.HashRemove(m, mdb.HASH, h)
buf := make([]byte, ice.MOD_BUFS) buf := make([]byte, ice.MOD_BUFS)
for { for {
if n, e := term.Read(buf); !m.Warn(e) && e == nil { if n, e := term.Read(buf); !m.WarnNotValid(e) && e == nil {
if _xterm_echo(m, h, string(buf[:n])); len(text) > 0 { if _xterm_echo(m, h, string(buf[:n])); len(text) > 0 {
kit.If(text[0], func(cmd string) { m.GoSleep300ms(func() { term.Write([]byte(cmd + lex.NL)) }) }) kit.If(text[0], func(cmd string) { m.GoSleep300ms(func() { term.Write([]byte(cmd + lex.NL)) }) })
text = text[1:] text = text[1:]
@ -115,7 +115,7 @@ func init() {
_xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80")) _xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80"))
}}, }},
html.INPUT: {Hand: func(m *ice.Message, arg ...string) { html.INPUT: {Hand: func(m *ice.Message, arg ...string) {
if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.Warn(e) { if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.WarnNotValid(e) {
_xterm_get(m, "").Write(b) _xterm_get(m, "").Write(b)
} }
}}, }},

View File

@ -124,7 +124,7 @@ func formatStyle(arg ...string) string {
} }
var transKey = map[string]string{ var transKey = map[string]string{
BG: html.BACKGROUND_COLOR, FG: html.COLOR, BG: html.BG_COLOR, FG: html.FG_COLOR,
} }
const ( const (

View File

@ -1,8 +1,6 @@
package chart package chart
import ( import (
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/core/wiki" "shylinux.com/x/icebergs/core/wiki"
@ -51,7 +49,7 @@ func (b *Block) Data(m *ice.Message, meta ice.Any) wiki.Chart {
return b return b
} }
func (b *Block) Draw(m *ice.Message, x, y int) wiki.Chart { func (b *Block) Draw(m *ice.Message, x, y int) wiki.Chart {
float := kit.Int(kit.Select("2", "6", strings.Contains(m.Option(ice.MSG_USERUA), "Chrome"))) float := kit.Int(kit.Select("2", "6", m.IsChromeUA()))
if m.Option(HIDE_BLOCK) != ice.TRUE { if m.Option(HIDE_BLOCK) != ice.TRUE {
item := wiki.NewItem(`<rect x="%d" y="%d" height="%d" width="%d" rx="4" ry="4"`, x+b.MarginX/2, y+b.MarginY/2, b.GetHeight(), b.GetWidth()) item := wiki.NewItem(`<rect x="%d" y="%d" height="%d" width="%d" rx="4" ry="4"`, x+b.MarginX/2, y+b.MarginY/2, b.GetHeight(), b.GetWidth())
item.Push(`fill="%s"`, b.BackGround).Push(`%v`, b.RectData).Echo("/>").Dump(m) item.Push(`fill="%s"`, b.BackGround).Push(`%v`, b.RectData).Echo("/>").Dump(m)

View File

@ -17,7 +17,7 @@ func _field_show(m *ice.Message, name, text string, arg ...string) {
meta[mdb.LIST], name = cmd.List, kit.Select(cmd.Help, name) meta[mdb.LIST], name = cmd.List, kit.Select(cmd.Help, name)
kit.For(cmd.Meta, func(k string, v ice.Any) { meta[kit.Keys(mdb.META, k)] = v }) kit.For(cmd.Meta, func(k string, v ice.Any) { meta[kit.Keys(mdb.META, k)] = v })
}) })
if m.Warn(len(meta) == 0, ice.ErrNotFound, text) || !aaa.Right(m.Spawn(), text) { if m.WarnNotFound(len(meta) == 0, text) || !aaa.Right(m.Spawn(), text) {
return return
} }
kit.For(arg, func(k, v string) { kit.For(arg, func(k, v string) {

View File

@ -53,9 +53,9 @@ func transArgKey(arg []string) []string {
for i := 0; i < len(arg)-1; i += 2 { for i := 0; i < len(arg)-1; i += 2 {
switch arg[i] { switch arg[i] {
case BG: case BG:
arg[i] = html.BACKGROUND_COLOR arg[i] = html.BG_COLOR
case FG: case FG:
arg[i] = html.COLOR arg[i] = html.FG_COLOR
} }
} }
return arg return arg

View File

@ -9,11 +9,8 @@ import (
) )
func (m *Message) ActionKey() string { func (m *Message) ActionKey() string {
if action := strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS); kit.IsIn(action, LIST, SELECT) { action := strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS)
return "" return kit.Select("", action, !kit.IsIn(action, LIST, SELECT))
} else {
return action
}
} }
func (m *Message) CommandKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS) } func (m *Message) CommandKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS) }
func (m *Message) PrefixKey() string { return m.Prefix(m.CommandKey()) } func (m *Message) PrefixKey() string { return m.Prefix(m.CommandKey()) }

11
exec.go
View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
"time" "time"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/logs" "shylinux.com/x/toolkits/logs"
"shylinux.com/x/toolkits/task" "shylinux.com/x/toolkits/task"
@ -69,8 +70,8 @@ func (m *Message) Go(cb func(), arg ...Any) *Message {
kit.If(len(arg) > 0, func() { meta.FileLine = kit.Format(arg[0]) }) kit.If(len(arg) > 0, func() { meta.FileLine = kit.Format(arg[0]) })
task.Put(meta, nil, func(task *task.Task) { task.Put(meta, nil, func(task *task.Task) {
m.TryCatch(true, func(m *Message) { m.TryCatch(true, func(m *Message) {
m.Option("task.id", kit.Format(task.TaskId()))
m.Option("work.id", kit.Format(task.WorkId())) m.Option("work.id", kit.Format(task.WorkId()))
m.Option("task.id", kit.Format(task.TaskId()))
cb() cb()
}) })
}) })
@ -108,7 +109,7 @@ func (m *Message) Cmdy(arg ...Any) *Message { return m.Copy(m._command(arg...))
func (m *Message) CmdList(arg ...string) []string { func (m *Message) CmdList(arg ...string) []string {
msg, list := m._command(arg), []string{} msg, list := m._command(arg), []string{}
kit.For(msg._cmd.List, func(value Map) { kit.For(msg._cmd.List, func(value Map) {
kit.If(!kit.IsIn(kit.Format(kit.Value(value, TYPE)), "button"), func() { list = append(list, kit.Format(kit.Value(value, NAME))) }) kit.If(!kit.IsIn(kit.Format(kit.Value(value, TYPE)), html.BUTTON), func() { list = append(list, kit.Format(kit.Value(value, NAME))) })
}) })
return msg.Appendv(kit.Select(kit.Select("", list, 0), list, len(arg)-1)) return msg.Appendv(kit.Select(kit.Select("", list, 0), list, len(arg)-1))
} }
@ -130,7 +131,7 @@ func (m *Message) CmdHand(cmd *Command, key string, arg ...string) *Message {
return m return m
} }
func (m *Message) ActionHand(cmd *Command, key, sub string, arg ...string) *Message { func (m *Message) ActionHand(cmd *Command, key, sub string, arg ...string) *Message {
if action, ok := cmd.Actions[sub]; !m.Warn(!ok, ErrNotFound, sub, cmd.FileLines()) { if action, ok := cmd.Actions[sub]; !m.WarnNotFound(!ok, sub, cmd.FileLines()) {
return m.Target()._action(m, cmd, key, sub, action, arg...) return m.Target()._action(m, cmd, key, sub, action, arg...)
} }
return m return m
@ -191,7 +192,7 @@ func (m *Message) _command(arg ...Any) *Message {
run(m.Spawn(s), s, cmd, key, list[1:]...) run(m.Spawn(s), s, cmd, key, list[1:]...)
}) })
} }
m.Warn(!ok, ErrNotFound, kit.Format(list)) m.WarnNotFound(!ok, kit.Format(list))
return m return m
} }
func (c *Context) _command(m *Message, cmd *Command, key string, arg ...string) *Message { func (c *Context) _command(m *Message, cmd *Command, key string, arg ...string) *Message {
@ -230,7 +231,7 @@ func (c *Context) _action(m *Message, cmd *Command, key string, sub string, h *A
} }
} }
kit.If(order && i < len(arg), func() { m.Option(name, arg[i]) }) kit.If(order && i < len(arg), func() { m.Option(name, arg[i]) })
if m.Warn(m.OptionDefault(name, kit.Format(kit.Value(v, VALUE))) == "" && kit.Value(v, "need") == "must", ErrNotValid, name, key, sub) { if m.WarnNotValid(m.OptionDefault(name, kit.Format(kit.Value(v, VALUE))) == "" && kit.Value(v, "need") == "must", name, key, sub) {
return m return m
} }
} }

59
info.go
View File

@ -1,7 +1,6 @@
package ice package ice
import ( import (
"io"
"os" "os"
"path" "path"
"reflect" "reflect"
@ -9,7 +8,6 @@ import (
"shylinux.com/x/icebergs/base/web/html" "shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/miss"
) )
type MakeInfo struct { type MakeInfo struct {
@ -30,46 +28,44 @@ type MakeInfo struct {
When string When string
Message string Message string
Module string
System string System string
Domain string Domain string
Module string
} }
func (s MakeInfo) Versions() string { func (s MakeInfo) Versions() string {
if s.Hash == "" { if s.Hash == "" {
return "" return ""
} } else if s.Version == "" {
if s.Version == "" {
return s.Hash[:6] return s.Hash[:6]
} } else if kit.IsIn(s.Forword, "", "0") {
if kit.IsIn(s.Forword, "", "0") {
return s.Version return s.Version
} else {
return kit.Format("%s-%s-%s", s.Version, s.Forword, s.Hash[:6])
} }
return kit.Format("%s-%s-%s", s.Version, s.Forword, s.Hash[:6])
} }
var Info = struct { var Info = struct {
Make MakeInfo Make MakeInfo
Hash string
Size string
Time string Time string
Size string
Hash string
Username string Username string
Hostname string Hostname string
Pathname string Pathname string
PidPath string NodeName string
CtxRoot string NodeType string
Traceid string
Colors bool
Pwd string
Pwd string
Lang string Lang string
System string System string
Domain string Domain string
NodeType string PidPath string
NodeName string Traceid string
Localhost bool Localhost bool
Important bool Important bool
Colors bool
File Maps File Maps
Gomod Maps Gomod Maps
@ -83,11 +79,11 @@ var Info = struct {
PushStream func(m *Message) *Message PushStream func(m *Message) *Message
PushNotice func(m *Message, arg ...Any) PushNotice func(m *Message, arg ...Any)
SystemCmd func(m *Message, arg ...Any) *Message
AdminCmd func(m *Message, cmd string, arg ...Any) *Message
Template func(m *Message, p string, data ...Any) string Template func(m *Message, p string, data ...Any) string
AdminCmd func(m *Message, cmd string, arg ...string) *Message
Save func(m *Message, key ...string) *Message Save func(m *Message, key ...string) *Message
Load func(m *Message, key ...string) *Message Load func(m *Message, key ...string) *Message
Open func(m *Message, p string) (io.ReadCloser, error)
Log func(m *Message, p, l, s string) Log func(m *Message, p, l, s string)
}{ }{
Localhost: true, Localhost: true,
@ -99,28 +95,15 @@ var Info = struct {
render: map[string]func(*Message, ...Any) string{}, render: map[string]func(*Message, ...Any) string{},
Stack: map[string]func(m *Message, key string, arg ...Any) Any{}, Stack: map[string]func(m *Message, key string, arg ...Any) Any{},
PushStream: func(m *Message) *Message { return m },
PushNotice: func(m *Message, arg ...Any) {},
Save: func(m *Message, key ...string) *Message { return m },
Load: func(m *Message, key ...string) *Message { return m },
Open: func(m *Message, p string) (io.ReadCloser, error) { return miss.OpenFile(p) },
Log: func(m *Message, p, l, s string) {},
} }
func init() { func init() { Info.Pwd = kit.Path(""); Info.Traceid = os.Getenv(LOG_TRACE) }
Info.Pwd = kit.Path("")
Info.CtxRoot = kit.Env("ctx_root") func AddMergeAction(h ...Any) { Info.merges = append(Info.merges, h...) }
Info.Traceid = os.Getenv(LOG_TRACE)
}
func AddMergeAction(h ...Any) {
Info.merges = append(Info.merges, h...)
}
func MergeHand(hand ...Handler) Handler { func MergeHand(hand ...Handler) Handler {
if len(hand) == 0 { if len(hand) == 0 {
return nil return nil
} } else if len(hand) == 1 {
if len(hand) == 1 {
return hand[0] return hand[0]
} }
return func(m *Message, arg ...string) { return func(m *Message, arg ...string) {
@ -180,7 +163,6 @@ func MergeActions(arg ...Any) Actions {
} }
} }
} }
kit.If((!ok || len(h.List) == 0) && len(v.List) > 0, func() { _cmd.Meta[k] = v.List }) kit.If((!ok || len(h.List) == 0) && len(v.List) > 0, func() { _cmd.Meta[k] = v.List })
}(k) }(k)
} }
@ -321,7 +303,6 @@ func (m *Message) FileURI(dir string) string {
if strings.HasPrefix(dir, USR_VOLCANOS) { if strings.HasPrefix(dir, USR_VOLCANOS) {
return strings.TrimPrefix(dir, USR) return strings.TrimPrefix(dir, USR)
} else { } else {
what := kit.MergeURL(path.Join(PS, REQUIRE, dir), POD, m.Option(MSG_USERPOD)) return kit.MergeURL(path.Join(PS, REQUIRE, dir), POD, m.Option(MSG_USERPOD))
return what
} }
} }

View File

@ -42,8 +42,8 @@ func (s *Frame) Close(m *Message, arg ...string) {
const ( const (
INIT = "init" INIT = "init"
EXIT = "exit"
QUIT = "quit" QUIT = "quit"
EXIT = "exit"
) )
var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{ var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{
@ -82,15 +82,16 @@ var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{
}) })
}}, }},
}, server: &Frame{}} }, server: &Frame{}}
var Pulse = &Message{_meta: map[string][]string{}, _data: Map{}, source: Index, target: Index} var Pulse = &Message{_meta: map[string][]string{}, _data: Map{}, source: Index, target: Index}
func init() { func init() {
logs.Disable(true)
switch tz := os.Getenv("TZ"); tz { switch tz := os.Getenv("TZ"); tz {
case "", "Asia/Beijing", "Asia/Shanghai": case "", "Asia/Beijing", "Asia/Shanghai":
time.Local = time.FixedZone(tz, 28800) time.Local = time.FixedZone(tz, 28800)
} }
Index.root, Pulse.root, Pulse.time = Index, Pulse, time.Now() Index.root, Pulse.root, Pulse.time = Index, Pulse, time.Now()
logs.Disable(true)
} }
func Run(arg ...string) string { func Run(arg ...string) string {

20
logs.go
View File

@ -125,23 +125,29 @@ func (m *Message) Warn(err Any, arg ...Any) bool {
ErrNotLogin: http.StatusUnauthorized, ErrNotLogin: http.StatusUnauthorized,
ErrNotRight: http.StatusForbidden, ErrNotRight: http.StatusForbidden,
ErrNotAllow: http.StatusMethodNotAllowed, ErrNotAllow: http.StatusMethodNotAllowed,
ErrNotValid: http.StatusBadRequest,
ErrNotFound: http.StatusNotFound, ErrNotFound: http.StatusNotFound,
ErrNotValid: http.StatusBadRequest,
}[kit.Format(arg[0])], func(s int) { m.Render(RENDER_STATUS, s, str) }) }[kit.Format(arg[0])], func(s int) { m.Render(RENDER_STATUS, s, str) })
} }
return true return true
} }
func (m *Message) WarnNotValidTime(time Any, arg ...Any) bool { func (m *Message) WarnNotLogin(err Any, arg ...Any) bool {
return m.Warn(kit.Format(time) < m.Time(), ErrNotValid, kit.Simple(arg...), time, m.Time(), logs.FileLineMeta(2)) return m.Warn(err, ErrNotLogin, kit.Simple(arg...), logs.FileLineMeta(2))
} }
func (m *Message) WarnNotValid(err Any, arg ...Any) bool { func (m *Message) WarnNotRight(err Any, arg ...Any) bool {
return m.Warn(err, ErrNotValid, kit.Simple(arg...), logs.FileLineMeta(2)) return m.Warn(err, ErrNotRight, kit.Simple(arg...), logs.FileLineMeta(2))
}
func (m *Message) WarnNotAllow(err Any, arg ...Any) bool {
return m.Warn(err, ErrNotAllow, kit.Simple(arg...), logs.FileLineMeta(2))
} }
func (m *Message) WarnNotFound(err Any, arg ...Any) bool { func (m *Message) WarnNotFound(err Any, arg ...Any) bool {
return m.Warn(err, ErrNotFound, kit.Simple(arg...), logs.FileLineMeta(2)) return m.Warn(err, ErrNotFound, kit.Simple(arg...), logs.FileLineMeta(2))
} }
func (m *Message) WarnNotRight(err Any, arg ...Any) bool { func (m *Message) WarnNotValid(err Any, arg ...Any) bool {
return m.Warn(err, ErrNotRight, kit.Simple(arg...), logs.FileLineMeta(2)) return m.Warn(err, ErrNotValid, kit.Simple(arg...), logs.FileLineMeta(2))
}
func (m *Message) WarnNotValidTime(time Any, arg ...Any) bool {
return m.Warn(kit.Format(time) < m.Time(), ErrNotValid, kit.Simple(arg...), time, m.Time(), logs.FileLineMeta(2))
} }
func (m *Message) WarnAlreadyExists(err Any, arg ...Any) bool { func (m *Message) WarnAlreadyExists(err Any, arg ...Any) bool {
return m.Warn(err, ErrAlreadyExists, kit.Simple(arg...), logs.FileLineMeta(2)) return m.Warn(err, ErrAlreadyExists, kit.Simple(arg...), logs.FileLineMeta(2))

13
misc.go
View File

@ -6,8 +6,14 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func (m *Message) IsEnglish() bool { func (m *Message) System(arg ...Any) *Message {
return kit.IsIn(strings.ToLower(m.Option(MSG_LANGUAGE)), "en", "en-us") return Info.SystemCmd(m, arg...)
}
func (m *Message) AdminCmd(cmd string, arg ...Any) *Message {
return Info.AdminCmd(m, cmd, arg...)
}
func (m *Message) Template(p string, data ...Any) string {
return Info.Template(m, p, data...)
} }
func (m *Message) Split(str string, arg ...string) *Message { func (m *Message) Split(str string, arg ...string) *Message {
m.Set(MSG_APPEND).Set(MSG_RESULT) m.Set(MSG_APPEND).Set(MSG_RESULT)
@ -175,3 +181,6 @@ func (m *Message) Trans(en string, zh string) string {
return en return en
} }
} }
func (m *Message) IsEnglish() bool {
return kit.IsIn(strings.ToLower(m.Option(MSG_LANGUAGE)), "en", "en-us")
}

View File

@ -35,7 +35,7 @@ func init() {
} }
if m.Option(SID, strings.TrimSpace(m.Option(SID))) == "" && m.Option(ice.MSG_USERNAME) != "" { if m.Option(SID, strings.TrimSpace(m.Option(SID))) == "" && m.Option(ice.MSG_USERNAME) != "" {
return return
} else if m.Warn(m.Option(SID) == "", ice.ErrNotLogin, arg) { } else if m.WarnNotLogin(m.Option(SID) == "", arg) {
return return
} else if msg := m.Cmd(SESS, m.Option(SID)); msg.Append(GRANT) == "" { } else if msg := m.Cmd(SESS, m.Option(SID)); msg.Append(GRANT) == "" {
aaa.SessAuth(m, ice.Maps{aaa.USERNAME: msg.Append(aaa.USERNAME), aaa.USERNICK: msg.Append(aaa.USERNAME), aaa.USERROLE: aaa.VOID}).Options(msg.AppendSimple(aaa.USERNAME, tcp.HOSTNAME, cli.RELEASE)) aaa.SessAuth(m, ice.Maps{aaa.USERNAME: msg.Append(aaa.USERNAME), aaa.USERNICK: msg.Append(aaa.USERNAME), aaa.USERROLE: aaa.VOID}).Options(msg.AppendSimple(aaa.USERNAME, tcp.HOSTNAME, cli.RELEASE))
@ -48,7 +48,7 @@ func init() {
}}, }},
web.PP(SESS): {Actions: ice.Actions{ web.PP(SESS): {Actions: ice.Actions{
aaa.LOGOUT: {Hand: func(m *ice.Message, arg ...string) { aaa.LOGOUT: {Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(SID) == "", ice.ErrNotValid, SID) { if !m.WarnNotValid(m.Option(SID) == "", SID) {
mdb.HashModify(m, mdb.HASH, m.Option(SID), mdb.STATUS, aaa.LOGOUT) mdb.HashModify(m, mdb.HASH, m.Option(SID), mdb.STATUS, aaa.LOGOUT)
} }
}}, }},

View File

@ -28,7 +28,7 @@ func (s cache) Create(m *ice.Message, arg ...string) *ice.Message {
s.Hash.Modify(m, kit.Simple(mdb.COUNT, count, mdb.TOTAL, total, mdb.VALUE, value)...) s.Hash.Modify(m, kit.Simple(mdb.COUNT, count, mdb.TOTAL, total, mdb.VALUE, value)...)
}) })
name := kit.Keys(path.Base(m.Append(nfs.FILE)), path.Base(m.Append(mdb.TYPE))) name := kit.Keys(path.Base(m.Append(nfs.FILE)), path.Base(m.Append(mdb.TYPE)))
m.Cmdy(nfs.LINK, path.Join(mdb.Config(m, nfs.PATH), name), m.Append(nfs.FILE)) m.Cmdy(nfs.LINK, path.Join(m.Config(nfs.PATH), name), m.Append(nfs.FILE))
s.Hash.Modify(m, mdb.NAME, name) s.Hash.Modify(m, mdb.NAME, name)
web.ToastSuccess(m.Message) web.ToastSuccess(m.Message)
return m return m

View File

@ -36,7 +36,7 @@ func (s server) Start(m *ice.Message, arg ...string) {
user-data-dir: %s user-data-dir: %s
bind-addr: %s:%s bind-addr: %s:%s
password: %s password: %s
`, "./data", kit.Select("0.0.0.0", m.Option(tcp.HOST)), path.Base(p), kit.Select(mdb.Config(m, aaa.PASSWORD), m.Option(aaa.PASSWORD)))) `, "./data", kit.Select("0.0.0.0", m.Option(tcp.HOST)), path.Base(p), kit.Select(m.Config(aaa.PASSWORD), m.Option(aaa.PASSWORD))))
return []string{"--config=config", kit.Path(nfs.PWD)} return []string{"--config=config", kit.Path(nfs.PWD)}
}) })
} }

View File

@ -14,7 +14,7 @@ import (
) )
func _counts_count(m *ice.Message, arg []string, cb func(string)) { func _counts_count(m *ice.Message, arg []string, cb func(string)) {
if m.Warn(len(arg) == 0 || arg[0] == nfs.USR, ice.ErrNotValid, nfs.DIR, "to many files, please select sub dir") { if m.WarnNotValid(len(arg) == 0 || arg[0] == nfs.USR, nfs.DIR, "to many files, please select sub dir") {
return return
} }
nfs.DirDeepAll(m, "", arg[0], func(value ice.Maps) { nfs.DirDeepAll(m, "", arg[0], func(value ice.Maps) {

View File

@ -305,8 +305,8 @@ func _repos_inner(m *ice.Message, _repos_path func(m *ice.Message, p string, arg
} else { } else {
if refer, err := repos.Head(); err == nil { if refer, err := repos.Head(); err == nil {
if commit, err := repos.CommitObject(refer.Hash()); err == nil { if commit, err := repos.CommitObject(refer.Hash()); err == nil {
if file, err := commit.File(arg[2]); !m.Warn(err) { if file, err := commit.File(arg[2]); !m.WarnNotValid(err) {
if content, err := file.Contents(); !m.Warn(err) { if content, err := file.Contents(); !m.WarnNotValid(err) {
for _, diff := range diffmatchpatch.New().DiffMain(content, m.Result(), true) { for _, diff := range diffmatchpatch.New().DiffMain(content, m.Result(), true) {
switch diff.Type { switch diff.Type {
case diffmatchpatch.DiffDelete: case diffmatchpatch.DiffDelete:
@ -324,7 +324,7 @@ func _repos_inner(m *ice.Message, _repos_path func(m *ice.Message, p string, arg
} }
m.Cmdy(nfs.CAT, _repos_path(m, ls[0], arg[2])) m.Cmdy(nfs.CAT, _repos_path(m, ls[0], arg[2]))
} }
} else if commit, err := _repos_open(m, ls[0]).CommitObject(plumbing.NewHash(ls[2])); m.Warn(err) { } else if commit, err := _repos_open(m, ls[0]).CommitObject(plumbing.NewHash(ls[2])); m.WarnNotValid(err) {
return return
} else if len(arg) < 3 { } else if len(arg) < 3 {
if stats, err := commit.Stats(); err == nil { if stats, err := commit.Stats(); err == nil {
@ -333,8 +333,8 @@ func _repos_inner(m *ice.Message, _repos_path func(m *ice.Message, p string, arg
} }
} }
} else { } else {
if file, err := commit.File(arg[2]); !m.Warn(err) { if file, err := commit.File(arg[2]); !m.WarnNotValid(err) {
if content, err := file.Contents(); !m.Warn(err) { if content, err := file.Contents(); !m.WarnNotValid(err) {
if parent, err := commit.Parent(0); err == nil { if parent, err := commit.Parent(0); err == nil {
if file0, err := parent.File(arg[2]); err == nil { if file0, err := parent.File(arg[2]); err == nil {
if content0, err := file0.Contents(); err == nil { if content0, err := file0.Contents(); err == nil {
@ -415,7 +415,7 @@ func init() {
} else { } else {
if p = path.Join(cache, path.Join(arg...)); !nfs.Exists(m, p) { if p = path.Join(cache, path.Join(arg...)); !nfs.Exists(m, p) {
if p = path.Join(ice.USR_REQUIRE, path.Join(arg...)); !nfs.Exists(m, p) { if p = path.Join(ice.USR_REQUIRE, path.Join(arg...)); !nfs.Exists(m, p) {
if m.Warn(kit.Lasterr(git.PlainClone(path.Join(ice.USR_REQUIRE, path.Join(arg[:3]...)), false, &git.CloneOptions{ if m.WarnNotValid(kit.Lasterr(git.PlainClone(path.Join(ice.USR_REQUIRE, path.Join(arg[:3]...)), false, &git.CloneOptions{
URL: ice.HTTPS + "://" + path.Join(arg[0], arg[1], ls[0]), Depth: 1, URL: ice.HTTPS + "://" + path.Join(arg[0], arg[1], ls[0]), Depth: 1,
ReferenceName: plumbing.NewTagReferenceName(kit.Select(ice.Info.Gomod[ls[0]], ls, 1)), ReferenceName: plumbing.NewTagReferenceName(kit.Select(ice.Info.Gomod[ls[0]], ls, 1)),
}))) { }))) {
@ -504,7 +504,7 @@ func init() {
} }
}}, }},
mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(REPOS), ice.ErrNotValid, REPOS) { if !m.WarnNotValid(m.Option(REPOS), REPOS) {
nfs.Trash(m, _repos_path(m, m.Option(REPOS))) nfs.Trash(m, _repos_path(m, m.Option(REPOS)))
mdb.HashRemove(m, m.Option(REPOS)) mdb.HashRemove(m, m.Option(REPOS))
} }
@ -521,7 +521,7 @@ func init() {
p := m.Option(REMOTE) p := m.Option(REMOTE)
kit.If(!kit.HasPrefix(p, nfs.PS, web.HTTP), func() { p = m.Cmdv(web.SPIDE, dev, web.CLIENT_ORIGIN) + web.X(p) }) kit.If(!kit.HasPrefix(p, nfs.PS, web.HTTP), func() { p = m.Cmdv(web.SPIDE, dev, web.CLIENT_ORIGIN) + web.X(p) })
m.Info("clone %s", p) m.Info("clone %s", p)
if _, err := git.PlainClone(m.Option(nfs.PATH), false, &git.CloneOptions{URL: p, Auth: _repos_auth(m, p)}); !m.Warn(err) { if _, err := git.PlainClone(m.Option(nfs.PATH), false, &git.CloneOptions{URL: p, Auth: _repos_auth(m, p)}); !m.WarnNotValid(err) {
_repos_insert(m, m.Option(nfs.PATH)) _repos_insert(m, m.Option(nfs.PATH))
return return
} }
@ -577,17 +577,17 @@ func init() {
} }
}}, }},
ADD: {Icon: "bi bi-plus-square", Hand: func(m *ice.Message, arg ...string) { ADD: {Icon: "bi bi-plus-square", Hand: func(m *ice.Message, arg ...string) {
if work, err := _repos_open(m, m.Option(REPOS)).Worktree(); !m.Warn(err) { if work, err := _repos_open(m, m.Option(REPOS)).Worktree(); !m.WarnNotValid(err) {
m.Warn(kit.Lasterr(work.Add(m.Option(nfs.FILE)))) m.WarnNotValid(kit.Lasterr(work.Add(m.Option(nfs.FILE))))
} }
}}, }},
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(m.Option(REPOS), ice.ErrNotValid, REPOS) && !m.Warn(m.Option(nfs.FILE), ice.ErrNotValid, nfs.FILE) { if !m.WarnNotValid(m.Option(REPOS), REPOS) && !m.WarnNotValid(m.Option(nfs.FILE), nfs.FILE) {
nfs.Trash(m, _repos_path(m, m.Option(REPOS), m.Option(nfs.FILE))) nfs.Trash(m, _repos_path(m, m.Option(REPOS), m.Option(nfs.FILE)))
} }
}}, }},
COMMIT: {Name: "commit actions=add,opt,fix message*=some", Help: "提交", Icon: "bi bi-check2-square", Hand: func(m *ice.Message, arg ...string) { COMMIT: {Name: "commit actions=add,opt,fix message*=some", Help: "提交", Icon: "bi bi-check2-square", Hand: func(m *ice.Message, arg ...string) {
if work, err := _repos_open(m, m.Option(REPOS)).Worktree(); !m.Warn(err) { if work, err := _repos_open(m, m.Option(REPOS)).Worktree(); !m.WarnNotValid(err) {
opt := &git.CommitOptions{All: true} opt := &git.CommitOptions{All: true}
if cfg, err := config.LoadConfig(config.GlobalScope); err == nil { if cfg, err := config.LoadConfig(config.GlobalScope); err == nil {
if cfg.Author.Email == "" || cfg.Author.Name == "" { if cfg.Author.Email == "" || cfg.Author.Name == "" {
@ -597,12 +597,12 @@ func init() {
} }
} }
} }
m.Warn(kit.Lasterr(work.Commit(kit.JoinWord(m.Option("actions"), m.Option(MESSAGE)), opt))) m.WarnNotValid(kit.Lasterr(work.Commit(kit.JoinWord(m.Option("actions"), m.Option(MESSAGE)), opt)))
} }
}}, }},
LOG: {Hand: func(m *ice.Message, arg ...string) { LOG: {Hand: func(m *ice.Message, arg ...string) {
repos := _repos_open(m, kit.Select(m.Option(REPOS), arg, 0)) repos := _repos_open(m, kit.Select(m.Option(REPOS), arg, 0))
if branch, err := repos.Branch(kit.Select(m.Option(BRANCH), arg, 1)); !m.Warn(err) { if branch, err := repos.Branch(kit.Select(m.Option(BRANCH), arg, 1)); !m.WarnNotValid(err) {
if refer, err := repos.Reference(branch.Merge, true); !m.Warn(err) { if refer, err := repos.Reference(branch.Merge, true); !m.Warn(err) {
_repos_log(m, refer.Hash(), repos) _repos_log(m, refer.Hash(), repos)
} }

View File

@ -140,11 +140,11 @@ func init() {
return return
} }
} }
if m.Warn(!nfs.Exists(m, repos), ice.ErrNotFound, arg[0]) { if m.WarnNotFound(!nfs.Exists(m, repos), arg[0]) {
return return
} }
} }
m.Warn(_service_repos(m, arg...), ice.ErrNotValid) m.WarnNotValid(_service_repos(m, arg...))
}}}) }}})
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
SERVICE: {Name: "service repos branch commit file auto", Help: "代码源", Actions: ice.MergeActions(ice.Actions{ SERVICE: {Name: "service repos branch commit file auto", Help: "代码源", Actions: ice.MergeActions(ice.Actions{

View File

@ -71,7 +71,7 @@ func init() {
} }
}}, }},
web.P(OAUTH): {Name: "/oauth", Help: "授权", Hand: func(m *ice.Message, arg ...string) { web.P(OAUTH): {Name: "/oauth", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(CODE) == "", ice.ErrNotValid) { if m.WarnNotValid(m.Option(CODE) == "") {
return return
} }
web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(CODE))) web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(CODE)))

View File

@ -42,7 +42,7 @@ func (s input) Inputs(m *ice.Message, arg ...string) {
} }
} }
func (s input) Load(m *ice.Message, arg ...string) { func (s input) Load(m *ice.Message, arg ...string) {
if f, e := nfs.OpenFile(m.Message, m.Option(nfs.FILE)); !m.Warn(e) { if f, e := nfs.OpenFile(m.Message, m.Option(nfs.FILE)); !m.WarnNotFound(e) {
defer f.Close() defer f.Close()
lib := kit.Select(path.Base(m.Option(nfs.FILE)), m.Option(mdb.ZONE)) lib := kit.Select(path.Base(m.Option(nfs.FILE)), m.Option(mdb.ZONE))
m.Assert(nfs.RemoveAll(m, path.Join(mdb.Config(m, mdb.STORE), lib))) m.Assert(nfs.RemoveAll(m, path.Join(mdb.Config(m, mdb.STORE), lib)))

View File

@ -55,7 +55,7 @@ func _ssh_dial(m *ice.Message, cb func(net.Conn), arg ...string) {
nfs.Remove(m, p) nfs.Remove(m, p)
} }
_ssh_conn(m, func(client *ssh.Client) { _ssh_conn(m, func(client *ssh.Client) {
if l, e := net.Listen(tcp.UNIX, p); !m.Warn(e, ice.ErrNotValid) { if l, e := net.Listen(tcp.UNIX, p); !m.WarnNotValid(e) {
defer func() { nfs.Remove(m, p) }() defer func() { nfs.Remove(m, p) }()
defer l.Close() defer l.Close()
m.Go(func() { m.Go(func() {
@ -86,7 +86,7 @@ func _ssh_dial(m *ice.Message, cb func(net.Conn), arg ...string) {
} }
}) })
} }
if c, e := net.Dial(tcp.UNIX, p); !m.Warn(e) { if c, e := net.Dial(tcp.UNIX, p); !m.WarnNotValid(e) {
cb(c) cb(c)
} }
}, arg...) }, arg...)
@ -121,13 +121,13 @@ func _ssh_conn(m *ice.Message, cb func(*ssh.Client), arg ...string) (err error)
User: m.Option(aaa.USERNAME), Auth: methods, BannerCallback: func(message string) error { return nil }, User: m.Option(aaa.USERNAME), Auth: methods, BannerCallback: func(message string) error { return nil },
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }, HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil },
}) })
kit.If(!m.Warn(_err), func() { cb(ssh.NewClient(conn, chans, reqs)) }) kit.If(!m.WarnNotValid(_err), func() { cb(ssh.NewClient(conn, chans, reqs)) })
err = _err err = _err
}) })
return return
} }
func _ssh_hold(m *ice.Message, c *ssh.Client) { func _ssh_hold(m *ice.Message, c *ssh.Client) {
if s, e := _ssh_session(m, c); !m.Warn(e, ice.ErrNotValid) { if s, e := _ssh_session(m, c); !m.WarnNotValid(e) {
defer s.Wait() defer s.Wait()
s.Shell() s.Shell()
} }
@ -189,9 +189,9 @@ func init() {
}) })
return nil return nil
}).ProcessInner() }).ProcessInner()
} else if s, e := _ssh_target(m, m.Option(mdb.NAME)).NewSession(); !m.Warn(e, ice.ErrNotValid) { } else if s, e := _ssh_target(m, m.Option(mdb.NAME)).NewSession(); !m.WarnNotValid(e) {
defer s.Close() defer s.Close()
if b, e := s.CombinedOutput(m.Option(ice.CMD)); !m.Warn(e, ice.ErrNotValid) { if b, e := s.CombinedOutput(m.Option(ice.CMD)); !m.WarnNotValid(e) {
m.Echo(string(b)).ProcessInner() m.Echo(string(b)).ProcessInner()
} }
} else { } else {
@ -237,10 +237,10 @@ func init() { xterm.AddCommand(SSH, NewSession) }
func CombinedOutput(m *ice.Message, cmd string, cb func(string)) { func CombinedOutput(m *ice.Message, cmd string, cb func(string)) {
_ssh_conn(m, func(c *ssh.Client) { _ssh_conn(m, func(c *ssh.Client) {
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) { if s, e := c.NewSession(); !m.WarnNotValid(e) {
defer s.Close() defer s.Close()
m.Debug("cmd %v", cmd) m.Debug("cmd %v", cmd)
if b, e := s.CombinedOutput(cmd); !m.Warn(e, ice.ErrNotValid) { if b, e := s.CombinedOutput(cmd); !m.WarnNotValid(e) {
cb(string(b)) cb(string(b))
} }
} }
@ -248,7 +248,7 @@ func CombinedOutput(m *ice.Message, cmd string, cb func(string)) {
} }
func PushOutput(m *ice.Message, cmd string, cb func(string)) { func PushOutput(m *ice.Message, cmd string, cb func(string)) {
_ssh_conn(m, func(c *ssh.Client) { _ssh_conn(m, func(c *ssh.Client) {
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) { if s, e := c.NewSession(); !m.WarnNotValid(e) {
defer s.Close() defer s.Close()
r, _ := s.StdoutPipe() r, _ := s.StdoutPipe()
m.Debug("res %v", cmd) m.Debug("res %v", cmd)
@ -262,7 +262,7 @@ func PushOutput(m *ice.Message, cmd string, cb func(string)) {
} }
func PushShell(m *ice.Message, cmds []string, cb func(string)) { func PushShell(m *ice.Message, cmds []string, cb func(string)) {
_ssh_conn(m, func(c *ssh.Client) { _ssh_conn(m, func(c *ssh.Client) {
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) { if s, e := c.NewSession(); !m.WarnNotValid(e) {
defer s.Close() defer s.Close()
w, _ := s.StdinPipe() w, _ := s.StdinPipe()
r, _ := s.StdoutPipe() r, _ := s.StdoutPipe()

View File

@ -67,7 +67,7 @@ func (s *FileSystem) Close() error { return nil }
func Open(m *ice.Message, cb func(*FileSystem)) { func Open(m *ice.Message, cb func(*FileSystem)) {
_ssh_conn(m, func(c *ssh.Client) { _ssh_conn(m, func(c *ssh.Client) {
defer c.Close() defer c.Close()
if s, e := sftp.NewClient(c); !m.Warn(e) { if s, e := sftp.NewClient(c); !m.WarnNotValid(e) {
cb(&FileSystem{s}) cb(&FileSystem{s})
} }
}) })

View File

@ -220,7 +220,7 @@ func (s relay) Publish(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, ice.USR_PUBLISH).Set(ctx.ACTION) m.Cmdy(nfs.DIR, ice.USR_PUBLISH).Set(ctx.ACTION)
return return
} }
kit.If(!nfs.Exists(m, path.Join(ice.USR_PUBLISH, RELAY)), func() { s.Compile(m) }) kit.If(!nfs.Exists(m.Message, path.Join(ice.USR_PUBLISH, RELAY)), func() { s.Compile(m) })
os.Symlink(RELAY, ice.USR_PUBLISH+m.Option(MACHINE)) os.Symlink(RELAY, ice.USR_PUBLISH+m.Option(MACHINE))
m.Cmd(nfs.SAVE, kit.HomePath(".ssh/"+m.Option(MACHINE)+".json"), kit.Formats(kit.Dict(m.OptionSimple("username,host,port")))+ice.NL) m.Cmd(nfs.SAVE, kit.HomePath(".ssh/"+m.Option(MACHINE)+".json"), kit.Formats(kit.Dict(m.OptionSimple("username,host,port")))+ice.NL)
} }
@ -311,7 +311,7 @@ func (s relay) Login(m *ice.Message, arg ...string) {
} }
func (s relay) Install(m *ice.Message, arg ...string) { func (s relay) Install(m *ice.Message, arg ...string) {
m.Options(web.DOMAIN, "https://shylinux.com", ice.MSG_USERPOD, m.Option(web.DREAM)) m.Options(web.DOMAIN, "https://shylinux.com", ice.MSG_USERPOD, m.Option(web.DREAM))
m.Options(nfs.SOURCE, kit.Value(kit.UnMarshal(web.AdminCmd(m.Message, cli.RUNTIME)), "make.remote")) m.Options(nfs.SOURCE, kit.Value(kit.UnMarshal(web.AdminCmd(m.Message, cli.RUNTIME).Result()), "make.remote"))
web.DreamList(m.Spawn().Message).Table(func(value ice.Maps) { web.DreamList(m.Spawn().Message).Table(func(value ice.Maps) {
kit.If(value[mdb.NAME] == m.Option(web.DREAM), func() { m.Option(nfs.SOURCE, value[nfs.REPOS]) }) kit.If(value[mdb.NAME] == m.Option(web.DREAM), func() { m.Option(nfs.SOURCE, value[nfs.REPOS]) })
}) })

View File

@ -40,8 +40,8 @@ func init() {
} }
}}, }},
mdb.CREATE: {Name: "create bits=2048,4096 title=some", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create bits=2048,4096 title=some", Hand: func(m *ice.Message, arg ...string) {
if key, err := rsa.GenerateKey(rand.Reader, kit.Int(m.Option(BITS))); !m.Warn(err, ice.ErrNotValid) { if key, err := rsa.GenerateKey(rand.Reader, kit.Int(m.Option(BITS))); !m.WarnNotValid(err) {
if pub, err := ssh.NewPublicKey(key.Public()); !m.Warn(err, ice.ErrNotValid) { if pub, err := ssh.NewPublicKey(key.Public()); !m.WarnNotValid(err) {
mdb.HashCreate(m, m.OptionSimple(TITLE), mdb.HashCreate(m, m.OptionSimple(TITLE),
PUBLIC, strings.TrimSpace(string(ssh.MarshalAuthorizedKey(pub)))+lex.SP+strings.TrimSpace(m.Option(TITLE)), PUBLIC, strings.TrimSpace(string(ssh.MarshalAuthorizedKey(pub)))+lex.SP+strings.TrimSpace(m.Option(TITLE)),
PRIVATE, string(pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})), PRIVATE, string(pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})),

View File

@ -40,8 +40,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
if !strings.HasPrefix(value[mdb.NAME], meta[aaa.USERNAME]+mdb.AT) { if !strings.HasPrefix(value[mdb.NAME], meta[aaa.USERNAME]+mdb.AT) {
return return
} }
if s, e := base64.StdEncoding.DecodeString(value[mdb.TEXT]); !m.Warn(e, ice.ErrNotValid, value[mdb.TEXT]) { if s, e := base64.StdEncoding.DecodeString(value[mdb.TEXT]); !m.WarnNotValid(e, value[mdb.TEXT]) {
if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e, ice.ErrNotValid, value[mdb.TEXT]) { if pub, e := ssh.ParsePublicKey([]byte(s)); !m.WarnNotValid(e, value[mdb.TEXT]) {
if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 { if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 {
meta[tcp.HOSTNAME] = kit.Select("", kit.Split(value[mdb.NAME], mdb.AT), 1) meta[tcp.HOSTNAME] = kit.Select("", kit.Split(value[mdb.NAME], mdb.AT), 1)
m.Auth(kit.SimpleKV(kit.Fields(aaa.USERNAME, tcp.HOSTNAME, tcp.HOSTPORT), meta)) m.Auth(kit.SimpleKV(kit.Fields(aaa.USERNAME, tcp.HOSTNAME, tcp.HOSTPORT), meta))
@ -62,7 +62,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
return &ssh.Permissions{Extensions: meta}, err return &ssh.Permissions{Extensions: meta}, err
}, },
} }
if key, err := ssh.ParsePrivateKey([]byte(m.Cmdx(nfs.CAT, kit.HomePath(m.Option(PRIVATE))))); !m.Warn(err, ice.ErrNotValid, m.Option(PRIVATE)) { if key, err := ssh.ParsePrivateKey([]byte(m.Cmdx(nfs.CAT, kit.HomePath(m.Option(PRIVATE))))); !m.WarnNotValid(err, m.Option(PRIVATE)) {
config.AddHostKey(key) config.AddHostKey(key)
} }
return config return config
@ -70,13 +70,13 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
func _ssh_accept(m *ice.Message, c net.Conn, conf *ssh.ServerConfig) { func _ssh_accept(m *ice.Message, c net.Conn, conf *ssh.ServerConfig) {
conn, chans, reqs, err := ssh.NewServerConn(c, conf) conn, chans, reqs, err := ssh.NewServerConn(c, conf)
if m.Warn(err) { if m.WarnNotValid(err) {
return return
} }
m.Go(func() { ssh.DiscardRequests(reqs) }) m.Go(func() { ssh.DiscardRequests(reqs) })
for ch := range chans { for ch := range chans {
channel, requests, err := ch.Accept() channel, requests, err := ch.Accept()
if m.Warn(err) { if m.WarnNotValid(err) {
continue continue
} }
m.Go(func() { m.Go(func() {
@ -88,7 +88,7 @@ func _ssh_accept(m *ice.Message, c net.Conn, conf *ssh.ServerConfig) {
} }
func _ssh_prepare(m *ice.Message, channel ssh.Channel, requests <-chan *ssh.Request) { func _ssh_prepare(m *ice.Message, channel ssh.Channel, requests <-chan *ssh.Request) {
pty, tty, err := xterm.Open() pty, tty, err := xterm.Open()
if m.Warn(err) { if m.WarnNotValid(err) {
return return
} }
defer tty.Close() defer tty.Close()

View File

@ -27,7 +27,7 @@ func (s XTerm) Close() error {
func Shell(m *ice.Message, cb func(xterm.XTerm)) error { func Shell(m *ice.Message, cb func(xterm.XTerm)) error {
return _ssh_conn(m, func(c *ssh.Client) { return _ssh_conn(m, func(c *ssh.Client) {
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) { if s, e := c.NewSession(); !m.WarnNotValid(e) {
defer s.Close() defer s.Close()
w, _ := s.StdinPipe() w, _ := s.StdinPipe()
r, _ := s.StdoutPipe() r, _ := s.StdoutPipe()

View File

@ -23,7 +23,7 @@ func init() {
check := kit.Sort([]string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")}) check := kit.Sort([]string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")})
sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))) sig := kit.Format(sha1.Sum([]byte(strings.Join(check, ""))))
if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight, check, sig) { if m.WarnNotRight(sig != m.Option("msg_signature"), check, sig) {
// return // return
} }

View File

@ -60,7 +60,7 @@ func init() {
}}, }},
aaa.CHECK: {Hand: func(m *ice.Message, arg ...string) { aaa.CHECK: {Hand: func(m *ice.Message, arg ...string) {
check := kit.Sort([]string{mdb.Config(m, TOKEN), m.Option(TIMESTAMP), m.Option(NONCE)}) check := kit.Sort([]string{mdb.Config(m, TOKEN), m.Option(TIMESTAMP), m.Option(NONCE)})
if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); !m.Warn(sig != m.Option(SIGNATURE), ice.ErrNotRight, check) { if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); !m.WarnNotRight(sig != m.Option(SIGNATURE), check) {
m.Echo(ice.TRUE) m.Echo(ice.TRUE)
} }
}}, }},

View File

@ -27,7 +27,6 @@ func (m *Message) OptionSimple(key ...string) (res []string) {
kit.If(len(key) == 0, func() { kit.If(len(key) == 0, func() {
key = kit.Filters(kit.Split(kit.Select("type,name,text", m.Conf(m.PrefixKey(), kit.Keym(FIELD)))), TIME, HASH) key = kit.Filters(kit.Split(kit.Select("type,name,text", m.Conf(m.PrefixKey(), kit.Keym(FIELD)))), TIME, HASH)
}) })
// kit.For(kit.Filters(kit.Split(kit.Join(key)), ""), func(k string) { kit.If(m.Option(k), func(v string) { res = append(res, k, v) }) })
kit.For(kit.Filters(kit.Split(kit.Join(key)), ""), func(k string) { res = append(res, k, m.Option(k)) }) kit.For(kit.Filters(kit.Split(kit.Join(key)), ""), func(k string) { res = append(res, k, m.Option(k)) })
return return
} }
@ -44,7 +43,6 @@ func (m *Message) OptionCB(key string, cb ...Any) Any {
kit.If(len(cb) > 0, func() { m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)), cb...) }) kit.If(len(cb) > 0, func() { m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)), cb...) })
return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key))) return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)))
} }
func (m *Message) ParseLink(p string) *Message { func (m *Message) ParseLink(p string) *Message {
u := kit.ParseURL(p) u := kit.ParseURL(p)
switch arg := strings.Split(strings.TrimPrefix(u.Path, PS), PS); arg[0] { switch arg := strings.Split(strings.TrimPrefix(u.Path, PS), PS); arg[0] {
@ -103,7 +101,6 @@ func (m *Message) StatusTimeCount(arg ...Any) *Message {
func (m *Message) StatusTimeCountTotal(arg ...Any) *Message { func (m *Message) StatusTimeCountTotal(arg ...Any) *Message {
return m.StatusTimeCount(append([]Any{kit.MDB_TOTAL}, arg...)) return m.StatusTimeCount(append([]Any{kit.MDB_TOTAL}, arg...))
} }
func (m *Message) Process(cmd string, arg ...Any) *Message { func (m *Message) Process(cmd string, arg ...Any) *Message {
if len(arg) == 0 { if len(arg) == 0 {
return m.Options(MSG_PROCESS, cmd) return m.Options(MSG_PROCESS, cmd)
@ -111,12 +108,8 @@ func (m *Message) Process(cmd string, arg ...Any) *Message {
return m.Options(MSG_PROCESS, cmd, PROCESS_ARG, kit.Simple(arg...)) return m.Options(MSG_PROCESS, cmd, PROCESS_ARG, kit.Simple(arg...))
} }
} }
func (m *Message) ProcessCookie(arg ...Any) { func (m *Message) ProcessCookie(arg ...Any) { m.Process(PROCESS_COOKIE, arg...) }
m.Process(PROCESS_COOKIE, arg...) func (m *Message) ProcessSession(arg ...Any) { m.Process(PROCESS_SESSION, arg...) }
}
func (m *Message) ProcessSession(arg ...Any) {
m.Process(PROCESS_SESSION, arg...)
}
func (m *Message) ProcessLocation(arg ...Any) { m.Process(PROCESS_LOCATION, arg...) } func (m *Message) ProcessLocation(arg ...Any) { m.Process(PROCESS_LOCATION, arg...) }
func (m *Message) ProcessReplace(url string, arg ...Any) { func (m *Message) ProcessReplace(url string, arg ...Any) {
m.Process(PROCESS_REPLACE, m.MergeLink(url, arg...)) m.Process(PROCESS_REPLACE, m.MergeLink(url, arg...))
@ -135,12 +128,8 @@ func (m *Message) ProcessHold(text ...Any) { m.Process(PROCESS_HOLD, text...)
func (m *Message) ProcessBack() { m.Process(PROCESS_BACK) } func (m *Message) ProcessBack() { m.Process(PROCESS_BACK) }
func (m *Message) ProcessRich(arg ...Any) { m.Process(PROCESS_RICH, arg...) } func (m *Message) ProcessRich(arg ...Any) { m.Process(PROCESS_RICH, arg...) }
func (m *Message) ProcessGrow(arg ...Any) { m.Process(PROCESS_GROW, arg...) } func (m *Message) ProcessGrow(arg ...Any) { m.Process(PROCESS_GROW, arg...) }
func (m *Message) ProcessOpen(url string) *Message { func (m *Message) ProcessOpen(url string) { m.Process(PROCESS_OPEN, url) }
kit.If(url, func() { m.Process(PROCESS_OPEN, url) }) func (m *Message) ProcessClose() *Message { return m.Process(PROCESS_CLOSE) }
return m
}
func (m *Message) ProcessOpenAndRefresh(url string) *Message { func (m *Message) ProcessOpenAndRefresh(url string) *Message {
kit.If(url, func() { m.Process(PROCESS_OPEN, url, "refresh") }) return m.Process(PROCESS_OPEN, url, "refresh")
return m
} }
func (m *Message) ProcessClose() *Message { return m.Process(PROCESS_CLOSE) }

View File

@ -49,6 +49,8 @@ func Render(m *Message, cmd string, args ...Any) string {
return strings.Join(list, "") return strings.Join(list, "")
case RENDER_ANCHOR: case RENDER_ANCHOR:
return kit.Format(`<a href="%s" target="_blank">%s</a>`, kit.Select(arg[0], arg, 1), arg[0]) return kit.Format(`<a href="%s" target="_blank">%s</a>`, kit.Select(arg[0], arg, 1), arg[0])
case RENDER_SCRIPT:
return kit.Format(`<code>%s</code>`, arg[0])
case RENDER_IMAGES: case RENDER_IMAGES:
if len(arg) > 1 { if len(arg) > 1 {
return kit.Format(`<img src="%s" height="%s">`, arg[0], arg[1]) return kit.Format(`<img src="%s" height="%s">`, arg[0], arg[1])
@ -60,8 +62,6 @@ func Render(m *Message, cmd string, args ...Any) string {
return kit.Format(`<audio src="%s" controls autoplay>`, arg[0]) return kit.Format(`<audio src="%s" controls autoplay>`, arg[0])
case RENDER_IFRAME: case RENDER_IFRAME:
return kit.Format(`<iframe src="%s"></iframe>`, arg[0]) return kit.Format(`<iframe src="%s"></iframe>`, arg[0])
case RENDER_SCRIPT:
return kit.Format(`<code>%s</code>`, arg[0])
default: default:
if len(arg) == 1 { if len(arg) == 1 {
return kit.Format(`<%s>%s</%s>`, cmd, arg[0], cmd) return kit.Format(`<%s>%s</%s>`, cmd, arg[0], cmd)
@ -81,9 +81,6 @@ func (m *Message) Render(cmd string, arg ...Any) *Message {
} }
return m.Options(MSG_OUTPUT, cmd, MSG_ARGS, arg) return m.Options(MSG_OUTPUT, cmd, MSG_ARGS, arg)
} }
func (m *Message) RenderTemplate(arg ...Any) *Message {
return m.Render(RENDER_TEMPLATE, arg...)
}
func (m *Message) RenderStatus(status int, arg ...string) *Message { func (m *Message) RenderStatus(status int, arg ...string) *Message {
return m.Render(RENDER_STATUS, status, arg) return m.Render(RENDER_STATUS, status, arg)
} }
@ -105,6 +102,9 @@ func (m *Message) RenderRedirect(arg ...Any) *Message {
func (m *Message) RenderDownload(arg ...Any) *Message { func (m *Message) RenderDownload(arg ...Any) *Message {
return m.Render(RENDER_DOWNLOAD, arg...) return m.Render(RENDER_DOWNLOAD, arg...)
} }
func (m *Message) RenderTemplate(arg ...Any) *Message {
return m.Render(RENDER_TEMPLATE, arg...)
}
func (m *Message) RenderResult(arg ...Any) *Message { func (m *Message) RenderResult(arg ...Any) *Message {
return m.Render(RENDER_RESULT, arg...) return m.Render(RENDER_RESULT, arg...)
} }
@ -118,7 +118,16 @@ func (m *Message) IsDebug() bool {
return m.Option(MSG_DEBUG) == TRUE return m.Option(MSG_DEBUG) == TRUE
} }
func (m *Message) IsCliUA() bool { func (m *Message) IsCliUA() bool {
return m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla") return m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), html.Mozilla)
}
func (m *Message) IsWeixinUA() bool {
return strings.Contains(m.Option(MSG_USERUA), html.MicroMessenger)
}
func (m *Message) IsMobileUA() bool {
return strings.Contains(m.Option(MSG_USERUA), html.Mobile)
}
func (m *Message) IsChromeUA() bool {
return strings.Contains(m.Option(MSG_USERUA), html.Chrome)
} }
func (m *Message) IsMetaKey() bool { func (m *Message) IsMetaKey() bool {
return m.Option("metaKey") == TRUE return m.Option("metaKey") == TRUE
@ -126,15 +135,6 @@ func (m *Message) IsMetaKey() bool {
func (m *Message) IsGetMethod() bool { func (m *Message) IsGetMethod() bool {
return m.Option(MSG_METHOD) == http.MethodGet return m.Option(MSG_METHOD) == http.MethodGet
} }
func (m *Message) IsMobileUA() bool {
return strings.Contains(m.Option(MSG_USERUA), "Mobile")
}
func (m *Message) IsWeixinUA() bool {
return strings.Contains(m.Option(MSG_USERUA), "MicroMessenger")
}
func (m *Message) IsChromeUA() bool {
return strings.Contains(m.Option(MSG_USERUA), "Chrome")
}
func (m *Message) PushSearch(arg ...Any) { func (m *Message) PushSearch(arg ...Any) {
data := kit.Dict(arg...) data := kit.Dict(arg...)
kit.For(arg, func(k, v Any) { kit.For(arg, func(k, v Any) {
@ -187,6 +187,9 @@ func (m *Message) PushQRCode(key, src string) *Message {
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_QRCODE, src)) }) kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_QRCODE, src)) })
return m return m
} }
func (m *Message) PushScript(arg ...string) {
kit.If(!m.IsCliUA(), func() { m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) })
}
func (m *Message) PushImages(key, src string, arg ...string) { func (m *Message) PushImages(key, src string, arg ...string) {
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IMAGES, src, arg)) }) kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IMAGES, src, arg)) })
} }
@ -199,24 +202,11 @@ func (m *Message) PushAudios(key, src string) {
func (m *Message) PushIFrame(key, src string) { func (m *Message) PushIFrame(key, src string) {
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IFRAME, src)) }) kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IFRAME, src)) })
} }
func (m *Message) PushScript(arg ...string) {
kit.If(!m.IsCliUA(), func() { m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) })
}
func (m *Message) PushDownload(key string, arg ...string) *Message { func (m *Message) PushDownload(key string, arg ...string) *Message {
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_DOWNLOAD, arg)) }) kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_DOWNLOAD, arg)) })
return m return m
} }
func (m *Message) EchoFields(cmd string, arg ...string) *Message {
return m.Echo(`<fieldset class="story" data-index="%s" data-args=%q>
<legend></legend>
<form class="option"></form>
<div class="action"></div>
<div class="output"></div>
<div class="status"></div>
</fieldset>
`, cmd, kit.Join(arg))
}
func (m *Message) EchoInfoButton(info string, arg ...Any) *Message { func (m *Message) EchoInfoButton(info string, arg ...Any) *Message {
kit.If(info == "", func() { info = Info.Template(m, m.ActionKey()+".html") }) kit.If(info == "", func() { info = Info.Template(m, m.ActionKey()+".html") })
kit.If(len(arg) == 0, func() { arg = append(arg, m.ActionKey()) }) kit.If(len(arg) == 0, func() { arg = append(arg, m.ActionKey()) })
@ -231,6 +221,7 @@ func (m *Message) EchoButton(arg ...Any) *Message {
} }
func (m *Message) EchoAnchor(arg ...string) *Message { return m.Echo(Render(m, RENDER_ANCHOR, arg)) } func (m *Message) EchoAnchor(arg ...string) *Message { return m.Echo(Render(m, RENDER_ANCHOR, arg)) }
func (m *Message) EchoQRCode(src string) *Message { return m.Echo(Render(m, RENDER_QRCODE, src)) } func (m *Message) EchoQRCode(src string) *Message { return m.Echo(Render(m, RENDER_QRCODE, src)) }
func (m *Message) EchoScript(arg ...string) *Message { return m.Echo(Render(m, RENDER_SCRIPT, arg)) }
func (m *Message) EchoImages(src string) *Message { return m.Echo(Render(m, RENDER_IMAGES, src)) } func (m *Message) EchoImages(src string) *Message { return m.Echo(Render(m, RENDER_IMAGES, src)) }
func (m *Message) EchoVideos(src string) *Message { return m.Echo(Render(m, RENDER_VIDEOS, src)) } func (m *Message) EchoVideos(src string) *Message { return m.Echo(Render(m, RENDER_VIDEOS, src)) }
func (m *Message) EchoAudios(src string) *Message { return m.Echo(Render(m, RENDER_AUDIOS, src)) } func (m *Message) EchoAudios(src string) *Message { return m.Echo(Render(m, RENDER_AUDIOS, src)) }
@ -240,15 +231,21 @@ func (m *Message) EchoIFrame(src string) *Message {
}) })
return m return m
} }
func (m *Message) EchoScript(arg ...string) *Message {
return m.Echo(Render(m, RENDER_SCRIPT, arg))
}
func (m *Message) EchoDownload(arg ...string) *Message { func (m *Message) EchoDownload(arg ...string) *Message {
return m.Echo(Render(m, RENDER_DOWNLOAD, arg)) return m.Echo(Render(m, RENDER_DOWNLOAD, arg))
} }
func (m *Message) EchoFields(cmd string, arg ...string) *Message {
return m.Echo(`<fieldset class="story" data-index="%s" data-args=%q>
<legend></legend>
<form class="option"></form>
<div class="action"></div>
<div class="output"></div>
<div class="status"></div>
</fieldset>
`, cmd, kit.Join(arg))
}
func (m *Message) Display(file string, arg ...Any) *Message { func (m *Message) Display(file string, arg ...Any) *Message {
file = m.resource(file) m.Option(MSG_DISPLAY, kit.MergeURL(kit.ExtChange(m.resource(file), JS), arg...))
m.Option(MSG_DISPLAY, kit.MergeURL(kit.ExtChange(file, JS), arg...))
return m return m
} }
func (m *Message) Resource(file string) string { return m.resource(file) } func (m *Message) Resource(file string) string { return m.resource(file) }
@ -262,5 +259,4 @@ func (m *Message) resource(file string) string {
} }
kit.If(file == "", func() { p = kit.ExtChange(p, JS) }, func() { p = path.Join(path.Dir(p), file) }) kit.If(file == "", func() { p = kit.ExtChange(p, JS) }, func() { p = path.Join(path.Dir(p), file) })
return kit.MergeURL("/require/"+p, POD, m.Option(MSG_USERPOD)) return kit.MergeURL("/require/"+p, POD, m.Option(MSG_USERPOD))
// return m.MergeLink("/require/"+p, POD, m.Option(MSG_USERPOD))
} }

View File

@ -13,8 +13,8 @@ import (
"shylinux.com/x/toolkits/task" "shylinux.com/x/toolkits/task"
) )
type Any = interface{}
type List = []Any type List = []Any
type Any = interface{}
type Map = map[string]Any type Map = map[string]Any
type Maps = map[string]string type Maps = map[string]string
type Handler func(m *Message, arg ...string) type Handler func(m *Message, arg ...string)
@ -203,10 +203,6 @@ func (c *Context) Close(m *Message, arg ...string) {
kit.If(c.server != nil, func() { c.server.Close(m, arg...) }) kit.If(c.server != nil, func() { c.server.Close(m, arg...) })
} }
type IMessage interface {
Option(key string, arg ...Any) string
PrefixKey() string
}
type Message struct { type Message struct {
time time.Time time time.Time
code int code int
@ -261,7 +257,7 @@ func (m *Message) Spawn(arg ...Any) *Message {
for _, val := range arg { for _, val := range arg {
switch val := val.(type) { switch val := val.(type) {
case []byte: case []byte:
if m.Warn(json.Unmarshal(val, &msg._meta), string(val)) { if m.WarnNotValid(json.Unmarshal(val, &msg._meta), string(val)) {
m.Debug(m.FormatStack(1, 100)) m.Debug(m.FormatStack(1, 100))
} }
case Option: case Option: