mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-26 01:04:06 +08:00
mac add userinfo 添加的用户权限管理
This commit is contained in:
parent
a2f4696979
commit
c293a1bd95
@ -0,0 +1,6 @@
|
|||||||
|
~aaa
|
||||||
|
login root 94ca7394d007fa189cc4be0a2625d716 root
|
||||||
|
login root root
|
||||||
|
|
||||||
|
~cli
|
||||||
|
remote slave listen :9393 tcp
|
@ -5,6 +5,7 @@ import ( // {{{
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
// "log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -25,6 +26,7 @@ type CLI struct {
|
|||||||
alias map[string]string
|
alias map[string]string
|
||||||
next string
|
next string
|
||||||
exit bool
|
exit bool
|
||||||
|
login *ctx.Context
|
||||||
|
|
||||||
target *ctx.Context
|
target *ctx.Context
|
||||||
*ctx.Context
|
*ctx.Context
|
||||||
@ -44,6 +46,33 @@ func (cli *CLI) push(f io.ReadCloser) { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (cli *CLI) parse(m *ctx.Message) bool { // {{{
|
func (cli *CLI) parse(m *ctx.Message) bool { // {{{
|
||||||
|
if len(cli.ins) == 1 && cli.Owner == nil {
|
||||||
|
|
||||||
|
username := ""
|
||||||
|
fmt.Fprintf(cli.out, "username>")
|
||||||
|
fmt.Fscanln(cli.in, &username)
|
||||||
|
|
||||||
|
password := ""
|
||||||
|
fmt.Fprintf(cli.out, "password>")
|
||||||
|
fmt.Fscanln(cli.in, &password)
|
||||||
|
|
||||||
|
if aaa := cli.Root.Find("aaa"); aaa != nil {
|
||||||
|
cli.Owner = Index.Owner
|
||||||
|
msg := m.Spawn(aaa, "user")
|
||||||
|
|
||||||
|
if msg.Cmd("login", username, password) == "" {
|
||||||
|
fmt.Fprintln(cli.out, "登录失败")
|
||||||
|
m.Post(cli.Context, "exit")
|
||||||
|
cli.out.Close()
|
||||||
|
cli.in.Close()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
cli.Owner = msg.Target
|
||||||
|
cli.Cap("user", msg.Target.Cap("username"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(cli.ins) == 1 || cli.Conf("slient") != "yes" {
|
if len(cli.ins) == 1 || cli.Conf("slient") != "yes" {
|
||||||
cli.echo(cli.Conf("PS1"))
|
cli.echo(cli.Conf("PS1"))
|
||||||
}
|
}
|
||||||
@ -175,6 +204,7 @@ func (cli *CLI) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
|
func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
|
||||||
|
cli.Owner = nil
|
||||||
cli.Capi("nterm", 1)
|
cli.Capi("nterm", 1)
|
||||||
defer cli.Capi("nterm", -1)
|
defer cli.Capi("nterm", -1)
|
||||||
|
|
||||||
@ -253,9 +283,11 @@ func (cli *CLI) Exit(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
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: "已经运行的终端数量"},
|
||||||
|
"user": &ctx.Cache{Name: "登录用户", Value: "", Help: "登录用户名"},
|
||||||
},
|
},
|
||||||
Configs: map[string]*ctx.Config{
|
Configs: map[string]*ctx.Config{
|
||||||
"slient": &ctx.Config{Name: "屏蔽脚本输出(yes/no)", Value: "yes", Help: "屏蔽脚本输出的信息,yes:屏蔽,no:不屏蔽"},
|
"slient": &ctx.Config{Name: "屏蔽脚本输出(yes/no)", Value: "yes", Help: "屏蔽脚本输出的信息,yes:屏蔽,no:不屏蔽"},
|
||||||
|
"default": &ctx.Config{Name: "默认的搜索起点(root/back/home)", Value: "root", Help: "模块搜索的默认起点,root:从根模块,back:从父模块,home:从当前模块"},
|
||||||
// "hello": &ctx.Config{Name: "开场白", Value: "\n~~~ Hello Context & Message World ~~~\n", Help: "模块启动时输出的信息"},
|
// "hello": &ctx.Config{Name: "开场白", Value: "\n~~~ Hello Context & Message World ~~~\n", Help: "模块启动时输出的信息"},
|
||||||
// "byebye": &ctx.Config{Name: "结束语", Value: "\n~~~ Byebye Context & Message World ~~~\n", Help: "模块停止时输出的信息"},
|
// "byebye": &ctx.Config{Name: "结束语", Value: "\n~~~ Byebye Context & Message World ~~~\n", Help: "模块停止时输出的信息"},
|
||||||
|
|
||||||
@ -278,15 +310,18 @@ var Index = &ctx.Context{Name: "cli", Help: "管理终端",
|
|||||||
},
|
},
|
||||||
Commands: map[string]*ctx.Command{
|
Commands: map[string]*ctx.Command{
|
||||||
"context": &ctx.Command{Name: "context [root|back|home] [[find|search] name] [show|spawn|start|switch][args]", Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块,args:启动参数", Hand: func(c *ctx.Context, m *ctx.Message, key string, arg ...string) string {
|
"context": &ctx.Command{Name: "context [root|back|home] [[find|search] name] [show|spawn|start|switch][args]", Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块,args:启动参数", Hand: func(c *ctx.Context, m *ctx.Message, key string, arg ...string) string {
|
||||||
cli, ok := c.Server.(*CLI) // {{{
|
cli, ok := m.Context.Server.(*CLI) // {{{
|
||||||
if !ok {
|
if !ok {
|
||||||
return ""
|
cli, ok = c.Server.(*CLI)
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch len(arg) {
|
switch len(arg) {
|
||||||
case 0:
|
case 0:
|
||||||
m.Target.Root.Travel(func(c *ctx.Context) bool {
|
m.Target.Root.Travel(func(c *ctx.Context) bool {
|
||||||
if c.Context != nil {
|
if c.Context != nil && m.Context.Check(c) {
|
||||||
m.Echo("%s: %s(%s)\n", c.Context.Name, c.Name, c.Help)
|
m.Echo("%s: %s(%s)\n", c.Context.Name, c.Name, c.Help)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@ -295,6 +330,16 @@ var Index = &ctx.Context{Name: "cli", Help: "管理终端",
|
|||||||
}
|
}
|
||||||
|
|
||||||
target := m.Target
|
target := m.Target
|
||||||
|
switch c.Conf("default") {
|
||||||
|
case "root":
|
||||||
|
target = target.Root
|
||||||
|
case "back":
|
||||||
|
if target.Context != nil {
|
||||||
|
target = target.Context
|
||||||
|
}
|
||||||
|
case "home":
|
||||||
|
}
|
||||||
|
|
||||||
method := "search"
|
method := "search"
|
||||||
action := "switch"
|
action := "switch"
|
||||||
which := ""
|
which := ""
|
||||||
@ -343,6 +388,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理终端",
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, v := range cs {
|
for _, v := range cs {
|
||||||
|
if !m.Context.Check(v) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
switch action {
|
switch action {
|
||||||
case "switch":
|
case "switch":
|
||||||
cli.target = v
|
cli.target = v
|
||||||
@ -565,6 +614,14 @@ var Index = &ctx.Context{Name: "cli", Help: "管理终端",
|
|||||||
return ""
|
return ""
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
|
"userinfo": &ctx.Command{Name: "userinfo", Help: "查看模块的用户信息", Hand: func(c *ctx.Context, m *ctx.Message, key string, arg ...string) string {
|
||||||
|
o := m.Target.Owner // {{{
|
||||||
|
if o != nil {
|
||||||
|
m.Echo("%s\n", o.Name)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
// }}}
|
||||||
|
}},
|
||||||
"exit": &ctx.Command{Name: "exit", Help: "退出", Hand: func(c *ctx.Context, m *ctx.Message, key string, arg ...string) string {
|
"exit": &ctx.Command{Name: "exit", Help: "退出", Hand: func(c *ctx.Context, m *ctx.Message, key string, arg ...string) string {
|
||||||
cli, ok := m.Target.Server.(*CLI) // {{{
|
cli, ok := m.Target.Server.(*CLI) // {{{
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -572,9 +629,11 @@ var Index = &ctx.Context{Name: "cli", Help: "管理终端",
|
|||||||
}
|
}
|
||||||
if ok {
|
if ok {
|
||||||
if !cli.exit {
|
if !cli.exit {
|
||||||
m.Echo(c.Conf("结束语"))
|
// m.Echo(c.Conf("结束语"))
|
||||||
cli.Context.Exit(m)
|
cli.Context.Exit(m)
|
||||||
}
|
}
|
||||||
|
cli.in.Close()
|
||||||
|
cli.out.Close()
|
||||||
cli.exit = true
|
cli.exit = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ func (m *Message) End(s bool) { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
func (m *Message) Cmd(arg ...string) string { // {{{
|
func (m *Message) Start(key string, arg ...string) bool { // {{{
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
if m.Meta == nil {
|
if m.Meta == nil {
|
||||||
m.Meta = make(map[string][]string)
|
m.Meta = make(map[string][]string)
|
||||||
@ -212,7 +212,9 @@ func (m *Message) Cmd(arg ...string) string { // {{{
|
|||||||
m.Meta["detail"] = arg
|
m.Meta["detail"] = arg
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.Target.Cmd(m, m.Meta["detail"][0], m.Meta["detail"][1:]...)
|
m.Target.Spawn(m, key).Start(m)
|
||||||
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
@ -225,7 +227,7 @@ func (m *Message) Post(c *Context, arg ...string) bool { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.Messages == nil {
|
if c.Messages == nil {
|
||||||
panic(m.Target.Name + " 没有开启消息处理")
|
panic(c.Name + " 没有开启消息处理")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Messages <- m
|
c.Messages <- m
|
||||||
@ -237,7 +239,7 @@ func (m *Message) Post(c *Context, arg ...string) bool { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Start(key string, arg ...string) bool { // {{{
|
func (m *Message) Cmd(arg ...string) string { // {{{
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
if m.Meta == nil {
|
if m.Meta == nil {
|
||||||
m.Meta = make(map[string][]string)
|
m.Meta = make(map[string][]string)
|
||||||
@ -245,9 +247,7 @@ func (m *Message) Start(key string, arg ...string) bool { // {{{
|
|||||||
m.Meta["detail"] = arg
|
m.Meta["detail"] = arg
|
||||||
}
|
}
|
||||||
|
|
||||||
m.Target.Spawn(m, key).Start(m)
|
return m.Target.Cmd(m, m.Meta["detail"][0], m.Meta["detail"][1:]...)
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
@ -276,6 +276,7 @@ type Context struct {
|
|||||||
Requests []*Message
|
Requests []*Message
|
||||||
Sessions map[string]*Message
|
Sessions map[string]*Message
|
||||||
|
|
||||||
|
Owner *Context
|
||||||
Index map[string]*Context
|
Index map[string]*Context
|
||||||
Groups map[string]*Context
|
Groups map[string]*Context
|
||||||
|
|
||||||
@ -299,6 +300,7 @@ func (c *Context) Assert(e error) bool { // {{{
|
|||||||
func (c *Context) AssertOne(m *Message, safe bool, hand ...func(c *Context, m *Message)) *Context { // {{{
|
func (c *Context) AssertOne(m *Message, safe bool, hand ...func(c *Context, m *Message)) *Context { // {{{
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
|
log.Println(c.Name, e)
|
||||||
if c.Conf("debug") == "on" && e != io.EOF {
|
if c.Conf("debug") == "on" && e != io.EOF {
|
||||||
fmt.Println(c.Name, "error:", e)
|
fmt.Println(c.Name, "error:", e)
|
||||||
debug.PrintStack()
|
debug.PrintStack()
|
||||||
@ -381,10 +383,12 @@ func (c *Context) Start(m *Message) bool { // {{{
|
|||||||
defer Index.Capi("nserver", -1)
|
defer Index.Capi("nserver", -1)
|
||||||
defer log.Printf("%d stop(%s): %s %s", m.Code, Index.Cap("nserver"), c.Name, c.Help)
|
defer log.Printf("%d stop(%s): %s %s", m.Code, Index.Cap("nserver"), c.Name, c.Help)
|
||||||
|
|
||||||
|
c.Owner = m.Owner
|
||||||
c.Requests = []*Message{m}
|
c.Requests = []*Message{m}
|
||||||
c.Server.Start(m, m.Meta["detail"]...)
|
c.Server.Start(m, m.Meta["detail"]...)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Pulse.Wait <- true
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -657,6 +661,22 @@ func (c *Context) Del(arg ...string) { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
func (c *Context) Check(s *Context) bool { // {{{
|
||||||
|
// if c.Owner != nil {
|
||||||
|
// log.Println("source:", c.Owner.Name)
|
||||||
|
// }
|
||||||
|
// if s.Owner != nil {
|
||||||
|
// log.Println("target:", s.Owner.Name)
|
||||||
|
// }
|
||||||
|
if c.Owner == s.Owner || c.Owner == Index.Owner {
|
||||||
|
// log.Println("match:")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// log.Println("not match:")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
func (c *Context) Travel(hand func(s *Context) bool) { // {{{
|
func (c *Context) Travel(hand func(s *Context) bool) { // {{{
|
||||||
cs := []*Context{c}
|
cs := []*Context{c}
|
||||||
for i := 0; i < len(cs); i++ {
|
for i := 0; i < len(cs); i++ {
|
||||||
@ -687,8 +707,6 @@ func (c *Context) Search(name string) []*Context { // {{{
|
|||||||
if strings.Contains(s.Name, name) || strings.Contains(s.Help, name) {
|
if strings.Contains(s.Name, name) || strings.Contains(s.Help, name) {
|
||||||
cs = append(cs, s)
|
cs = append(cs, s)
|
||||||
log.Println(c.Name, "search:", s.Name, "[match]", name)
|
log.Println(c.Name, "search:", s.Name, "[match]", name)
|
||||||
} else {
|
|
||||||
log.Println(c.Name, "search:", s.Name)
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@ -723,6 +741,11 @@ func (c *Context) Cmd(m *Message, key string, arg ...string) string { // {{{
|
|||||||
if x, ok := s.Commands[key]; ok {
|
if x, ok := s.Commands[key]; ok {
|
||||||
log.Printf("%s cmd(%s->%s): %v", c.Name, m.Context.Name, m.Target.Name, m.Meta["detail"])
|
log.Printf("%s cmd(%s->%s): %v", c.Name, m.Context.Name, m.Target.Name, m.Meta["detail"])
|
||||||
|
|
||||||
|
if !m.Context.Check(m.Target) {
|
||||||
|
log.Printf("没有权限:")
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
for _, v := range m.Meta["option"] {
|
for _, v := range m.Meta["option"] {
|
||||||
if _, ok := x.Options[v]; !ok {
|
if _, ok := x.Options[v]; !ok {
|
||||||
panic(errors.New(fmt.Sprintf("未知参数:" + v)))
|
panic(errors.New(fmt.Sprintf("未知参数:" + v)))
|
||||||
@ -731,8 +754,10 @@ func (c *Context) Cmd(m *Message, key string, arg ...string) string { // {{{
|
|||||||
|
|
||||||
m.Meta["result"] = nil
|
m.Meta["result"] = nil
|
||||||
c.AssertOne(m, true, func(c *Context, m *Message) {
|
c.AssertOne(m, true, func(c *Context, m *Message) {
|
||||||
x.Hand(c, m, key, arg...)
|
ret := x.Hand(c, m, key, arg...)
|
||||||
|
if ret != "" {
|
||||||
|
m.Echo(ret)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if x.Appends != nil {
|
if x.Appends != nil {
|
||||||
@ -753,6 +778,7 @@ func (c *Context) Cmd(m *Message, key string, arg ...string) string { // {{{
|
|||||||
// }}}
|
// }}}
|
||||||
func (c *Context) Conf(key string, arg ...string) string { // {{{
|
func (c *Context) Conf(key string, arg ...string) string { // {{{
|
||||||
for s := c; s != nil; s = s.Context {
|
for s := c; s != nil; s = s.Context {
|
||||||
|
|
||||||
if x, ok := s.Configs[key]; ok {
|
if x, ok := s.Configs[key]; ok {
|
||||||
switch len(arg) {
|
switch len(arg) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -935,7 +961,6 @@ func init() {
|
|||||||
Pulse.Target = Index
|
Pulse.Target = Index
|
||||||
Pulse.Context = Index
|
Pulse.Context = Index
|
||||||
Pulse.Wait = make(chan bool, 10)
|
Pulse.Wait = make(chan bool, 10)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Start(args ...string) {
|
func Start(args ...string) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user