From ec3f245241a23e6762b4d29b80b18ddde3b9012f Mon Sep 17 00:00:00 2001 From: shylinux Date: Sat, 12 May 2018 23:18:53 +0800 Subject: [PATCH 1/2] add ssh.save --- src/contexts/ctx.go | 3 ++- src/contexts/ssh/ssh.go | 38 ++++++++++++++++++++++++-------------- src/contexts/web/web.go | 9 +++++---- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/contexts/ctx.go b/src/contexts/ctx.go index 2a637d41..a0050a35 100644 --- a/src/contexts/ctx.go +++ b/src/contexts/ctx.go @@ -935,10 +935,11 @@ func (m *Message) CallBack(sync bool, cb func(msg *Message) (sub *Message), arg wait := make(chan bool) go m.Call(func(sub *Message) *Message { + msg := cb(sub) m.Log("lock", nil, "before done %v", arg) wait <- true m.Log("lock", nil, "after done %v", arg) - return cb(sub) + return msg }, arg...) m.Log("lock", nil, "before wait %v", arg) diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index 7fe30c62..e04e1d75 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -105,6 +105,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Sessions["ssh"] = sub return sub }, m.Meta["detail"]) + m.Spawn(m.Target()).Cmd("save") } // }}} }}, @@ -127,6 +128,14 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { if ssh, ok := m.Target().Server.(*SSH); m.Assert(ok) { // {{{ + if m.Option("domain") == m.Cap("domain") { //本地命令 + msg := m.Spawn(m.Target()) + msg.Cmd(arg) + m.Copy(msg, "result").Copy(msg, "append") + m.Back(m) + return + } + target := strings.Split(m.Option("domain"), ".") name, rest := target[0], target[1:] if name == m.Conf("domain") { @@ -138,14 +147,14 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", } } - if len(rest) == 0 && len(name) == 0 { - if m.Options("nsend") { + if len(rest) == 0 && len(name) == 0 { //点对点通信 + if m.Options("nsend") { //接收命令 msg := m.Spawn(m.Target()) msg.Cmd(arg) m.Back(msg) - } else { + } else { //发送命令 ssh.Message.Sesss("nfs").CallBack(m.Options("stdio"), func(host *ctx.Message) *ctx.Message { - m.Back(m.Copy(host, "result").Copy(host, "option")) + m.Back(m.Copy(host, "result").Copy(host, "append")) return nil }, "send", "send", arg) } @@ -153,7 +162,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", } miss := true - m.Travel(c, func(m *ctx.Message) bool { + m.Travel(c, func(m *ctx.Message) bool { //向下搜索 if ssh, ok := m.Target().Server.(*SSH); ok && m.Conf("domains") == name { msg := m.Spawn(ssh.nfs) msg.Option("domain", strings.Join(rest, ".")) @@ -166,7 +175,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", return miss }) - if miss { + if miss { //向上搜索 if ssh, ok := c.Server.(*SSH); m.Assert(ok) && ssh.nfs != nil { msg := m.Spawn(ssh.nfs) msg.Option("domain", m.Option("domain")) @@ -194,19 +203,20 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Echo(m.Cap("domain", strings.Join(msg.Meta["result"], ""))) m.Back(msg) - nfs := m.Sesss("nfs") - nfs.Put("option", "data", map[string]string{"domain": m.Cap("domain")}) - nfs.Cmd("json", m.Conf("domain.json")) - - png := m.Sesss("nfs") - png.Cmd("genqr", m.Conf("domain.png"), m.Cap("domain")) - + m.Spawn(m.Target()).Cmd("save") return nil }, "send", "pwd", arg[0]) } } // }}} }}, + "save": &ctx.Command{Name: "save", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + json := m.Sesss("nfs") + json.Put("option", "data", map[string]string{"domain": m.Cap("domain")}) + json.Cmd("json", m.Conf("domain.json")) + + m.Sesss("nfs").Cmd("genqr", m.Conf("domain.png"), json.Result(0)) + }}, "who": &ctx.Command{Name: "who", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { aaa := m.Sesss("aaa") if aaa != nil { @@ -217,7 +227,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Append("share", m.Cap("share")) // {{{ m.Append("level", m.Cap("level")) m.Append("type", m.Conf("type")) - m.Append("value", m.Cap("route")) + m.Append("value", m.Cap("domain")) m.Append("kind", m.Conf("kind")) m.Append("name", m.Conf("name")) m.Append("mark", m.Conf("mark")) diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index a55e9a42..82479db3 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -117,11 +117,11 @@ func (web *WEB) generate(m *ctx.Message, uri string, arg ...string) string { // func (web *WEB) AppendJson(msg *ctx.Message) string { // {{{ meta := map[string][]string{} - meta["result"] = msg.Meta["result"] - meta["append"] = msg.Meta["append"] for _, v := range msg.Meta["append"] { meta[v] = msg.Meta[v] } + meta["result"] = msg.Meta["result"] + meta["append"] = msg.Meta["append"] b, e := json.Marshal(meta) msg.Assert(e) @@ -160,8 +160,9 @@ func (web *WEB) Trans(m *ctx.Message, key string, hand func(*ctx.Message, *ctx.C msg.Log("cmd", nil, "%s [] %v", key, msg.Meta["option"]) msg.Put("option", "request", r).Put("option", "response", w) - if hand(msg, msg.Target(), key); len(msg.Meta["append"]) > 0 { - msg.Set("result", web.AppendJson(msg)) + if hand(msg, msg.Target(), key); len(msg.Meta["append"]) > -1 { + w.Write([]byte(web.AppendJson(msg))) + return } for _, v := range msg.Meta["result"] { From 9e7de2508a966c71173007a45e696f274f0ec178 Mon Sep 17 00:00:00 2001 From: shylinux Date: Sun, 13 May 2018 22:34:11 +0800 Subject: [PATCH 2/2] vps add nfs.good --- etc/init.shy | 5 +- src/contexts/ssh/ssh.go | 102 +++++++++++++++++++++++++++++++++------- 2 files changed, 87 insertions(+), 20 deletions(-) diff --git a/etc/init.shy b/etc/init.shy index cd02fb94..cc42de48 100644 --- a/etc/init.shy +++ b/etc/init.shy @@ -1,5 +1,6 @@ login root root -config debug on +source etc/local.shy ~ssh - listen ":9090" + config domain ctx + dial "shylinux.com:9090" diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index e04e1d75..64d26ff1 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -5,7 +5,6 @@ import ( // {{{ "fmt" "strings" - "time" ) // }}} @@ -111,12 +110,11 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", }}, "dial": &ctx.Command{Name: "dial address protocol", Help: "建立连接", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { if _, ok := m.Target().Server.(*SSH); m.Assert(ok) { // {{{ - m.Find("nfs").Call(func(file *ctx.Message) *ctx.Message { + m.Find("nfs").CallBack(true, func(file *ctx.Message) *ctx.Message { sub := file.Spawn(m.Target()) sub.Target().Start(sub) m.Sessions["ssh"] = sub - time.Sleep(time.Second) sub.Spawn(sub.Target()).Cmd("pwd", m.Conf("domain")) return sub }, m.Meta["detail"]) @@ -193,7 +191,17 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Echo(m.Cap("domain")) case 1: if m.Options("nsend") { - m.Conf("domains", arg[0]) + domain := arg[0] + + m.Travel(c, func(m *ctx.Message) bool { + if m.Conf("domains") == domain { + domain = domain + m.Cap("nhost") + return false + } + return true + }) + m.Conf("domains", domain) + m.Echo(m.Cap("domain")) m.Echo(".") m.Echo(m.Conf("domains")) @@ -211,30 +219,88 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", // }}} }}, "save": &ctx.Command{Name: "save", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - json := m.Sesss("nfs") + json := m.Sesss("nfs") // {{{ json.Put("option", "data", map[string]string{"domain": m.Cap("domain")}) json.Cmd("json", m.Conf("domain.json")) - m.Sesss("nfs").Cmd("genqr", m.Conf("domain.png"), json.Result(0)) + // }}} }}, "who": &ctx.Command{Name: "who", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - aaa := m.Sesss("aaa") + aaa := m.Sesss("aaa") // {{{ if aaa != nil { m.Echo(aaa.Cap("group")) } - }}, - "good": &ctx.Command{Name: "good", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - m.Append("share", m.Cap("share")) // {{{ - m.Append("level", m.Cap("level")) - m.Append("type", m.Conf("type")) - m.Append("value", m.Cap("domain")) - m.Append("kind", m.Conf("kind")) - m.Append("name", m.Conf("name")) - m.Append("mark", m.Conf("mark")) - m.Append("count", m.Cap("count")) - m.Back(m) // }}} }}, + "good": &ctx.Command{Name: "good context|command|config|cache args", Help: "设备注册", Hand: func(m *ctx.Message, c *ctx.Context, cmd string, arg ...string) { + if len(arg) == 0 { // {{{ + m.Append("share", m.Cap("share")) + m.Append("level", m.Cap("level")) + m.Append("type", m.Conf("type")) + m.Append("value", m.Cap("domain")) + m.Append("kind", m.Conf("kind")) + m.Append("name", m.Cap("domain")) + m.Append("mark", m.Conf("mark")) + m.Append("count", m.Cap("count")) + m.Back(m) + return + } + cmds := m.Option("cmds") + + if arg[0] == "context" { + if len(arg) > 1 { + cmds = arg[1] + } + + m.Travel(ctx.Index, func(msg *ctx.Message) bool { + current := msg.Target() + if _, ok := current.Index[cmds]; ok { + + } else if cmds != "" && cmds != "root" { + return true + } + + m.Add("append", "name", current.Name) + m.Add("append", "help", current.Help) + return true + }) + return + } + + if len(arg) > 2 { + cmds = arg[2] + } + current := m.Sess(arg[1], arg[1], "search").Target() + if x, ok := current.Index[cmds]; ok { + current = x + } else if cmds != "" && cmds != "root" { + return + } + + switch arg[0] { + case "command": + + for k, x := range current.Commands { + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + m.Add("append", "help", x.Help) + } + case "config": + for k, x := range current.Configs { + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + m.Add("append", "value", x.Value) + m.Add("append", "help", x.Help) + } + case "cache": + for k, x := range current.Caches { + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + m.Add("append", "value", x.Value) + m.Add("append", "help", x.Help) + } + } // }}} + }}, }, }