forked from x/ContextOS
tce add ctx.session
This commit is contained in:
parent
cfdcb4aea6
commit
2e8a69dcf4
@ -274,6 +274,19 @@ func (c *Context) Has(key ...string) bool { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
type Session struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
type Callback struct {
|
||||||
|
ncall int
|
||||||
|
hand func(msg *Message) (sub *Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Feedback struct {
|
||||||
|
nfeed int
|
||||||
|
hand func(msg *Message) (sub *Message)
|
||||||
|
}
|
||||||
|
|
||||||
type Message struct {
|
type Message struct {
|
||||||
time time.Time
|
time time.Time
|
||||||
code int
|
code int
|
||||||
@ -294,8 +307,7 @@ type Message struct {
|
|||||||
target *Context
|
target *Context
|
||||||
Index int
|
Index int
|
||||||
|
|
||||||
ncallback int
|
callback Callback
|
||||||
callback func(msg *Message) (sub *Message)
|
|
||||||
|
|
||||||
Template *Message
|
Template *Message
|
||||||
}
|
}
|
||||||
@ -816,6 +828,11 @@ func (m *Message) Echo(str string, arg ...interface{}) *Message { // {{{
|
|||||||
return m.Add("result", fmt.Sprintf(str, arg...))
|
return m.Add("result", fmt.Sprintf(str, arg...))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
func (m *Message) Color(color int, str string, arg ...interface{}) *Message { // {{{
|
||||||
|
return m.Add("result", fmt.Sprintf("\033[%dm%s\033[0m", color, fmt.Sprintf(str, arg...)))
|
||||||
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Copy(msg *Message, meta string, arg ...string) *Message { // {{{
|
func (m *Message) Copy(msg *Message, meta string, arg ...string) *Message { // {{{
|
||||||
switch meta {
|
switch meta {
|
||||||
@ -1125,7 +1142,7 @@ func (m *Message) Cmd(arg ...interface{}) *Message { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Call(cb func(msg *Message) (sub *Message), arg ...interface{}) *Message { // {{{
|
func (m *Message) Call(cb func(msg *Message) (sub *Message), arg ...interface{}) *Message { // {{{
|
||||||
m.callback = cb
|
m.callback.hand = cb
|
||||||
m.Wait = nil
|
m.Wait = nil
|
||||||
m.Cmd(arg...)
|
m.Cmd(arg...)
|
||||||
return m
|
return m
|
||||||
@ -1133,17 +1150,16 @@ func (m *Message) Call(cb func(msg *Message) (sub *Message), arg ...interface{})
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Back(msg *Message) *Message { // {{{
|
func (m *Message) Back(msg *Message) *Message { // {{{
|
||||||
if msg == nil || m.callback == nil {
|
if msg == nil || m.callback.hand == nil {
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
m.Log("callback", nil, "%v %v", msg.Meta["result"], msg.Meta["append"])
|
m.Log("callback", nil, "%v %v", msg.Meta["result"], msg.Meta["append"])
|
||||||
|
|
||||||
if sub := m.callback(msg); sub != nil && m.message != nil && m.message != m {
|
m.callback.ncall++
|
||||||
m.Log("fuck", nil, "31")
|
if sub := m.callback.hand(msg); sub != nil && m.message != nil && m.message != m {
|
||||||
m.message.Back(sub)
|
m.message.Back(sub)
|
||||||
}
|
}
|
||||||
m.Log("fuck", nil, "41")
|
|
||||||
|
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
@ -1365,21 +1381,35 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
},
|
},
|
||||||
Commands: map[string]*Command{
|
Commands: map[string]*Command{
|
||||||
"help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
"help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 { // {{{
|
||||||
m.Echo("^_^ Welcome to context world ^_^\n")
|
m.Echo("^_^ Welcome to context world ^_^\n")
|
||||||
|
m.Echo("\n")
|
||||||
m.Echo("Context is to be a distributed operating system, try to simple everything in work and life. ")
|
m.Echo("Context is to be a distributed operating system, try to simple everything in work and life. ")
|
||||||
m.Echo("In context you will find all kinds of tools, and you can also make new tool in a quick and easy way.\n")
|
m.Echo("In context you will find all kinds of tools, and you can also make new tool in a quick and easy way.\n")
|
||||||
m.Echo("Here is just a simple introduce, you can look github.com/shylinux/context/README.md for more information.\n")
|
m.Echo("Here is just a simple introduce, you can look github.com/shylinux/context/README.md for more information.\n")
|
||||||
m.Echo("0. example\n")
|
m.Echo("\n")
|
||||||
m.Echo("1. context\n")
|
m.Color(31, " c\n")
|
||||||
m.Echo("2. message\n")
|
m.Color(33, " sh go\n")
|
||||||
|
m.Color(32, " vi").Color(33, " php").Color(31, " js\n")
|
||||||
|
m.Echo(" ARM Linux HTTP\n")
|
||||||
|
m.Echo("\n")
|
||||||
|
|
||||||
|
m.Color(31, "Content ").Color(32, "Message\n")
|
||||||
|
m.Color(32, "ctx ").Color(33, "cli ").Color(31, "aaa ").Color(33, "web\n")
|
||||||
|
m.Color(32, "lex ").Color(33, "yac ").Color(31, "log ").Color(33, "gdb\n")
|
||||||
|
m.Color(32, "tcp ").Color(33, "nfs ").Color(31, "ssh ").Color(33, "mdb\n")
|
||||||
|
m.Echo("\n")
|
||||||
|
|
||||||
|
m.Color(31, " edukid ").Color(32, "etcvpn\n")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch arg[0] {
|
switch arg[0] {
|
||||||
case "example":
|
case "example":
|
||||||
case "context":
|
case "context":
|
||||||
case "message":
|
case "message":
|
||||||
}
|
}
|
||||||
|
// }}}
|
||||||
}},
|
}},
|
||||||
"server": &Command{Name: "server [start|exit|switch][args]", Help: "服务启动停止切换", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
"server": &Command{Name: "server [start|exit|switch][args]", Help: "服务启动停止切换", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
switch len(arg) { // {{{
|
switch len(arg) { // {{{
|
||||||
@ -1449,8 +1479,8 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
m.Echo(" %s: %v\n", k, ms[i].Meta[k])
|
m.Echo(" %s: %v\n", k, ms[i].Meta[k])
|
||||||
}
|
}
|
||||||
|
|
||||||
if ms[i].callback != nil {
|
if ms[i].callback.hand != nil {
|
||||||
m.Echo("callback: %d\n", ms[i].ncallback)
|
m.Echo("callback: %d\n", ms[i].callback.ncall)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(ms[i].Meta["result"]) > 0 {
|
if len(ms[i].Meta["result"]) > 0 {
|
||||||
@ -1473,23 +1503,33 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
ms = append(ms, ms[i].messages...)
|
ms = append(ms, ms[i].messages...)
|
||||||
}
|
}
|
||||||
case 2, 3:
|
default:
|
||||||
index := 0
|
|
||||||
if len(arg) == 3 {
|
|
||||||
n, e := strconv.Atoi(arg[2])
|
|
||||||
m.Assert(e)
|
|
||||||
index = n
|
|
||||||
}
|
|
||||||
|
|
||||||
n, e := strconv.Atoi(arg[0])
|
n, e := strconv.Atoi(arg[0])
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
|
|
||||||
ms := []*Message{m.root}
|
ms := []*Message{m.root}
|
||||||
for i := 0; i < len(ms); i++ {
|
for i := 0; i < len(ms); i++ {
|
||||||
if ms[i].code == n {
|
if ms[i].code == n {
|
||||||
if meta, ok := ms[i].Meta[arg[1]]; ok {
|
switch arg[1] {
|
||||||
m.Echo(meta[index])
|
case "option", "session", "callback", "feedback":
|
||||||
|
m.Echo("get")
|
||||||
|
msg := ms[i].Spawn(ms[i].target)
|
||||||
|
msg.Cmd(arg[1:])
|
||||||
|
m.Copy(msg, "result")
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
index := 0
|
||||||
|
if len(arg) >= 3 {
|
||||||
|
n, e := strconv.Atoi(arg[2])
|
||||||
|
m.Assert(e)
|
||||||
|
index = n
|
||||||
|
}
|
||||||
|
|
||||||
|
if meta, ok := ms[i].Meta[arg[1]]; ok {
|
||||||
|
m.Echo(meta[index])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
ms = append(ms, ms[i].messages...)
|
ms = append(ms, ms[i].messages...)
|
||||||
}
|
}
|
||||||
@ -1497,6 +1537,122 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
|
"option": &Command{Name: "option", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
|
for msg := m; msg != nil; msg = msg.message { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo("msg(%s->%s): %d(%s) %v\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"), msg.Meta["detail"])
|
||||||
|
}
|
||||||
|
for _, k := range msg.Meta["option"] {
|
||||||
|
for _, v := range msg.Meta[k] {
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo(" %s: %v\n", k, v)
|
||||||
|
} else if k == arg[0] {
|
||||||
|
if len(arg) > 1 {
|
||||||
|
msg.Option(k, arg[1])
|
||||||
|
}
|
||||||
|
m.Echo("msg(%s->%s): %d(%s)\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
m.Echo(" %s: %v\n", k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }}}
|
||||||
|
}},
|
||||||
|
"session": &Command{Name: "session", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
|
for msg := m; msg != nil; msg = msg.message { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo("msg(%s->%s): %d(%s) %v\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"), msg.Meta["detail"])
|
||||||
|
}
|
||||||
|
for k, v := range msg.target.Sessions {
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo(" %s(%s->%s): %d(%s)\n", k, v.source.Name, v.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
} else if k == arg[0] {
|
||||||
|
switch arg[1] {
|
||||||
|
case "cache":
|
||||||
|
sub := msg.Sess(k)
|
||||||
|
sub.Cmd("cache", arg[2:])
|
||||||
|
m.Copy(sub, "result")
|
||||||
|
return
|
||||||
|
case "config":
|
||||||
|
sub := msg.Sess(k)
|
||||||
|
sub.Cmd("config", arg[2:])
|
||||||
|
m.Copy(sub, "result")
|
||||||
|
return
|
||||||
|
case "command":
|
||||||
|
sub := msg.Sess(k)
|
||||||
|
sub.Cmd("command", arg[2:])
|
||||||
|
m.Copy(sub, "result")
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
msg.target.Sessions[arg[0]] = msg.Find(arg[1])
|
||||||
|
}
|
||||||
|
m.Echo("msg(%s->%s): %d(%s)\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
m.Echo(" %s(%s->%s): %d(%s)\n", k, v.source.Name, v.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }}}
|
||||||
|
}},
|
||||||
|
"callback": &Command{Name: "callback", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
|
for msg := m; msg != nil; msg = msg.message { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo("msg(%s->%s): %d(%s) %v\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"), msg.Meta["detail"])
|
||||||
|
m.Echo(" ncall: %d\n", msg.callback.ncall)
|
||||||
|
m.Echo(" hand: %v\n", msg.callback.hand)
|
||||||
|
} else {
|
||||||
|
switch arg[0] {
|
||||||
|
case "del":
|
||||||
|
msg.message.callback.hand = nil
|
||||||
|
case "add":
|
||||||
|
msg.message.callback.hand = func(msg *Message) *Message {
|
||||||
|
msg.Log("fuck", nil, "default")
|
||||||
|
return msg
|
||||||
|
}
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
m.Result(0, arg)
|
||||||
|
msg.message.Back(m)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }}}
|
||||||
|
}},
|
||||||
|
"feedback": &Command{Name: "feedback", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
|
for msg := m; msg != nil; msg = msg.message { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo("msg(%s->%s): %d(%s)\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
}
|
||||||
|
for k, v := range msg.target.Sessions {
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo(" %s(%s->%s): %d(%s)\n", k, v.source.Name, v.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
} else if k == arg[0] {
|
||||||
|
switch arg[1] {
|
||||||
|
case "cache":
|
||||||
|
sub := msg.Sess(k)
|
||||||
|
sub.Cmd("cache", arg[2:])
|
||||||
|
m.Copy(sub, "result")
|
||||||
|
return
|
||||||
|
case "config":
|
||||||
|
sub := msg.Sess(k)
|
||||||
|
sub.Cmd("config", arg[2:])
|
||||||
|
m.Copy(sub, "result")
|
||||||
|
return
|
||||||
|
case "command":
|
||||||
|
sub := msg.Sess(k)
|
||||||
|
sub.Cmd("command", arg[2:])
|
||||||
|
m.Copy(sub, "result")
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
msg.target.Sessions[arg[0]] = msg.Find(arg[1])
|
||||||
|
}
|
||||||
|
m.Echo("msg(%s->%s): %d(%s)\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
m.Echo(" %s(%s->%s): %d(%s)\n", k, v.source.Name, v.target.Name, msg.code, msg.time.Format("15:04:05"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// }}}
|
||||||
|
}},
|
||||||
"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|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},
|
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},
|
||||||
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
@ -1974,6 +2130,11 @@ func Start(args ...string) {
|
|||||||
|
|
||||||
Pulse.Options("log", true)
|
Pulse.Options("log", true)
|
||||||
Pulse.Sess("log", "log").Conf("bench.log", Pulse.Conf("bench.log"))
|
Pulse.Sess("log", "log").Conf("bench.log", Pulse.Conf("bench.log"))
|
||||||
|
Pulse.Sess("cli", "cli")
|
||||||
|
Pulse.callback.hand = func(msg *Message) *Message {
|
||||||
|
msg.Log("fuck", nil, "%v", msg.Meta["result"])
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
for _, m := range Pulse.Search(Pulse.Conf("start")) {
|
for _, m := range Pulse.Search(Pulse.Conf("start")) {
|
||||||
m.Set("detail", Pulse.Conf("init.shy")).Set("option", "stdio").target.Start(m)
|
m.Set("detail", Pulse.Conf("init.shy")).Set("option", "stdio").target.Start(m)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user