diff --git a/README.md b/README.md index 85b6769e..6a80420d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # icebergs -icebergs 是一个应用框架,通过群化、模块化、集自动化方式,在各种设备上,一键部署完整的个人云计算与云研发平台。 +icebergs 是一个应用框架,通过模块化、集群化、自动化方式,在各种设备上,即可一键启动完整的云计算服务与云研发环境。 diff --git a/base/aaa/email.go b/base/aaa/email.go index a945e1c1..b92d2624 100644 --- a/base/aaa/email.go +++ b/base/aaa/email.go @@ -7,6 +7,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" ) @@ -37,12 +38,12 @@ func init() { if m.WarnNotFound(msg.Append(SERVICE) == "", m.Option(FROM)) { return } - m.Toast(ice.PROCESS, "", "-1") - 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)) + 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), 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]) m.Logs(EMAIL, SEND, string(content)) - if !m.Warn(smtp.SendMail(msg.Append(SERVICE), auth, msg.Append(USERNAME), kit.Split(m.Option(TO)), content)) { - m.Toast(ice.SUCCESS) + if !m.WarnNotValid(smtp.SendMail(msg.Append(SERVICE), auth, msg.Append(USERNAME), kit.Split(m.Option(TO)), content)) { + 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) { diff --git a/base/aaa/offer.go b/base/aaa/offer.go index 93b8d842..00a57850 100644 --- a/base/aaa/offer.go +++ b/base/aaa/offer.go @@ -30,12 +30,12 @@ func init() { 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) { - if m.WarnNotValid(m.Option(mdb.HASH) == "", mdb.HASH) { + if m.WarnNotValid(m.Option(mdb.HASH), mdb.HASH) { return } 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)) { - 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))))) mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.STATUS, ACCEPT) } @@ -45,7 +45,7 @@ func init() { kit.If(mdb.HashSelect(m, arg...).FieldsIsDetail(), func() { if m.Option(ice.MSG_USERNAME) == "" { 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 { m.ProcessLocation(m.MergePod("")) } diff --git a/base/aaa/role.go b/base/aaa/role.go index 55216295..875692b9 100644 --- a/base/aaa/role.go +++ b/base/aaa/role.go @@ -160,7 +160,7 @@ func Right(m *ice.Message, key ...ice.Any) bool { } else if len(key) > 0 && key[0] == ice.ETC_PATH { 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, - ice.ErrNotRight, kit.Keys(key...), USERROLE, m.Option(ice.MSG_USERROLE), logs.FileLineMeta(-1)) + 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, + 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) } diff --git a/base/aaa/sess.go b/base/aaa/sess.go index f2773c80..73bc8e48 100644 --- a/base/aaa/sess.go +++ b/base/aaa/sess.go @@ -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) != "" } 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 { - return m.Option(ice.MSG_SESSID, ice.Info.AdminCmd(m.Spawn(), SESS, mdb.CREATE, m.Option(ice.MSG_USERNAME)).Result()) + if m.Option(ice.MSG_SESSID) == "" || m.Spawn().AdminCmd(SESS, m.Option(ice.MSG_SESSID)).Length() == 0 { + return m.Option(ice.MSG_SESSID, m.Spawn().AdminCmd(SESS, mdb.CREATE, m.Option(ice.MSG_USERNAME)).Result()) } return m.Option(ice.MSG_SESSID) } diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 2bed1580..b5b3feee 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -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), 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) return } mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[PID] = cmd.Process.Pid }) 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) m.Cost(CODE, "0", ctx.ARGS, cmd.Args) } else { @@ -80,9 +80,11 @@ const ( STATUS = "status" ERROR = "error" CLEAR = "clear" + STASH = "stash" DELAY = "delay" - RELOAD = "reload" RECORD = "record" + RELOAD = "reload" + REBOOT = "reboot" RESTART = "restart" INTERVAL = "interval" @@ -106,12 +108,16 @@ const DAEMON = "daemon" func init() { Index.MergeCommands(ice.Commands{ 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) { 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))...)) }}, - 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) { h, pid := m.Option(mdb.HASH), m.Option(PID) mdb.HashSelects(m, h).Table(func(value ice.Maps) { diff --git a/base/cli/qrcode.go b/base/cli/qrcode.go index c6be14d7..dc40ae69 100644 --- a/base/cli/qrcode.go +++ b/base/cli/qrcode.go @@ -60,7 +60,7 @@ func init() { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch arg[0] { case FG, BG: - m.Push(arg[0], BLACK, WHITE) + m.Push(arg[0], kit.SortedKey(_color_map)) } }}, }), Hand: func(m *ice.Message, arg ...string) { diff --git a/base/cli/runtime.go b/base/cli/runtime.go index a688b2dd..a68abc21 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -128,7 +128,14 @@ const ( LINUX = "linux" MACOS = "macos" DARWIN = "darwin" - WINDOWS = ice.WINDOWS + WINDOWS = "windows" + + COMMIT_TIME = "commitTime" + COMPILE_TIME = "compileTime" + BOOT_TIME = "bootTime" + + KERNEL = "kernel" + ARCH = "arch" ) const ( PATH = "PATH" @@ -194,7 +201,7 @@ func init() { }}, API: {Hand: func(m *ice.Message, arg ...string) { 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 } 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) { 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 } 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()) }}, "upgrade": {Help: "升级", Hand: func(m *ice.Message, arg ...string) { 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) { - m.Cmdy("web.code.upgrade") + m.Cmdy("upgrade") } 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) }) }}, - "stash": {Help: "清空", Icon: "bi bi-trash", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(SYSTEM, "git", "stash") + STASH: {Help: "清空", Icon: "bi bi-trash", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(SYSTEM, "git", STASH) m.Cmd(SYSTEM, "git", "checkout", ".") m.Go(func() { m.Sleep30ms(ice.QUIT, 1) }) }}, @@ -274,26 +281,26 @@ func ParseMake(str string) []string { res := kit.UnMarshal(str) data := kit.Value(res, MAKE) return kit.Simple( - mdb.TIME, kit.Format(kit.Value(res, "boot.time")), - ice.SPACE, kit.Format(kit.Value(res, "node.name")), + mdb.TIME, kit.Format(kit.Value(res, kit.Keys(BOOT, mdb.TIME))), + ice.SPACE, kit.Format(kit.Value(res, kit.Keys(NODE, mdb.NAME))), nfs.MODULE, kit.Format(kit.Value(data, nfs.MODULE)), nfs.VERSION, kit.Join(kit.TrimArg(kit.Simple( kit.Format(kit.Value(data, nfs.VERSION)), kit.Format(kit.Value(data, "forword")), kit.Cut(kit.Format(kit.Value(data, mdb.HASH)), 6), )...), "-"), - "commitTime", kit.Format(kit.Value(data, "when")), - "compileTime", kit.Format(kit.Value(data, mdb.TIME)), - "bootTime", kit.Format(kit.Value(res, "boot.time")), - SHELL, kit.Format(kit.Value(res, "conf.SHELL")), - "kernel", kit.Format(kit.Value(res, "host.GOOS")), - "arch", kit.Format(kit.Value(res, "host.GOARCH")), + COMMIT_TIME, kit.Format(kit.Value(data, "when")), + COMPILE_TIME, kit.Format(kit.Value(data, mdb.TIME)), + BOOT_TIME, kit.Format(kit.Value(res, kit.Keys(BOOT, mdb.TIME))), + SHELL, kit.Format(kit.Value(res, kit.Keys(CONF, SHELL))), + KERNEL, kit.Format(kit.Value(res, kit.Keys(HOST, GOOS))), + ARCH, kit.Format(kit.Value(res, kit.Keys(HOST, GOARCH))), ) } func SimpleMake() []string { return []string{ 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, - "kernel", runtime.GOOS, "arch", runtime.GOARCH, + COMMIT_TIME, ice.Info.Make.When, COMPILE_TIME, ice.Info.Make.Time, BOOT_TIME, ice.Info.Time, + KERNEL, runtime.GOOS, ARCH, runtime.GOARCH, } } diff --git a/base/cli/system.go b/base/cli/system.go index 1722bebd..1a77d521 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -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.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 { @@ -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 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" } 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) { if len(_cache_path) > 0 { return _cache_path diff --git a/base/ctx/config.go b/base/ctx/config.go index 703f4b49..5e2cb47d 100644 --- a/base/ctx/config.go +++ b/base/ctx/config.go @@ -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) { defer f.Close() - if s, e := json.MarshalIndent(data, "", " "); !m.Warn(e) { - if _, e := f.Write(s); !m.Warn(e) { + if s, e := json.MarshalIndent(data, "", " "); !m.WarnNotValid(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 { 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) { if len(arg) == 0 { kit.For(m.Target().Commands[m.CommandKey()].Actions[m.ActionKey()].List, func(value ice.Any) { diff --git a/base/ctx/process.go b/base/ctx/process.go index c3fe575e..dba9b51b 100644 --- a/base/ctx/process.go +++ b/base/ctx/process.go @@ -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 { 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) { defer m.Push(STYLE, html.FLOAT) diff --git a/base/gdb/gdb.go b/base/gdb/gdb.go index 5253a714..b4b889d2 100644 --- a/base/gdb/gdb.go +++ b/base/gdb/gdb.go @@ -30,8 +30,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) { for { select { case <-t.C: - m.Options(ice.LOG_DISABLE, ice.TRUE) - m.Cmd(TIMER, HAPPEN) + m.Options(ice.LOG_DISABLE, ice.TRUE).Cmd(TIMER, HAPPEN) case s, ok := <-f.s: if !ok { return diff --git a/base/log/log.go b/base/log/log.go index d8d374e5..943a72f8 100644 --- a/base/log/log.go +++ b/base/log/log.go @@ -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) }) }) }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { - ice.Info.Save(m, TAIL) - }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { ice.Info.Save(m, TAIL) }}, }} func init() { ice.Index.Register(Index, &Frame{}, TAIL) } diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 78869fca..623d58aa 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -40,16 +40,11 @@ func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) string { if arg[0] == HASH { m.Echo(arg[1]).Conf(prefix, kit.Keys(chain, HASH, arg[1]), kit.Data(arg[2:])) } else { - func() { - switch target := m.Optionv(TARGET).(type) { - case []string: - if len(target) == 0 { - m.Echo(Rich(m, prefix, chain, kit.Data(arg))) - return - } - } + if target, ok := m.Optionv(TARGET).([]string); ok && len(target) == 0 { + m.Echo(Rich(m, prefix, chain, kit.Data(arg))) + } else { 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)...) 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 { 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.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) { m.Logs(MODIFY, KEY, path.Join(prefix, chain), field, value, arg) defer Lock(m, prefix)() 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...) + saveImportant(m, prefix, chain, kit.Simple(MODIFY, prefix, chain, HASH, HASH, key, arg)...) }) } 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) { 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) { 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) { defer Lock(m, prefix)() - count := len(Confm(m, prefix, kit.Keys(chain, HASH))) p := kit.Keys(file, JSON) + count := len(Confm(m, prefix, kit.Keys(chain, HASH))) if count == 0 { if s, e := os.Stat(p); e == nil && !s.IsDir() { os.Remove(p) @@ -122,16 +117,16 @@ func _hash_export(m *ice.Message, prefix, chain, file string) { defer m.Echo(p) m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count) 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), "") } } func _hash_import(m *ice.Message, prefix, chain, file string) { 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 { return - } else if m.Warn(e) { + } else if m.WarnNotFound(e) { return } 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, "") }}, 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...))) } }}, @@ -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) }}, 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") }) 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) { case func(Maps) Any: - target = create(ToMaps(value)) + target = create(kit.ToMaps(value)) case func(Map) Any: target = create(value) 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 { HashSelectValue(m, func(value Map) { if c, ok := value[TARGET].(io.Closer); ok { - m.Warn(c.Close()) + m.WarnNotValid(c.Close()) } delete(value, TARGET) }) diff --git a/base/mdb/list.go b/base/mdb/list.go index 1a0ef582..d63cad64 100644 --- a/base/mdb/list.go +++ b/base/mdb/list.go @@ -2,6 +2,7 @@ package mdb import ( "encoding/csv" + "os" "path" "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) { m.Logs(INSERT, KEY, path.Join(prefix, chain), arg) 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)))) + 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) { m.Logs(MODIFY, KEY, path.Join(prefix, chain), field, value, arg) 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...) }) + saveImportant(m, prefix, chain, kit.Simple(MODIFY, prefix, chain, LIST, field, value, arg)...) } func _list_select(m *ice.Message, prefix, chain, field, value string) { 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) { 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) defer f.Close() defer m.Echo(p) + m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count) w := csv.NewWriter(f) 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) { if value = kit.GetMeta(value); index == 0 { kit.If(len(head) == 0 || head[0] == ice.FIELDS_DETAIL, func() { head = kit.SortedKey(value) }) w.Write(head) } 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, LIST), "") } func _list_import(m *ice.Message, prefix, chain, file string) { defer Lock(m, prefix)() 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() r := csv.NewReader(f) head, _ := r.Read() @@ -195,12 +207,7 @@ const ( CACHE_FIELD = "cache.field" ) -type Message interface { - 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 { +func Grows(m *ice.Message, prefix string, chain Any, match string, value string, cb Any) Map { cache, ok := m.Confv(prefix, chain).(ice.Map) if cache == nil || !ok { 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("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) if cache == nil || !ok { cache = kit.Data() diff --git a/base/mdb/lock.go b/base/mdb/lock.go index 88fc7c2d..25ed1f6c 100644 --- a/base/mdb/lock.go +++ b/base/mdb/lock.go @@ -8,41 +8,33 @@ import ( "shylinux.com/x/toolkits/task" ) -type configMessage interface { - Option(key string, arg ...Any) string - PrefixKey() string - Confv(...Any) Any -} - var _lock = 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)) defer _lock.Lock()() l, ok := _locks[key] kit.If(!ok, func() { l = &task.Lock{}; _locks[key] = l }) return l } -func Lock(m configMessage, arg ...string) func() { - return getLock(m, arg...).Lock() -} -func RLock(m configMessage, arg ...string) func() { return getLock(m, arg...).RLock() } +func Lock(m *ice.Message, arg ...string) func() { return getLock(m, arg...).Lock() } +func RLock(m *ice.Message, arg ...string) func() { return getLock(m, arg...).RLock() } -func Config(m configMessage, key string, arg ...Any) string { - return kit.Format(Configv(m, key, arg...)) -} -func ConfigSimple(m configMessage, key ...string) (res []string) { +func ConfigSimple(m *ice.Message, key ...string) (res []string) { for _, key := range key { res = append(res, key, kit.Format(Configv(m, key))) } 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]) }) 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])) if ctx, ok := ice.Info.Index[key].(*ice.Context); ok { key = ctx.Prefix(key) @@ -54,10 +46,8 @@ func Confv(m configMessage, arg ...Any) Any { } return m.Confv(arg...) } -func Conf(m configMessage, arg ...Any) string { - return kit.Format(Confv(m, arg...)) -} -func Confm(m configMessage, key string, sub Any, cbs ...Any) Map { +func Conf(m *ice.Message, arg ...Any) string { return kit.Format(Confv(m, arg...)) } +func Confm(m *ice.Message, key string, sub Any, cbs ...Any) Map { val := m.Confv(key, sub) kit.If(len(cbs) > 0, func() { kit.For(val, cbs[0]) }) 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 { cache.Delete(key) return nil - } - if val, ok := cache.Load(key); ok { + } else if val, ok := cache.Load(key); ok { return val - } - if val := add(); val != nil { + } else if val := add(); val != nil { cache.Store(key, val) return val + } else { + return nil } - return nil } diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index ed8199fb..364891b1 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -32,7 +32,7 @@ func _mdb_select(m *ice.Message, cb Any, key string, value Map, fields []string, case func(Any): cb(value[TARGET]) case func(Maps): - cb(ToMaps(value)) + cb(kit.ToMaps(value)) case string, []string, []Any, nil: if m.FieldsIsDetail() { m.Push(ice.FIELDS_DETAIL, value) @@ -96,6 +96,7 @@ const ( ICONS = "icons" UNITS = "units" ORDER = "order" + GROUP = "group" VALID = "valid" ENABLE = "enable" DISABLE = "disable" @@ -217,26 +218,16 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: ice.Commands m.OptionDefault(CACHE_LIMIT, "-1") file := _mdb_export_file(m, arg...) kit.Switch(arg[2], - HASH, func() { - _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) - }, + HASH, func() { _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) }, ) }}, IMPORT: {Name: "import key sub type file", Hand: func(m *ice.Message, arg ...string) { file := _mdb_export_file(m, arg...) kit.Switch(arg[2], - HASH, func() { - _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) - }, + HASH, func() { _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) }, 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) { kit.For(list, func(k string) { 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 @@ -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...) }) } -func ToMaps(value Map) Maps { - res := Maps{} - kit.For(value, func(k, v string) { res[k] = v }) - return res -} diff --git a/base/mdb/zone.go b/base/mdb/zone.go index dfdbb0e7..37dc8b4f 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -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, META, COUNT), "") } - if count == 0 { - os.Remove(p) - return - } + kit.If(count == 0, func() { os.Remove(p) }) m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count) } func _zone_import(m *ice.Message, prefix, chain, file string) { defer Lock(m, prefix)() - f, e := ice.Info.Open(m, kit.Keys(file, CSV)) - if os.IsNotExist(e) { + f, e := miss.OpenFile(kit.Keys(file, CSV)) + if e != nil && !ice.Info.Important { return - } - if e != nil { + } else if m.WarnNotFound(e) { return } 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)) kit.If(times[list[zone]], func(t string) { m.Confv(prefix, kit.Keys(chain, HASH, list[zone], META, TIME), t) }) } - func() { - chain := kit.Keys(chain, HASH, list[zone]) - Grow(m, prefix, chain, data) - }() + func() { chain := kit.Keys(chain, HASH, list[zone]); Grow(m, prefix, chain, data) }() 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) { kit.For(list, func(k string) { 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 @@ -279,7 +272,7 @@ func PageZoneSelect(m *ice.Message, arg ...string) *ice.Message { if ZoneSelect(m, arg...); len(arg) == 0 { m.Action(CREATE) } else if len(arg) == 1 { - m.Action(INSERT, "page") + m.Action(INSERT, PAGE) } return m } diff --git a/base/nfs/cat.go b/base/nfs/cat.go index dbb74f36..12cd93c9 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -34,7 +34,7 @@ func _cat_list(m *ice.Message, p string) { return } f, e := _cat_find(m, p) - if m.Warn(e, ice.ErrNotFound, p) { + if m.WarnNotFound(e, p) { return } defer f.Close() @@ -52,7 +52,7 @@ func _cat_list(m *ice.Message, p string) { case func([]string): kit.For(f, cb) 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)) } default: @@ -103,13 +103,12 @@ const ( PY = "py" IMAGE = "image" - - PNG = "png" - JPEG = "jpeg" - JPG = "jpg" - MP4 = "mp4" - MOV = "mov" - PDF = "pdf" + JPEG = "jpeg" + JPG = "jpg" + PNG = "png" + MP4 = "mp4" + MOV = "mov" + PDF = "pdf" DF = ice.DF PS = ice.PS @@ -139,8 +138,9 @@ func DirList(m *ice.Message, arg ...string) bool { if len(arg) == 0 || strings.HasSuffix(arg[0], PS) { m.Cmdy(DIR, kit.Slice(arg, 0, 1)) return true + } else { + return false } - return false } func IsSourceFile(m *ice.Message, ext string) bool { @@ -159,7 +159,7 @@ func Open(m *ice.Message, p string, cb ice.Any) { return } else if strings.HasSuffix(p, PS) { 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) { case func([]os.FileInfo): cb(ls) @@ -171,7 +171,7 @@ func Open(m *ice.Message, p string, cb ice.Any) { 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() switch cb := cb.(type) { case func(io.Reader, os.FileInfo): @@ -182,7 +182,7 @@ func Open(m *ice.Message, p string, cb ice.Any) { case func(io.Reader): cb(f) case func(string): - if b, e := ioutil.ReadAll(f); !m.Warn(e) { + if b, e := ioutil.ReadAll(f); !m.WarnNotFound(e) { cb(string(b)) } default: @@ -191,7 +191,7 @@ func Open(m *ice.Message, p string, cb ice.Any) { } } 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 nil diff --git a/base/nfs/dir.go b/base/nfs/dir.go index bef72851..5272d3ba 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -51,9 +51,7 @@ func _dir_list(m *ice.Message, root string, dir string, level int, deep bool, di default: m.ErrorNotImplement(cb) } - if s.ModTime().After(last) { - last = s.ModTime() - } + kit.If(s.ModTime().After(last), func() { last = s.ModTime() }) for _, field := range fields { switch field { case mdb.TIME: @@ -144,29 +142,29 @@ const ( VAR = "var/" USR = "usr/" - USR_PORTAL = ice.USR_PORTAL - USR_PUBLISH = ice.USR_PUBLISH - USR_ICEBERGS = ice.USR_ICEBERGS - USR_LOCAL_WORK = ice.USR_LOCAL_WORK - USR_LOCAL = ice.USR_LOCAL - SRC_TEMPLATE = ice.SRC_TEMPLATE - USR_LEARNING_PORTAL = "usr/learning/portal/" - USR_PACKAGE = "usr/package.json" - USR_MODULES = "usr/node_modules/" - REQUIRE_MODULES = "/require/modules/" - REQUIRE_SRC = "/require/src/" - REQUIRE_USR = "/require/usr/" - REQUIRE = "/require/" - VOLCANOS = "/volcanos/" - INTSHELL = "/intshell/" - SHARE_LOCAL = "/share/local/" - PATHNAME = "pathname" - FILENAME = "filename" + SRC_TEMPLATE = ice.SRC_TEMPLATE + USR_ICEBERGS = ice.USR_ICEBERGS + USR_PUBLISH = ice.USR_PUBLISH + USR_PORTAL = ice.USR_PORTAL + USR_LOCAL = ice.USR_LOCAL + USR_LOCAL_WORK = ice.USR_LOCAL_WORK + USR_PACKAGE = "usr/package.json" + USR_MODULES = "usr/node_modules/" + REQUIRE_MODULES = "/require/modules/" + REQUIRE_USR = "/require/usr/" + REQUIRE_SRC = "/require/src/" + REQUIRE = "/require/" + VOLCANOS = "/volcanos/" + INTSHELL = "/intshell/" + SHARE_LOCAL = "/share/local/" + PATHNAME = "pathname" + FILENAME = "filename" - USR_ICONS_AVATAR = "usr/icons/avatar.jpg" - USR_ICONS_CONTEXTS = "usr/icons/contexts.png" - USR_ICONS_ICEBERGS = "usr/icons/icebergs.jpg" - USR_ICONS_VOLCANOS = "usr/icons/volcanos.jpg" + USR_LEARNING_PORTAL = "usr/learning/portal/" + USR_ICONS_AVATAR = "usr/icons/avatar.jpg" + USR_ICONS_CONTEXTS = "usr/icons/contexts.png" + USR_ICONS_ICEBERGS = "usr/icons/icebergs.jpg" + USR_ICONS_VOLCANOS = "usr/icons/volcanos.jpg" TYPE_ALL = "all" TYPE_BIN = "bin" @@ -204,14 +202,14 @@ func init() { ice.APP: {Help: "本机", Hand: func(m *ice.Message, arg ...string) { switch runtime.GOOS { 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) { Show(m.ProcessInner(), path.Join(m.Option(DIR_ROOT), m.Option(PATH))) }}, mdb.UPLOAD: {}, 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)) }}, }, 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 { p := SHARE_LOCAL + file - kit.If(m.Option(ice.MSG_USERPOD), func(pod string) { - p += "?" + kit.JoinKV("=", "&", ice.POD, pod) - }) + kit.If(m.Option(ice.MSG_USERPOD), func(pod string) { p = kit.MergeURL(p, ice.POD, pod) }) switch strings.ToLower(kit.Ext(file)) { case PNG, JPG, JPEG: m.EchoImages(p) diff --git a/base/nfs/document.go b/base/nfs/document.go index 9532d5c4..d3f2306a 100644 --- a/base/nfs/document.go +++ b/base/nfs/document.go @@ -4,6 +4,7 @@ import ( "path" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" ) @@ -11,9 +12,9 @@ const DOCUMENT = "document" func init() { 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 { - m.Cmdy(ice.COMMAND).Action("filter:text").Option(ice.MSG_DISPLAY, "") + m.Cmdy(ice.COMMAND).Action(html.FILTER).Option(ice.MSG_DISPLAY, "") return } 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))) } 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 p - } else { - return p - } + return path.Join(USR_LEARNING_PORTAL, m.PrefixKey(), path.Join(arg...)) } diff --git a/base/nfs/find.go b/base/nfs/find.go index 4ff858b6..d4823156 100644 --- a/base/nfs/find.go +++ b/base/nfs/find.go @@ -16,7 +16,7 @@ func init() { 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") }) 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)) kit.For(strings.Split(msg.Result(), ice.NL), func(s string) { m.Push(FILE, s) }) m.StatusTimeCount(kit.Dict(PATH, m.Option(CMD_DIR))) diff --git a/base/nfs/grep.go b/base/nfs/grep.go index f6263100..64c0b0a8 100644 --- a/base/nfs/grep.go +++ b/base/nfs/grep.go @@ -21,7 +21,7 @@ func init() { 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) }) 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 { m.Push(FILE, strings.TrimPrefix(ls[0], PWD)).Push(LINE, ls[1]).Push(mdb.TEXT, ls[2]) } diff --git a/base/nfs/hex.go b/base/nfs/hex.go index 06e17ce2..589f0c5e 100644 --- a/base/nfs/hex.go +++ b/base/nfs/hex.go @@ -22,11 +22,11 @@ func init() { Open(m, arg[0], func(r io.Reader, s os.FileInfo) { switch arg[1] { case "gzip": - if g, e := gzip.NewReader(r); !m.Warn(e) { + if g, e := gzip.NewReader(r); !m.WarnNotFound(e) { r = g } case "zlib": - if z, e := zlib.NewReader(r); !m.Warn(e) { + if z, e := zlib.NewReader(r); !m.WarnNotFound(e) { r = z } } diff --git a/base/nfs/pack.go b/base/nfs/pack.go index 57be3ca4..a898162e 100644 --- a/base/nfs/pack.go +++ b/base/nfs/pack.go @@ -17,20 +17,6 @@ const PACK = "pack" func init() { Index.MergeCommands(ice.Commands{ 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) { OptionFiles(m, PackFile) Create(m, m.Option(PATH), func(w io.Writer, p string) { @@ -72,13 +58,8 @@ var DiskFile = file.NewDiskFile() var PackFile = file.NewPackFile() func init() { file.Init(OptionFiles(ice.Pulse, DiskFile, PackFile)) } -func init() { ice.Info.Open = OpenFile } -type optionMessage interface { - Optionv(key string, arg ...ice.Any) ice.Any -} - -func OptionFiles(m optionMessage, f ...file.File) file.File { +func OptionFiles(m *ice.Message, f ...file.File) file.File { if len(f) > 1 { m.Optionv(ice.MSG_FILES, file.NewMultiFile(f...)) } 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) } -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 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) } -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) 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) for i := 0; i < len(list)-1; i++ { for j := i + 1; j < len(list); j++ { @@ -110,24 +91,24 @@ func ReadDir(m optionMessage, p string) ([]os.FileInfo, error) { } 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) return p } -func RemoveAll(m optionMessage, p string) error { return OptionFiles(m).RemoveAll(p) } -func Remove(m optionMessage, p string) error { return OptionFiles(m).Remove(p) } -func Rename(m optionMessage, oldname string, newname string) error { +func RemoveAll(m *ice.Message, p string) error { return OptionFiles(m).RemoveAll(p) } +func Remove(m *ice.Message, p string) error { return OptionFiles(m).Remove(p) } +func Rename(m *ice.Message, oldname string, newname string) error { MkdirAll(m, path.Dir(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) } -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) } -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 { for _, cb := range cb { cb(p) @@ -136,7 +117,7 @@ func Exists(m optionMessage, p string, cb ...func(string)) bool { } 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() { 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 { 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 { w.Close() } diff --git a/base/nfs/save.go b/base/nfs/save.go index 75f4509b..5ee4d809 100644 --- a/base/nfs/save.go +++ b/base/nfs/save.go @@ -16,7 +16,7 @@ func _defs_file(m *ice.Message, name string, text ...string) { return } 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) } } @@ -45,16 +45,16 @@ func _copy_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 } name = path.Join(m.Option(DIR_ROOT), name) 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 } 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 } 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) { - if f, p, e := CreateFile(m, p); !m.Warn(e) { + if f, p, e := CreateFile(m, p); !m.WarnNotValid(e) { defer f.Close() switch cb := cb.(type) { 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) { - if f, p, e := AppendFile(m, p); !m.Warn(e) { + if f, p, e := AppendFile(m, p); !m.WarnNotValid(e) { defer f.Close() switch cb := cb.(type) { 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) 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) { case func(int): 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) { - if n, e := io.Copy(w, r); !m.Warn(e) { + if n, e := io.Copy(w, r); !m.WarnNotValid(e) { switch cb := cb.(type) { case func(int): cb(int(n)) @@ -171,7 +171,7 @@ func CopyStream(m *ice.Message, to io.Writer, from io.Reader, cache, total int, default: m.ErrorNotImplement(cb) } - if e == io.EOF || m.Warn(e) { + if e == io.EOF || m.WarnNotValid(e) { break } } diff --git a/base/nfs/tar.go b/base/nfs/tar.go index 52d6ca69..1622320f 100644 --- a/base/nfs/tar.go +++ b/base/nfs/tar.go @@ -20,7 +20,7 @@ func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) { case TGZ: p = kit.Keys(kit.TrimExt(p, kit.Ext(p)), TAR, 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 } else { defer f.Close() @@ -30,7 +30,7 @@ func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) { i := 0 for r := tar.NewReader(r); ; i++ { h, e := r.Next() - if m.Warn(e) || e == io.EOF { + if m.WarnNotValid(e) || e == io.EOF { break } if h.Size == 0 { diff --git a/base/nfs/template.go b/base/nfs/template.go index 67ff32de..ea986436 100644 --- a/base/nfs/template.go +++ b/base/nfs/template.go @@ -4,6 +4,7 @@ import ( "path" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" ) @@ -19,7 +20,7 @@ func init() { }}, }), Hand: func(m *ice.Message, arg ...string) { 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 } 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 Template(m *ice.Message, p string, data ...ice.Any) string { if len(data) == 0 { 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"))) } 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 p - } else { - return p - } + return path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Join(arg...)) } diff --git a/base/nfs/trash.go b/base/nfs/trash.go index 4e5a5907..2e4aa8a0 100644 --- a/base/nfs/trash.go +++ b/base/nfs/trash.go @@ -10,18 +10,18 @@ import ( ) func _trash_create(m *ice.Message, from string) { - if m.Warn(from == "", ice.ErrNotValid, FROM) { + if m.WarnNotValid(from == "", FROM) { return } s, e := StatFile(m, from) defer Remove(m, from) - if m.Warn(e, ice.ErrNotFound, from) { + if m.WarnNotFound(e, from) { return } 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)) }) }) 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" diff --git a/base/nfs/zip.go b/base/nfs/zip.go index 6b73a706..201bb46b 100644 --- a/base/nfs/zip.go +++ b/base/nfs/zip.go @@ -13,7 +13,7 @@ import ( ) 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 } else { defer f.Close() diff --git a/base/ssh/script.go b/base/ssh/script.go index c0497c72..2f2111ca 100644 --- a/base/ssh/script.go +++ b/base/ssh/script.go @@ -184,7 +184,6 @@ func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server const ( FRAME = "frame" SHELL = "shell" - WEBIO = "webio" STDIO = "stdio" PS1 = "PS1" PS2 = "PS2" @@ -195,7 +194,6 @@ const ( TARGET = "target" PROMPT = "prompt" PRINTF = "printf" - SCREEN = "screen" ) func init() { @@ -229,16 +227,6 @@ func init() { 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) - } - }}, }) } diff --git a/base/ssh/ssh.go b/base/ssh/ssh.go index 95ba711c..2d25ff04 100644 --- a/base/ssh/ssh.go +++ b/base/ssh/ssh.go @@ -6,4 +6,4 @@ const SSH = "ssh" 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) } diff --git a/base/tcp/broad.go b/base/tcp/broad.go index 760fe495..01926e62 100644 --- a/base/tcp/broad.go +++ b/base/tcp/broad.go @@ -19,7 +19,7 @@ func _server_udp(m *ice.Message, arg ...string) { m.Assert(e) buf := make([]byte, 2*ice.MOD_BUFS) 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]) } else { break @@ -34,7 +34,7 @@ func _client_dial_udp4(m *ice.Message, arg ...string) { defer kit.If(e == nil, func() { c.Close() }) switch cb := m.OptionCB("").(type) { case func(*net.UDPConn): - kit.If(!m.Warn(e), func() { cb(c) }) + kit.If(!m.WarnNotValid(e), func() { cb(c) }) default: m.ErrorNotImplement(cb) } @@ -47,7 +47,7 @@ const ( ) 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 nil diff --git a/base/tcp/client.go b/base/tcp/client.go index 5c556888..7faf7d8f 100644 --- a/base/tcp/client.go +++ b/base/tcp/client.go @@ -35,7 +35,7 @@ func _client_dial(m *ice.Message, arg ...string) { defer kit.If(e == nil, func() { c.Close() }) switch cb := m.OptionCB("").(type) { case func(net.Conn): - kit.If(!m.Warn(e), func() { cb(c) }) + kit.If(!m.WarnNotValid(e), func() { cb(c) }) default: m.ErrorNotImplement(cb) } diff --git a/base/tcp/host.go b/base/tcp/host.go index a930be55..8f7e1105 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -1,7 +1,6 @@ package tcp import ( - "fmt" "net" "os" "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)) } @@ -87,8 +83,8 @@ func init() { 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 { m.Echo(ice.OK) - // } else if mdb.HashSelectField(m, strings.Split(arg[0], nfs.DF)[0], mdb.TYPE) == aaa.WHITE { - // m.Echo(ice.OK) + } else if mdb.HashSelectField(m, strings.Split(arg[0], nfs.DF)[0], mdb.TYPE) == aaa.WHITE { + m.Echo(ice.OK) } }}, 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 PublishLocalhost(m *ice.Message, url string) string { return m.Cmdx(HOST, PUBLISH, url) } diff --git a/base/tcp/port.go b/base/tcp/port.go index a4e498a3..0570d006 100644 --- a/base/tcp/port.go +++ b/base/tcp/port.go @@ -8,7 +8,6 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" - "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" @@ -105,10 +104,8 @@ func init() { m.Assert(m.Option(PORT) != "") nfs.Trash(m, path.Join(ice.USR_LOCAL_DAEMON, m.Option(PORT))) }}, - aaa.RIGHT: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(PortRight(m, arg...)) - }}, - CURRENT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(mdb.Config(m, CURRENT)) }}, + aaa.RIGHT: {Hand: func(m *ice.Message, arg ...string) { m.Echo(PortRight(m, arg...)) }}, + 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) { if len(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])) 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) }}, }) diff --git a/base/tcp/server.go b/base/tcp/server.go index ca3e495d..ac29bc3a 100644 --- a/base/tcp/server.go +++ b/base/tcp/server.go @@ -30,7 +30,7 @@ func (l Listener) Close() error { func _server_listen(m *ice.Message, arg ...string) { l, e := net.Listen(TCP, m.Option(HOST)+nfs.DF+m.Option(PORT)) - if m.Warn(e) { + if m.WarnNotValid(e) { 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{}} @@ -40,7 +40,7 @@ func _server_listen(m *ice.Message, arg ...string) { cb(l) case func(net.Conn): for { - if c, e := l.Accept(); !m.Warn(e) { + if c, e := l.Accept(); !m.WarnNotValid(e) { cb(c) } else { break diff --git a/base/tcp/wifi.go b/base/tcp/wifi.go index ba404337..0fc31362 100644 --- a/base/tcp/wifi.go +++ b/base/tcp/wifi.go @@ -17,7 +17,6 @@ const WIFI = "wifi" func init() { const ( - SYSTEM = "cli.system" NETWORKSETUP = "networksetup" DISCOVER = "discover" CONNECT = "connect" @@ -25,12 +24,12 @@ func init() { Index.MergeCommands(ice.Commands{ WIFI: {Help: "无线", Actions: ice.MergeActions(ice.Actions{ 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) }}, CONNECT: {Help: "连接", Hand: func(m *ice.Message, arg ...string) { 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() }}, }, mdb.HashAction(mdb.SHORT, SSID, mdb.FIELD, "time,ssid,password")), Hand: func(m *ice.Message, arg ...string) { diff --git a/base/web/admin.go b/base/web/admin.go index 1186ce24..dcada9b8 100644 --- a/base/web/admin.go +++ b/base/web/admin.go @@ -41,7 +41,7 @@ func init() { RenderMain(m) } else { 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, 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 { - return m.Cmdx(append([]ice.Any{SPACE, ice.OPS, cmd}, arg...)...) + return m.Cmd(append([]ice.Any{SPACE, ice.OPS, cmd}, arg...)...) } else { - return m.Cmdx(append([]ice.Any{cmd}, arg...)...) + return m.Cmd(append([]ice.Any{cmd}, arg...)...) } } diff --git a/base/web/agent.go b/base/web/agent.go deleted file mode 100644 index efb38952..00000000 --- a/base/web/agent.go +++ /dev/null @@ -1 +0,0 @@ -package web diff --git a/base/web/basic.go b/base/web/basic.go index 259763ce..4a2637af 100644 --- a/base/web/basic.go +++ b/base/web/basic.go @@ -36,9 +36,9 @@ func BasicSess(m *ice.Message) { 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) { case html.Basic: - if buf, err := base64.StdEncoding.DecodeString(kit.Select("", ls, 1)); !m.Warn(err) { - if ls := strings.SplitN(string(buf), ":", 2); !m.Warn(len(ls) < 2 || ls[1] == "", ice.ErrNotValid, html.Basic) { - if msg := m.Cmd(TOKEN, ls[1]); !m.Warn(msg.Time() > msg.Append(mdb.TIME), ice.ErrNotValid) { + if buf, err := base64.StdEncoding.DecodeString(kit.Select("", ls, 1)); !m.WarnNotValid(err) { + if ls := strings.SplitN(string(buf), ":", 2); !m.WarnNotValid(len(ls) < 2 || ls[1] == "", html.Basic) { + if msg := m.Cmd(TOKEN, ls[1]); !m.WarnNotValid(msg.Time() > msg.Append(mdb.TIME)) { if len(check) == 0 || check[0](msg) { return true } diff --git a/base/web/broad.go b/base/web/broad.go index cf134950..d5fa67a4 100644 --- a/base/web/broad.go +++ b/base/web/broad.go @@ -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) { - 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 } 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) { switch kit.If(value[tcp.HOST] == host, func() { value[tcp.HOST] = domain }); value[mdb.TYPE] { 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: - 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) }}, 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) { - 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...) }}, }, 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", @@ -80,5 +82,5 @@ func init() { }) } 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())) } diff --git a/base/web/cache.go b/base/web/cache.go index 15454d6d..966ca959 100644 --- a/base/web/cache.go +++ b/base/web/cache.go @@ -30,7 +30,7 @@ func _cache_mime(m *ice.Message, mime, name string) string { return mime } 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 } else if len(text) > 512 { 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" } 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() - 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() 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))) 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" } 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() { if s, e := os.Stat(file); e == nil && s.Size() == 0 { nfs.Remove(m, file) @@ -117,9 +117,6 @@ func init() { 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))) }}, - 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) { _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)) _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) { mime, name, file, size := _cache_upload(m, m.R) _cache_save(m, mime, name, "", file, size) }}, 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) { 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) diff --git a/base/web/count.go b/base/web/count.go index 14538eba..c1a72e45 100644 --- a/base/web/count.go +++ b/base/web/count.go @@ -22,19 +22,19 @@ func _count_stat(m *ice.Message, arg ...string) map[string]int { 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) { stat[agent] += count return } } - for _, agent := range []string{"Edg", "Chrome", "Safari", "MSIE", "Firefox"} { + for _, agent := range html.AgentList { if strings.Contains(value[mdb.TEXT], agent) { stat[agent] += count break } } - for _, agent := range []string{"Android", "iPhone", "Mac", "Linux", "Windows"} { + for _, agent := range html.SystemList { if strings.Contains(value[mdb.TEXT], agent) { stat[agent] += count break @@ -66,7 +66,7 @@ func init() { }) 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{} list := map[string]map[string]string{} m.Cmd("", mdb.VALID).Table(func(value ice.Maps) { diff --git a/base/web/dream.go b/base/web/dream.go index 02b85351..a82cbf41 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -61,6 +61,22 @@ func _dream_list(m *ice.Message) *ice.Message { }) 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 { if m.IsCliUA() { return m @@ -95,7 +111,7 @@ func _dream_more_list(m *ice.Message) *ice.Message { return m } func _dream_start(m *ice.Message, name string) { - if m.Warn(name == "", ice.ErrNotValid, mdb.NAME) { + if m.WarnNotValid(name == "", mdb.NAME) { return } 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, "") 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.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)) @@ -168,9 +184,9 @@ const ( ALWAYS = "always" STARTALL = "startall" STOPALL = "stopall" + PUBLISH = "publish" FOR_EACH = "forEach" FOR_FLOW = "forFlow" - PUBLISH = "publish" DREAM_CREATE = "dream.create" DREAM_REMOVE = "dream.remove" @@ -189,9 +205,7 @@ const DREAM = "dream" func init() { Index.MergeCommands(ice.Commands{ DREAM: {Name: "dream refresh", Help: "梦想家", Icon: "Launchpad.png", Role: aaa.VOID, Meta: kit.Dict( - ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict( - WORKER, "空间", SERVER, "机器", MASTER, "服务", - )), + ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(WORKER, "空间", SERVER, "机器", MASTER, "服务")), ), Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m = m.Spawn() @@ -284,8 +298,8 @@ func init() { }) }}, 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") != "" + 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 { if compile && nfs.Exists(m, path.Join(p, ice.SRC_MAIN_GO)) { return false @@ -362,14 +376,14 @@ func init() { gdb.Event(m, DREAM_TRASH, arg) nfs.Trash(m, path.Join(ice.USR_LOCAL_WORK, 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))) - }}, - "send": {Name: "send space*", Hand: func(m *ice.Message, arg ...string) { + tcp.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, cli.START, m.OptionSimple(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) { 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) { switch m.Option(mdb.TYPE) { case WORKER: - m.PushButton("send", OPEN) + m.PushButton(tcp.SEND, OPEN) default: m.PushButton(OPEN) } @@ -408,20 +422,8 @@ func init() { html.BUTTON, kit.JoinWord(PORTAL, ADMIN, DESKTOP, WIKI_WORD, STATUS, VIMER, XTERM, COMPILE), )), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { - _dream_list(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 - }) + _dream_list(m) + _dream_list_icon(m) _dream_more_list(m) stat := map[string]int{} 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 { reg, err := regexp.Compile(name) - if m.Warn(err) { + if m.WarnNotValid(err) { return m } list := []string{} @@ -488,7 +490,7 @@ func DreamEach(m *ice.Message, name string, status string, cb func(string)) *ice return m } 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) { aaa.White(m, kit.Keys(DREAM, ctx.ACTION, m.CommandKey())) diff --git a/base/web/html/html.go b/base/web/html/html.go index 112cef8a..d7d1250a 100644 --- a/base/web/html/html.go +++ b/base/web/html/html.go @@ -7,8 +7,23 @@ import ( ) 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" + XForwardedFor = "X-Forwarded-For" + XHost = "X-Host" Referer = "Referer" Authorization = "Authorization" Bearer = "Bearer" @@ -18,8 +33,6 @@ const ( ContentEncoding = "Content-Encoding" ContentLength = "Content-Length" ContentType = "Content-Type" - XForwardedFor = "X-Forwarded-For" - XHost = "X-Host" ApplicationForm = "application/x-www-form-urlencoded" ApplicationOctet = "application/octet-stream" @@ -36,9 +49,8 @@ const ( WIDTH = "width" HEIGHT = "height" - BACKGROUND_COLOR = "background-color" - - COLOR = "color" + BG_COLOR = "background-color" + FG_COLOR = "color" ) const ( DARK = "dark" @@ -98,5 +110,22 @@ func FormatA(inner string, arg ...string) string { return kit.Format(`%s`, kit.Select(inner, arg, 0), inner) } 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", } diff --git a/base/web/option.go b/base/web/option.go index 56644691..d9a51ef1 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -15,7 +15,7 @@ import ( "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)) } 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) } } -func AgentIs(m ice.IMessage, arg ...string) bool { +func AgentIs(m *ice.Message, arg ...string) bool { for _, k := range arg { if strings.HasPrefix(strings.ToLower(m.Option(ice.MSG_USERUA)), k) { 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 PushNoticeToast(m *ice.Message, arg ...ice.Any) { PushNotice(m, kit.List("toast", arg)...) } func PushNoticeGrow(m *ice.Message, arg ...ice.Any) { - m.StatusTimeCount() - PushNotice(m, kit.List("grow", arg)...) + PushNotice(m.StatusTimeCount(), kit.List("grow", arg)...) } func PushNoticeRich(m *ice.Message, arg ...ice.Any) { - m.StatusTimeCount() - PushNotice(m, kit.Simple("rich", arg)) + PushNotice(m.StatusTimeCount(), kit.Simple("rich", arg)) } 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)) @@ -129,10 +127,10 @@ func toastContent(m *ice.Message, state string, arg ...ice.Any) string { } } 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) { - 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) { 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 { 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) } else { icon = Icons[ice.SUCCESS] - m.Option(ice.TOAST_DURATION, "1s") + m.Option(ice.TOAST_DURATION, cli.TIME_3s) toast(ice.SUCCESS, _total, _total) } m.Sleep(m.Option(ice.TOAST_DURATION)) diff --git a/base/web/render.go b/base/web/render.go index 8f13428d..2855bcc8 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -24,8 +24,8 @@ const ( COOKIE = "cookie" REQUEST = "request" RESPONSE = "response" - TITLE = "title" CONTENT = "content" + TITLE = "title" ) 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) { RenderHeader(w, "Access-Control-Allow-Origin", origin) } -func RenderHeader(w http.ResponseWriter, key, value string) { - w.Header().Set(key, value) -} +func RenderHeader(w http.ResponseWriter, key, value string) { w.Header().Set(key, value) } func RenderStatus(w http.ResponseWriter, code int, text string) { w.WriteHeader(code) w.Write([]byte(text)) } -func RenderRedirect(m *ice.Message, arg ...ice.Any) { - 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 RenderRedirect(m *ice.Message, arg ...ice.Any) { 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 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)) } @@ -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))) } } -func RenderCmd(m *ice.Message, cmd string, arg ...ice.Any) { - RenderPodCmd(m, "", cmd, arg...) -} +func RenderCmd(m *ice.Message, cmd string, arg ...ice.Any) { RenderPodCmd(m, "", cmd, arg...) } func RenderVersion(m *ice.Message) string { if ice.Info.Make.Hash == "" { @@ -191,6 +181,8 @@ const ( CHAT_FAVOR = "web.chat.favor" CHAT_FLOWS = "web.chat.flows" CHAT_GRANT = "web.chat.grant" + CHAT_POD = "web.chat.pod" + CHAT_CMD = "web.chat.cmd" TEAM_PLAN = "web.team.plan" PLUGIN_XTERM = "/plugin/local/code/xterm.js" diff --git a/base/web/route.go b/base/web/route.go index c628bad3..f666a1df 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -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)) { reg, err := regexp.Compile(space) - if m.Warn(err) { + if m.WarnNotValid(err) { return } res := []ice.Maps{} @@ -88,9 +88,6 @@ func init() { func() { defer ToastProcess(m)(); m.Sleep3s() }() 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) { kit.For(kit.Split(m.OptionDefault(ice.MSG_FIELDS, mdb.Config(m, mdb.FIELD))), func(key string) { switch key { @@ -129,6 +126,9 @@ func init() { PushPodCmd(m, "", m.ActionKey()) 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) { m.Cmd("", func(value ice.Maps) { kit.If(value[mdb.STATUS] == OFFLINE, func() { mdb.HashRemove(m, SPACE, value[SPACE]) }) diff --git a/base/web/serve.go b/base/web/serve.go index 7984d4d5..ffc9dfba 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -23,11 +23,11 @@ import ( "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) { 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)) }) - 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.Cmd(SPIDE, ice.OPS, _serve_address(m)+"/exit", ice.Maps{CLIENT_TIMEOUT: cli.TIME_30ms, ice.LOG_DISABLE: ice.TRUE}) }).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)) } 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), - ParseLink(m, kit.Select(r.URL.String(), r.Referer()))) + 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()))) if path.Join(r.URL.Path) == nfs.PS { if Render(RenderMain(msg), msg.Option(ice.MSG_OUTPUT), kit.List(msg.Optionv(ice.MSG_ARGS))...) { 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) { 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) { - 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) } 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) @@ -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) })) 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 } m.ActionHand(cmd, key, cmds[1], cmds[2:]...) @@ -213,7 +212,7 @@ const SERVE = "serve" func init() { Index.MergeCommands(ice.Commands{P(ice.EXIT): {Hand: func(m *ice.Message, arg ...string) { m.Cmd(ice.EXIT) }}, - SERVE: {Name: "serve 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.MAIN: {Name: "main index", Help: "首页", Hand: func(m *ice.Message, arg ...string) { if m.Option(ctx.INDEX) == "" { @@ -222,16 +221,7 @@ func init() { mdb.Config(m, ice.MAIN, C(m.Option(ctx.INDEX)+nfs.PS)) } }}, - log.TRACEID: {Help: "日志", Hand: func(m *ice.Message, arg ...string) { - 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`) - }) - }}, + tcp.HOST: {Help: "公网", Hand: func(m *ice.Message, arg ...string) { m.Echo(kit.Formats(PublicIP(m))) }}, 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) }}, 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) { - 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) { @@ -267,21 +257,18 @@ func init() { }) } -func Domain(host, port string) string { - return kit.Format("%s://%s:%s", HTTP, host, port) -} -func Script(m *ice.Message, str string, arg ...ice.Any) string { - return ice.Render(m, ice.RENDER_SCRIPT, kit.Format(str, arg...)) +func IsLocalHost(m *ice.Message) bool { + return (m.R == nil || m.R.Header.Get(html.XForwardedFor) == "") && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) } func ParseUA(m *ice.Message) (res []string) { 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) { res = append(res, cli.SYSTEM, p) 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) { res = append(res, AGENT, p, mdb.ICONS, agentIcons[p]) break @@ -289,6 +276,9 @@ func ParseUA(m *ice.Message) (res []string) { } 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 { return m.MergePodCmd("", kit.Select(m.PrefixKey(), path.Join(arg...))) } @@ -300,6 +290,3 @@ func RequireFile(m *ice.Message, file string) string { } 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)) -} diff --git a/base/web/share.go b/base/web/share.go index 4f4fdcd4..0d08e6bb 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -39,12 +39,12 @@ func _share_cache(m *ice.Message, arg ...string) { } } func _share_proxy(m *ice.Message) { - if m.Warn(m.Option(SHARE) == "", ice.ErrNotValid) { + if m.WarnNotValid(m.Option(SHARE) == "") { return } msg := m.Cmd(SHARE, 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 } 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() }}, 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) { 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) { - if m.Warn(len(arg) == 0 || arg[0] == "", ice.ErrNotValid, SHARE) { + if m.WarnNotValid(len(arg) == 0 || arg[0] == "", SHARE) { return } 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) { - 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) } }}, @@ -137,13 +137,13 @@ func init() { }) } 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 { 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 } - if m.Warn(msg.Append(mdb.NAME) == "") { + if m.WarnNotValid(msg.Append(mdb.NAME) == "") { return true } return false @@ -162,7 +162,7 @@ func ShareLocalFile(m *ice.Message, arg ...string) { p := path.Join(arg...) switch ls := strings.Split(p, nfs.PS); ls[0] { 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 } default: @@ -180,6 +180,15 @@ func ShareLocalFile(m *ice.Message, arg ...string) { 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 { pp := path.Join(ice.VAR_PROXY, pod, p) 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) 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))))) -} diff --git a/base/web/space.go b/base/web/space.go index cf5d5910..5024cc1b 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -40,7 +40,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { for i := 1; i < _c; i++ { next := time.Duration(rand.Intn(a*(i+1))+b*i) * time.Millisecond 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))() kit.If(ice.Info.Colors, func() { once.Do(func() { m.Go(func() { _space_qrcode(m, dev) }) }) }) _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)) } -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) { 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) @@ -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 = 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)...) - 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() { defer mdb.HashCreateDeferRemove(m, args, kit.Dict(mdb.TARGET, c))() 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) }, strings.Join(kit.Simple(SPACE, name, msg.Detailv()), lex.SP)) } 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) { case (*websocket.Conn): // 转发报文 _space_echo(msg, source, target, c) case ice.Handler: // 接收响应 msg.Go(func() { c(msg) }) } - }), ice.ErrNotFound, next) + }), next) } } } @@ -175,7 +159,7 @@ func _space_domain(m *ice.Message) (link string) { return "" }, 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) { @@ -183,7 +167,7 @@ func _space_exec(m *ice.Message, name string, source, target []string, c *websoc case cli.PWD: 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.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))) 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) } func _space_echo(m *ice.Message, source, target []string, c *websocket.Conn) { - defer func() { m.Warn(recover()) }() - if m.Options(ice.MSG_SOURCE, source, ice.MSG_TARGET, target[1:]); !m.Warn(c.WriteMessage(1, []byte(m.FormatMeta()))) { + defer func() { m.WarnNotValid(recover()) }() + if m.Options(ice.MSG_SOURCE, source, ice.MSG_TARGET, target[1:]); !m.WarnNotValid(c.WriteMessage(1, []byte(m.FormatMeta()))) { if source != 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) } 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() { 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() { - 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 { - m.Warn(!wait(), "time out") + m.WarnNotValid(!wait(), "time out") } return } @@ -261,77 +245,9 @@ const ( const SPACE = "space" 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{ - "s": {Help: "空间", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.chat.pod", arg) }}, - "c": {Help: "命令", Actions: ApiWhiteAction(), Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.chat.cmd", 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(CHAT_CMD, arg) }}, 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.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...) }}, - cli.CLOSE: {Hand: func(m *ice.Message, arg ...string) { - mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) - }}, + cli.CLOSE: {Hand: func(m *ice.Message, arg ...string) { mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) }}, mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { defer ToastProcess(m)() mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) - m.Cmd("", m.Option(mdb.NAME), ice.EXIT) - m.Sleep3s() + m.Cmd("", m.Option(mdb.NAME), ice.EXIT).Sleep3s() }}, DOMAIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_space_domain(m)) }}, LOGIN: {Help: "授权", Hand: func(m *ice.Message, arg ...string) { @@ -380,7 +293,7 @@ func init() { OPEN: {Hand: func(m *ice.Message, arg ...string) { switch m.Option(mdb.TYPE) { 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: 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) }) 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] != "" { - m.Push(mdb.STATUS, value[mdb.STATUS]) - m.Push(aaa.UA, value[aaa.UA]) + m.Push(mdb.STATUS, value[mdb.STATUS]).Push(aaa.UA, value[aaa.UA]) } if kit.IsIn(value[mdb.TYPE], WEIXIN, PORTAL) && value[mdb.NAME] != html.CHROME { 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 { if arg == nil || arg == "" { diff --git a/base/web/spide.go b/base/web/spide.go index 0a966ff0..33de0b9b 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -25,13 +25,12 @@ import ( ) 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()) m.Logs(mdb.INSERT, SPIDE, name, LINK, link) mdb.HashSelectUpdate(m, mdb.HashCreate(m, CLIENT_NAME, name), func(value ice.Map) { value[mdb.ICONS] = icons - value[SPIDE_CLIENT] = kit.Dict( - mdb.NAME, name, mdb.TYPE, types, + value[SPIDE_CLIENT] = kit.Dict(mdb.NAME, name, mdb.TYPE, types, 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", ) @@ -55,7 +54,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) { } _uri := kit.MergeURL2(msg.Append(CLIENT_URL), uri, arg) req, e := http.NewRequest(method, _uri, body) - if m.Warn(e, ice.ErrNotValid, uri) { + if m.WarnNotValid(e, uri) { return } 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) }) } 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 } 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 { m.Logs(RESPONSE, k, v) } - m.Options(k, v) - if action != SPIDE_RAW { + if m.Options(k, v); action != SPIDE_RAW { 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 { case http.StatusNotFound, http.StatusUnauthorized: 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] { case SPIDE_FORM: 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(_data) + head[html.ContentType], body = html.ApplicationForm, bytes.NewBufferString(kit.JoinQuery(arg[1:]...)) case SPIDE_PART: head[html.ContentType], body = _spide_part(m, arg...) case SPIDE_FILE: @@ -132,8 +129,7 @@ func _spide_body(m *ice.Message, method string, arg ...string) (io.Reader, ice.M default: data := ice.Map{} kit.For(arg, func(k, v string) { kit.Value(data, k, v) }) - _data := kit.Format(data) - head[html.ContentType], body = html.ApplicationJSON, bytes.NewBufferString(_data) + head[html.ContentType], body = html.ApplicationJSON, bytes.NewBufferString(kit.Format(data)) } 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 { size = kit.Int64(arg[i+1]) } 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 } } else if strings.HasPrefix(arg[i+1], mdb.AT) { 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) { m.Option("spide.break", ice.TRUE) 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) } - 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() - if p, e := mp.CreateFormFile(arg[i], path.Base(p)); !m.Warn(e, ice.ErrNotValid, arg[i+1]) { - if n, e := io.Copy(p, f); !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.WarnNotValid(e, arg[i+1]) { 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 { case SPIDE_RAW: - if b, _ := ioutil.ReadAll(res.Body); strings.HasPrefix(res.Header.Get(html.ContentType), html.ApplicationJSON) { - // m.Echo(kit.Formats(kit.UnMarshal(string(b)))) - m.Echo(string(b)) - } else { - m.Echo(string(b)) - } + b, _ := ioutil.ReadAll(res.Body) + m.Echo(string(b)) case SPIDE_MSG: var data map[string][]string 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)) default: 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 { m.Push("", kit.KeyValue(ice.Map{}, "", m.Optionv(SPIDE_RES, data))) } else { @@ -272,48 +264,15 @@ const ( ) var agentIcons = map[string]string{ - "Safari": "usr/icons/Safari.png", - "Chrome": "usr/icons/Chrome.png", - "Edg": "usr/icons/Edg.png", - "MicroMessenger": "usr/icons/wechat.png", + html.Safari: "usr/icons/Safari.png", + html.Chrome: "usr/icons/Chrome.png", + html.Edg: "usr/icons/Edg.png", + html.MicroMessenger: "usr/icons/wechat.png", } const SPIDE = "spide" 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{ // 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( @@ -397,17 +356,14 @@ func init() { }}, 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) { - m.Cmd(SPACE, tcp.DIAL, ice.DEV, m.Option(CLIENT_NAME), m.OptionSimple(TOKEN)) - m.Sleep300ms() + m.Cmd(SPACE, tcp.DIAL, ice.DEV, m.Option(CLIENT_NAME), m.OptionSimple(TOKEN)).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) { if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") { list := m.CmdMap(SPACE, mdb.NAME) 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 { - if key == CLIENT_URL { - value = kit.MergeURL(value, m.OptionSimple(ice.MSG_DEBUG)) - } + kit.If(key == CLIENT_URL, func() { value = kit.MergeURL(value, m.OptionSimple(ice.MSG_DEBUG)) }) return value }) 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:])))) }}, }) + 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 { @@ -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 { return m.Cmd(Prefix(SPIDE), ice.DEV, SPIDE_CACHE, http.MethodGet, link) } -func SpideOrigin(m *ice.Message, name string) string { - return m.Cmdv(SPIDE, name, CLIENT_ORIGIN) -} -func SpideURL(m *ice.Message, name string) string { - return m.Cmdv(SPIDE, name, CLIENT_URL) -} +func SpideOrigin(m *ice.Message, name string) string { return m.Cmdv(SPIDE, name, CLIENT_ORIGIN) } +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 { if m.IsMetaKey() || m.IsMobileUA() { - return m.ProcessOpen(link) + m.ProcessOpen(link) + return m } if !kit.HasPrefixList(arg, ctx.RUN) { defer m.Push(TITLE, title) diff --git a/base/web/stats.go b/base/web/stats.go index 3b6e4d6c..ba279afb 100644 --- a/base/web/stats.go +++ b/base/web/stats.go @@ -20,6 +20,8 @@ func init() { STATS: {Help: "汇总量", Hand: func(m *ice.Message, arg ...string) { defer ctx.DisplayStory(m, "") if m.Option(ice.MSG_USERPOD) == "" { + PushStats(m, "", "", "", "共享总数", SHARE) + PushStats(m, "", "", "", "令牌总数", TOKEN) PushStats(m, "", "", "", "注册总数", aaa.APPLY) PushStats(m, "", "", "", "邀请总数", aaa.OFFER) if ice.Info.Username == ice.Info.Make.Username { @@ -29,8 +31,6 @@ func init() { } PushStats(m, "", "", "", "会话总数", aaa.SESS) PushStats(m, "", m.Cmd(mdb.SELECT, aaa.ROLE, "", mdb.HASH).Length(), "", "角色总数", aaa.ROLE) - PushStats(m, "", "", "", "令牌总数", TOKEN) - PushStats(m, "", "", "", "共享总数", SHARE) PushStats(m, "", "", "", "命令总数", ctx.COMMAND) } gdb.Event(m, STATS_TABLES) diff --git a/base/web/store.go b/base/web/store.go index 30f1d61f..5d734f0b 100644 --- a/base/web/store.go +++ b/base/web/store.go @@ -43,7 +43,7 @@ func init() { PORTAL: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) { ProcessIframe(m, m.Option(mdb.NAME), m.Option(ORIGIN)+S(m.Option(mdb.NAME))+C(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) { m.Cmdy(DREAM, arg) return @@ -55,17 +55,16 @@ func init() { if ice.Info.NodeType == WORKER || !aaa.IsTechOrRoot(m) { m.Action() } else { - m.Action(html.FILTER, mdb.CREATE) - m.PushAction(mdb.REMOVE) + m.PushAction(mdb.REMOVE).Action(html.FILTER, mdb.CREATE) } } else { if arg[0] == ice.OPS && ice.Info.NodeType == SERVER { m.Cmdy(DREAM) return } - defer ToastProcess(m, "查询中,请稍候")("查询成功") + defer ToastProcess(m, m.Trans("querying, please wait", "查询中,请稍候"))(m.Trans("query succsess", "查询成功")) 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) 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 { diff --git a/base/web/token.go b/base/web/token.go index 34a0adb7..ea0227cb 100644 --- a/base/web/token.go +++ b/base/web/token.go @@ -37,11 +37,10 @@ func DevTokenAction(name, origin string) ice.Actions { )) }}, mdb.DEV_CHOOSE: {Hand: func(m *ice.Message, arg ...string) { - 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.EchoInfoButton(kit.JoinWord(m.PrefixKey(), 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) { - 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.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) }}, 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) }) mdb.HashModify(m, m.OptionSimple(name, TOKEN)) m.Cmdy("", DEV_CREATE_TOKEN).ProcessClose() diff --git a/base/web/web.go b/base/web/web.go index 14395810..b71976f0 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -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) { defer mdb.HashCreateDeferRemove(m, m.OptionSimple(mdb.NAME, tcp.PROTO), arg, cli.STATUS, tcp.START)() 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) }) } diff --git a/conf.go b/conf.go index 7f9e031d..4ded58bf 100644 --- a/conf.go +++ b/conf.go @@ -56,8 +56,8 @@ const ( const ( // REPOS CONTEXTS = "contexts" INTSHELL = "intshell" - VOLCANOS = "volcanos" LEARNING = "learning" + VOLCANOS = "volcanos" TOOLKITS = "toolkits" ICEBERGS = "icebergs" RELEASE = "release" @@ -117,15 +117,15 @@ const ( // DIR USR_REQUIRE = "usr/require/" USR_PUBLISH = "usr/publish/" USR_INTSHELL = "usr/intshell/" - USR_VOLCANOS = "usr/volcanos/" USR_LEARNING = "usr/learning/" + USR_VOLCANOS = "usr/volcanos/" USR_TOOLKITS = "usr/toolkits/" USR_ICEBERGS = "usr/icebergs/" USR_RELEASE = "usr/release/" - USR_ICONS = "usr/icons/" USR_PROGRAM = "usr/program/" USR_GEOAREA = "usr/geoarea/" USR_PORTAL = "usr/portal/" + USR_ICONS = "usr/icons/" USR_LOCAL = "usr/local/" USR_LOCAL_GO = "usr/local/go/" @@ -242,17 +242,16 @@ const ( // MSG TABLE_CHECKBOX = "table.checkbox" TOAST_DURATION = "toast.duration" - TCP_DOMAIN = "tcp_domain" ) const ( // RENDER RENDER_BUTTON = "_button" RENDER_ANCHOR = "_anchor" RENDER_QRCODE = "_qrcode" + RENDER_SCRIPT = "_script" RENDER_IMAGES = "_images" RENDER_VIDEOS = "_videos" RENDER_AUDIOS = "_audios" RENDER_IFRAME = "_iframe" - RENDER_SCRIPT = "_script" RENDER_STATUS = "_status" RENDER_REDIRECT = "_redirect" @@ -298,11 +297,11 @@ const ( // CTX CTX_CLOSE = "close" CTX_INIT = "_init" - CTX_OPEN = "_open" CTX_EXIT = "_exit" - CTX_ICONS = "_icons" - CTX_TRANS = "_trans" + CTX_OPEN = "_open" CTX_TITLE = "_title" + CTX_TRANS = "_trans" + CTX_ICONS = "_icons" ) const ( // LOG LOG_CMDS = "cmds" @@ -319,8 +318,8 @@ const ( // Err ErrNotLogin = "not login: " ErrNotRight = "not right: " ErrNotAllow = "not allow: " - ErrNotValid = "not valid: " ErrNotFound = "not found: " + ErrNotValid = "not valid: " ErrNotStart = "not start: " ErrAlreadyExists = "already exists: " @@ -340,8 +339,8 @@ const ( // mdb SELECT = "select" KEY = "key" - FIELD = "field" VALUE = "value" + FIELD = "field" EXTRA = "extra" META = "meta" TIME = "time" @@ -355,8 +354,8 @@ const ( // web SERVE = "serve" SPACE = "space" - THEME = "theme" TITLE = "title" + THEME = "theme" ) const ( // gdb EVENT = "event" @@ -390,5 +389,6 @@ const ( // ice LOG = "log" ) const ( // env - LOG_TRACE = "log_trace" + LOG_TRACE = "log_trace" + TCP_DOMAIN = "tcp_domain" ) diff --git a/core/chat/action.go b/core/chat/action.go index 0143be10..87397db9 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -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) { 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] != "" { m.Option(ice.POD, value[web.SPACE]) } - }).Length() == 0, ice.ErrNotRight, index, arg) { + }).Length() == 0, index, arg) { return } 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) { 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, "") return msg } @@ -69,14 +69,11 @@ func init() { }}, 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) { - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) { + if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "", arg) { return - } else if m.Warn(!_river_right(m, arg[0]), ice.ErrNotRight, arg) { + } else if m.WarnNotRight(!_river_right(m, arg[0]), arg) { 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 { ctx.OptionFromConfig(m, MENUS) _action_list(m, arg[0], arg[1]) diff --git a/core/chat/grant.go b/core/chat/grant.go index 3c0bff7d..19abc95b 100644 --- a/core/chat/grant.go +++ b/core/chat/grant.go @@ -1,6 +1,8 @@ package chat import ( + "net/http" + ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" "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)) }}, aaa.CONFIRM: {Help: "授权", Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) { - // if m.Warn(m.R.Method == http.MethodGet, ice.ErrNotAllow) { - // return - // } else - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) || m.Warn(m.Option(web.SPACE) == "", ice.ErrNotValid, web.SPACE) { + if m.WarnNotAllow(m.R.Method == http.MethodGet) { 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 } else { web.RenderCookie(m, aaa.SessValid(m)) @@ -50,7 +51,7 @@ func init() { }, gdb.EventsAction(web.SPACE_LOGIN)), Hand: func(m *ice.Message, arg ...string) { msg := m.Cmd(web.SPACE, m.Option(web.SPACE, arg[0])) 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() { m.OptionFields(mdb.DETAIL) m.Push(web.SPACE, arg[0]) diff --git a/core/chat/header.go b/core/chat/header.go index 638cf412..05e7f6f6 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -17,18 +17,18 @@ import ( ) 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 - } else if m.Warn(m.Option(web.SHARE) != "", ice.ErrNotRight, "没有权限") { + } else if m.WarnNotRight(m.Option(web.SHARE) != "", "没有权限") { return } else { 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) { - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, "没有登录") { + if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "", "没有登录") { return - } else if m.Warn(m.Option(web.SHARE) != "", ice.ErrNotRight, "没有权限") { + } else if m.WarnNotRight(m.Option(web.SHARE) != "", "没有权限") { return } 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) diff --git a/core/chat/location/tmap.go b/core/chat/location/tmap.go index 7f6f747c..430e3207 100644 --- a/core/chat/location/tmap.go +++ b/core/chat/location/tmap.go @@ -24,7 +24,7 @@ func init() { 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 { 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)) return res })) diff --git a/core/chat/oauth/client.go b/core/chat/oauth/client.go index 3f7a68e0..b202168e 100644 --- a/core/chat/oauth/client.go +++ b/core/chat/oauth/client.go @@ -112,13 +112,13 @@ func (s Client) List(m *ice.Message, arg ...string) { func init() { ice.ChatCtxCmd(Client{}) } 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) }) 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))))) 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)) web.RenderCookie(m.Message, aaa.SessCreate(m.Message, m.Option(aaa.USERNAME))) m.ProcessHistory() @@ -129,13 +129,13 @@ func (s Client) Login(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) }) 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))))) 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)) web.RenderCookie(m.Message, aaa.SessCreate(m.Message, m.Option(aaa.USERNAME))) m.ProcessHistory() diff --git a/core/chat/river.go b/core/chat/river.go index 6a2c2a9c..12d3a59b 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -47,7 +47,7 @@ func init() { 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) { - 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 } else if len(arg) == 0 { _river_list(m) diff --git a/core/chat/sso.go b/core/chat/sso.go index 8d13214b..6273b35a 100644 --- a/core/chat/sso.go +++ b/core/chat/sso.go @@ -18,7 +18,7 @@ const SSO = "sso" func init() { Index.MergeCommands(ice.Commands{ 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) return } diff --git a/core/code/autogen.go b/core/code/autogen.go index 56f4f206..8cb13457 100644 --- a/core/code/autogen.go +++ b/core/code/autogen.go @@ -135,7 +135,7 @@ func init() { 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) { - if m.Warn(!nfs.Exists(m, kit.Path(".git")), ice.ErrNotValid, "未初始化代码库") { + if m.WarnNotFound(!nfs.Exists(m, kit.Path(".git")), "未初始化代码库") { return } m.OptionDefault(mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME)) diff --git a/core/code/binpack.go b/core/code/binpack.go index 3e1ce893..e4577fac 100644 --- a/core/code/binpack.go +++ b/core/code/binpack.go @@ -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), "") 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() - if b, e := ioutil.ReadAll(f); !m.Warn(e, ice.ErrNotValid, arg[0]) { - kit.If(len(b) > 1<<20, func() { m.Warn("too large %s %s", arg[0], len(b)) }) + if b, e := ioutil.ReadAll(f); !m.WarnNotValid(e, arg[0]) { + 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)) } } diff --git a/core/code/install.go b/core/code/install.go index 67bf7d6d..4d77b9e7 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -174,7 +174,7 @@ func init() { 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) { 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) } else { web.ToastSuccess(m) @@ -225,7 +225,7 @@ func InstallAction(args ...ice.Any) ice.Actions { nfs.Trash(m, m.Option(nfs.PATH)) }}, 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) }}, } } diff --git a/core/code/xterm.go b/core/code/xterm.go index 7d3eeb8d..16df1ee5 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -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]) 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:]...) - if m.Warn(e) { + if m.WarnNotValid(e) { return nil } m.Go(func() { @@ -37,7 +37,7 @@ func _xterm_get(m *ice.Message, h string) xterm.XTerm { defer mdb.HashRemove(m, mdb.HASH, h) buf := make([]byte, ice.MOD_BUFS) 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 { kit.If(text[0], func(cmd string) { m.GoSleep300ms(func() { term.Write([]byte(cmd + lex.NL)) }) }) text = text[1:] @@ -115,7 +115,7 @@ func init() { _xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80")) }}, 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) } }}, diff --git a/core/wiki/chart.go b/core/wiki/chart.go index f6063922..9839f75d 100644 --- a/core/wiki/chart.go +++ b/core/wiki/chart.go @@ -124,7 +124,7 @@ func formatStyle(arg ...string) string { } var transKey = map[string]string{ - BG: html.BACKGROUND_COLOR, FG: html.COLOR, + BG: html.BG_COLOR, FG: html.FG_COLOR, } const ( diff --git a/core/wiki/chart/block.go b/core/wiki/chart/block.go index 8dd14ff7..bcb47cc7 100644 --- a/core/wiki/chart/block.go +++ b/core/wiki/chart/block.go @@ -1,8 +1,6 @@ package chart import ( - "strings" - ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/core/wiki" @@ -51,7 +49,7 @@ func (b *Block) Data(m *ice.Message, meta ice.Any) wiki.Chart { return b } 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 { item := wiki.NewItem(`").Dump(m) diff --git a/core/wiki/field.go b/core/wiki/field.go index c64e2bb5..c4e63585 100644 --- a/core/wiki/field.go +++ b/core/wiki/field.go @@ -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) 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 } kit.For(arg, func(k, v string) { diff --git a/core/wiki/table.go b/core/wiki/table.go index 2e740f8e..06ea6897 100644 --- a/core/wiki/table.go +++ b/core/wiki/table.go @@ -53,9 +53,9 @@ func transArgKey(arg []string) []string { for i := 0; i < len(arg)-1; i += 2 { switch arg[i] { case BG: - arg[i] = html.BACKGROUND_COLOR + arg[i] = html.BG_COLOR case FG: - arg[i] = html.COLOR + arg[i] = html.FG_COLOR } } return arg diff --git a/data.go b/data.go index 8d02d6c6..b0f5f478 100644 --- a/data.go +++ b/data.go @@ -9,11 +9,8 @@ import ( ) func (m *Message) ActionKey() string { - if action := strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS); kit.IsIn(action, LIST, SELECT) { - return "" - } else { - return action - } + action := strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS) + return kit.Select("", action, !kit.IsIn(action, LIST, SELECT)) } func (m *Message) CommandKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS) } func (m *Message) PrefixKey() string { return m.Prefix(m.CommandKey()) } diff --git a/exec.go b/exec.go index 167d6d42..ef1101a6 100644 --- a/exec.go +++ b/exec.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" "shylinux.com/x/toolkits/logs" "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]) }) task.Put(meta, nil, func(task *task.Task) { m.TryCatch(true, func(m *Message) { - m.Option("task.id", kit.Format(task.TaskId())) m.Option("work.id", kit.Format(task.WorkId())) + m.Option("task.id", kit.Format(task.TaskId())) 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 { msg, list := m._command(arg), []string{} 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)) } @@ -130,7 +131,7 @@ func (m *Message) CmdHand(cmd *Command, key string, arg ...string) *Message { return m } 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 @@ -191,7 +192,7 @@ func (m *Message) _command(arg ...Any) *Message { run(m.Spawn(s), s, cmd, key, list[1:]...) }) } - m.Warn(!ok, ErrNotFound, kit.Format(list)) + m.WarnNotFound(!ok, kit.Format(list)) return m } 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]) }) - 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 } } diff --git a/info.go b/info.go index 76e09f1d..7498b035 100644 --- a/info.go +++ b/info.go @@ -1,7 +1,6 @@ package ice import ( - "io" "os" "path" "reflect" @@ -9,7 +8,6 @@ import ( "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" - "shylinux.com/x/toolkits/miss" ) type MakeInfo struct { @@ -30,46 +28,44 @@ type MakeInfo struct { When string Message string - Module string System string Domain string + Module string } func (s MakeInfo) Versions() string { if s.Hash == "" { return "" - } - if s.Version == "" { + } else if s.Version == "" { return s.Hash[:6] - } - if kit.IsIn(s.Forword, "", "0") { + } else if kit.IsIn(s.Forword, "", "0") { 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 { Make MakeInfo - Hash string - Size string Time string + Size string + Hash string Username string Hostname string Pathname string - PidPath string - CtxRoot string - Traceid string - Colors bool - Pwd string + NodeName string + NodeType string + Pwd string Lang string System string Domain string - NodeType string - NodeName string + PidPath string + Traceid string Localhost bool Important bool + Colors bool File Maps Gomod Maps @@ -83,11 +79,11 @@ var Info = struct { PushStream func(m *Message) *Message 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 - AdminCmd func(m *Message, cmd string, arg ...string) *Message Save 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) }{ Localhost: true, @@ -99,28 +95,15 @@ var Info = struct { render: map[string]func(*Message, ...Any) string{}, 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() { - Info.Pwd = kit.Path("") - Info.CtxRoot = kit.Env("ctx_root") - Info.Traceid = os.Getenv(LOG_TRACE) -} -func AddMergeAction(h ...Any) { - Info.merges = append(Info.merges, h...) -} +func init() { Info.Pwd = kit.Path(""); Info.Traceid = os.Getenv(LOG_TRACE) } + +func AddMergeAction(h ...Any) { Info.merges = append(Info.merges, h...) } func MergeHand(hand ...Handler) Handler { if len(hand) == 0 { return nil - } - if len(hand) == 1 { + } else if len(hand) == 1 { return hand[0] } 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 }) }(k) } @@ -321,7 +303,6 @@ func (m *Message) FileURI(dir string) string { if strings.HasPrefix(dir, USR_VOLCANOS) { return strings.TrimPrefix(dir, USR) } else { - what := kit.MergeURL(path.Join(PS, REQUIRE, dir), POD, m.Option(MSG_USERPOD)) - return what + return kit.MergeURL(path.Join(PS, REQUIRE, dir), POD, m.Option(MSG_USERPOD)) } } diff --git a/init.go b/init.go index 954d1bb0..fb273a51 100644 --- a/init.go +++ b/init.go @@ -42,8 +42,8 @@ func (s *Frame) Close(m *Message, arg ...string) { const ( INIT = "init" - EXIT = "exit" QUIT = "quit" + EXIT = "exit" ) var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{ @@ -82,15 +82,16 @@ var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{ }) }}, }, server: &Frame{}} + var Pulse = &Message{_meta: map[string][]string{}, _data: Map{}, source: Index, target: Index} func init() { + logs.Disable(true) switch tz := os.Getenv("TZ"); tz { case "", "Asia/Beijing", "Asia/Shanghai": time.Local = time.FixedZone(tz, 28800) } Index.root, Pulse.root, Pulse.time = Index, Pulse, time.Now() - logs.Disable(true) } func Run(arg ...string) string { diff --git a/logs.go b/logs.go index a1db1b21..fdd35bd5 100644 --- a/logs.go +++ b/logs.go @@ -125,23 +125,29 @@ func (m *Message) Warn(err Any, arg ...Any) bool { ErrNotLogin: http.StatusUnauthorized, ErrNotRight: http.StatusForbidden, ErrNotAllow: http.StatusMethodNotAllowed, - ErrNotValid: http.StatusBadRequest, ErrNotFound: http.StatusNotFound, + ErrNotValid: http.StatusBadRequest, }[kit.Format(arg[0])], func(s int) { m.Render(RENDER_STATUS, s, str) }) } return true } -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) WarnNotLogin(err Any, arg ...Any) bool { + return m.Warn(err, ErrNotLogin, kit.Simple(arg...), logs.FileLineMeta(2)) } -func (m *Message) WarnNotValid(err Any, arg ...Any) bool { - return m.Warn(err, ErrNotValid, kit.Simple(arg...), logs.FileLineMeta(2)) +func (m *Message) WarnNotRight(err Any, arg ...Any) bool { + 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 { return m.Warn(err, ErrNotFound, kit.Simple(arg...), logs.FileLineMeta(2)) } -func (m *Message) WarnNotRight(err Any, arg ...Any) bool { - return m.Warn(err, ErrNotRight, kit.Simple(arg...), logs.FileLineMeta(2)) +func (m *Message) WarnNotValid(err Any, arg ...Any) bool { + 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 { return m.Warn(err, ErrAlreadyExists, kit.Simple(arg...), logs.FileLineMeta(2)) diff --git a/misc.go b/misc.go index 93c70baf..5b291077 100644 --- a/misc.go +++ b/misc.go @@ -6,8 +6,14 @@ import ( kit "shylinux.com/x/toolkits" ) -func (m *Message) IsEnglish() bool { - return kit.IsIn(strings.ToLower(m.Option(MSG_LANGUAGE)), "en", "en-us") +func (m *Message) System(arg ...Any) *Message { + 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 { m.Set(MSG_APPEND).Set(MSG_RESULT) @@ -175,3 +181,6 @@ func (m *Message) Trans(en string, zh string) string { return en } } +func (m *Message) IsEnglish() bool { + return kit.IsIn(strings.ToLower(m.Option(MSG_LANGUAGE)), "en", "en-us") +} diff --git a/misc/bash/sess.go b/misc/bash/sess.go index acbe74b7..6bf2c9d1 100644 --- a/misc/bash/sess.go +++ b/misc/bash/sess.go @@ -35,7 +35,7 @@ func init() { } if m.Option(SID, strings.TrimSpace(m.Option(SID))) == "" && m.Option(ice.MSG_USERNAME) != "" { return - } else if m.Warn(m.Option(SID) == "", ice.ErrNotLogin, arg) { + } else if m.WarnNotLogin(m.Option(SID) == "", arg) { return } 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)) @@ -48,7 +48,7 @@ func init() { }}, web.PP(SESS): {Actions: ice.Actions{ 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) } }}, diff --git a/misc/chrome/cache.go b/misc/chrome/cache.go index a0d5e4c2..b0ec2b5d 100644 --- a/misc/chrome/cache.go +++ b/misc/chrome/cache.go @@ -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)...) }) 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) web.ToastSuccess(m.Message) return m diff --git a/misc/coder/server.go b/misc/coder/server.go index 3e4b1486..fa570cc1 100644 --- a/misc/coder/server.go +++ b/misc/coder/server.go @@ -36,7 +36,7 @@ func (s server) Start(m *ice.Message, arg ...string) { user-data-dir: %s bind-addr: %s:%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)} }) } diff --git a/misc/git/counts.go b/misc/git/counts.go index d7fb0b56..f023792b 100644 --- a/misc/git/counts.go +++ b/misc/git/counts.go @@ -14,7 +14,7 @@ import ( ) 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 } nfs.DirDeepAll(m, "", arg[0], func(value ice.Maps) { diff --git a/misc/git/repos.go b/misc/git/repos.go index da9cbea5..098bf5fd 100644 --- a/misc/git/repos.go +++ b/misc/git/repos.go @@ -305,8 +305,8 @@ func _repos_inner(m *ice.Message, _repos_path func(m *ice.Message, p string, arg } else { if refer, err := repos.Head(); err == nil { if commit, err := repos.CommitObject(refer.Hash()); err == nil { - if file, err := commit.File(arg[2]); !m.Warn(err) { - if content, err := file.Contents(); !m.Warn(err) { + if file, err := commit.File(arg[2]); !m.WarnNotValid(err) { + if content, err := file.Contents(); !m.WarnNotValid(err) { for _, diff := range diffmatchpatch.New().DiffMain(content, m.Result(), true) { switch diff.Type { 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])) } - } 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 } else if len(arg) < 3 { 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 { - if file, err := commit.File(arg[2]); !m.Warn(err) { - if content, err := file.Contents(); !m.Warn(err) { + if file, err := commit.File(arg[2]); !m.WarnNotValid(err) { + if content, err := file.Contents(); !m.WarnNotValid(err) { if parent, err := commit.Parent(0); err == nil { if file0, err := parent.File(arg[2]); err == nil { if content0, err := file0.Contents(); err == nil { @@ -415,7 +415,7 @@ func init() { } else { 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 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, 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) { - 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))) mdb.HashRemove(m, m.Option(REPOS)) } @@ -521,7 +521,7 @@ func init() { 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) }) 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)) return } @@ -577,17 +577,17 @@ func init() { } }}, 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) { - m.Warn(kit.Lasterr(work.Add(m.Option(nfs.FILE)))) + if work, err := _repos_open(m, m.Option(REPOS)).Worktree(); !m.WarnNotValid(err) { + m.WarnNotValid(kit.Lasterr(work.Add(m.Option(nfs.FILE)))) } }}, 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))) } }}, 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} if cfg, err := config.LoadConfig(config.GlobalScope); err == nil { 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) { 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) { _repos_log(m, refer.Hash(), repos) } diff --git a/misc/git/service.go b/misc/git/service.go index 3aa40bce..913ae057 100644 --- a/misc/git/service.go +++ b/misc/git/service.go @@ -140,11 +140,11 @@ func init() { return } } - if m.Warn(!nfs.Exists(m, repos), ice.ErrNotFound, arg[0]) { + if m.WarnNotFound(!nfs.Exists(m, repos), arg[0]) { return } } - m.Warn(_service_repos(m, arg...), ice.ErrNotValid) + m.WarnNotValid(_service_repos(m, arg...)) }}}) Index.MergeCommands(ice.Commands{ SERVICE: {Name: "service repos branch commit file auto", Help: "代码源", Actions: ice.MergeActions(ice.Actions{ diff --git a/misc/github/oauth.go b/misc/github/oauth.go index d2619e76..78378363 100644 --- a/misc/github/oauth.go +++ b/misc/github/oauth.go @@ -71,7 +71,7 @@ func init() { } }}, 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 } web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(CODE))) diff --git a/misc/input/input.go b/misc/input/input.go index b70cc835..2d2df8a7 100644 --- a/misc/input/input.go +++ b/misc/input/input.go @@ -42,7 +42,7 @@ func (s input) Inputs(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() 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))) diff --git a/misc/ssh/connect.go b/misc/ssh/connect.go index af0b3fb2..34082d8e 100644 --- a/misc/ssh/connect.go +++ b/misc/ssh/connect.go @@ -55,7 +55,7 @@ func _ssh_dial(m *ice.Message, cb func(net.Conn), arg ...string) { nfs.Remove(m, p) } _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 l.Close() 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) } }, 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 }, 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 }) return } 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() s.Shell() } @@ -189,9 +189,9 @@ func init() { }) return nil }).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() - 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() } } else { @@ -237,10 +237,10 @@ func init() { xterm.AddCommand(SSH, NewSession) } func CombinedOutput(m *ice.Message, cmd string, cb func(string)) { _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() 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)) } } @@ -248,7 +248,7 @@ func CombinedOutput(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) { - if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) { + if s, e := c.NewSession(); !m.WarnNotValid(e) { defer s.Close() r, _ := s.StdoutPipe() 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)) { _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() w, _ := s.StdinPipe() r, _ := s.StdoutPipe() diff --git a/misc/ssh/file.go b/misc/ssh/file.go index 9d5cce32..d29af8eb 100644 --- a/misc/ssh/file.go +++ b/misc/ssh/file.go @@ -67,7 +67,7 @@ func (s *FileSystem) Close() error { return nil } func Open(m *ice.Message, cb func(*FileSystem)) { _ssh_conn(m, func(c *ssh.Client) { defer c.Close() - if s, e := sftp.NewClient(c); !m.Warn(e) { + if s, e := sftp.NewClient(c); !m.WarnNotValid(e) { cb(&FileSystem{s}) } }) diff --git a/misc/ssh/relay/relay.go b/misc/ssh/relay/relay.go index de537952..386c2518 100644 --- a/misc/ssh/relay/relay.go +++ b/misc/ssh/relay/relay.go @@ -220,7 +220,7 @@ func (s relay) Publish(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, ice.USR_PUBLISH).Set(ctx.ACTION) 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)) 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) { 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) { kit.If(value[mdb.NAME] == m.Option(web.DREAM), func() { m.Option(nfs.SOURCE, value[nfs.REPOS]) }) }) diff --git a/misc/ssh/rsa.go b/misc/ssh/rsa.go index ab3901b2..e7d33424 100644 --- a/misc/ssh/rsa.go +++ b/misc/ssh/rsa.go @@ -40,8 +40,8 @@ func init() { } }}, 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 pub, err := ssh.NewPublicKey(key.Public()); !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.WarnNotValid(err) { mdb.HashCreate(m, m.OptionSimple(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)})), diff --git a/misc/ssh/service.go b/misc/ssh/service.go index b57c5c0b..e109758c 100644 --- a/misc/ssh/service.go +++ b/misc/ssh/service.go @@ -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) { return } - if s, e := base64.StdEncoding.DecodeString(value[mdb.TEXT]); !m.Warn(e, ice.ErrNotValid, value[mdb.TEXT]) { - if pub, e := ssh.ParsePublicKey([]byte(s)); !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.WarnNotValid(e, value[mdb.TEXT]) { if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 { 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)) @@ -62,7 +62,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { 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) } 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) { conn, chans, reqs, err := ssh.NewServerConn(c, conf) - if m.Warn(err) { + if m.WarnNotValid(err) { return } m.Go(func() { ssh.DiscardRequests(reqs) }) for ch := range chans { channel, requests, err := ch.Accept() - if m.Warn(err) { + if m.WarnNotValid(err) { continue } 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) { pty, tty, err := xterm.Open() - if m.Warn(err) { + if m.WarnNotValid(err) { return } defer tty.Close() diff --git a/misc/ssh/xterm.go b/misc/ssh/xterm.go index f5775eda..09c35665 100644 --- a/misc/ssh/xterm.go +++ b/misc/ssh/xterm.go @@ -27,7 +27,7 @@ func (s XTerm) Close() error { func Shell(m *ice.Message, cb func(xterm.XTerm)) error { 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() w, _ := s.StdinPipe() r, _ := s.StdoutPipe() diff --git a/misc/wework/bot.go b/misc/wework/bot.go index 3efca220..82844228 100644 --- a/misc/wework/bot.go +++ b/misc/wework/bot.go @@ -23,7 +23,7 @@ func init() { 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, "")))) - if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight, check, sig) { + if m.WarnNotRight(sig != m.Option("msg_signature"), check, sig) { // return } diff --git a/misc/wx/access.go b/misc/wx/access.go index f71c0a07..b6dd57f7 100644 --- a/misc/wx/access.go +++ b/misc/wx/access.go @@ -60,7 +60,7 @@ func init() { }}, aaa.CHECK: {Hand: func(m *ice.Message, arg ...string) { 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) } }}, diff --git a/option.go b/option.go index 005c3c97..2c304d71 100644 --- a/option.go +++ b/option.go @@ -27,7 +27,6 @@ func (m *Message) OptionSimple(key ...string) (res []string) { 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) }) - // 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)) }) 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...) }) return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key))) } - func (m *Message) ParseLink(p string) *Message { u := kit.ParseURL(p) 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 { return m.StatusTimeCount(append([]Any{kit.MDB_TOTAL}, arg...)) } - func (m *Message) Process(cmd string, arg ...Any) *Message { if len(arg) == 0 { 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...)) } } -func (m *Message) ProcessCookie(arg ...Any) { - m.Process(PROCESS_COOKIE, arg...) -} -func (m *Message) ProcessSession(arg ...Any) { - m.Process(PROCESS_SESSION, arg...) -} +func (m *Message) ProcessCookie(arg ...Any) { m.Process(PROCESS_COOKIE, 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) ProcessReplace(url string, arg ...Any) { 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) ProcessRich(arg ...Any) { m.Process(PROCESS_RICH, arg...) } func (m *Message) ProcessGrow(arg ...Any) { m.Process(PROCESS_GROW, arg...) } -func (m *Message) ProcessOpen(url string) *Message { - kit.If(url, func() { m.Process(PROCESS_OPEN, url) }) - return m -} +func (m *Message) ProcessOpen(url string) { m.Process(PROCESS_OPEN, url) } +func (m *Message) ProcessClose() *Message { return m.Process(PROCESS_CLOSE) } func (m *Message) ProcessOpenAndRefresh(url string) *Message { - kit.If(url, func() { m.Process(PROCESS_OPEN, url, "refresh") }) - return m + return m.Process(PROCESS_OPEN, url, "refresh") } -func (m *Message) ProcessClose() *Message { return m.Process(PROCESS_CLOSE) } diff --git a/render.go b/render.go index fafe168b..79bb2a40 100644 --- a/render.go +++ b/render.go @@ -49,6 +49,8 @@ func Render(m *Message, cmd string, args ...Any) string { return strings.Join(list, "") case RENDER_ANCHOR: return kit.Format(`%s`, kit.Select(arg[0], arg, 1), arg[0]) + case RENDER_SCRIPT: + return kit.Format(`%s`, arg[0]) case RENDER_IMAGES: if len(arg) > 1 { return kit.Format(``, arg[0], arg[1]) @@ -60,8 +62,6 @@ func Render(m *Message, cmd string, args ...Any) string { return kit.Format(`