diff --git a/base/nfs/dir.go b/base/nfs/dir.go
index 7aad64fd..4238d9be 100644
--- a/base/nfs/dir.go
+++ b/base/nfs/dir.go
@@ -124,7 +124,7 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d
case kit.MDB_LINK:
m.PushDownload(kit.MDB_LINK, kit.Select("", f.Name(), !f.IsDir()), path.Join(root, name, f.Name()))
case "show":
- p := kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/local/"+path.Join(name, f.Name()), ice.POD, m.Option(ice.MSG_USERPOD))
+ p := m.MergeURL2("/share/local/"+path.Join(name, f.Name()), ice.POD, m.Option(ice.MSG_USERPOD))
switch kit.Ext(f.Name()) {
case "jpg", "png":
m.PushImages(field, p)
diff --git a/base/web/cache.go b/base/web/cache.go
index cbd8841b..3d185e38 100644
--- a/base/web/cache.go
+++ b/base/web/cache.go
@@ -184,7 +184,7 @@ func init() {
if m.Append(kit.MDB_FILE) == "" {
m.PushScript("inner", m.Append(kit.MDB_TEXT))
} else {
- m.PushDownload(m.Append(kit.MDB_NAME), kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+arg[0]))
+ m.PushDownload(m.Append(kit.MDB_NAME), m.MergeURL2("/share/cache/"+arg[0]))
}
}},
}})
diff --git a/base/web/dream.go b/base/web/dream.go
index a9720bdd..a77bb7bb 100644
--- a/base/web/dream.go
+++ b/base/web/dream.go
@@ -43,7 +43,7 @@ func _dream_show(m *ice.Message, name string) {
os.MkdirAll(p, ice.MOD_DIR)
}
- m.ProcessOpen(kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/chat/pod/"+name))
+ m.ProcessOpen(m.MergeURL2("/chat/pod/" + name))
// 任务模板
if m.Option(kit.MDB_TEMPLATE) != "" {
diff --git a/base/web/route.go b/base/web/route.go
index e5270dd5..02133855 100644
--- a/base/web/route.go
+++ b/base/web/route.go
@@ -69,7 +69,7 @@ func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
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 spide", Help: "路由器", Action: map[string]*ice.Action{
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
p := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN))
m.EchoAnchor(p)
@@ -115,6 +115,14 @@ func init() {
m.Debug(m.Option(ROUTE))
m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(ice.CTX), m.Option(ice.CMD)), arg)
}},
+ "spide": {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
+ if len(arg) == 0 { // 模块列表
+ m.Cmdy(ROUTE)
+ m.Display("/plugin/story/spide.js", "root", ice.ICE, "field", "route", "split", ice.PT, "prefix", "spide")
+ m.StatusTimeCount()
+ return
+ }
+ }},
}, 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 {
diff --git a/base/web/serve.go b/base/web/serve.go
index 638db42d..27c96ab2 100644
--- a/base/web/serve.go
+++ b/base/web/serve.go
@@ -231,6 +231,16 @@ func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWr
}
return cmds, true
}
+func _serve_spide(m *ice.Message, prefix string, c *ice.Context) {
+ for k := range c.Commands {
+ if strings.HasPrefix(k, "/") {
+ m.Push("path", path.Join(prefix, k)+kit.Select("", "/", strings.HasSuffix(k, "/")))
+ }
+ }
+ for k, v := range c.Contexts {
+ _serve_spide(m, path.Join(prefix, k), v)
+ }
+}
const (
WEB_LOGIN = "_login"
@@ -265,7 +275,7 @@ func init() {
m.Done(value[kit.MDB_STATUS] == tcp.START)
})
}},
- SERVE: {Name: "serve name auto start", Help: "服务器", Action: ice.MergeAction(map[string]*ice.Action{
+ SERVE: {Name: "serve name auto start spide", Help: "服务器", Action: ice.MergeAction(map[string]*ice.Action{
aaa.BLACK: {Name: "black", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) {
for _, k := range arg {
m.Log_CREATE(aaa.BLACK, k)
@@ -291,6 +301,14 @@ func init() {
m.Cmd(SPACE, tcp.DIAL, ice.DEV, k, kit.MDB_NAME, ice.Info.NodeName)
}
}},
+ "spide": {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
+ if len(arg) == 0 { // 模块列表
+ _serve_spide(m, "/", m.Target())
+ m.Display("/plugin/story/spide.js", "root", ice.ICE, "prefix", "spide")
+ m.StatusTimeCount()
+ return
+ }
+ }},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
mdb.HashSelect(m, arg...)
}},
diff --git a/base/web/share.go b/base/web/share.go
index 19188aab..72694065 100644
--- a/base/web/share.go
+++ b/base/web/share.go
@@ -19,7 +19,7 @@ import (
func _share_link(m *ice.Message, p string, arg ...interface{}) string {
p = kit.Select("", "/share/local/", !strings.HasPrefix(p, "/")) + p
- return tcp.ReplaceLocalhost(m, kit.MergeURL2(m.Option(ice.MSG_USERWEB), p, arg...))
+ return tcp.ReplaceLocalhost(m, m.MergeURL2(p, arg...))
}
func _share_repos(m *ice.Message, repos string, arg ...string) {
prefix := kit.Path(m.Conf(SERVE, kit.Keym(ice.REQUIRE)))
@@ -75,7 +75,7 @@ func _share_local(m *ice.Message, arg ...string) {
}
// 上传文件
- m.Cmdy(SPACE, m.Option(ice.POD), SPIDE, ice.DEV, SPIDE_RAW, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/proxy"),
+ m.Cmdy(SPACE, m.Option(ice.POD), SPIDE, ice.DEV, SPIDE_RAW, m.MergeURL2("/share/proxy"),
SPIDE_PART, m.OptionSimple(ice.POD), kit.MDB_PATH, p, CACHE, cache.Format(ice.MOD_TIME), UPLOAD, "@"+p)
if s, e := os.Stat(pp); e == nil && !s.IsDir() {
diff --git a/base/web/space.go b/base/web/space.go
index 949e70cc..bc67ee53 100644
--- a/base/web/space.go
+++ b/base/web/space.go
@@ -16,7 +16,7 @@ import (
)
func _space_link(m *ice.Message, pod string, arg ...interface{}) string {
- return tcp.ReplaceLocalhost(m, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/chat/pod/"+pod, arg...))
+ return tcp.ReplaceLocalhost(m, m.MergeURL2("/chat/pod/"+pod, arg...))
}
func _space_domain(m *ice.Message) (link string) {
link = m.Config(kit.MDB_DOMAIN)
diff --git a/core/chat/node.go b/core/chat/node.go
index 9597668b..75165d90 100644
--- a/core/chat/node.go
+++ b/core/chat/node.go
@@ -52,8 +52,7 @@ func init() {
m.Option(mdb.FIELDS, "time,type,name,share")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH)
m.Table(func(index int, value map[string]string, head []string) {
- m.PushAnchor(value[kit.MDB_NAME], kit.MergeURL2(m.Option(ice.MSG_USERWEB),
- "/chat/pod/"+kit.Keys(m.Option(ice.POD), value[kit.MDB_NAME])))
+ m.PushAnchor(value[kit.MDB_NAME], m.MergeURL2("/chat/pod/"+kit.Keys(m.Option(ice.POD), value[kit.MDB_NAME])))
})
m.RenameAppend("name", "pod")
m.PushAction(mdb.REMOVE)
diff --git a/core/chat/trans.go b/core/chat/trans.go
index 355918af..222ec512 100644
--- a/core/chat/trans.go
+++ b/core/chat/trans.go
@@ -22,7 +22,7 @@ func init() {
TRANS: {Name: "trans from to auto", Help: "传输", Action: ice.MergeAction(map[string]*ice.Action{
SEND: {Name: "send", Help: "发送", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPACE, m.Option(TO), web.SPIDE, ice.DEV, web.SPIDE_SAVE, kit.Select(ice.PWD, m.Option("to_path")),
- kit.MergeURL2(m.Option(ice.MSG_USERWEB), path.Join("/share/local/", m.Option("from_path")), ice.POD, m.Option(FROM),
+ m.MergeURL2(path.Join("/share/local/", m.Option("from_path")), ice.POD, m.Option(FROM),
web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN),
),
)
diff --git a/core/code/python.go b/core/code/python.go
index fbbfbb3e..e725ab89 100644
--- a/core/code/python.go
+++ b/core/code/python.go
@@ -12,7 +12,7 @@ import (
const PYTHON = "python"
func init() {
- Index.Register(&ice.Context{
+ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
PYTHON: {Name: PYTHON, Help: "脚本命令", Value: kit.Data(
cli.SOURCE, "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz",
@@ -40,5 +40,5 @@ func init() {
m.Cmdy(INSTALL, path.Base(m.Conf(PYTHON, kit.META_SOURCE)), arg)
}},
},
- }, nil)
+ })
}
diff --git a/misc.go b/misc.go
index 5753b270..7b5adefd 100644
--- a/misc.go
+++ b/misc.go
@@ -139,6 +139,9 @@ func (m *Message) AppendTrans(cb func(value string, key string, index int) strin
}
}
}
+func (m *Message) MergeURL2(url string, arg ...interface{}) string {
+ return kit.MergeURL2(m.Option(MSG_USERWEB), url, arg...)
+}
func (m *Message) cmd(arg ...interface{}) *Message {
opts := map[string]interface{}{}
diff --git a/misc/git/server.go b/misc/git/server.go
index fc423499..3124c6cb 100644
--- a/misc/git/server.go
+++ b/misc/git/server.go
@@ -19,6 +19,7 @@ import (
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
+ "shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
@@ -43,6 +44,11 @@ func packetWrite(m *ice.Message, cmd string, str ...string) {
var basicAuthRegex = regexp.MustCompile("^([^:]*):(.*)$")
func _server_login(m *ice.Message) error {
+ if m.Conf("web.serve", "meta.localhost") != ice.FALSE {
+ if tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) {
+ return nil
+ }
+ }
parts := strings.SplitN(m.R.Header.Get("Authorization"), ice.SP, 2)
if len(parts) < 2 {
return fmt.Errorf("Invalid authorization header, not enought parts")
@@ -125,7 +131,7 @@ func init() {
}},
}, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if m.Option("go-get") == "1" { // 下载地址
- p := kit.Split(kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/x/"+path.Join(arg...)), "?")[0]
+ p := kit.Split(m.MergeURL2("/x/"+path.Join(arg...)), "?")[0]
m.RenderResult(kit.Format(``, "go-import", kit.Format(`%s git %s`, strings.TrimPrefix(p, "https://"), p)))
return
}
@@ -148,16 +154,24 @@ func init() {
web.RenderStatus(m, 500, err.Error())
}
}},
- SERVER: {Name: "server path auto create", Help: "服务器", Action: map[string]*ice.Action{
+ SERVER: {Name: "server path auto create import", Help: "服务器", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create name", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, path.Join(ice.USR_LOCAL, REPOS))
m.Cmdy(cli.SYSTEM, GIT, INIT, "--bare", m.Option(kit.MDB_NAME))
}},
+ mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(REPOS, ice.OptionFields("time,name,path")).Table(func(index int, value map[string]string, head []string) {
+ m.Option(cli.CMD_DIR, value[nfs.PATH])
+ m.Cmd(cli.SYSTEM, "git", "push", m.MergeURL2("/x/"+value[kit.MDB_NAME]), "master")
+ m.Cmd(cli.SYSTEM, "git", "push", "--tags", m.MergeURL2("/x/"+value[kit.MDB_NAME]), "master")
+ })
+ }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if m.Option(nfs.DIR_ROOT, path.Join(ice.USR_LOCAL, REPOS)); len(arg) == 0 {
- m.Cmdy(nfs.DIR, "").Table(func(index int, value map[string]string, head []string) {
- m.PushScript("git clone " + kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/x/"+value[nfs.PATH]))
+ m.Cmdy(nfs.DIR, ice.PWD, "time,path,size").Table(func(index int, value map[string]string, head []string) {
+ m.PushScript("git clone " + m.MergeURL2("/x/"+value[nfs.PATH]))
})
+ m.StatusTimeCount()
return
}
m.Cmdy("_sum", path.Join(m.Option(nfs.DIR_ROOT), arg[0]))
diff --git a/misc/lark/sso.go b/misc/lark/sso.go
index 8588879d..1b84badb 100644
--- a/misc/lark/sso.go
+++ b/misc/lark/sso.go
@@ -18,7 +18,7 @@ func init() {
return
}
- home := kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/chat/lark/sso")
+ home := m.MergeURL2("/chat/lark/sso")
if m.Option(kit.MDB_CODE) != "" { // 登录成功
msg := m.Cmd(web.SPIDE, LARK, "/open-apis/authen/v1/access_token", "grant_type", "authorization_code",
kit.MDB_CODE, m.Option(kit.MDB_CODE), "app_access_token", m.Cmdx(APP, TOKEN, m.Cmd(APP).Append(APPID)))
diff --git a/option.go b/option.go
index bc2c0f9e..1b10b4bc 100644
--- a/option.go
+++ b/option.go
@@ -90,7 +90,7 @@ func (m *Message) Upload(dir string) {
if p := path.Join(dir, up[1]); m.Option(MSG_USERPOD) == "" {
m.Cmdy("cache", "watch", up[0], p) // 本机文件
} else { // 下发文件
- m.Cmdy("spide", DEV, SAVE, p, "GET", kit.MergeURL2(m.Option(MSG_USERWEB), path.Join("/share/cache", up[0])))
+ m.Cmdy("spide", DEV, SAVE, p, "GET", m.MergeURL2(path.Join("/share/cache", up[0])))
}
}
func (m *Message) Action(arg ...string) {
@@ -133,7 +133,7 @@ func (m *Message) PushNotice(arg ...interface{}) {
if m.Option(MSG_USERPOD) == "" {
m.Cmd("space", m.Option(MSG_DAEMON), arg)
} else {
- m.Cmd("web.spide", "dev", kit.MergeURL2(m.Option(MSG_USERWEB), "/share/toast/"), kit.Format(kit.Dict("pod", m.Option(MSG_DAEMON), "cmds", kit.Simple(arg...))))
+ m.Cmd("web.spide", "dev", m.MergeURL2("/share/toast/"), kit.Format(kit.Dict("pod", m.Option(MSG_DAEMON), "cmds", kit.Simple(arg...))))
}
}
func (m *Message) PushNoticeGrow(arg ...interface{}) {
diff --git a/render.go b/render.go
index ead56aef..c7818ae5 100644
--- a/render.go
+++ b/render.go
@@ -12,13 +12,12 @@ func AddRender(key string, render func(*Message, string, ...interface{}) string)
}
func Render(m *Message, cmd string, args ...interface{}) string {
if render, ok := Info.render[cmd]; ok {
- m.Debug("render: %v %v", cmd, kit.FileLine(render, 3))
return render(m, cmd, args...)
}
switch arg := kit.Simple(args...); cmd {
case RENDER_ANCHOR: // [name] link
- p := kit.MergeURL2(m.Option(MSG_USERWEB), kit.Select(arg[0], arg, 1))
+ p := m.MergeURL2(kit.Select(arg[0], arg, 1))
return kit.Format(`%s`, p, arg[0])
case RENDER_BUTTON: // name...
diff --git a/type.go b/type.go
index 429e2369..777cb5aa 100644
--- a/type.go
+++ b/type.go
@@ -52,7 +52,7 @@ type Context struct {
Configs map[string]*Config
Commands map[string]*Command
- contexts map[string]*Context
+ Contexts map[string]*Context
context *Context
root *Context
@@ -85,10 +85,10 @@ func (c *Context) Register(s *Context, x Server, n ...string) *Context {
name(n, s)
}
- if c.contexts == nil {
- c.contexts = map[string]*Context{}
+ if c.Contexts == nil {
+ c.Contexts = map[string]*Context{}
}
- c.contexts[s.Name] = s
+ c.Contexts[s.Name] = s
s.root = c.root
s.context = c
s.server = x
@@ -349,13 +349,13 @@ func (m *Message) Travel(cb interface{}) *Message {
}
ls := []string{}
- for k := range list[i].contexts {
+ for k := range list[i].Contexts {
ls = append(ls, k)
}
sort.Strings(ls)
for _, k := range ls { // 遍历递进
- list = append(list, list[i].contexts[k])
+ list = append(list, list[i].Contexts[k])
}
}
return m
@@ -380,7 +380,7 @@ func (m *Message) Search(key string, cb interface{}) *Message {
continue
}
for _, k := range ls[:len(ls)-1] {
- if p = p.contexts[k]; p == nil {
+ if p = p.Contexts[k]; p == nil {
break
}
}