1
0
mirror of https://shylinux.com/x/ContextOS synced 2025-04-25 16:58:06 +08:00

add ssh.login

This commit is contained in:
shaoying 2019-08-23 21:04:34 +08:00
parent 04be739f22
commit 8cac01d75f
4 changed files with 74 additions and 9 deletions

View File

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

View File

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

View File

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

View File

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