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["status"] = &Cache{Name: "服务状态(begin/start/close)", Value: "begin", Help: "服务状态begin:初始完成start:正在运行close:未在运行"}
c.Caches["stream"] = &Cache{Name: "服务数据", Value: "", Help: "服务数据"} 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 m.Index = 1
c.Pulse = m c.Pulse = m
c.Requests = []*Message{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) wait := make(chan bool)
go m.Call(func(sub *Message) *Message { go m.Call(func(sub *Message) *Message {
m.Log("lock", nil, "before done %v", arg)
wait <- true wait <- true
m.Log("lock", nil, "after done %v", arg)
return cb(sub) return cb(sub)
}, arg...) }, arg...)
m.Log("lock", nil, "before wait %v", arg)
<-wait <-wait
m.Log("lock", nil, "after wait %v", arg)
return m 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:启动参数", "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, "close": 0, "switch": 0, "start": 0, "spawn": 0}, 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) { Hand: func(m *Message, c *Context, key string, arg ...string) {
if m.Has("back") { // {{{ if m.Has("back") { // {{{
m.target = m.source m.target = m.source
@ -1826,14 +1847,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch { switch {
case m.Has("switch"), m.Has("back"): case m.Has("switch"), m.Has("back"):
m.target = v.target 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"): case m.Has("show"):
m.Echo("%s(%s): %s\n", v.target.Name, v.target.Owner.Name, v.target.Help) m.Echo("%s(%s): %s\n", v.target.Name, v.target.Owner.Name, v.target.Help)
if len(v.target.Requests) > 0 { if len(v.target.Requests) > 0 {
@ -1855,6 +1868,19 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch m.Get("info") { switch m.Get("info") {
case "name": case "name":
m.Echo("%s", v.target.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": case "owner":
m.Echo("%s", v.target.Owner.Name) m.Echo("%s", v.target.Owner.Name)
default: 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 { // {{{ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{
m.Target().Sessions["nfs"] = m m.Target().Sessions["nfs"] = m
m.Sessions["nfs"] = m
nfs.Message = m nfs.Message = m
if socket, ok := m.Data["io"]; ok { if socket, ok := m.Data["io"]; ok {
m.Cap("stream", m.Source().Name) m.Cap("stream", m.Source().Name)
// m.Sesss("aaa", "aaa").Cmd("login", "demo", "demo") // m.Sesss("aaa", "aaa").Cmd("login", "demo", "demo")
m.Options("stdio", false)
nfs.io = socket.(io.ReadWriteCloser) nfs.io = socket.(io.ReadWriteCloser)
nfs.Reader = bufio.NewReader(nfs.io) nfs.Reader = bufio.NewReader(nfs.io)
nfs.Writer = bufio.NewWriter(nfs.io) nfs.Writer = bufio.NewWriter(nfs.io)
nfs.send = make(map[int]*ctx.Message) nfs.send = make(map[int]*ctx.Message)
nfs.target = m.Target() nfs.target = m.Target()
if target, ok := m.Data["target"]; ok { if target, ok := m.Data["target"]; ok {
nfs.target = target.(*ctx.Context) nfs.target = target.(*ctx.Context)
} }
msg := m.Spawn(nfs.target) var msg *ctx.Message
nfs.Caches["target"] = &ctx.Cache{Name: "target", Value: nfs.target.Name, Help: "文件名"}
nfs.Caches["target"] = &ctx.Cache{Name: "target", Value: "", Help: "文件名"}
for { for {
line, e := nfs.Reader.ReadString('\n') line, e := nfs.Reader.ReadString('\n')
m.Assert(e) m.Assert(e)
if msg == nil {
msg = m.Sesss("ssh")
m.Cap("target", msg.Target().Name)
}
if line = strings.TrimSpace(line); len(line) > 0 { if line = strings.TrimSpace(line); len(line) > 0 {
ls := strings.SplitN(line, ":", 2) ls := strings.SplitN(line, ":", 2)
ls[0] = strings.TrimSpace(ls[0]) ls[0] = strings.TrimSpace(ls[0])
@ -466,7 +475,6 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{
} }
if msg.Has("detail") { if msg.Has("detail") {
msg.Target(m.Sessions["ssh"].Target())
msg.Log("info", nil, "%d recv", m.Capi("nrecv", 1)) msg.Log("info", nil, "%d recv", m.Capi("nrecv", 1))
msg.Log("info", nil, "detail: %v", msg.Meta["detail"]) msg.Log("info", nil, "detail: %v", msg.Meta["detail"])
msg.Log("info", nil, "option: %v", msg.Meta["option"]) 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) send.Back(send)
} }
msg = m.Spawn(nfs.target) msg = nil
m.Cap("target", nfs.target.Name)
} }
return true return true
} }

View File

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