diff --git a/src/contexts/cli/version.go b/src/contexts/cli/version.go index 3ce864f5..787626bf 100644 --- a/src/contexts/cli/version.go +++ b/src/contexts/cli/version.go @@ -4,5 +4,5 @@ var version = struct { host string self int }{ - "2019-08-22 17:02:38", "ZYB-20190522USI", 415, + "2019-08-23 14:51:01", "ZYB-20190522USI", 443, } diff --git a/src/contexts/ctx/ctx.go b/src/contexts/ctx/ctx.go index 4e147bf2..86ac8c27 100644 --- a/src/contexts/ctx/ctx.go +++ b/src/contexts/ctx/ctx.go @@ -743,7 +743,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, } m.Optionv("bio.msg", msg) - m.Log("fuck", "what %v", arg) if len(arg) == 0 { ms := []*Message{msg.message, msg} for i := 0; i < len(ms); i++ { @@ -759,7 +758,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, m.Push("time", ms[i].Time()) m.Push("source", ms[i].source.Name) m.Push("target", ms[i].target.Name) - m.Push("detail", kit.Format(ms[i].Meta["detail"])) + m.Push("details", kit.Format(ms[i].Meta["detail"])) if i > 0 { ms = append(ms, ms[i].messages...) } diff --git a/src/contexts/ctx/type.go b/src/contexts/ctx/type.go index a74dcd50..e75ef053 100644 --- a/src/contexts/ctx/type.go +++ b/src/contexts/ctx/type.go @@ -485,6 +485,9 @@ func (m *Message) Cmd(args ...interface{}) *Message { m.Set("detail", kit.Trans(args...)) } key, arg := m.Meta["detail"][0], m.Meta["detail"][1:] + if key == "_" { + return m + } msg := m if strings.Contains(key, ":") { @@ -513,10 +516,6 @@ func (m *Message) Cmd(args ...interface{}) *Message { } return msg.Hand }) - - if !msg.Hand { - // msg.Log("error", "cmd run error %s", msg.Format()) - } return msg } diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index 206b0374..768f8bff 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -1,7 +1,11 @@ package ssh import ( + "bufio" "contexts/ctx" + "fmt" + "os/exec" + "time" "toolkit" "encoding/hex" @@ -12,6 +16,7 @@ import ( ) type SSH struct { + relay chan *ctx.Message *ctx.Context } @@ -22,7 +27,49 @@ func (ssh *SSH) Begin(m *ctx.Message, arg ...string) ctx.Server { return ssh } func (ssh *SSH) Start(m *ctx.Message, arg ...string) bool { - return true + ir, iw := io.Pipe() + or, ow := io.Pipe() + er, ew := io.Pipe() + cmd := exec.Command("ssh", arg[0]) + cmd.Stdin, cmd.Stdout, cmd.Stderr = ir, ow, ew + cmd.Start() + + relay := m + done := false + ssh.relay = make(chan *ctx.Message, 10) + m.Gos(m.Spawn(), func(msg *ctx.Message) { + for relay = range ssh.relay { + done = false + for _, v := range relay.Meta["detail"][1:] { + msg.Log("info", "%v", v) + fmt.Fprint(iw, v, " ") + } + fmt.Fprintln(iw) + + ticker, delay := kit.Duration(msg.Conf("ssh.login", "ticker")), kit.Duration(msg.Conf("ssh.login", "ticker")) + for i := 0; i < msg.Confi("ssh.login", "count"); i++ { + msg.Log("done", "%d %v", i, done) + if time.Sleep(ticker); done { + time.Sleep(delay) + relay.Back(relay) + break + } + } + } + }) + m.Gos(m.Spawn(), func(msg *ctx.Message) { + for bio := bufio.NewScanner(er); bio.Scan(); { + msg.Log("warn", "what %v", bio.Text()) + relay.Echo(bio.Text()).Echo("\n") + done = true + } + }) + for bio := bufio.NewScanner(or); bio.Scan(); { + m.Log("info", "what %v", bio.Text()) + relay.Echo(bio.Text()).Echo("\n") + done = true + } + return false } func (ssh *SSH) Close(m *ctx.Message, arg ...string) bool { return false @@ -127,6 +174,11 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", "trust": &ctx.Config{Name: "trust", Value: map[string]interface{}{ "renew": true, "fresh": false, "user": true, "up": true, }, Help: "可信节点"}, + "login": &ctx.Config{Name: "login", Value: map[string]interface{}{ + "ticker": "10ms", + "count": 100, + "delay": "10ms", + }, Help: "聊天群组"}, }, Commands: map[string]*ctx.Command{ "_init": &ctx.Command{Name: "_init", Help: "启动初始化", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { @@ -959,7 +1011,22 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Log("time", "exec: %v", m.Format("cost")) return }}, - "relay": &ctx.Command{Name: "relay address", Help: "网络连接", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + + "login": &ctx.Command{Name: "login address", Help: "网络连接", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + if len(arg) == 0 { + arg = append(arg, "shy@shylinux.com") + } + m.Start(arg[0], arg[0], arg...) + time.Sleep(1000 * time.Millisecond) + return + }}, + "run": {Name: "run cmd", Help: "网络连接", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + if ssh, ok := m.Target().Server.(*SSH); ok && ssh.relay != nil { + ssh.relay <- m + m.CallBack(true, func(msg *ctx.Message) (res *ctx.Message) { + return nil + }, append([]string{"_"}, arg...)) + } return }}, },