1
0
forked from x/ContextOS

mac add ssh.pwd

This commit is contained in:
shaoying 2018-05-06 00:51:35 +08:00
parent 8f6c23e4c2
commit 4456c45258
3 changed files with 89 additions and 26 deletions

View File

@ -199,6 +199,16 @@ func (c *Context) Begin(m *Message) *Context { // {{{
c.Caches["status"] = &Cache{Name: "服务状态(begin/start/close)", Value: "begin", Help: "服务状态begin:初始完成start:正在运行close:未在运行"}
c.Caches["stream"] = &Cache{Name: "服务数据", Value: "", Help: "服务数据"}
item := []string{}
m.BackTrace(func(m *Message) bool {
item = append(item, m.target.Name)
return true
})
for i := 0; i < len(item)/2; i++ {
item[i], item[len(item)-i-1] = item[len(item)-i-1], item[i]
}
c.Caches["route"] = &Cache{Name: "服务数据", Value: strings.Join(item, "."), Help: "服务数据"}
m.Index = 1
c.Pulse = m
c.Requests = []*Message{m}
@ -916,13 +926,24 @@ func (m *Message) Back(msg *Message) *Message { // {{{
}
// }}}
func (m *Message) CallBack(cb func(msg *Message) (sub *Message), arg ...interface{}) *Message { // {{{
func (m *Message) CallBack(sync bool, cb func(msg *Message) (sub *Message), arg ...interface{}) *Message { // {{{
if !sync {
m.Call(cb, arg...)
return m
}
wait := make(chan bool)
go m.Call(func(sub *Message) *Message {
m.Log("lock", nil, "before done %v", arg)
wait <- true
m.Log("lock", nil, "after done %v", arg)
return cb(sub)
}, arg...)
m.Log("lock", nil, "before wait %v", arg)
<-wait
m.Log("lock", nil, "after wait %v", arg)
return m
}
@ -1790,8 +1811,8 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
}
// }}}
}},
"context": &Command{Name: "context back|[[home] [find|search] name] [info|list|show|spawn|start|switch|close][args]", Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块args:启动参数",
Formats: map[string]int{"back": 0, "home": 0, "find": 1, "search": 1, "info": 1, "list": 0, "show": 0, "close": 0, "switch": 0, "start": 0, "spawn": 0},
"context": &Command{Name: "context back|[[home] [find|search] name] [info|list|show|switch|[args]", Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块args:启动参数",
Formats: map[string]int{"back": 0, "home": 0, "find": 1, "search": 1, "info": 1, "list": 0, "show": 0, "switch": 0},
Hand: func(m *Message, c *Context, key string, arg ...string) {
if m.Has("back") { // {{{
m.target = m.source
@ -1826,14 +1847,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch {
case m.Has("switch"), m.Has("back"):
m.target = v.target
case m.Has("spawn"):
v.Set("detail", arg[2:]...).target.Spawn(v, arg[0], arg[1]).Begin(v)
m.target = v.target
case m.Has("start"):
v.Set("detail", arg...).target.Start(v)
m.target = v.target
case m.Has("close"):
v.target.Close(v)
case m.Has("show"):
m.Echo("%s(%s): %s\n", v.target.Name, v.target.Owner.Name, v.target.Help)
if len(v.target.Requests) > 0 {
@ -1855,6 +1868,19 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch m.Get("info") {
case "name":
m.Echo("%s", v.target.Name)
case "path":
path := []string{}
m.BackTrace(func(m *Message) bool {
path = append(path, m.target.Name)
return true
})
list := []string{}
for i := len(path) - 1; i >= 0; i-- {
list = append(list, path[i])
}
m.Echo("%s", strings.Join(list, "."))
case "owner":
m.Echo("%s", v.target.Owner.Name)
default:

View File

@ -426,28 +426,37 @@ func (nfs *NFS) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
// }}}
func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{
m.Target().Sessions["nfs"] = m
m.Sessions["nfs"] = m
nfs.Message = m
if socket, ok := m.Data["io"]; ok {
m.Cap("stream", m.Source().Name)
// m.Sesss("aaa", "aaa").Cmd("login", "demo", "demo")
m.Options("stdio", false)
nfs.io = socket.(io.ReadWriteCloser)
nfs.Reader = bufio.NewReader(nfs.io)
nfs.Writer = bufio.NewWriter(nfs.io)
nfs.send = make(map[int]*ctx.Message)
nfs.target = m.Target()
if target, ok := m.Data["target"]; ok {
nfs.target = target.(*ctx.Context)
}
msg := m.Spawn(nfs.target)
nfs.Caches["target"] = &ctx.Cache{Name: "target", Value: nfs.target.Name, Help: "文件名"}
var msg *ctx.Message
nfs.Caches["target"] = &ctx.Cache{Name: "target", Value: "", Help: "文件名"}
for {
line, e := nfs.Reader.ReadString('\n')
m.Assert(e)
if msg == nil {
msg = m.Sesss("ssh")
m.Cap("target", msg.Target().Name)
}
if line = strings.TrimSpace(line); len(line) > 0 {
ls := strings.SplitN(line, ":", 2)
ls[0] = strings.TrimSpace(ls[0])
@ -466,7 +475,6 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{
}
if msg.Has("detail") {
msg.Target(m.Sessions["ssh"].Target())
msg.Log("info", nil, "%d recv", m.Capi("nrecv", 1))
msg.Log("info", nil, "detail: %v", msg.Meta["detail"])
msg.Log("info", nil, "option: %v", msg.Meta["option"])
@ -530,8 +538,7 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{
send.Back(send)
}
msg = m.Spawn(nfs.target)
m.Cap("target", nfs.target.Name)
msg = nil
}
return true
}

View File

@ -5,6 +5,7 @@ import ( // {{{
"fmt"
"strings"
"time"
)
// }}}
@ -12,12 +13,15 @@ import ( // {{{
type SSH struct {
nfs *ctx.Context
*ctx.Message
*ctx.Context
}
func (ssh *SSH) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server { // {{{
c.Caches = map[string]*ctx.Cache{}
c.Configs = map[string]*ctx.Config{}
c.Configs = map[string]*ctx.Config{
"domain": &ctx.Config{Name: "domain", Value: "", Help: "主机数量"},
}
s := new(SSH)
s.Context = c
@ -35,6 +39,7 @@ func (ssh *SSH) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
// }}}
func (ssh *SSH) Start(m *ctx.Message, arg ...string) bool { // {{{
ssh.Message = m
ssh.nfs = m.Source()
m.Cap("stream", m.Source().Name)
return false
@ -78,9 +83,12 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
"count": &ctx.Cache{Name: "count", Value: "3", Help: "主机数量"},
"share": &ctx.Cache{Name: "share", Value: "root", Help: "主机数量"},
"level": &ctx.Cache{Name: "level", Value: "root", Help: "主机数量"},
"domain": &ctx.Cache{Name: "domain", Value: "com", Help: "主机数量"},
},
Configs: map[string]*ctx.Config{
"route": &ctx.Config{Name: "route", Value: "com", Help: "主机数量"},
"domain": &ctx.Config{Name: "domain", Value: "com", Help: "主机数量"},
"route.json": &ctx.Config{Name: "route.json", Value: "var/route.json", Help: "主机数量"},
"route.png": &ctx.Config{Name: "route.png", Value: "var/route.png", Help: "主机数量"},
"type": &ctx.Config{Name: "type", Value: "terminal", Help: "主机数量"},
@ -94,6 +102,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
m.Find("nfs").Call(func(file *ctx.Message) *ctx.Message {
sub := file.Spawn(m.Target())
sub.Start(fmt.Sprintf("host%d", Pulse.Capi("nhost", 1)), "远程主机")
m.Sessions["ssh"] = sub
// sub.Sesss("nfs").Cmd("send", "route", sub.Target().Name, m.Cap("route"))
return sub
}, m.Meta["detail"])
@ -105,6 +114,10 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
m.Find("nfs").Call(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"])
}
@ -127,12 +140,29 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
}},
"who": &ctx.Command{Name: "who", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
aaa := m.Sesss("aaa")
m.Echo(aaa.Cap("group"))
if aaa != nil {
m.Echo(aaa.Cap("group"))
}
}},
"pwd": &ctx.Command{Name: "pwd", Help: "远程执行", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
m.Echo(m.Cap("route")) // {{{
m.Back(m)
// }}}
switch len(arg) {
case 0:
m.Echo(m.Cap("domain"))
case 1:
if m.Options("nsend") {
m.Conf("domain", arg[0])
m.Echo(m.Cap("domain"))
m.Echo(".")
m.Echo(m.Conf("domain"))
} else {
m.Spawn(m.Target()).CallBack(m.Options("stdio"), func(msg *ctx.Message) *ctx.Message {
m.Conf("domain", msg.Result(2))
m.Echo(m.Cap("domain", strings.Join(msg.Meta["result"], "")))
m.Back(msg)
return nil
}, "send", "pwd", arg[0])
}
}
}},
"send": &ctx.Command{Name: "send [route domain] cmd arg...", Help: "远程执行",
Formats: map[string]int{"route": 1},
@ -140,15 +170,15 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
if ssh, ok := m.Target().Server.(*SSH); m.Assert(ok) { // {{{
target := strings.Split(m.Option("route"), ".")
if len(target) == 0 {
if len(target) == 1 && len(target[0]) == 0 {
if m.Options("nsend") {
msg := m.Spawn(m.Target())
msg.Cmd(arg)
m.Back(msg)
} else {
msg := m.Spawn(ssh.nfs)
msg.Call(func(host *ctx.Message) *ctx.Message {
return m.Copy(host, "result").Copy(host, "append")
ssh.Message.Sesss("nfs").CallBack(m.Options("stdio"), func(host *ctx.Message) *ctx.Message {
m.Back(m.Copy(host, "result").Copy(host, "option"))
return nil
}, "send", "send", arg)
}
return