From debceb6c0f0ab00affc00248e3cfa5101275b844 Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 14 Dec 2017 23:48:24 +0800 Subject: [PATCH] =?UTF-8?q?mac=20mod=20context.close=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E4=BA=86=E6=A8=A1=E5=9D=97=E7=9A=84=E9=80=80=E5=87=BA=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/context/aaa/aaa.go | 24 +++++++++++++----- src/context/cli/cli.go | 16 +++++++++++- src/context/ctx.go | 55 ++++++++++++++++++++++-------------------- src/context/ssh/ssh.go | 2 +- src/example/bench.go | 4 +-- 5 files changed, 65 insertions(+), 36 deletions(-) diff --git a/src/context/aaa/aaa.go b/src/context/aaa/aaa.go index 98f33b97..7000443b 100644 --- a/src/context/aaa/aaa.go +++ b/src/context/aaa/aaa.go @@ -44,7 +44,7 @@ func (aaa *AAA) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{ if len(arg) > 0 { // {{{ bs := md5.Sum([]byte(fmt.Sprintln("用户密码:%s", arg[0]))) m.Assert(x.Value == "" || x.Value == hex.EncodeToString(bs[:]), "密码错误") - m.Cap("expire", fmt.Sprintf("%d", time.Now().Unix()+int64(m.Confi("expire")))) + m.Cap("expire", fmt.Sprintf("%d", time.Now().Unix()+int64(Pulse.Confi("expire")))) return hex.EncodeToString(bs[:]) } return x.Value @@ -77,11 +77,12 @@ func (aaa *AAA) Start(m *ctx.Message, arg ...string) bool { // {{{ if len(arg) > 1 { if m.Cap("sessid") == "" { m.Cap("sessid", aaa.session(arg[1])) - m.Capi("nuser", 1) + Pulse.Capi("nuser", 1) } - m.Log("info", m.Source, "login %s %s", m.Cap("group", arg[0]), m.Cap("username", arg[1])) + m.Log("info", m.Source, "create %s %s", m.Cap("group", arg[0]), m.Cap("username", arg[1])) m.Cap("stream", m.Cap("username")) } + m.Log("info", m.Source, "login %s %s", m.Cap("group"), m.Cap("username")) return false } @@ -94,15 +95,18 @@ func (aaa *AAA) Close(m *ctx.Message, arg ...string) bool { // {{{ switch aaa.Context { case m.Target: + if len(aaa.Context.Requests) == 0 { + m.Log("info", nil, "%d logout %s", Pulse.Capi("nuser", -1)+1, m.Cap("username")) + } case m.Source: } - m.Log("info", nil, "%d logout %s", Pulse.Capi("nuser", -1)+1, m.Cap("username")) return true } // }}} +var Pulse *ctx.Message var Index = &ctx.Context{Name: "aaa", Help: "认证中心", Caches: map[string]*ctx.Cache{ "nuser": &ctx.Cache{Name: "用户数量", Value: "0", Help: "用户数量"}, @@ -131,6 +135,10 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", m.Source.Group, m.Source.Owner = m.Cap("group"), m.Target m.Log("info", m.Source, "logon %s", m.Cap("group"), m.Cap("username")) + if m.Name != "" { + c.Requests = append(c.Requests, m) + m.Index = len(m.Target.Requests) + } return m.Cap("username") } case 2, 3: @@ -139,12 +147,17 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", username, password = arg[1], arg[2] } - if username == m.Conf("rootname") { + if username == Pulse.Conf("rootname") { m.Set("detail", group, username).Target.Start(m) } else if msg := m.Find(username); msg == nil { m.Start(username, "认证用户", group, username) } else { m.Target = msg.Target + msg.Target.Start(msg) + if m.Name != "" { + m.Target.Requests = append(m.Target.Requests, m) + m.Index = len(m.Target.Requests) + } } m.Cap("password", password) @@ -162,7 +175,6 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", }, }, } -var Pulse *ctx.Message func init() { aaa := &AAA{} diff --git a/src/context/cli/cli.go b/src/context/cli/cli.go index b9f8c467..f7efb908 100644 --- a/src/context/cli/cli.go +++ b/src/context/cli/cli.go @@ -239,6 +239,9 @@ func (cli *CLI) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{ if cli.Context != Index { cli.Owner = nil } + if cli.Context == Index { + Pulse = m + } cli.target = cli.Context cli.alias = map[string]string{ @@ -286,6 +289,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{ cli.echo("password>") fmt.Fscanln(cli.in, &password) + msg.Name = "aaa" msg.Wait = make(chan bool) if msg.Cmd("login", username, password) == "" { cli.echo("登录失败") @@ -299,7 +303,6 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{ cli.Sessions = make(map[string]*ctx.Message) } cli.Sessions["aaa"] = msg - msg.Name = "aaa" } } else { m.Cap("stream", "stdout") @@ -358,7 +361,17 @@ func (cli *CLI) Close(m *ctx.Message, arg ...string) bool { // {{{ switch cli.Context { case m.Target: + if len(cli.Context.Requests) == 0 { + m.Log("info", nil, "%s close %v", Pulse.Cap("nterm"), arg) + } case m.Source: + if m.Name == "aaa" { + msg := m.Spawn(cli.Context) + msg.Master = cli.Context + if !cli.Context.Close(msg, arg...) { + return false + } + } } return true @@ -366,6 +379,7 @@ func (cli *CLI) Close(m *ctx.Message, arg ...string) bool { // {{{ // }}} +var Pulse *ctx.Message var Index = &ctx.Context{Name: "cli", Help: "管理中心", Caches: map[string]*ctx.Cache{ "nterm": &ctx.Cache{Name: "终端数量", Value: "0", Help: "已经运行的终端数量"}, diff --git a/src/context/ctx.go b/src/context/ctx.go index 4c1e871f..41a53f89 100644 --- a/src/context/ctx.go +++ b/src/context/ctx.go @@ -72,7 +72,6 @@ type Context struct { Owner *Context Group string - Pulse *Message Server } @@ -127,8 +126,9 @@ func (c *Context) Begin(m *Message) *Context { // {{{ } } - c.Requests = []*Message{m} + m.Index = 1 c.Historys = []*Message{m} + c.Requests = []*Message{m} if c.Server != nil { c.Server.Begin(m, m.Meta["detail"]...) @@ -161,12 +161,24 @@ func (c *Context) Start(m *Message) bool { // {{{ // }}} func (c *Context) Close(m *Message, arg ...string) bool { // {{{ m.Log("close", c, "close %v", arg) + if m.Target == c { - for k, v := range c.Sessions { - delete(c.Sessions, k) - if v.Target != c && !v.Target.Close(v, arg...) { - return false + switch { + case m.Index == 0: + for i := len(c.Requests) - 1; i >= 0; i-- { + v := c.Requests[i] + v.Index = -1 + if v.Source != c && !v.Source.Close(v, arg...) { + v.Index = i + return false + } + c.Requests = c.Requests[:i] } + case m.Index > 0: + for i := m.Index - 1; i < len(c.Requests)-1; i++ { + c.Requests[i] = c.Requests[i+1] + } + c.Requests = c.Requests[:len(c.Requests)-1] } } @@ -174,34 +186,26 @@ func (c *Context) Close(m *Message, arg ...string) bool { // {{{ return false } - if m.Source == c { + if m.Source == c && m.Target != c { if _, ok := c.Sessions[m.Name]; ok { delete(c.Sessions, m.Name) - m.Target.Server.Close(m, arg...) } - } else { - if m.Index == -1 { - return true - } - } - - if len(c.Sessions) > 0 { - return false - } - - if m.Cap("status") == "close" { return true } + if len(c.Requests) > 0 { + return false + } + + m.Log(m.Cap("status", "close"), c, "%d server %v", m.root.Capi("nserver", -1)+1, arg) if c.context != nil && len(c.contexts) == 0 { m.Log("close", c, "%d context %v", m.root.Capi("ncontext", -1)+1, arg) delete(c.context.contexts, c.Name) } - for _, v := range c.Requests { - if v.Source != c && v.Index != -1 { - v.Index = -1 - v.Source.Close(v, arg...) + for _, v := range c.Sessions { + if v.Target != c { + v.Target.Close(v, arg...) } } @@ -1077,7 +1081,8 @@ func (m *Message) Cap(key string, arg ...string) string { // {{{ // }}} -var Index = &Context{Name: "ctx", Help: "元始模块", +var Pulse = &Message{code: 0, time: time.Now(), Wait: make(chan bool), Source: Index, Master: Index, Target: Index} +var Index = &Context{Name: "ctx", Help: "模块中心", Caches: map[string]*Cache{ "nserver": &Cache{Name: "服务数量", Value: "0", Help: "显示已经启动运行模块的数量"}, "ncontext": &Cache{Name: "模块数量", Value: "0", Help: "显示功能树已经注册模块的数量"}, @@ -1562,8 +1567,6 @@ var Index = &Context{Name: "ctx", Help: "元始模块", }, } -var Pulse = &Message{code: 0, time: time.Now(), Wait: make(chan bool), Source: Index, Master: Index, Target: Index} - func init() { Pulse.root = Pulse Index.root = Index diff --git a/src/context/ssh/ssh.go b/src/context/ssh/ssh.go index 174ad3a6..201100a2 100644 --- a/src/context/ssh/ssh.go +++ b/src/context/ssh/ssh.go @@ -30,7 +30,7 @@ func (ssh *SSH) Close(m *ctx.Message, arg ...string) bool { return false } -var Index = &ctx.Context{Name: "ssh", Help: "加密终端", +var Index = &ctx.Context{Name: "ssh", Help: "集群中心", Caches: map[string]*ctx.Cache{}, Configs: map[string]*ctx.Config{}, Commands: map[string]*ctx.Command{}, diff --git a/src/example/bench.go b/src/example/bench.go index e8f8ee84..38e9ed1d 100644 --- a/src/example/bench.go +++ b/src/example/bench.go @@ -4,13 +4,13 @@ import ( "context" _ "context/aaa" _ "context/cli" + _ "context/ssh" _ "context/mdb" + _ "context/nfs" _ "context/tcp" _ "context/web" - _ "context/ssh" - _ "context/lex" "os"