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

View File

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

View File

@ -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) {

View File

@ -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(""))
}

View File

@ -160,7 +160,7 @@ func Right(m *ice.Message, key ...ice.Any) bool {
} else if len(key) > 0 && key[0] == ice.ETC_PATH {
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) }

View File

@ -50,8 +50,8 @@ func SessCheck(m *ice.Message, sessid string) bool {
return sessid != "" && m.Cmdy(SESS, CHECK, sessid, logs.FileLineMeta(-1)).Option(ice.MSG_USERNAME) != ""
}
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)
}

View File

@ -33,13 +33,13 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
ice.CMD, kit.JoinWord(cmd.Args...), DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
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) {

View File

@ -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) {

View File

@ -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,
}
}

View File

@ -95,7 +95,7 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) {
}
}()
}
if e := cmd.Run(); !m.Warn(e, ice.ErrNotValid, cmd.Args) {
if e := cmd.Run(); !m.WarnNotValid(e, cmd.Args) {
m.Cost(CODE, _system_code(cmd), EXEC, cmd.Args)
}
m.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

View File

@ -51,8 +51,8 @@ func _config_save(m *ice.Message, name string, arg ...string) {
}
if f, _, e := miss.CreateFile(path.Join(ice.VAR_CONF, name)); m.Assert(e) {
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) {

View File

@ -45,7 +45,8 @@ func ProcessField(m *ice.Message, cmd string, args ice.Any, arg ...string) *ice.
}
func ProcessFloat(m *ice.Message, cmd string, args ice.Any, arg ...string) *ice.Message {
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)

View File

@ -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

View File

@ -111,9 +111,7 @@ var Index = &ice.Context{Name: LOG, Help: "日志模块", Configs: ice.Configs{
kit.For(value[mdb.LIST], func(index int, k string) { m.Conf(SHOW, kit.Keys(k, VIEW), key) })
})
}},
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) }

View File

@ -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)
})

View File

@ -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()

View File

@ -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
}

View File

@ -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
}

View File

@ -83,19 +83,15 @@ func _zone_export(m *ice.Message, prefix, chain, file string) {
m.Conf(prefix, kit.Keys(chain, HASH, key, LIST), "")
m.Conf(prefix, kit.Keys(chain, HASH, key, 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
}

View File

@ -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

View File

@ -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)

View File

@ -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...))
}

View File

@ -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)))

View File

@ -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])
}

View File

@ -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
}
}

View File

@ -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()
}

View File

@ -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
}
}

View File

@ -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 {

View File

@ -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...))
}

View File

@ -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"

View File

@ -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()

View File

@ -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)
}
}},
})
}

View File

@ -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) }

View File

@ -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

View File

@ -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)
}

View File

@ -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) }

View File

@ -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)
}},
})

View File

@ -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

View File

@ -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) {

View File

@ -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...)...)
}
}

View File

@ -1 +0,0 @@
package web

View File

@ -36,9 +36,9 @@ func BasicSess(m *ice.Message) {
func BasicCheck(m *ice.Message, realm string, check ...func(*ice.Message) bool) bool {
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
}

View File

@ -31,7 +31,7 @@ func _broad_serve(m *ice.Message) {
})
})
m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, tcp.UDP4, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(from *net.UDPAddr, buf []byte) {
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()))
}

View File

@ -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)

View File

@ -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) {

View File

@ -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()))

View File

@ -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",
}

View File

@ -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))

View File

@ -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"

View File

@ -23,7 +23,7 @@ func _route_push(m *ice.Message, space string, msg *ice.Message) *ice.Message {
}
func _route_match(m *ice.Message, space string, cb func(ice.Maps, int, []ice.Maps)) {
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]) })

View File

@ -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))
}

View File

@ -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)))))
}

View File

@ -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 == "" {

View File

@ -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)

View File

@ -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)

View File

@ -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 {

View File

@ -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()

View File

@ -63,7 +63,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) {
m.Cmd(tcp.SERVER, tcp.LISTEN, mdb.TYPE, HTTP, mdb.NAME, logs.FileLine(1), m.OptionSimple(tcp.HOST, tcp.PORT), func(l net.Listener) {
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
View File

@ -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"
)

View File

@ -14,11 +14,11 @@ func _action_list(m *ice.Message, river, storm string) {
}
func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
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])

View File

@ -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])

View File

@ -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)

View File

@ -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
}))

View File

@ -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()

View File

@ -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)

View File

@ -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
}

View File

@ -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))

View File

@ -30,10 +30,10 @@ func _binpack_file(m *ice.Message, w io.Writer, arg ...string) {
fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "")
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))
}
}

View File

@ -174,7 +174,7 @@ func init() {
web.DOWNLOAD: {Name: "download link* path", Hand: func(m *ice.Message, arg ...string) { _install_download(m, arg...) }},
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)
}},
}
}

View File

@ -29,7 +29,7 @@ func _xterm_get(m *ice.Message, h string) xterm.XTerm {
ls := kit.Split(strings.Split(kit.Select(ISH, value[mdb.TYPE]), " # ")[0])
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)
}
}},

View File

@ -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 (

View File

@ -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)

View File

@ -17,7 +17,7 @@ func _field_show(m *ice.Message, name, text string, arg ...string) {
meta[mdb.LIST], name = cmd.List, kit.Select(cmd.Help, name)
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) {

View File

@ -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

View File

@ -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
View File

@ -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
View File

@ -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))
}
}

View File

@ -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
View File

@ -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
View File

@ -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")
}

View File

@ -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)
}
}},

View File

@ -28,7 +28,7 @@ func (s cache) Create(m *ice.Message, arg ...string) *ice.Message {
s.Hash.Modify(m, kit.Simple(mdb.COUNT, count, mdb.TOTAL, total, mdb.VALUE, value)...)
})
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

View File

@ -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)}
})
}

View File

@ -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) {

View File

@ -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)
}

View File

@ -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{

View File

@ -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)))

View File

@ -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)))

View File

@ -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()

View File

@ -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})
}
})

View File

@ -220,7 +220,7 @@ func (s relay) Publish(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, ice.USR_PUBLISH).Set(ctx.ACTION)
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]) })
})

View File

@ -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)})),

View File

@ -40,8 +40,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
if !strings.HasPrefix(value[mdb.NAME], meta[aaa.USERNAME]+mdb.AT) {
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()

View File

@ -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()

View File

@ -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
}

View File

@ -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)
}
}},

View File

@ -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) }

View File

@ -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))
}

View File

@ -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: