diff --git a/base/aaa/user.go b/base/aaa/user.go index cc5dad34..0c11ba1a 100644 --- a/base/aaa/user.go +++ b/base/aaa/user.go @@ -98,6 +98,9 @@ const ( USER_CREATE = "user.create" ) +const ( + INVITE = "invite" +) const USER = "user" diff --git a/base/cli/cli.go b/base/cli/cli.go index 29f87c04..3a942dba 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -31,6 +31,8 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", m.Conf(RUNTIME, "conf.ctx_shy", os.Getenv("ctx_shy")) m.Conf(RUNTIME, "conf.ctx_pid", os.Getenv("ctx_pid")) m.Conf(RUNTIME, "conf.ctx_user", os.Getenv("ctx_user")) + m.Conf(RUNTIME, "conf.ctx_share", os.Getenv("ctx_share")) + m.Conf(RUNTIME, "conf.ctx_river", os.Getenv("ctx_river")) // 主机信息 m.Conf(RUNTIME, "host.GOARCH", runtime.GOARCH) @@ -58,6 +60,9 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", ice.Info.PathName = m.Conf(RUNTIME, "boot.pathname") ice.Info.UserName = m.Conf(RUNTIME, "boot.username") + ice.Info.CtxShare = m.Conf(RUNTIME, "conf.ctx_share") + ice.Info.CtxRiver = m.Conf(RUNTIME, "conf.ctx_river") + // 启动记录 count := kit.Int(m.Conf(RUNTIME, "boot.count")) + 1 m.Conf(RUNTIME, "boot.count", count) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index fe5d89b9..d5ec1791 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -410,7 +410,6 @@ const ( IMPORT = "import" PRUNES = "prunes" INPUTS = "inputs" - INVITE = "invite" COMMIT = "commit" SOURCE = "source" ) diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index dbfc5880..b9647237 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -288,7 +288,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { case STDIO: // 终端交互 r, f.stdout = os.Stdin, os.Stdout - m.Option(ice.MSG_USEROPT, ice.MSG_USERNAME) + m.Option(ice.MSG_OPTS, ice.MSG_USERNAME) m.Option(ice.MSG_USERNAME, ice.Info.UserName) m.Option(ice.MSG_USERROLE, aaa.ROOT) m.Option(ice.MSG_USERZONE, "boot") diff --git a/base/ssh/service.go b/base/ssh/service.go index c0301fe3..04169892 100644 --- a/base/ssh/service.go +++ b/base/ssh/service.go @@ -29,7 +29,7 @@ func _ssh_meta(conn ssh.ConnMetadata) map[string]string { func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { config := &ssh.ServerConfig{ PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { - meta, err := _ssh_meta(conn), errors.New(ice.ErrNotAuth) + meta, err := _ssh_meta(conn), errors.New(ice.ErrNotRight) if tcp.IsLocalHost(m, strings.Split(conn.RemoteAddr().String(), ":")[0]) { m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) err = nil // 本机用户 @@ -53,7 +53,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { return &ssh.Permissions{Extensions: meta}, err }, PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { - meta, err := _ssh_meta(conn), errors.New(ice.ErrNotAuth) + meta, err := _ssh_meta(conn), errors.New(ice.ErrNotRight) m.Richs(aaa.USER, "", conn.User(), func(k string, value map[string]interface{}) { if string(password) == kit.Format(value[aaa.PASSWORD]) { m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD])))) @@ -203,7 +203,7 @@ func init() { mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.PRUNES, SERVICE, "", mdb.HASH, kit.MDB_STATUS, tcp.CLOSE) }}, - mdb.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) m.Option("hostname", strings.Split(u.Host, ":")[0]) @@ -218,7 +218,7 @@ ssh {{.Option "user.name"}}@{{.Option "hostname"}} -p {{.Option "port"}} if len(arg) == 0 { m.Option(mdb.FIELDS, "time,status,port,private,auth,count") m.Cmdy(mdb.SELECT, SERVICE, "", mdb.HASH) - m.PushAction(mdb.IMPORT, mdb.INSERT, mdb.EXPORT, mdb.INVITE) + m.PushAction(mdb.IMPORT, mdb.INSERT, mdb.EXPORT, aaa.INVITE) return } diff --git a/base/tcp/client.go b/base/tcp/client.go index 418f5cb1..aa3876f8 100644 --- a/base/tcp/client.go +++ b/base/tcp/client.go @@ -38,6 +38,8 @@ func (c *Conn) Close() error { } const ( + SOCKET = "socket" + OPEN = "open" START = "start" ERROR = "error" diff --git a/base/tcp/host.go b/base/tcp/host.go index e7e7fa6b..0179bbbf 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -63,6 +63,7 @@ func IsLocalHost(m *ice.Message, ip string) bool { return _islocalhost(m, ip) } const ( HOSTPORT = "hostport" HOSTNAME = "hostname" + PROTOCOL = "protocol" LOCALHOST = "localhost" ) diff --git a/base/web/cache.go b/base/web/cache.go index 76384ce4..2aff9661 100644 --- a/base/web/cache.go +++ b/base/web/cache.go @@ -62,6 +62,7 @@ func _cache_catch(m *ice.Message, name string) (file, size string) { } return "", "0" } + func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size string) { if buf, h, e := r.FormFile(UPLOAD); e == nil { defer buf.Close() @@ -83,36 +84,41 @@ func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size stri func _cache_download(m *ice.Message, r *http.Response) (file, size string) { defer r.Body.Close() - total := kit.Int(kit.Select("1", r.Header.Get(ContentLength))) if f, p, e := kit.Create(path.Join("var/tmp", kit.Hashs("uniq"))); m.Assert(e) { - size, buf := 0, make([]byte, 1024) + step, total := 0, kit.Int(kit.Select("1", r.Header.Get(ContentLength))) + size, buf := 0, make([]byte, ice.MOD_BUFS) + for { if n, _ := r.Body.Read(buf); n > 0 { + size += n f.Write(buf[0:n]) - switch size += n; cb := m.Optionv(DOWNLOAD_CB).(type) { - case []string: - m.Richs(cb[0], cb[1], cb[2], func(key string, value map[string]interface{}) { - value = value[kit.MDB_META].(map[string]interface{}) + s := size * 100 / total - s := size * 100 / total - if s != kit.Int(value[kit.SSH_STEP]) && s%10 == 0 { - m.Log_IMPORT(kit.MDB_FILE, path.Base(cb[2]), kit.SSH_STEP, s, kit.MDB_SIZE, kit.FmtSize(int64(size)), kit.MDB_TOTAL, kit.FmtSize(int64(total))) - } - value[kit.SSH_STEP], value[kit.MDB_SIZE], value[kit.MDB_TOTAL] = kit.Format(s), size, total - }) + switch cb := m.Optionv(DOWNLOAD_CB).(type) { case func(int, int): cb(size, total) + case []string: + m.Richs(cb[0], cb[1], cb[2], func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) + value[kit.SSH_STEP], value[kit.MDB_SIZE], value[kit.MDB_TOTAL] = kit.Format(s), size, total + }) default: - m.Log_IMPORT(kit.MDB_FILE, p, "per", size*100/total, kit.MDB_SIZE, kit.FmtSize(int64(size)), "total", kit.FmtSize(int64(total))) + if s != step && s%10 == 0 { + m.Log_IMPORT(kit.MDB_FILE, p, kit.SSH_STEP, s, + kit.MDB_SIZE, kit.FmtSize(int64(size)), kit.MDB_TOTAL, kit.FmtSize(int64(total))) + } } - - } else { - f.Close() - break + step = s + continue } + + f.Close() + break } + if f, e := os.Open(p); m.Assert(e) { defer f.Close() + m.Log_IMPORT(kit.MDB_FILE, p, kit.MDB_SIZE, kit.FmtSize(int64(size))) c := _cache_name(m, kit.Hashs(f)) m.Cmd(nfs.LINK, c, p) @@ -147,13 +153,13 @@ func init() { WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) { _cache_watch(m, arg[0], arg[1]) }}, - WRITE: {Name: "write type name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - _cache_save(m, arg[0], arg[1], arg[2]) - }}, CATCH: {Name: "catch type name", Help: "捕获", Hand: func(m *ice.Message, arg ...string) { file, size := _cache_catch(m, arg[1]) _cache_save(m, arg[0], arg[1], "", file, size) }}, + WRITE: {Name: "write type name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + _cache_save(m, arg[0], arg[1], arg[2]) + }}, UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { kind, name, file, size := _cache_upload(m, m.R) _cache_save(m, kind, name, "", file, size) @@ -165,8 +171,16 @@ func init() { } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select("time,hash,size,type,name,text,file", mdb.DETAIL, len(arg) > 0)) + m.Option(mdb.FIELDS, kit.Select("time,hash,size,type,name,text", mdb.DETAIL, len(arg) > 0)) m.Cmdy(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, arg) + + if len(arg) > 0 { + if m.Append(kit.MDB_FILE) == "" { + m.Push(kit.MDB_LINK, m.Append(kit.MDB_TEXT)) + } else { + m.PushAnchor(DOWNLOAD, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+arg[0])) + } + } }}, "/cache/": {Name: "/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/base/web/dream.go b/base/web/dream.go index d8f27884..78910117 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -16,55 +16,44 @@ import ( ) func _dream_list(m *ice.Message) { - m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "time size name").Table(func(index int, value map[string]string, head []string) { + m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "time,size,name").Table(func(index int, value map[string]string, head []string) { if m.Richs(SPACE, nil, value[kit.MDB_NAME], func(key string, value map[string]interface{}) { m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) - m.Push(kit.MDB_STATUS, gdb.START) - m.PushButton(gdb.STOP) + m.Push(kit.MDB_STATUS, tcp.START) + m.PushButton(tcp.STOP) }) == nil { m.Push(kit.MDB_TYPE, WORKER) - m.Push(kit.MDB_STATUS, gdb.STOP) - m.PushButton(gdb.START) + m.Push(kit.MDB_STATUS, tcp.STOP) + m.PushButton(tcp.START) } }) - m.Sort(kit.MDB_NAME, "str_r") + m.SortStrR(kit.MDB_NAME) } func _dream_show(m *ice.Message, name string) { - // 规范命名 if !strings.Contains(name, "-") || !strings.HasPrefix(name, "20") { name = m.Time("20060102-") + strings.ReplaceAll(name, "-", "_") } - // 创建目录 + // 任务目录 p := path.Join(m.Conf(DREAM, kit.META_PATH), name) - os.MkdirAll(p, ice.MOD_DIR) - - // 下载代码 - if m.Option(kit.SSH_REPOS) != "" { + if m.Option(kit.SSH_REPOS) != "" { // 下载源码 m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, m.Option(kit.SSH_REPOS), kit.MDB_PATH, p) + } else { // 创建目录 + os.MkdirAll(p, ice.MOD_DIR) } + // 任务模板 if m.Option("template") != "" { - for _, file := range []string{"etc/miss.sh", "go.mod", "src/main.go", "src/main.shy"} { + for _, file := range []string{"etc/miss.sh", "src/main.shy", "src/main.go", "go.mod"} { if _, e := os.Stat(path.Join(p, file)); os.IsNotExist(e) { - m.Cmdy(nfs.COPY, path.Join(p, file), path.Join(m.Option("template"), file)) - switch file { + switch m.Cmdy(nfs.COPY, path.Join(p, file), path.Join(m.Option("template"), file)); file { case "go.mod": kit.Rewrite(path.Join(p, file), func(line string) string { - if strings.HasPrefix(line, "module") { - m.Info("module %s", name) - return "module " + name - } - return line + return kit.Select(line, "module "+name, strings.HasPrefix(line, "module")) }) } } } - - go func() { - m.Option(cli.CMD_DIR, p) - m.Cmd(cli.SYSTEM, "bash", "-c", "source etc/miss.sh") - }() } // 任务脚本 @@ -89,9 +78,9 @@ func _dream_show(m *ice.Message, name string) { )) // 启动任务 m.Optionv(cli.CMD_STDERR, path.Join(p, m.Conf(DREAM, "meta.env.ctx_log"))) - m.Cmd(cli.DAEMON, m.Confv(DREAM, "meta.cmd"), "dev", "self", "name", name) + m.Cmd(cli.DAEMON, m.Confv(DREAM, "meta.cmd"), SPIDE_DEV, SPIDE_SELF, kit.MDB_NAME, name) m.Event(DREAM_CREATE, kit.MDB_TYPE, m.Option(kit.MDB_TYPE), kit.MDB_NAME, name) - m.Sleep("1s") + m.Sleep(ice.MOD_TICK) } m.Cmdy(nfs.DIR, p) } @@ -105,18 +94,56 @@ const DREAM = "dream" func init() { Index.Merge(&ice.Context{ + Commands: map[string]*ice.Command{ + DREAM: {Name: "dream name path auto start create", Help: "梦想家", Action: map[string]*ice.Action{ + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case kit.MDB_NAME: + m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,time") + } + }}, + mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.CREATE, arg) + m.Option(ice.MSG_PROCESS, ice.PROCESS_INNER) + }}, + tcp.START: {Name: "start name repos", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + if m.Option(kit.MDB_NAME) == SPIDE_SELF { + m.Option(kit.MDB_NAME, "") + } + _dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME)))) + }}, + tcp.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SPACE, m.Option(kit.MDB_NAME), "exit", "0") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + _dream_list(m) + return + } + + m.Option(nfs.DIR_ROOT, path.Join(m.Conf(DREAM, kit.META_PATH), arg[0])) + if len(arg) == 1 || strings.HasSuffix(arg[1], "/") { + m.Cmdy(nfs.DIR, arg[1:]) + } else { + m.Cmdy(nfs.CAT, arg[1:]) + } + }}, + }, Configs: map[string]*ice.Config{ DREAM: {Name: DREAM, Help: "梦想家", Value: kit.Data(kit.MDB_PATH, "usr/local/work", "cmd", []interface{}{"ice.bin", SPACE, tcp.DIAL}, "env", kit.Dict("ctx_log", "bin/boot.log"), "miss", `#!/bin/bash -[ -f ~/.ish/plug.sh ] || [ -f ./.ish/plug.sh ] || git clone ${ISH_CONF_HUB_PROXY:="https://"}github.com/shylinux/intshell ./.ish -[ "$ISH_CONF_PRE" != "" ] || source ./.ish/plug.sh || source ~/.ish/plug.sh +[ -f ~/.ish/plug.sh ] || [ -f $PWD/.ish/plug.sh ] || git clone ${ISH_CONF_HUB_PROXY:="https://"}github.com/shylinux/intshell $PWD/.ish +[ "$ISH_CONF_PRE" != "" ] || source $PWD/.ish/plug.sh || source ~/.ish/plug.sh require miss.sh +ish_miss_prepare_develop ish_miss_prepare_compile ish_miss_prepare_install +# ish_miss_prepare_intshell +# ish_miss_prepare_contexts # ish_miss_prepare_icebergs # ish_miss_prepare_toolkits @@ -124,31 +151,5 @@ make `, )}, }, - Commands: map[string]*ice.Command{ - DREAM: {Name: "dream name path auto 启动", Help: "梦想家", Action: map[string]*ice.Action{ - gdb.START: {Name: "start name repos", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if m.Option(kit.MDB_NAME) == "self" { - m.Option(kit.MDB_NAME, "") - } - _dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME)))) - }}, - gdb.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(SPACE, m.Option(kit.MDB_NAME), "exit", "0") - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch arg[0] { - case kit.MDB_NAME: - m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,time") - } - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 { - _dream_list(m) - return - } - m.Option(nfs.DIR_ROOT, path.Join(m.Conf(DREAM, kit.META_PATH), arg[0])) - m.Cmdy(nfs.DIR, arg[1:]) - }}, - }, }) } diff --git a/base/web/route.go b/base/web/route.go index 07c63c5d..4e2c24f4 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -2,43 +2,66 @@ package web import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/ctx" - "github.com/shylinux/icebergs/base/gdb" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/tcp" kit "github.com/shylinux/toolkits" - - "strings" ) func _route_travel(m *ice.Message, route string) { - if route == "" { - m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { - switch val[kit.MDB_TYPE] { - case SERVER: - if val[kit.MDB_NAME] == ice.Info.NodeName { - return // 避免循环 - } - - // 远程查询 - m.Cmd(SPACE, val[kit.MDB_NAME], ROUTE).Table(func(index int, value map[string]string, head []string) { - m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) - m.Push(kit.SSH_ROUTE, kit.Keys(val[kit.MDB_NAME], value[kit.SSH_ROUTE])) - }) - fallthrough - case WORKER: - // 本机查询 - m.Push(kit.MDB_TYPE, val[kit.MDB_TYPE]) - m.Push(kit.SSH_ROUTE, val[kit.MDB_NAME]) + m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { + switch val[kit.MDB_TYPE] { + case SERVER: // 远程查询 + if val[kit.MDB_NAME] == ice.Info.NodeName { + return // 避免循环 } - }) - } else { - m.Cmd(SPACE, route, ROUTE).Table(func(index int, value map[string]string, head []string) { - m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) - m.Push(kit.SSH_ROUTE, kit.Keys(route, value[kit.SSH_ROUTE])) - }) - } + + m.Cmd(SPACE, val[kit.MDB_NAME], ROUTE).Table(func(index int, value map[string]string, head []string) { + m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE]) + m.Push(kit.SSH_ROUTE, kit.Keys(val[kit.MDB_NAME], value[kit.SSH_ROUTE])) + }) + + fallthrough + case WORKER: // 本机查询 + m.Push(kit.MDB_TYPE, val[kit.MDB_TYPE]) + m.Push(kit.SSH_ROUTE, val[kit.MDB_NAME]) + } + }) +} +func _route_list(m *ice.Message) { + // 链接操作 + m.Table(func(index int, value map[string]string, field []string) { + m.PushAnchor(value[kit.SSH_ROUTE], kit.MergeURL(m.Option(ice.MSG_USERWEB), + kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value[kit.SSH_ROUTE]))) + + switch value[kit.MDB_TYPE] { + case WORKER: + m.PushButton(mdb.CREATE) + case SERVER: + m.PushButton(tcp.START) + default: + m.PushButton("") + } + }) + + // 网卡信息 + u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) + m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) { + m.Push(kit.MDB_TYPE, MYSELF) + m.Push(kit.SSH_ROUTE, ice.Info.NodeName) + m.PushAnchor(value["ip"], kit.Format("%s://%s:%s", u.Scheme, value["ip"], u.Port())) + m.PushButton(tcp.START) + }) + + // 本机信息 + m.Push(kit.MDB_TYPE, MYSELF) + m.Push(kit.SSH_ROUTE, ice.Info.NodeName) + m.PushAnchor("localhost", kit.Format("%s://%s:%s", u.Scheme, "localhost", u.Port())) + m.PushButton(tcp.START) + + m.Sort(kit.SSH_ROUTE) } const ROUTE = "route" @@ -49,111 +72,71 @@ func init() { ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.SSH_ROUTE)}, }, Commands: map[string]*ice.Command{ - ROUTE: {Name: "route route ctx cmd auto invite share", Help: "路由", Action: map[string]*ice.Action{ + ROUTE: {Name: "route route ctx cmd auto invite share", Help: "路由器", Action: map[string]*ice.Action{ SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { - h := m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, "login") - p := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, h) - m.Cmdy("web.wiki.spark", "shell", p).Render("") - m.Cmdy("web.wiki.image", "qrcode", p) + p := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN)) + m.EchoScript(p) + m.EchoQRCode(p) + m.EchoAnchor(p) }}, - mdb.INVITE: {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { for _, k := range []string{"tmux", "base", "miss"} { m.Cmdy("web.code.publish", "contexts", k) - m.Cmdy("web.wiki.spark") + m.EchoScript("break") } - m.Cmdy("web.wiki.spark", "shell", strings.Join([]string{"# 共享环境", m.Option(ice.MSG_USERWEB)}, "\n")) - m.Cmdy("web.wiki.image", "qrcode", m.Option(ice.MSG_USERWEB)) + m.EchoScript("shell", "# 共享环境", m.Option(ice.MSG_USERWEB)) + m.EchoQRCode(m.Option(ice.MSG_USERWEB)) + m.EchoAnchor(m.Option(ice.MSG_USERWEB)) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch m.Option("action") { - case "autogen": - m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", "inputs", arg) + switch m.Option(kit.MDB_ACTION) { + case mdb.CREATE: + m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.INPUTS, arg) return } switch arg[0] { - case "name": + case kit.MDB_NAME: m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,size,time") m.SortStrR(kit.MDB_PATH) - case "template": + + case kit.SSH_TEMPLATE: m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "path,size,time") m.SortStrR(kit.MDB_PATH) } }}, - gdb.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(SPACE, m.Option(ROUTE), DREAM, gdb.START, arg) + + mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.CREATE, arg) m.Option(ice.MSG_PROCESS, ice.PROCESS_INNER) }}, - gdb.STOP: {Name: "stop", Help: "结束", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(SPACE, m.Option(ROUTE), "exit") - m.Sleep("3s") - }}, - "autogen": {Name: "autogen main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", "create", arg) + tcp.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg) m.Option(ice.MSG_PROCESS, ice.PROCESS_INNER) }}, + ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(kit.SSH_CTX), m.Option(kit.SSH_CMD)), arg) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 || arg[0] == "" { - if _route_travel(m, kit.Select("", arg, 0)); m.W == nil { - return + if len(arg) == 0 || arg[0] == "" { // 路由列表 + if _route_travel(m, kit.Select("", arg, 0)); m.W != nil { + _route_list(m) } - m.Table(func(index int, value map[string]string, field []string) { - if value[kit.MDB_TYPE] != MYSELF { - m.PushRender(kit.MDB_LINK, "a", value[kit.SSH_ROUTE], - kit.MergeURL(m.Option(ice.MSG_USERWEB), kit.SSH_POD, kit.Keys(m.Option(kit.SSH_POD, value[kit.SSH_ROUTE])))) - } - - switch value[kit.MDB_TYPE] { - case SERVER: - m.PushButton(gdb.START) - case WORKER: - m.PushButton("autogen") - default: - m.PushButton("") - } - }) - - m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) { - m.Push(kit.MDB_TYPE, MYSELF) - m.Push(kit.SSH_ROUTE, ice.Info.NodeName) - u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) - m.PushRender(kit.MDB_LINK, "a", value["ip"], kit.Format("%s://%s:%s", u.Scheme, value["ip"], u.Port())) - m.PushButton(gdb.START) - }) - - m.Push(kit.MDB_TYPE, MYSELF) - m.Push(kit.SSH_ROUTE, ice.Info.NodeName) - u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) - m.PushRender(kit.MDB_LINK, "a", "localhost", kit.Format("%s://%s:%s", u.Scheme, "localhost", u.Port())) - m.PushButton(gdb.START) - - m.Sort(kit.SSH_ROUTE) - return // 设备列表 - } - - if len(arg) > 3 { // 执行命令 - m.Cmdy(SPACE, arg[0], kit.Keys(arg[1], arg[2]), arg[4:]) - } else if len(arg) > 2 { // 加载插件 - m.Cmdy(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND, arg[2]) - m.Option("_prefix", arg[0], arg[1], arg[2], "run") - m.Option(ice.MSG_PROCESS, ice.PROCESS_FIELD) + m.PushPlugins(arg[0], arg[1], arg[2], ctx.COMMAND) } else if len(arg) > 1 { // 命令列表 m.Cmd(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND).Table(func(index int, value map[string]string, head []string) { - m.Push("cmd", value["key"]) - m.Push("name", value["name"]) - m.Push("help", value["help"]) + m.Push(kit.SSH_CMD, value[kit.MDB_KEY]) + m.Push("", value, []string{kit.MDB_NAME, kit.MDB_HELP}) }) } else if len(arg) > 0 { // 模块列表 m.Cmd(SPACE, arg[0], ctx.CONTEXT).Table(func(index int, value map[string]string, head []string) { - m.Push("ctx", kit.Keys(value["ups"], value["name"])) - m.Push("status", value["status"]) - m.Push("stream", value["stream"]) - m.Push("help", value["help"]) + m.Push(kit.SSH_CTX, kit.Keys(value["ups"], value[kit.MDB_NAME])) + m.Push("", value, []string{ice.CTX_STATUS, ice.CTX_STREAM, kit.MDB_HELP}) }) } }}, diff --git a/base/web/serve.go b/base/web/serve.go index 554d1868..83b1c252 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -4,7 +4,6 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/cli" - "github.com/shylinux/icebergs/base/gdb" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/tcp" kit "github.com/shylinux/toolkits" @@ -19,7 +18,7 @@ import ( func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool { if r.Header.Get("index.module") == "" { r.Header.Set("index.module", m.Target().Name) - } else { + } else { // 模块接口 return true } @@ -67,8 +66,11 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool { return false } - // 内置文件 - return !ice.DumpBinPack(w, r.URL.Path, func(name string) { RenderType(w, name, "") }) + // 文件接口 + if ice.DumpBinPack(w, r.URL.Path, func(name string) { RenderType(w, name, "") }) { + return false + } + return true } func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.ResponseWriter, r *http.Request) { defer func() { @@ -98,7 +100,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon if msg.R, msg.W = r, w; r.Header.Get("X-Real-Port") != "" { msg.Option(ice.MSG_USERADDR, msg.Option(ice.MSG_USERIP)+":"+r.Header.Get("X-Real-Port")) } else { - msg.Option(ice.MSG_USERADDR, r.RemoteAddr) + msg.Option(ice.MSG_USERADDR, msg.Option(ice.MSG_USERIP)) } // 请求数据 @@ -144,7 +146,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon // 执行命令 if cmds, ok := _serve_login(msg, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok { - msg.Option(ice.MSG_USEROPT, msg.Optionv(ice.MSG_OPTION)) + msg.Option(ice.MSG_OPTS, msg.Optionv(ice.MSG_OPTION)) msg.Target().Cmd(msg, key, r.URL.Path, cmds...) } @@ -156,13 +158,13 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt msg.Option(ice.MSG_USERROLE, aaa.VOID) msg.Option(ice.MSG_USERNAME, "") - if msg.Options(ice.MSG_SESSID) { - // 会话认证 + if msg.Option(ice.MSG_SESSID) != "" { aaa.SessCheck(msg, msg.Option(ice.MSG_SESSID)) + // 会话认证 } - if !msg.Options(ice.MSG_USERNAME) && tcp.IsLocalHost(msg, msg.Option(ice.MSG_USERIP)) && msg.Conf(SERVE, kit.Keym(tcp.LOCALHOST)) == "true" { - // 自动认证 + if msg.Option(ice.MSG_USERNAME) == "" && tcp.IsLocalHost(msg, msg.Option(ice.MSG_USERIP)) && msg.Conf(SERVE, kit.Keym(tcp.LOCALHOST)) == "true" { aaa.UserLogin(msg, ice.Info.UserName, ice.Info.PassWord) + // 主机认证 } if _, ok := msg.Target().Commands[LOGIN]; ok { @@ -177,24 +179,19 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt return cmds, true // 白名单 } - if msg.Warn(!msg.Options(ice.MSG_USERNAME), ice.ErrNotLogin, r.URL.Path) { - msg.Render(STATUS, 401, ice.ErrNotLogin) + if msg.Warn(msg.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, r.URL.Path) { + msg.Render(STATUS, http.StatusUnauthorized, ice.ErrNotLogin) return cmds, false // 未登录 } if msg.Warn(!msg.Right(r.URL.Path)) { - msg.Render(STATUS, 403, ice.ErrNotAuth) + msg.Render(STATUS, http.StatusForbidden, ice.ErrNotRight) return cmds, false // 未授权 } - return cmds, true } const ( - LOGIN = "_login" -) -const ( - SERVE_START = "serve.start" - SERVE_CLOSE = "serve.close" + WEB_LOGIN = "_login" ) const SERVE = "serve" @@ -203,12 +200,13 @@ func init() { Configs: map[string]*ice.Config{ SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, tcp.LOCALHOST, true, aaa.BLACK, kit.Dict(), aaa.WHITE, kit.Dict( - "intshell", true, "volcanos", true, "publish", true, "plugin", true, - "login", true, "space", true, "share", true, + "intshell", true, "volcanos", true, + "publish", true, "require", true, + SPACE, true, SHARE, true, ), "logheaders", false, "static", kit.Dict("/", "usr/volcanos/"), - "volcanos", kit.Dict("path", "usr/volcanos", "index", "page/index.html", + "volcanos", kit.Dict("path", "usr/volcanos", "index", "index.html", "repos", "https://github.com/shylinux/volcanos", "branch", "master", ), "publish", "usr/publish/", @@ -229,7 +227,7 @@ func init() { m.Conf(SERVE, kit.Keys(kit.MDB_META, aaa.WHITE, k), true) } }}, - gdb.START: {Name: "start dev= name=self proto=http host= port=9020", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + tcp.START: {Name: "start dev= name=self proto=http host= port=9020", Help: "启动", Hand: func(m *ice.Message, arg ...string) { if cli.NodeInfo(m, SERVER, ice.Info.HostName); m.Option(tcp.PORT) == "random" { m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT)) } @@ -255,8 +253,8 @@ func init() { "/publish/": {Name: "/publish/", Help: "源码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _share_local(m, m.Conf(SERVE, kit.Keym("publish")), path.Join(arg...)) }}, - "/plugin/github.com/": {Name: "/plugin/github.com/", Help: "源码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _share_repos(m, path.Join("github.com", arg[0], arg[1]), arg[2:]...) + "/require/": {Name: "/require/", Help: "源码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + _share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...) }}, }}) } diff --git a/base/web/share.go b/base/web/share.go index 6b3f9775..fc14569c 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -3,7 +3,6 @@ package web import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" - "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" @@ -21,14 +20,14 @@ func _share_cache(m *ice.Message, arg ...string) { func _share_local(m *ice.Message, arg ...string) { p := path.Join(arg...) switch ls := strings.Split(p, "/"); ls[0] { - case "etc", "var": // 私有文件 + case kit.SSH_ETC, kit.SSH_VAR: // 私有文件 if m.Option(ice.MSG_USERROLE) == aaa.VOID { - m.Render(STATUS, http.StatusUnauthorized, "not auth") + m.Render(STATUS, http.StatusUnauthorized, ice.ErrNotRight) return // 没有权限 } default: - if m.Warn(!m.Right(ls), ice.ErrNotAuth, m.Option(ice.MSG_USERROLE), " of ", p) { - m.Render(STATUS, http.StatusUnauthorized, "not auth") + if !m.Right(ls) { + m.Render(STATUS, http.StatusUnauthorized, ice.ErrNotRight) return // 没有权限 } } @@ -41,18 +40,19 @@ func _share_local(m *ice.Message, arg ...string) { } m.Cmdy(SPACE, m.Option(kit.SSH_POD), SPIDE, SPIDE_DEV, SPIDE_RAW, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/proxy/"), - SPIDE_PART, kit.SSH_POD, m.Option(kit.SSH_POD), kit.MDB_PATH, p, "cache", cache.Format(ice.MOD_TIME), "upload", "@"+p) + SPIDE_PART, kit.SSH_POD, m.Option(kit.SSH_POD), kit.MDB_PATH, p, CACHE, cache.Format(ice.MOD_TIME), UPLOAD, "@"+p) - p = path.Join("var/proxy", m.Option(kit.SSH_POD), p) + p = pp } m.Render(ice.RENDER_DOWNLOAD, p) } func _share_proxy(m *ice.Message, arg ...string) { switch m.R.Method { - case http.MethodGet: + case http.MethodGet: // 下发文件 m.Render(ice.RENDER_DOWNLOAD, path.Join("var/proxy", path.Join(m.Option(kit.SSH_POD), m.Option(kit.MDB_PATH), m.Option(kit.MDB_NAME)))) - case http.MethodPost: + + case http.MethodPost: // 上传文件 m.Cmdy(CACHE, UPLOAD) m.Cmdy(CACHE, WATCH, m.Option("data"), path.Join("var/proxy", m.Option(kit.SSH_POD), m.Option(kit.MDB_PATH))) m.Render(ice.RENDER_RESULT, m.Option(kit.MDB_PATH)) @@ -61,11 +61,16 @@ func _share_proxy(m *ice.Message, arg ...string) { func _share_repos(m *ice.Message, repos string, arg ...string) { prefix := kit.Path(m.Conf(SERVE, "meta.require")) if _, e := os.Stat(path.Join(prefix, repos)); e != nil { - m.Cmd(cli.SYSTEM, "git", "clone", "https://"+repos, path.Join(prefix, repos)) + m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, "https://"+repos, kit.MDB_PATH, path.Join(prefix, repos)) } m.Render(ice.RENDER_DOWNLOAD, path.Join(prefix, repos, path.Join(arg...))) } +const ( + LOGIN = "login" + RIVER = "river" + STORM = "storm" +) const SHARE = "share" func init() { @@ -76,63 +81,53 @@ func init() { Commands: map[string]*ice.Command{ SHARE: {Name: "share hash auto", Help: "共享链", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, SHARE, "", mdb.HASH, + m.Cmdy(mdb.INSERT, SHARE, "", mdb.HASH, kit.MDB_TIME, m.Time(m.Conf(SHARE, "meta.expire")), aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), - "river", m.Option(ice.MSG_RIVER), "storm", m.Option(ice.MSG_STORM), - kit.MDB_TIME, m.Time(m.Conf(SHARE, "meta.expire")), arg) + RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, mdb.SELECT: {Name: "select hash", Help: "查询", Hand: func(m *ice.Message, arg ...string) { m.Option(mdb.FIELDS, "time,userrole,username,river,storm,type,name,text") m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) - }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(mdb.FIELDS, kit.Select("time,hash,userrole,username,river,storm,type,name,text", mdb.DETAIL, len(arg) > 0)) m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, arg) m.PushAction(mdb.REMOVE) + + if len(arg) > 0 { + m.PushAnchor(kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) + m.PushQRCode("share", kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) + } }}, "/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(mdb.FIELDS, kit.Select("time,hash,userrole,username,river,storm,type,name,text")) - switch msg := m.Cmd(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, kit.Select(m.Option("share"), arg, 0)); msg.Append(kit.MDB_TYPE) { - case "login": - switch kit.Select("", arg, 1) { - case "share": - list := []string{} - for _, k := range []string{"river", "storm"} { - if msg.Append(k) != "" { - list = append(list, k, msg.Append(k)) - } - } - m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/", SHARE, arg[0], list)) - } - case "river": - switch kit.Select("", arg, 1) { - case "share": - list := []string{} - for _, k := range []string{"river"} { - if msg.Append(k) != "" { - list = append(list, k, msg.Append(k)) - } - } - m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/", SHARE, arg[0], list)) - default: - m.Render("redirect", "/", "river", msg.Append("river")) + msg := m.Cmd(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, kit.Select(m.Option(SHARE), arg, 0)) + list := []string{SHARE, kit.Select(m.Option(SHARE), arg, 0)} + for _, k := range []string{RIVER, STORM} { + if msg.Append(k) != "" { + list = append(list, k, msg.Append(k)) } - case "storm": + } + + switch msg.Append(kit.MDB_TYPE) { + case LOGIN, RIVER: switch kit.Select("", arg, 1) { - case "share": - list := []string{} - for _, k := range []string{"river", "storm"} { - if msg.Append(k) != "" { - list = append(list, k, msg.Append(k)) - } - } - m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/page/share.html", SHARE, arg[0], list)) + case SHARE: + m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/", list)) default: - m.Render("redirect", "/page/share.html", "share", m.Option("share")) + m.Render(REDIRECT, "/", list) + } + + case STORM: + switch kit.Select("", arg, 1) { + case SHARE: + m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/page/share.html", list)) + default: + m.Render(REDIRECT, "/page/share.html", SHARE, m.Option(SHARE)) } } }}, diff --git a/base/web/space.go b/base/web/space.go index d84cea52..654f7940 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -11,7 +11,6 @@ import ( "math/rand" "net" "net/url" - "os" "strings" "time" ) @@ -19,45 +18,51 @@ import ( func _space_list(m *ice.Message, space string) { m.Option(mdb.FIELDS, kit.Select("time,type,name,text", mdb.DETAIL, space != "")) m.Cmdy(mdb.SELECT, SPACE, "", mdb.HASH, kit.MDB_NAME, space) - m.Table(func(index int, value map[string]string, head []string) { - p := kit.MergeURL(m.Option(ice.MSG_USERWEB), kit.SSH_POD, kit.Keys(m.Option(kit.SSH_POD), kit.Select(value[kit.MDB_VALUE], value[kit.MDB_NAME]))) - m.PushRender(kit.MDB_LINK, "a", value[kit.MDB_NAME], p) - }) - m.Sort(kit.MDB_NAME) + + if space == "" { + m.Table(func(index int, value map[string]string, head []string) { + m.PushAnchor(value[kit.MDB_NAME], kit.MergeURL(strings.Split(m.Option(ice.MSG_USERWEB), "?")[0], + kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value[kit.MDB_NAME]))) + }) + m.SortStrR(kit.MDB_NAME) + } } func _space_dial(m *ice.Message, dev, name string, arg ...string) { m.Richs(SPIDE, nil, dev, func(key string, value map[string]interface{}) { - client := kit.Value(value, "client").(map[string]interface{}) + client := kit.Value(value, tcp.CLIENT).(map[string]interface{}) redial := m.Confm(SPACE, "meta.redial") - web := m.Target().Server().(*Frame) + frame := m.Target().Server().(*Frame) + + host := kit.Format(client[tcp.HOSTNAME]) + proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1) + uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, + kit.MDB_NAME, name, "share", ice.Info.CtxShare, "river", ice.Info.CtxRiver, arg) - host := kit.Format(client["hostname"]) - proto := kit.Select("ws", "wss", client["protocol"] == "https") - uri := kit.MergeURL(proto+"://"+host+"/space/", "name", name, "type", ice.Info.NodeType, "share", os.Getenv("ctx_share"), "river", os.Getenv("ctx_river")) if u, e := url.Parse(uri); m.Assert(e) { m.Go(func() { for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ { - m.Option(tcp.DIAL_CB, func(s net.Conn, e error) { - if m.Warn(e != nil, e) { + msg := m.Spawn() + msg.Option(tcp.DIAL_CB, func(s net.Conn, e error) { + if msg.Warn(e != nil, e) { return } - if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !m.Warn(e != nil, e) { - m.Rich(SPACE, nil, kit.Dict("socket", s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host)) - m.Log_CREATE(SPACE, dev, "retry", i, "uri", uri) + + if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e != nil, e) { + msg.Rich(SPACE, nil, kit.Dict(tcp.SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host)) + msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri) // 连接成功 - m = m.Spawn() - if i = 0; _space_handle(m, true, web.send, s, dev) { - i = -1 // 连接关闭 + if i = 0; _space_handle(msg, true, frame.send, s, dev) { + i = -2 // 连接关闭 } } }) ls := strings.Split(host, ":") - m.Cmd(tcp.CLIENT, tcp.DIAL, kit.MDB_TYPE, "wss", kit.MDB_NAME, dev, tcp.HOST, ls[0], tcp.PORT, ls[1]) + msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.MDB_TYPE, "wss", kit.MDB_NAME, dev, tcp.HOST, ls[0], tcp.PORT, ls[1]) // 断线重连 sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond - m.Cost("order", i, "sleep", sleep, "reconnect", u) + msg.Cost("order", i, "sleep", sleep, "reconnect", u) time.Sleep(sleep) } }) @@ -66,37 +71,37 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { } func _space_send(m *ice.Message, space string, arg ...string) { if space == "" || space == MYSELF || space == ice.Info.NodeName { - m.Cmdy(arg) - return // 本地命令 + m.Cmdy(arg) // 本地命令 + return } - target := strings.Split(space, ".") - frame := m.Target().Server().(*Frame) + target := kit.Split(space, ".", ".") m.Warn(m.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) { - if socket, ok := value["socket"].(*websocket.Conn); !m.Warn(!ok, "socket err") { + if socket, ok := value[tcp.SOCKET].(*websocket.Conn); !m.Warn(!ok, ice.ErrNotFound, tcp.SOCKET) { + // 复制选项 - for _, k := range kit.Simple(m.Optionv(ice.MSG_USEROPT)) { + for _, k := range kit.Simple(m.Optionv(ice.MSG_OPTS)) { switch k { - case "detail", "cmds", ice.MSG_SESSID: + case ice.MSG_DETAIL, ice.MSG_CMDS, ice.MSG_SESSID: default: m.Optionv(k, m.Optionv(k)) } } - m.Optionv(ice.MSG_USEROPT, m.Optionv(ice.MSG_USEROPT)) - m.Optionv("option", nil) + m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTS)) + m.Optionv(ice.MSG_OPTION, nil) // 构造路由 + frame := m.Target().Server().(*Frame) id := kit.Format(m.Target().ID()) frame.send[id] = m // 下发命令 - m.Set(ice.MSG_DETAIL, arg...) - _space_echo(m, []string{id}, target[1:], socket, target[0]) + _space_echo(m.Set(ice.MSG_DETAIL, arg...), []string{id}, target[1:], socket, target[0]) m.Option("timeout", m.Conf(SPACE, "meta.timeout.c")) m.Call(m.Option("_async") == "", func(res *ice.Message) *ice.Message { + // 返回结果 if delete(frame.send, id); res != nil && m != nil { - // 返回结果 return m.Cost(kit.Format("[%v]->%v %v %v", id, target, arg, m.Copy(res).Format(ice.MSG_APPEND))) } return nil @@ -106,24 +111,19 @@ func _space_send(m *ice.Message, space string, arg ...string) { } func _space_echo(msg *ice.Message, source, target []string, c *websocket.Conn, name string) { - _args, _ := msg.Optionv(ice.MSG_ARGS).([]interface{}) - switch arg := kit.Simple(_args...); msg.Option(ice.MSG_OUTPUT) { - case ice.RENDER_DOWNLOAD: - msg.Cmdy("nfs.cat", arg[0]) - } - msg.Optionv(ice.MSG_SOURCE, source) msg.Optionv(ice.MSG_TARGET, target) - e := c.WriteMessage(1, []byte(msg.Format("meta"))) - msg.Assert(e) + msg.Assert(c.WriteMessage(1, []byte(msg.Format(kit.MDB_META)))) + target = append([]string{name}, target...) - msg.Log("send", "%v->%v %v %v", source, target, msg.Detailv(), msg.Format("meta")) + msg.Log("send", "%v->%v %v %v", source, target, msg.Detailv(), msg.Format(kit.MDB_META)) } func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) { - if !msg.Warn(!msg.Right(msg.Detailv()), ice.ErrNotAuth) { + if !msg.Warn(!msg.Right(msg.Detailv()), ice.ErrNotRight) { msg = msg.Cmd() } - msg.Set(ice.MSG_USEROPT) + + msg.Set(ice.MSG_OPTS) _space_echo(msg, []string{}, kit.Revert(source)[1:], c, name) msg.Cost(kit.Format("%v->%v %v %v", source, target, msg.Detailv(), msg.Format(ice.MSG_APPEND))) } @@ -135,61 +135,64 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w socket, msg := c, m.Spawn(b) target := kit.Simple(msg.Optionv(ice.MSG_TARGET)) source := kit.Simple(msg.Optionv(ice.MSG_SOURCE), name) - msg.Log("recv", "%v->%v %s %v", source, target, msg.Detailv(), msg.Format("meta")) + msg.Log("recv", "%v->%v %s %v", source, target, msg.Detailv(), msg.Format(kit.MDB_META)) - if len(target) == 0 { + if len(target) == 0 { // 本地执行 if msg.Option(ice.MSG_USERROLE, aaa.UserRole(msg, msg.Option(ice.MSG_USERNAME))) == aaa.VOID { role := msg.Cmdx(SPIDE, SPIDE_DEV, SPIDE_MSG, SPIDE_GET, "/chat/header", "cmds", aaa.USERROLE, "who", msg.Option(ice.MSG_USERNAME)) msg.Option(ice.MSG_USERROLE, kit.Select(role, aaa.TECH, role == aaa.ROOT)) } msg.Log_AUTH(aaa.USERROLE, msg.Option(ice.MSG_USERROLE), aaa.USERNAME, msg.Option(ice.MSG_USERNAME)) - if msg.Optionv(ice.MSG_HANDLE, "true"); !msg.Warn(!safe, ice.ErrNotAuth) { - // 本地执行 - msg.Option("_dev", name) + if msg.Optionv(ice.MSG_HANDLE, "true"); !msg.Warn(!safe, ice.ErrNotRight) { msg.Go(func() { _space_exec(msg, source, target, c, name) }) } + } else if msg.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) { - // 查询节点 - name := target[0] - if s, ok := value["socket"].(*websocket.Conn); ok { - socket, source, target = s, source, target[1:] - } else { + if s, ok := value[tcp.SOCKET].(*websocket.Conn); ok { socket, source, target = s, source, target[1:] + _space_echo(msg, source, target, socket, target[0]) + return // 转发报文 } - _space_echo(msg, source, target, socket, name) - }) != nil { - // 转发报文 - } else if res, ok := send[msg.Option(ice.MSG_TARGET)]; len(target) == 1 && ok { - // 接收响应 + if msg.Warn(msg.Option(ice.MSG_HANDLE) == "true", ice.ErrNotFound) { + // 回复失败 + + } else { // 下发失败 + msg.Warn(true, ice.ErrNotFound) + source, target = []string{}, kit.Revert(source)[1:] + } + }) != nil { // 转发成功 + + } else if res, ok := send[msg.Option(ice.MSG_TARGET)]; len(target) != 1 || !ok { + if msg.Warn(msg.Option(ice.MSG_HANDLE) == "true", ice.ErrNotFound) { + // 回复失败 + + } else { // 下发失败 + msg.Warn(true, ice.ErrNotFound) + source, target = []string{}, kit.Revert(source)[1:] + } + + } else { // 接收响应 res.Back(msg) - - } else if msg.Warn(msg.Option("_handle") == "true", "space miss") { - // 回复失败 - - } else { - // 下发失败 - msg.Warn(true, "space error") - source, target = []string{}, kit.Revert(source)[1:] } } } return false } func _space_search(m *ice.Message, kind, name, text string, arg ...string) { - m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { - if val = kit.GetMeta(val); strings.Contains(kit.Format(val["name"]), name) { - m.PushSearch("cmd", SPACE, "type", val["type"], "name", val["name"], "text", kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", val["name"])) + m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + if value = kit.GetMeta(value); strings.Contains(kit.Format(value[kit.MDB_NAME]), name) { + m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, value[kit.MDB_TYPE], kit.MDB_NAME, value[kit.MDB_NAME], + kit.MDB_TEXT, kit.MergeURL(m.Option(ice.MSG_USERWEB), kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value[kit.MDB_NAME]))) } }) } const ( + CHROME = "chrome" MASTER = "master" MYSELF = "myself" - BETTER = "better" - CHROME = "chrome" SERVER = "server" WORKER = "worker" ) @@ -211,9 +214,9 @@ func init() { Commands: map[string]*ice.Command{ SPACE: {Name: "space name cmd auto", Help: "空间站", Action: map[string]*ice.Action{ tcp.DIAL: {Name: "dial dev name", Help: "连接", Hand: func(m *ice.Message, arg ...string) { - _space_dial(m, m.Option("dev"), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME))) + _space_dial(m, m.Option(SPIDE_DEV), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME))) }}, - mdb.SEARCH: {Name: "search type name text arg...", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { _space_search(m, arg[0], arg[1], kit.Select("", arg, 2)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { @@ -224,32 +227,33 @@ func init() { _space_send(m, arg[0], arg[1:]...) }}, - "/space/": {Name: "/space/ type name", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + "/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) { - name := m.Option(kit.MDB_NAME, strings.Replace(kit.Select(m.Option(ice.MSG_USERADDR), m.Option(kit.MDB_NAME)), ".", "_", -1)) + name := m.Option(kit.MDB_NAME, strings.Replace(kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME)), ".", "_", -1)) kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE)) share := m.Option("share") river := m.Option("river") // 添加节点 - h := m.Rich(SPACE, nil, kit.Dict("socket", s, "share", share, "river", river, + h := m.Rich(SPACE, nil, kit.Dict(tcp.SOCKET, s, "share", share, "river", river, kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, s.RemoteAddr().String(), )) m.Go(func() { + defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") + // 监听消息 - switch kind { + switch args := []string{kit.MDB_TYPE, kind, kit.MDB_NAME, name, "share", share, "river", river}; kind { case WORKER: - m.Event(DREAM_START, "type", kind, "name", name, "share", share, "river", river) - defer m.Event(DREAM_STOP, "type", kind, "name", name, "share", share, "river", river) + m.Event(DREAM_START, args...) + defer m.Event(DREAM_STOP, args...) default: - m.Event(SPACE_START, "type", kind, "name", name, "share", share, "river", river) - defer m.Event(SPACE_STOP, "type", kind, "name", name, "share", share, "river", river) + m.Event(SPACE_START, args...) + defer m.Event(SPACE_STOP, args...) } frame := m.Target().Server().(*Frame) _space_handle(m, false, frame.send, s, name) - m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") }) } }}, diff --git a/base/web/web.go b/base/web/web.go index 4d925323..f782fd61 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -72,8 +72,6 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool { web.m, web.Server = m, &http.Server{Handler: web} m.Option(tcp.LISTEN_CB, func(l net.Listener) { m.Cmdy(mdb.INSERT, SERVE, "", mdb.HASH, arg, kit.MDB_STATUS, tcp.START, kit.MDB_PROTO, m.Option(kit.MDB_PROTO), SPIDE_DEV, m.Option(SPIDE_DEV)) - m.Event(SERVE_START, arg...) - defer m.Event(SERVE_CLOSE, arg...) defer m.Cmd(mdb.MODIFY, SERVE, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, tcp.STOP) // 启动服务 @@ -113,7 +111,7 @@ var Index = &ice.Context{Name: WEB, Help: "网络模块", func init() { ice.Index.Register(Index, &Frame{}, - SPIDE, SERVE, SPACE, DREAM, - ROUTE, CACHE, SHARE, STORY, + ROUTE, SERVE, SPACE, DREAM, + SPIDE, SHARE, CACHE, STORY, ) } diff --git a/base/web/web.shy b/base/web/web.shy index 528275be..b6c214d3 100644 --- a/base/web/web.shy +++ b/base/web/web.shy @@ -1,11 +1,11 @@ chapter "web" -field "蜘蛛侠" web.spide +field "路由器" web.route field "服务器" web.serve field "空间站" web.space field "梦想家" web.dream -field "路由器" web.route +field "蜘蛛侠" web.spide field "共享链" web.share field "缓存池" web.cache field "故事会" web.story diff --git a/conf.go b/conf.go index 9ff866f4..248d2af5 100644 --- a/conf.go +++ b/conf.go @@ -6,7 +6,7 @@ const ( //MOD MOD_CHAN = 16 MOD_TICK = "1s" - MOD_BUF = 1024 + MOD_BUFS = 1024 MOD_DATE = "2006-01-02" MOD_TIME = "2006-01-02 15:04:05" @@ -25,26 +25,25 @@ const ( // MSG MSG_OUTPUT = "_output" MSG_ARGS = "_args" + MSG_PROCESS = "_process" MSG_CONTROL = "_control" MSG_DISPLAY = "_display" - MSG_PROCESS = "_process" MSG_CMDS = "cmds" - MSG_DOMAIN = "domain" MSG_SESSID = "sessid" + MSG_DOMAIN = "domain" + MSG_OPTS = "_option" - MSG_USERIP = "user.ip" - MSG_USERUA = "user.ua" - MSG_USERWEB = "user.web" - MSG_USERPOD = "user.pod" - // MSG_USEROPT = "user.opt" - MSG_USEROPT = "_option" + MSG_USERIP = "user.ip" + MSG_USERUA = "user.ua" + MSG_USERWEB = "user.web" + MSG_USERPOD = "user.pod" + MSG_USERADDR = "user.addr" + MSG_USERDATA = "user.data" MSG_USERNICK = "user.nick" MSG_USERNAME = "user.name" MSG_USERZONE = "user.zone" MSG_USERROLE = "user.role" - MSG_USERDATA = "user.data" - MSG_USERADDR = "user.addr" MSG_RIVER = "sess.river" MSG_STORM = "sess.storm" @@ -53,41 +52,32 @@ const ( // MSG const ( // RENDER RENDER_VOID = "_void" RENDER_RESULT = "_result" + RENDER_ANCHOR = "_anchor" + RENDER_BUTTON = "_button" RENDER_QRCODE = "_qrcode" + RENDER_SCRIPT = "_script" RENDER_DOWNLOAD = "_download" RENDER_TEMPLATE = "_template" ) -const ( - CONTROL_PAGE = "_page" - +const ( // PROCESS PROCESS_REFRESH = "_refresh" PROCESS_FOLLOW = "_follow" PROCESS_INNER = "_inner" PROCESS_FIELD = "_field" -) -const ( // CTX - CTX_FOLLOW = "follow" - CTX_STATUS = "status" - CTX_STREAM = "stream" - CTX_BEGIN = "begin" - CTX_START = "start" - CTX_SERVE = "serve" - CTX_CLOSE = "close" - - CTX_INIT = "_init" - CTX_EXIT = "_exit" + FIELD_PREFIX = "_prefix" + CONTROL_PAGE = "_page" ) const ( // LOG // 数据 - LOG_IMPORT = "import" - LOG_EXPORT = "export" LOG_CREATE = "create" LOG_REMOVE = "remove" + LOG_MODIFY = "modify" LOG_INSERT = "insert" LOG_DELETE = "delete" LOG_SELECT = "select" - LOG_MODIFY = "modify" + LOG_EXPORT = "export" + LOG_IMPORT = "import" // 状态 LOG_BEGIN = "begin" @@ -104,3 +94,16 @@ const ( // LOG LOG_ERROR = "error" LOG_DEBUG = "debug" ) +const ( // CTX + CTX_FOLLOW = "follow" + CTX_STATUS = "status" + CTX_STREAM = "stream" + + CTX_BEGIN = "begin" + CTX_START = "start" + CTX_SERVE = "serve" + CTX_CLOSE = "close" + + CTX_INIT = "_init" + CTX_EXIT = "_exit" +) diff --git a/core/chat/action.go b/core/chat/action.go index 2617d582..39405bb6 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -73,7 +73,7 @@ func _action_show(m *ice.Message, river, storm, index string, arg ...string) { if cmds = kit.Simple(kit.Keys(value[CTX], value[CMD])); kit.Format(value[POD]) != "" { m.Option(POD, value[POD]) } - }) == nil && m.Warn(!m.Right(cmds), ice.ErrNotAuth) { + }) == nil && m.Warn(!m.Right(cmds), ice.ErrNotRight) { return } @@ -121,7 +121,7 @@ func init() { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { return // 没有登录 } - if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotAuth) { + if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight) { return // 没有授权 } } diff --git a/core/chat/river.go b/core/chat/river.go index 1233cddd..ef57ee84 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -106,7 +106,7 @@ func init() { mdb.INSERT: {Name: "insert type name share", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), NODE), mdb.HASH, arg) }}, - mdb.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { m.Option(web.SHARE, m.Cmdx(m.Prefix(AUTH), mdb.CREATE, kit.MDB_TYPE, NODE)) m.Cmdy(code.PUBLISH, "contexts", "tool") }}, @@ -232,7 +232,7 @@ func init() { }) }}, USER: {Name: "user username auto insert invite", Help: "用户", Action: map[string]*ice.Action{ - mdb.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { share := m.Option(web.SHARE, m.Cmdx(m.Prefix(AUTH), mdb.CREATE, kit.MDB_TYPE, USER)) m.Cmdy(wiki.SPARK, "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, share)) m.Cmdy(wiki.IMAGE, "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, share)) @@ -329,7 +329,7 @@ func init() { m.Cmdy(m.Prefix(arg[1]), arg[2:]) return // 应用列表 } - if m.Warn(!m.Right(RIVER, arg), ice.ErrNotAuth) { + if m.Warn(!m.Right(RIVER, arg), ice.ErrNotRight) { return // 没有授权 } diff --git a/core/code/inner.go b/core/code/inner.go index c0678a8e..e719cfd9 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -34,7 +34,7 @@ func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { return } - if m.Warn(!m.Right(dir, file), ice.ErrNotAuth, path.Join(dir, file)) { + if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) { return // 没有权限 } if m.Cmdy(mdb.RENDER, ext, file, dir, arg); m.Result() != "" { @@ -49,7 +49,7 @@ func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { m.Echo(path.Join(dir, file)) } func _inner_show(m *ice.Message, ext, file, dir string, arg ...string) { - if m.Warn(!m.Right(dir, file), ice.ErrNotAuth, path.Join(dir, file)) { + if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) { return // 没有权限 } if m.Cmdy(mdb.ENGINE, ext, file, dir, arg); m.Result() != "" { diff --git a/core/wiki/word.go b/core/wiki/word.go index 9d32f39c..2c49679c 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -388,7 +388,7 @@ func init() { }}, FIELD: {Name: "field [name] cmd", Help: "插件", Action: map[string]*ice.Action{ "run": {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { - if !m.Warn(!m.Right(arg[1:]), ice.ErrNotAuth, arg[1:]) { + if !m.Warn(!m.Right(arg[1:]), ice.ErrNotRight, arg[1:]) { m.Cmdy(arg[1:]) } }}, diff --git a/init.go b/init.go index a0559f89..cdaa16a4 100644 --- a/init.go +++ b/init.go @@ -15,8 +15,11 @@ var Info = struct { PathName string UserName string PassWord string + NodeType string NodeName string + CtxShare string + CtxRiver string Build struct { Time string diff --git a/logs.go b/logs.go index b4a83a50..a1006ff7 100644 --- a/logs.go +++ b/logs.go @@ -9,10 +9,10 @@ import ( ) var ErrWarn = "warn: " -var ErrNotFound = "not found: " var ErrNotLogin = "not login: " -var ErrNotAuth = "not auth: " -var ErrNotJoin = "not join: " +var ErrNotRight = "not right: " +var ErrNotFound = "not found: " +var ErrNotShare = "not share: " var _log_disable = true var Log func(m *Message, p, l, s string) diff --git a/meta.go b/meta.go index db22ce5e..e5d62bb1 100644 --- a/meta.go +++ b/meta.go @@ -170,7 +170,7 @@ func (m *Message) Copy(msg *Message, arg ...string) *Message { if i := kit.IndexOf(m.meta[MSG_OPTION], k); i > -1 && len(m.meta[k]) > 0 { m.meta[k] = m.meta[k][:0] } - if i := kit.IndexOf(m.meta[MSG_USEROPT], k); i > -1 && len(m.meta[k]) > 0 { + if i := kit.IndexOf(m.meta[MSG_OPTS], k); i > -1 && len(m.meta[k]) > 0 { m.meta[k] = m.meta[k][:0] } if kit.IndexOf(m.meta[MSG_APPEND], k) == -1 { diff --git a/misc.go b/misc.go index e9dbba10..b6b9d431 100644 --- a/misc.go +++ b/misc.go @@ -3,7 +3,10 @@ package ice import ( kit "github.com/shylinux/toolkits" + "bytes" + "encoding/base64" "fmt" + "github.com/skip2/go-qrcode" "net/url" "path" "strings" @@ -47,7 +50,9 @@ func (m *Message) Event(key string, arg ...string) *Message { return m } func (m *Message) Right(arg ...interface{}) bool { - return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("aaa.role", "right", m.Option(MSG_USERROLE), strings.ReplaceAll(kit.Keys(arg...), "/", ".")) != "ok", ErrNotAuth, m.Option(MSG_USERROLE), " of ", strings.Join(kit.Simple(arg), ".")) + return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("aaa.role", "right", + m.Option(MSG_USERROLE), strings.ReplaceAll(kit.Keys(arg...), "/", ".")) != "ok", + ErrNotRight, m.Option(MSG_USERROLE), " of ", strings.Join(kit.Simple(arg), "."), " at ", kit.FileLine(2, 3)) } func (m *Message) Space(arg interface{}) []string { if arg == nil || arg == "" || kit.Format(arg) == m.Conf("cli.runtime", "node.name") { @@ -56,10 +61,15 @@ func (m *Message) Space(arg interface{}) []string { return []string{"web.space", kit.Format(arg)} } -func (m *Message) PushPlugin(key string, arg ...string) { +func (m *Message) PushPlugins(pod, ctx, cmd string, arg ...string) { + m.Cmdy("space", pod, "context", ctx, "command", cmd) m.Option(MSG_PROCESS, PROCESS_FIELD) - m.Option("_prefix", arg) + m.Option(FIELD_PREFIX, arg) +} +func (m *Message) PushPlugin(key string, arg ...string) { m.Cmdy("command", key) + m.Option(MSG_PROCESS, PROCESS_FIELD) + m.Option(FIELD_PREFIX, arg) } func (m *Message) PushRender(key, view, name string, arg ...string) *Message { if m.Option(MSG_USERUA) == "" { @@ -81,22 +91,16 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message { m.Push(key, fmt.Sprintf(`