mirror of
https://shylinux.com/x/icebergs
synced 2025-04-25 09:08:06 +08:00
opt some
This commit is contained in:
parent
29c1a023e3
commit
04ad921dd8
@ -1,3 +1,3 @@
|
||||
# icebergs
|
||||
|
||||
icebergs 是一个应用框架,通过群化、模块化、集自动化方式,在各种设备上,一键部署完整的个人云计算与云研发平台。
|
||||
icebergs 是一个应用框架,通过模块化、集群化、自动化方式,在各种设备上,即可一键启动完整的云计算服务与云研发环境。
|
||||
|
@ -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) {
|
||||
|
@ -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(""))
|
||||
}
|
||||
|
@ -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) }
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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) }
|
||||
|
@ -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)
|
||||
})
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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...))
|
||||
}
|
||||
|
@ -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)))
|
||||
|
@ -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])
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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...))
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
}},
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -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) }
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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) }
|
||||
|
@ -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)
|
||||
}},
|
||||
})
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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...)...)
|
||||
}
|
||||
}
|
||||
|
@ -1 +0,0 @@
|
||||
package web
|
@ -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
|
||||
}
|
||||
|
@ -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()))
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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()))
|
||||
|
@ -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(`<a href="%s">%s</a>`, 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",
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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"
|
||||
|
@ -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]) })
|
||||
|
@ -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))
|
||||
}
|
||||
|
@ -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)))))
|
||||
}
|
||||
|
@ -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 == "" {
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
|
@ -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) })
|
||||
}
|
||||
|
24
conf.go
24
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"
|
||||
)
|
||||
|
@ -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])
|
||||
|
@ -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])
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}))
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}},
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}},
|
||||
|
@ -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 (
|
||||
|
@ -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(`<rect x="%d" y="%d" height="%d" width="%d" rx="4" ry="4"`, x+b.MarginX/2, y+b.MarginY/2, b.GetHeight(), b.GetWidth())
|
||||
item.Push(`fill="%s"`, b.BackGround).Push(`%v`, b.RectData).Echo("/>").Dump(m)
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
7
data.go
7
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()) }
|
||||
|
11
exec.go
11
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
|
||||
}
|
||||
}
|
||||
|
59
info.go
59
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))
|
||||
}
|
||||
}
|
||||
|
5
init.go
5
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 {
|
||||
|
20
logs.go
20
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))
|
||||
|
13
misc.go
13
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")
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}},
|
||||
|
@ -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
|
||||
|
@ -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)}
|
||||
})
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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{
|
||||
|
@ -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)))
|
||||
|
@ -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)))
|
||||
|
@ -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()
|
||||
|
@ -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})
|
||||
}
|
||||
})
|
||||
|
@ -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]) })
|
||||
})
|
||||
|
@ -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)})),
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
}},
|
||||
|
21
option.go
21
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) }
|
||||
|
64
render.go
64
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(`<a href="%s" target="_blank">%s</a>`, kit.Select(arg[0], arg, 1), arg[0])
|
||||
case RENDER_SCRIPT:
|
||||
return kit.Format(`<code>%s</code>`, arg[0])
|
||||
case RENDER_IMAGES:
|
||||
if len(arg) > 1 {
|
||||
return kit.Format(`<img src="%s" height="%s">`, arg[0], arg[1])
|
||||
@ -60,8 +62,6 @@ func Render(m *Message, cmd string, args ...Any) string {
|
||||
return kit.Format(`<audio src="%s" controls autoplay>`, arg[0])
|
||||
case RENDER_IFRAME:
|
||||
return kit.Format(`<iframe src="%s"></iframe>`, arg[0])
|
||||
case RENDER_SCRIPT:
|
||||
return kit.Format(`<code>%s</code>`, arg[0])
|
||||
default:
|
||||
if len(arg) == 1 {
|
||||
return kit.Format(`<%s>%s</%s>`, cmd, arg[0], cmd)
|
||||
@ -81,9 +81,6 @@ func (m *Message) Render(cmd string, arg ...Any) *Message {
|
||||
}
|
||||
return m.Options(MSG_OUTPUT, cmd, MSG_ARGS, arg)
|
||||
}
|
||||
func (m *Message) RenderTemplate(arg ...Any) *Message {
|
||||
return m.Render(RENDER_TEMPLATE, arg...)
|
||||
}
|
||||
func (m *Message) RenderStatus(status int, arg ...string) *Message {
|
||||
return m.Render(RENDER_STATUS, status, arg)
|
||||
}
|
||||
@ -105,6 +102,9 @@ func (m *Message) RenderRedirect(arg ...Any) *Message {
|
||||
func (m *Message) RenderDownload(arg ...Any) *Message {
|
||||
return m.Render(RENDER_DOWNLOAD, arg...)
|
||||
}
|
||||
func (m *Message) RenderTemplate(arg ...Any) *Message {
|
||||
return m.Render(RENDER_TEMPLATE, arg...)
|
||||
}
|
||||
func (m *Message) RenderResult(arg ...Any) *Message {
|
||||
return m.Render(RENDER_RESULT, arg...)
|
||||
}
|
||||
@ -118,7 +118,16 @@ func (m *Message) IsDebug() bool {
|
||||
return m.Option(MSG_DEBUG) == TRUE
|
||||
}
|
||||
func (m *Message) IsCliUA() bool {
|
||||
return m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla")
|
||||
return m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), html.Mozilla)
|
||||
}
|
||||
func (m *Message) IsWeixinUA() bool {
|
||||
return strings.Contains(m.Option(MSG_USERUA), html.MicroMessenger)
|
||||
}
|
||||
func (m *Message) IsMobileUA() bool {
|
||||
return strings.Contains(m.Option(MSG_USERUA), html.Mobile)
|
||||
}
|
||||
func (m *Message) IsChromeUA() bool {
|
||||
return strings.Contains(m.Option(MSG_USERUA), html.Chrome)
|
||||
}
|
||||
func (m *Message) IsMetaKey() bool {
|
||||
return m.Option("metaKey") == TRUE
|
||||
@ -126,15 +135,6 @@ func (m *Message) IsMetaKey() bool {
|
||||
func (m *Message) IsGetMethod() bool {
|
||||
return m.Option(MSG_METHOD) == http.MethodGet
|
||||
}
|
||||
func (m *Message) IsMobileUA() bool {
|
||||
return strings.Contains(m.Option(MSG_USERUA), "Mobile")
|
||||
}
|
||||
func (m *Message) IsWeixinUA() bool {
|
||||
return strings.Contains(m.Option(MSG_USERUA), "MicroMessenger")
|
||||
}
|
||||
func (m *Message) IsChromeUA() bool {
|
||||
return strings.Contains(m.Option(MSG_USERUA), "Chrome")
|
||||
}
|
||||
func (m *Message) PushSearch(arg ...Any) {
|
||||
data := kit.Dict(arg...)
|
||||
kit.For(arg, func(k, v Any) {
|
||||
@ -187,6 +187,9 @@ func (m *Message) PushQRCode(key, src string) *Message {
|
||||
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_QRCODE, src)) })
|
||||
return m
|
||||
}
|
||||
func (m *Message) PushScript(arg ...string) {
|
||||
kit.If(!m.IsCliUA(), func() { m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) })
|
||||
}
|
||||
func (m *Message) PushImages(key, src string, arg ...string) {
|
||||
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IMAGES, src, arg)) })
|
||||
}
|
||||
@ -199,24 +202,11 @@ func (m *Message) PushAudios(key, src string) {
|
||||
func (m *Message) PushIFrame(key, src string) {
|
||||
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IFRAME, src)) })
|
||||
}
|
||||
func (m *Message) PushScript(arg ...string) {
|
||||
kit.If(!m.IsCliUA(), func() { m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) })
|
||||
}
|
||||
func (m *Message) PushDownload(key string, arg ...string) *Message {
|
||||
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_DOWNLOAD, arg)) })
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *Message) EchoFields(cmd string, arg ...string) *Message {
|
||||
return m.Echo(`<fieldset class="story" data-index="%s" data-args=%q>
|
||||
<legend></legend>
|
||||
<form class="option"></form>
|
||||
<div class="action"></div>
|
||||
<div class="output"></div>
|
||||
<div class="status"></div>
|
||||
</fieldset>
|
||||
`, cmd, kit.Join(arg))
|
||||
}
|
||||
func (m *Message) EchoInfoButton(info string, arg ...Any) *Message {
|
||||
kit.If(info == "", func() { info = Info.Template(m, m.ActionKey()+".html") })
|
||||
kit.If(len(arg) == 0, func() { arg = append(arg, m.ActionKey()) })
|
||||
@ -231,6 +221,7 @@ func (m *Message) EchoButton(arg ...Any) *Message {
|
||||
}
|
||||
func (m *Message) EchoAnchor(arg ...string) *Message { return m.Echo(Render(m, RENDER_ANCHOR, arg)) }
|
||||
func (m *Message) EchoQRCode(src string) *Message { return m.Echo(Render(m, RENDER_QRCODE, src)) }
|
||||
func (m *Message) EchoScript(arg ...string) *Message { return m.Echo(Render(m, RENDER_SCRIPT, arg)) }
|
||||
func (m *Message) EchoImages(src string) *Message { return m.Echo(Render(m, RENDER_IMAGES, src)) }
|
||||
func (m *Message) EchoVideos(src string) *Message { return m.Echo(Render(m, RENDER_VIDEOS, src)) }
|
||||
func (m *Message) EchoAudios(src string) *Message { return m.Echo(Render(m, RENDER_AUDIOS, src)) }
|
||||
@ -240,15 +231,21 @@ func (m *Message) EchoIFrame(src string) *Message {
|
||||
})
|
||||
return m
|
||||
}
|
||||
func (m *Message) EchoScript(arg ...string) *Message {
|
||||
return m.Echo(Render(m, RENDER_SCRIPT, arg))
|
||||
}
|
||||
func (m *Message) EchoDownload(arg ...string) *Message {
|
||||
return m.Echo(Render(m, RENDER_DOWNLOAD, arg))
|
||||
}
|
||||
func (m *Message) EchoFields(cmd string, arg ...string) *Message {
|
||||
return m.Echo(`<fieldset class="story" data-index="%s" data-args=%q>
|
||||
<legend></legend>
|
||||
<form class="option"></form>
|
||||
<div class="action"></div>
|
||||
<div class="output"></div>
|
||||
<div class="status"></div>
|
||||
</fieldset>
|
||||
`, cmd, kit.Join(arg))
|
||||
}
|
||||
func (m *Message) Display(file string, arg ...Any) *Message {
|
||||
file = m.resource(file)
|
||||
m.Option(MSG_DISPLAY, kit.MergeURL(kit.ExtChange(file, JS), arg...))
|
||||
m.Option(MSG_DISPLAY, kit.MergeURL(kit.ExtChange(m.resource(file), JS), arg...))
|
||||
return m
|
||||
}
|
||||
func (m *Message) Resource(file string) string { return m.resource(file) }
|
||||
@ -262,5 +259,4 @@ func (m *Message) resource(file string) string {
|
||||
}
|
||||
kit.If(file == "", func() { p = kit.ExtChange(p, JS) }, func() { p = path.Join(path.Dir(p), file) })
|
||||
return kit.MergeURL("/require/"+p, POD, m.Option(MSG_USERPOD))
|
||||
// return m.MergeLink("/require/"+p, POD, m.Option(MSG_USERPOD))
|
||||
}
|
||||
|
8
type.go
8
type.go
@ -13,8 +13,8 @@ import (
|
||||
"shylinux.com/x/toolkits/task"
|
||||
)
|
||||
|
||||
type Any = interface{}
|
||||
type List = []Any
|
||||
type Any = interface{}
|
||||
type Map = map[string]Any
|
||||
type Maps = map[string]string
|
||||
type Handler func(m *Message, arg ...string)
|
||||
@ -203,10 +203,6 @@ func (c *Context) Close(m *Message, arg ...string) {
|
||||
kit.If(c.server != nil, func() { c.server.Close(m, arg...) })
|
||||
}
|
||||
|
||||
type IMessage interface {
|
||||
Option(key string, arg ...Any) string
|
||||
PrefixKey() string
|
||||
}
|
||||
type Message struct {
|
||||
time time.Time
|
||||
code int
|
||||
@ -261,7 +257,7 @@ func (m *Message) Spawn(arg ...Any) *Message {
|
||||
for _, val := range arg {
|
||||
switch val := val.(type) {
|
||||
case []byte:
|
||||
if m.Warn(json.Unmarshal(val, &msg._meta), string(val)) {
|
||||
if m.WarnNotValid(json.Unmarshal(val, &msg._meta), string(val)) {
|
||||
m.Debug(m.FormatStack(1, 100))
|
||||
}
|
||||
case Option:
|
||||
|
Loading…
x
Reference in New Issue
Block a user