forked from x/ContextOS
mac add ssh.pwd
This commit is contained in:
parent
8f6c23e4c2
commit
4456c45258
@ -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:
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user