1
0
forked from x/ContextOS

vps add ctx.group 添加了ctx模块的用户权限管理

This commit is contained in:
shaoying 2018-04-05 11:37:44 +08:00
parent d77bb17771
commit 7ddbee3fd5

View File

@ -276,180 +276,6 @@ func (c *Context) Has(key ...string) bool { // {{{
// }}}
func (c *Context) Add(group string, arg ...string) { // {{{
if c.Index == nil {
c.Index = make(map[string]*Context)
}
if c.Groups == nil {
c.Groups = make(map[string]*Context)
}
s := c
if group != "" && group != "root" {
if g, ok := c.Index[group]; ok {
s = g
} else {
panic(errors.New(group + "上下文不存在"))
}
}
switch arg[0] {
case "context":
if len(arg) != 4 {
panic(errors.New("参数错误"))
}
if v, ok := c.Index[arg[1]]; ok {
panic(errors.New(v.Name + "上下文已存在"))
}
s.Groups[arg[1]] = &Context{Name: arg[2], Help: arg[3], Index: c.Index}
c.Index[arg[1]] = s.Groups[arg[1]]
log.Println(c.Name, "add context:", arg[1:])
case "command":
if len(arg) != 3 {
panic(errors.New("参数错误"))
}
if v, ok := s.Groups[arg[1]]; ok {
if v.Commands == nil {
v.Commands = make(map[string]*Command)
}
if x, ok := v.Commands[arg[2]]; ok {
panic(errors.New(x.Name + "命令已存在"))
}
if x, ok := s.Commands[arg[2]]; ok {
log.Println(v.Name, "add command:", arg[2])
v.Commands[arg[2]] = x
} else {
panic(errors.New(arg[2] + "命令不存在"))
}
} else {
panic(errors.New(arg[1] + "上下文不存在"))
}
case "config":
if len(arg) != 3 {
panic(errors.New("参数错误"))
}
if v, ok := s.Groups[arg[1]]; ok {
if v.Configs == nil {
v.Configs = make(map[string]*Config)
}
if x, ok := v.Configs[arg[2]]; ok {
panic(errors.New(x.Name + "配置项已存在"))
}
if x, ok := s.Configs[arg[2]]; ok {
log.Println(v.Name, "add config:", arg[2])
v.Configs[arg[2]] = x
} else {
panic(errors.New(arg[2] + "配置项不存在"))
}
} else {
panic(errors.New(arg[1] + "上下文不存在"))
}
case "cache":
if len(arg) != 3 {
panic(errors.New("参数错误"))
}
if v, ok := s.Groups[arg[1]]; ok {
if v.Caches == nil {
v.Caches = make(map[string]*Cache)
}
if x, ok := v.Caches[arg[2]]; ok {
panic(errors.New(x.Name + "缓存项已存在"))
}
if x, ok := s.Caches[arg[2]]; ok {
log.Println(v.Name, "add cache:", arg[2])
v.Caches[arg[2]] = x
} else {
panic(errors.New(arg[2] + "缓存项不存在"))
}
} else {
panic(errors.New(arg[1] + "上下文不存在"))
}
}
}
// }}}
func (c *Context) Del(arg ...string) { // {{{
cs := make([]*Context, 0, 5)
switch arg[0] {
case "context":
if len(arg) != 2 {
panic(errors.New("参数错误"))
}
if v, ok := c.Groups[arg[1]]; ok {
cs = append(cs, v)
delete(c.Index, arg[1])
delete(c.Groups, arg[1])
log.Println(c.Name, "del context:", arg[1])
}
for i := 0; i < len(cs); i++ {
for k, v := range cs[i].Groups {
cs = append(cs, v)
delete(c.Index, k)
log.Println(c.Name, "del context:", k)
}
}
case "command":
if len(arg) != 3 {
panic(errors.New("参数错误"))
}
if v, ok := c.Groups[arg[1]]; ok {
cs = append(cs, v)
delete(v.Commands, arg[2])
log.Println(v.Name, "del command:", arg[2])
}
for i := 0; i < len(cs); i++ {
for _, v := range cs[i].Groups {
cs = append(cs, v)
delete(v.Commands, arg[2])
log.Println(v.Name, "del command:", arg[2])
}
}
case "config":
if len(arg) != 3 {
panic(errors.New("参数错误"))
}
if v, ok := c.Groups[arg[1]]; ok {
cs = append(cs, v)
delete(v.Configs, arg[2])
log.Println(v.Name, "del config:", arg[2])
}
for i := 0; i < len(cs); i++ {
for _, v := range cs[i].Groups {
cs = append(cs, v)
delete(v.Configs, arg[2])
log.Println(v.Name, "del config:", arg[2])
}
}
case "cache":
if len(arg) != 3 {
panic(errors.New("参数错误"))
}
if v, ok := c.Groups[arg[1]]; ok {
cs = append(cs, v)
delete(v.Caches, arg[2])
log.Println(v.Name, "del cache:", arg[2])
}
for i := 0; i < len(cs); i++ {
for _, v := range cs[i].Groups {
cs = append(cs, v)
delete(v.Caches, arg[2])
log.Println(v.Name, "del cache:", arg[2])
}
}
}
}
// }}}
type Message struct {
time time.Time
code int
@ -1540,43 +1366,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
"key": &Config{Name: "私钥文件", Value: "etc/key.pem", Help: "私钥文件"},
},
Commands: map[string]*Command{
"userinfo": &Command{Name: "userinfo [add|del [context key name help]|[command|config|cache group name]]", Help: "查看模块的用户信息",
Formats: map[string]int{"add": -1, "del": -1},
Hand: func(m *Message, c *Context, key string, arg ...string) {
switch { // {{{
case m.Has("add"):
m.target.Add(m.source.Group, m.Meta["add"]...)
case m.Has("del"):
m.target.Del(m.Meta["del"]...)
default:
target := m.target
m.target = target.Owner
if m.target != nil && m.Check(m.target) {
m.Echo("%s %s\n", m.Cap("username"), m.Cap("group"))
}
m.target = target
if len(m.Meta["args"]) > 0 {
if g, ok := m.target.Index[m.Get("args")]; ok {
for k, _ := range g.Commands {
m.Echo("cmd: %s\n", k)
}
for k, _ := range g.Configs {
m.Echo("cfg: %s\n", k)
}
for k, _ := range g.Caches {
m.Echo("cap: %s\n", k)
}
}
} else {
for k, v := range m.target.Index {
m.Echo("%s", k)
m.Echo(": %s %s\n", v.Name, v.Help)
}
}
}
// }}}
}},
"server": &Command{Name: "server [start|exit|switch][args]", Help: "服务启动停止切换", Hand: func(m *Message, c *Context, key string, arg ...string) {
switch len(arg) { // {{{
case 0:
@ -1685,40 +1474,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
// }}}
}},
"detail": &Command{Name: "detail index val...", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
msg := m.Spawn(m.Target()) // {{{
msg.Detail(1, "nie", 1, []string{"123", "123"}, true, []bool{false, true}, []int{1, 2, 2})
m.Echo("%v", msg.Meta)
msg.Detail(2, "nie")
m.Echo("%v", msg.Meta)
// }}}
}},
"option": &Command{Name: "option key val...", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
if len(arg) > 0 { // {{{
m.Option(arg[0], arg[1:])
} else {
for msg := m; msg != nil; msg = msg.message {
m.Echo("%d %s:%s->%s %v\n", msg.code, msg.time.Format("15:03:04"), msg.source.Name, msg.target.Name, msg.Meta["detail"])
for _, k := range msg.Meta["option"] {
m.Echo("%s: %v\n", k, msg.Meta[k])
}
}
} // }}}
}},
"append": &Command{Name: "append key val...", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
if len(arg) > 0 { // {{{
m.Append(arg[0], arg[1:])
} else {
for msg := m; msg != nil; msg = msg.message {
m.Echo("%d %s:%s->%s %v\n", msg.code, msg.time.Format("15:03:04"), msg.source.Name, msg.target.Name, msg.Meta["result"])
for _, k := range msg.Meta["append"] {
m.Echo("%s: %v\n", k, msg.Meta[k])
}
}
} // }}}
}},
"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},
Hand: func(m *Message, c *Context, key string, arg ...string) {
@ -2036,6 +1791,113 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
}
// }}}
}},
"group": &Command{
Name: "group current [add|del group [cache|config|command item]]",
Help: "用户组管理,查看、添加、删除用户组或是接口",
Formats: map[string]int{"add": 0, "del": 0, "cache": 0, "config": 0, "command": 0},
Hand: func(m *Message, c *Context, key string, arg ...string) {
index := m.Target().Index // {{{
current := m.Target()
if len(arg) > 0 && arg[0] != "root" {
current = index[arg[0]]
if current == nil {
return
}
}
group := current
if len(arg) > 1 {
group = current.Index[arg[1]]
}
item := ""
if len(arg) > 2 {
item = arg[2]
}
switch {
case m.Has("add"):
if group == nil {
if _, ok := index[arg[1]]; ok {
break
}
group = &Context{Name: arg[1]}
}
switch {
case m.Has("cache"):
if x, ok := current.Caches[item]; ok {
if group.Caches == nil {
group.Caches = map[string]*Cache{}
}
group.Caches[item] = x
}
case m.Has("config"):
if x, ok := current.Configs[item]; ok {
if group.Configs == nil {
group.Configs = map[string]*Config{}
}
group.Configs[item] = x
}
case m.Has("command"):
if x, ok := current.Commands[item]; ok {
if group.Commands == nil {
group.Commands = map[string]*Command{}
}
group.Commands[item] = x
}
}
if current.Index == nil {
current.Index = map[string]*Context{}
}
current.Index[arg[1]] = group
index[arg[1]] = group
case m.Has("del"):
if group == nil {
break
}
gs := []*Context{group}
for i := 0; i < len(gs); i++ {
for _, g := range gs[i].Index {
gs = append(gs, g)
}
switch {
case m.Has("cache"):
delete(gs[i].Caches, item)
case m.Has("config"):
delete(gs[i].Configs, item)
case m.Has("command"):
delete(gs[i].Commands, item)
default:
delete(index, gs[i].Name)
delete(current.Index, gs[i].Name)
}
}
default:
m.Echo("%s:caches\n", current.Name)
for k, c := range current.Caches {
m.Echo(" %s: %s\n", k, c.Value)
}
m.Echo("%s:configs\n", current.Name)
for k, c := range current.Configs {
m.Echo(" %s: %s\n", k, c.Value)
}
m.Echo("%s:commands\n", current.Name)
for k, c := range current.Commands {
m.Echo(" %s: %s\n", k, c.Name)
}
m.Echo("%s:contexts\n", current.Name)
for k, c := range current.Index {
m.Echo(" %s: %s\n", k, c.Name)
}
} // }}}
}},
"pulse": &Command{Name: "arg name", Help: "查看日志", Hand: func(m *Message, c *Context, key string, arg ...string) {
p := m.Target().Pulse
m.Echo("%d\n", p.code)