forked from x/ContextOS
mac mod context.close 完善了模块的退出机制
This commit is contained in:
parent
7fffcde987
commit
debceb6c0f
@ -44,7 +44,7 @@ func (aaa *AAA) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
|
|||||||
if len(arg) > 0 { // {{{
|
if len(arg) > 0 { // {{{
|
||||||
bs := md5.Sum([]byte(fmt.Sprintln("用户密码:%s", arg[0])))
|
bs := md5.Sum([]byte(fmt.Sprintln("用户密码:%s", arg[0])))
|
||||||
m.Assert(x.Value == "" || x.Value == hex.EncodeToString(bs[:]), "密码错误")
|
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 hex.EncodeToString(bs[:])
|
||||||
}
|
}
|
||||||
return x.Value
|
return x.Value
|
||||||
@ -77,11 +77,12 @@ func (aaa *AAA) Start(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
if len(arg) > 1 {
|
if len(arg) > 1 {
|
||||||
if m.Cap("sessid") == "" {
|
if m.Cap("sessid") == "" {
|
||||||
m.Cap("sessid", aaa.session(arg[1]))
|
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.Cap("stream", m.Cap("username"))
|
||||||
}
|
}
|
||||||
|
m.Log("info", m.Source, "login %s %s", m.Cap("group"), m.Cap("username"))
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -94,15 +95,18 @@ func (aaa *AAA) Close(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
|
|
||||||
switch aaa.Context {
|
switch aaa.Context {
|
||||||
case m.Target:
|
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:
|
case m.Source:
|
||||||
}
|
}
|
||||||
|
|
||||||
m.Log("info", nil, "%d logout %s", Pulse.Capi("nuser", -1)+1, m.Cap("username"))
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
var Pulse *ctx.Message
|
||||||
var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
||||||
Caches: map[string]*ctx.Cache{
|
Caches: map[string]*ctx.Cache{
|
||||||
"nuser": &ctx.Cache{Name: "用户数量", Value: "0", Help: "用户数量"},
|
"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.Source.Group, m.Source.Owner = m.Cap("group"), m.Target
|
||||||
m.Log("info", m.Source, "logon %s", m.Cap("group"), m.Cap("username"))
|
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")
|
return m.Cap("username")
|
||||||
}
|
}
|
||||||
case 2, 3:
|
case 2, 3:
|
||||||
@ -139,12 +147,17 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
|||||||
username, password = arg[1], arg[2]
|
username, password = arg[1], arg[2]
|
||||||
}
|
}
|
||||||
|
|
||||||
if username == m.Conf("rootname") {
|
if username == Pulse.Conf("rootname") {
|
||||||
m.Set("detail", group, username).Target.Start(m)
|
m.Set("detail", group, username).Target.Start(m)
|
||||||
} else if msg := m.Find(username); msg == nil {
|
} else if msg := m.Find(username); msg == nil {
|
||||||
m.Start(username, "认证用户", group, username)
|
m.Start(username, "认证用户", group, username)
|
||||||
} else {
|
} else {
|
||||||
m.Target = msg.Target
|
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)
|
m.Cap("password", password)
|
||||||
@ -162,7 +175,6 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
var Pulse *ctx.Message
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
aaa := &AAA{}
|
aaa := &AAA{}
|
||||||
|
@ -239,6 +239,9 @@ func (cli *CLI) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
|
|||||||
if cli.Context != Index {
|
if cli.Context != Index {
|
||||||
cli.Owner = nil
|
cli.Owner = nil
|
||||||
}
|
}
|
||||||
|
if cli.Context == Index {
|
||||||
|
Pulse = m
|
||||||
|
}
|
||||||
|
|
||||||
cli.target = cli.Context
|
cli.target = cli.Context
|
||||||
cli.alias = map[string]string{
|
cli.alias = map[string]string{
|
||||||
@ -286,6 +289,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
cli.echo("password>")
|
cli.echo("password>")
|
||||||
fmt.Fscanln(cli.in, &password)
|
fmt.Fscanln(cli.in, &password)
|
||||||
|
|
||||||
|
msg.Name = "aaa"
|
||||||
msg.Wait = make(chan bool)
|
msg.Wait = make(chan bool)
|
||||||
if msg.Cmd("login", username, password) == "" {
|
if msg.Cmd("login", username, password) == "" {
|
||||||
cli.echo("登录失败")
|
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 = make(map[string]*ctx.Message)
|
||||||
}
|
}
|
||||||
cli.Sessions["aaa"] = msg
|
cli.Sessions["aaa"] = msg
|
||||||
msg.Name = "aaa"
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m.Cap("stream", "stdout")
|
m.Cap("stream", "stdout")
|
||||||
@ -358,7 +361,17 @@ func (cli *CLI) Close(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
|
|
||||||
switch cli.Context {
|
switch cli.Context {
|
||||||
case m.Target:
|
case m.Target:
|
||||||
|
if len(cli.Context.Requests) == 0 {
|
||||||
|
m.Log("info", nil, "%s close %v", Pulse.Cap("nterm"), arg)
|
||||||
|
}
|
||||||
case m.Source:
|
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
|
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: "管理中心",
|
var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
||||||
Caches: map[string]*ctx.Cache{
|
Caches: map[string]*ctx.Cache{
|
||||||
"nterm": &ctx.Cache{Name: "终端数量", Value: "0", Help: "已经运行的终端数量"},
|
"nterm": &ctx.Cache{Name: "终端数量", Value: "0", Help: "已经运行的终端数量"},
|
||||||
|
@ -72,7 +72,6 @@ type Context struct {
|
|||||||
Owner *Context
|
Owner *Context
|
||||||
Group string
|
Group string
|
||||||
|
|
||||||
Pulse *Message
|
|
||||||
Server
|
Server
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,8 +126,9 @@ func (c *Context) Begin(m *Message) *Context { // {{{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Requests = []*Message{m}
|
m.Index = 1
|
||||||
c.Historys = []*Message{m}
|
c.Historys = []*Message{m}
|
||||||
|
c.Requests = []*Message{m}
|
||||||
|
|
||||||
if c.Server != nil {
|
if c.Server != nil {
|
||||||
c.Server.Begin(m, m.Meta["detail"]...)
|
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 { // {{{
|
func (c *Context) Close(m *Message, arg ...string) bool { // {{{
|
||||||
m.Log("close", c, "close %v", arg)
|
m.Log("close", c, "close %v", arg)
|
||||||
|
|
||||||
if m.Target == c {
|
if m.Target == c {
|
||||||
for k, v := range c.Sessions {
|
switch {
|
||||||
delete(c.Sessions, k)
|
case m.Index == 0:
|
||||||
if v.Target != c && !v.Target.Close(v, arg...) {
|
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
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.Source == c {
|
if m.Source == c && m.Target != c {
|
||||||
if _, ok := c.Sessions[m.Name]; ok {
|
if _, ok := c.Sessions[m.Name]; ok {
|
||||||
delete(c.Sessions, m.Name)
|
delete(c.Sessions, m.Name)
|
||||||
m.Target.Server.Close(m, arg...)
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if m.Index == -1 {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if len(c.Sessions) > 0 {
|
if len(c.Requests) > 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.Cap("status") == "close" {
|
m.Log(m.Cap("status", "close"), c, "%d server %v", m.root.Capi("nserver", -1)+1, arg)
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.context != nil && len(c.contexts) == 0 {
|
if c.context != nil && len(c.contexts) == 0 {
|
||||||
m.Log("close", c, "%d context %v", m.root.Capi("ncontext", -1)+1, arg)
|
m.Log("close", c, "%d context %v", m.root.Capi("ncontext", -1)+1, arg)
|
||||||
delete(c.context.contexts, c.Name)
|
delete(c.context.contexts, c.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, v := range c.Requests {
|
for _, v := range c.Sessions {
|
||||||
if v.Source != c && v.Index != -1 {
|
if v.Target != c {
|
||||||
v.Index = -1
|
v.Target.Close(v, arg...)
|
||||||
v.Source.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{
|
Caches: map[string]*Cache{
|
||||||
"nserver": &Cache{Name: "服务数量", Value: "0", Help: "显示已经启动运行模块的数量"},
|
"nserver": &Cache{Name: "服务数量", Value: "0", Help: "显示已经启动运行模块的数量"},
|
||||||
"ncontext": &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() {
|
func init() {
|
||||||
Pulse.root = Pulse
|
Pulse.root = Pulse
|
||||||
Index.root = Index
|
Index.root = Index
|
||||||
|
@ -30,7 +30,7 @@ func (ssh *SSH) Close(m *ctx.Message, arg ...string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
var Index = &ctx.Context{Name: "ssh", Help: "加密终端",
|
var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
|
||||||
Caches: map[string]*ctx.Cache{},
|
Caches: map[string]*ctx.Cache{},
|
||||||
Configs: map[string]*ctx.Config{},
|
Configs: map[string]*ctx.Config{},
|
||||||
Commands: map[string]*ctx.Command{},
|
Commands: map[string]*ctx.Command{},
|
||||||
|
@ -4,13 +4,13 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
_ "context/aaa"
|
_ "context/aaa"
|
||||||
_ "context/cli"
|
_ "context/cli"
|
||||||
|
_ "context/ssh"
|
||||||
|
|
||||||
_ "context/mdb"
|
_ "context/mdb"
|
||||||
|
_ "context/nfs"
|
||||||
_ "context/tcp"
|
_ "context/tcp"
|
||||||
_ "context/web"
|
_ "context/web"
|
||||||
|
|
||||||
_ "context/ssh"
|
|
||||||
|
|
||||||
_ "context/lex"
|
_ "context/lex"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user