From 39bb3e0583e421ca552b69e3ca69a9f4ebdbb6ac Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 6 Aug 2018 09:37:57 +0800 Subject: [PATCH] mac opt ctx.right --- etc/init.shy | 2 +- src/contexts/aaa/aaa.go | 1 + src/contexts/cli/cli.go | 18 +- src/contexts/ctx.go | 379 +++++++++++++++------------------------- src/contexts/web/web.go | 63 +++---- 5 files changed, 191 insertions(+), 272 deletions(-) diff --git a/etc/init.shy b/etc/init.shy index 6f02bb0d..1d159939 100644 --- a/etc/init.shy +++ b/etc/init.shy @@ -1,4 +1,4 @@ -return +login root root source etc/local.shy diff --git a/src/contexts/aaa/aaa.go b/src/contexts/aaa/aaa.go index 86a3db4e..ebd7cb0b 100644 --- a/src/contexts/aaa/aaa.go +++ b/src/contexts/aaa/aaa.go @@ -214,6 +214,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", if int64(msg.Capi("expire")) > time.Now().Unix() { m.Echo(msg.Cap("username")) m.Copy(msg, "target") + m.Sess("aaa", msg) } else { delete(aaa.sessions, arg[0]) msg.Target().Close(msg) diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index e37d6b55..d66b86f4 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -211,12 +211,15 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", Name: "source filename [async [cli_name [cli_help]]", Help: "解析脚本, filename: 文件名, async: 异步执行, cli_name: 模块名, cli_help: 模块帮助", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - if _, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ - m.Start(m.Confx("cli_name", arg, 2), m.Confx("cli_help", arg, 3), key, arg[0]) - if len(arg) < 2 || arg[1] != "async" { - m.Wait() - } - } // }}} + if _, ok := m.Source().Server.(*CLI); ok { + msg := m.Spawn(c) + m.Copy(msg, "target") + } + + m.Start(m.Confx("cli_name", arg, 2), m.Confx("cli_help", arg, 3), key, arg[0]) + if len(arg) < 2 || arg[1] != "async" { + m.Wait() + } }}, "label": &ctx.Command{Name: "label name", Help: "记录当前脚本的位置, name: 位置名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ @@ -766,6 +769,9 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", m.Log("fuck", strings.Repeat("\n", 20)) }}, }, + Index: map[string]*ctx.Context{ + "void": &ctx.Context{Caches: map[string]*ctx.Cache{"nshell": &ctx.Cache{}}}, + }, } func init() { diff --git a/src/contexts/ctx.go b/src/contexts/ctx.go index 01f94e6c..24072096 100644 --- a/src/contexts/ctx.go +++ b/src/contexts/ctx.go @@ -2673,279 +2673,188 @@ var Index = &Context{Name: "ctx", Help: "模块中心", "right": &Command{ Name: "right [share|add|del group [cache|config|command item]]", Help: "用户组管理,查看、添加、删除用户组或是接口", - Form: map[string]int{"check": 0, "add": 0, "del": 0, "brow": 0, "cache": 0, "config": 0, "command": 0}, Hand: func(m *Message, c *Context, key string, arg ...string) { - index := m.target.Index + index := m.target.Index // {{{ if index == nil { - m.target.Index = map[string]*Context{} - index = m.target.Index + index = map[string]*Context{} + m.target.Index = index } - current := m.target + owner := m.target aaa := m.Sess("aaa", false) if aaa.Cap("username") != aaa.Conf("rootname") { - current = index[aaa.Cap("username")] + owner = index[aaa.Cap("username")] + m.Assert(owner != nil) + } + + share := owner + if len(arg) > 0 { + if owner.Index == nil { + owner.Index = map[string]*Context{} + } + if s, ok := owner.Index[arg[0]]; ok { + share = s + } else { + share = &Context{Name: arg[0], context: owner} + if _, ok = index[arg[0]]; m.Assert(!ok) { + owner.Index[arg[0]] = share + index[arg[0]] = share + } + } + arg = arg[1:] } - m.Echo("username:%s\n", aaa.Cap("username")) if len(arg) == 0 { - if current != nil { - for k, x := range current.Caches { - m.Add("append", "ccc", "cache") - m.Add("append", "key", k) - m.Add("append", "name", x.Name) - } - for k, x := range current.Configs { - m.Add("append", "ccc", "config") - m.Add("append", "key", k) - m.Add("append", "name", x.Name) - } - for k, x := range current.Commands { - m.Add("append", "ccc", "command") - m.Add("append", "key", k) - m.Add("append", "name", x.Name) - } - for k, x := range current.Index { - m.Add("append", "ccc", "context") - m.Add("append", "key", k) - m.Add("append", "name", x.Name) - } - m.Table() + for k, x := range share.Caches { + m.Add("append", "ccc", "cache") + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + m.Add("append", "arg", "") + m.Add("append", "value", "") } + for k, x := range share.Configs { + m.Add("append", "ccc", "config") + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + m.Add("append", "arg", "") + m.Add("append", "value", "") + } + for k, x := range share.Commands { + m.Add("append", "ccc", "command") + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + + m.Add("append", "arg", "") + m.Add("append", "value", "") + for a, val := range x.Shares { + for _, v := range val { + m.Add("append", "ccc", "command") + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + + m.Add("append", "arg", a) + m.Add("append", "value", v) + } + } + } + for k, x := range share.Index { + m.Add("append", "ccc", "context") + m.Add("append", "key", k) + m.Add("append", "name", x.Name) + m.Add("append", "arg", x.context.Name) + m.Add("append", "value", "") + } + m.Table() return } - void := index["void"] - switch arg[0] { - case "show": - case "add": - case "del": - } - return - // {{{ - - if aaa != nil && aaa.Cap("username") != aaa.Conf("rootname") { - if current = index[aaa.Cap("username")]; current == nil { - if void != nil { - m.Echo("%s:caches\n", void.Name) - for k, c := range void.Caches { - m.Echo(" %s: %s\n", k, c.Value) - } - m.Echo("%s:configs\n", void.Name) - for k, c := range void.Configs { - m.Echo(" %s: %s\n", k, c.Value) - } - m.Echo("%s:commands\n", void.Name) - for k, c := range void.Commands { - m.Echo(" %s: %s\n", k, c.Name) - } - m.Echo("%s:contexts\n", void.Name) - for k, c := range void.Index { - m.Echo(" %s: %s\n", k, c.Name) - } - } - return + case "check": + if len(arg) == 1 { + m.Echo("ok") + break } - } - - group := current - if len(arg) > 0 { - group = current.Index[arg[0]] - } - - item := "" - if len(arg) > 1 { - item = arg[1] - } - - switch { - case m.Has("check"): - if group != nil { - switch { - case m.Has("cache"): - if _, ok := group.Caches[item]; ok { + switch arg[1] { + case "cache": + if _, ok := share.Caches[arg[2]]; ok { + m.Echo("ok") + return + } + case "config": + if _, ok := share.Configs[arg[2]]; ok { + m.Echo("ok") + return + } + case "command": + if x, ok := share.Commands[arg[2]]; ok { + if len(arg) == 3 { m.Echo("ok") - return + break } - case m.Has("config"): - if _, ok := group.Configs[item]; ok { - m.Echo("ok") - return - } - case m.Has("command"): - - if len(arg) > 1 { - if _, ok := group.Commands[item]; !ok { - m.Echo("no") - return - } - } - if len(arg) > 2 { - if _, ok := group.Commands[item].Shares[arg[2]]; !ok { - m.Echo("no") - return - } - } - if len(arg) > 3 { - for _, v := range group.Commands[item].Shares[arg[2]] { - match, e := regexp.MatchString(v, arg[3]) - m.Assert(e) - if match { - m.Echo("ok") + for i := 3; i < len(arg)-1; i += 2 { + if len(x.Shares[arg[i]]) > 0 { + match := false + for _, v := range x.Shares[arg[i]] { + ma, e := regexp.MatchString(v, arg[i+1]) + m.Assert(e) + if ma { + match = ma + break + } + } + if !match { + m.Echo("no") return } } - m.Echo("no") - return } m.Echo("ok") - return - default: - m.Echo("ok") - return } } - m.Echo("no") - return - case m.Has("add"): - if group == nil { - if _, ok := index[arg[0]]; ok { - break + case "add": + switch arg[1] { + case "cache": + if x, ok := owner.Caches[arg[2]]; ok { + if share.Caches == nil { + share.Caches = map[string]*Cache{} + } + share.Caches[arg[2]] = x + m.Log("info", "%s.cache(%s)->%s", owner.Name, arg[2], share.Name) } - group = &Context{Name: arg[0]} - } - - switch { - case m.Has("cache"): - if x, ok := current.Caches[item]; ok { - if group.Caches == nil { - group.Caches = map[string]*Cache{} + case "config": + if x, ok := owner.Configs[arg[2]]; ok { + if share.Configs == nil { + share.Configs = map[string]*Config{} } - group.Caches[item] = x + share.Configs[arg[2]] = x } - case m.Has("config"): - if x, ok := current.Configs[item]; ok { - if group.Configs == nil { - group.Configs = map[string]*Config{} + m.Log("info", "%s.config(%s)->%s", owner.Name, arg[2], share.Name) + case "command": + if _, ok := owner.Commands[arg[2]]; ok { + if share.Commands == nil { + share.Commands = map[string]*Command{} } - group.Configs[item] = x - } - case m.Has("command"): - if _, ok := current.Commands[item]; ok { - if group.Commands == nil { - group.Commands = map[string]*Command{} + if _, ok := share.Commands[arg[2]]; !ok { + share.Commands[arg[2]] = &Command{Shares: map[string][]string{}} } - - command, ok := group.Commands[item] - if !ok { - command = &Command{Shares: map[string][]string{}} - group.Commands[item] = command + m.Log("info", "%s.command(%s)->%s", owner.Name, arg[2], share.Name) + for i := 3; i < len(arg)-1; i += 2 { + m.Log("info", "%s.command(%s, %s, %s)->%s", owner.Name, arg[2], arg[i], arg[i+1], share.Name) + share.Commands[arg[2]].Shares[arg[i]] = append(share.Commands[arg[2]].Shares[arg[i]], arg[i+1]) } - - for i := 2; i < len(arg)-1; i += 2 { - command.Shares[arg[i]] = append(command.Shares[arg[i]], arg[i+1]) - } - - // group.Commands[item] = x } } - - if current.Index == nil { - current.Index = map[string]*Context{} - } - current.Index[arg[0]] = group - index[arg[0]] = 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) + case "del": + switch arg[1] { + case "cache": + cs := []*Context{share} + for i := 0; i < len(cs); i++ { + for _, x := range cs[i].Index { + cs = append(cs, x) + } + delete(cs[i].Caches, arg[2]) } - - switch { - case m.Has("cache"): - delete(gs[i].Caches, item) - case m.Has("config"): - delete(gs[i].Configs, item) - case m.Has("command"): - if gs[i].Commands == nil { - break + case "config": + cs := []*Context{share} + for i := 0; i < len(cs); i++ { + for _, x := range cs[i].Index { + cs = append(cs, x) } - if len(arg) == 2 { - delete(gs[i].Commands, item) - break - } - - if gs[i].Commands[item] == nil { - break - } - shares := gs[i].Commands[item].Shares - if shares == nil { - break + delete(cs[i].Configs, arg[2]) + } + case "command": + cs := []*Context{share} + for i := 0; i < len(cs); i++ { + for _, x := range cs[i].Index { + cs = append(cs, x) } if len(arg) == 3 { - delete(shares, arg[2]) - break + delete(cs[i].Commands, arg[2]) + } else if len(arg) == 4 { + delete(cs[i].Commands[arg[2]].Shares, arg[3]) } + } - for i := 0; i < len(shares[arg[2]]); i++ { - if shares[arg[2]][i] == arg[3] { - for ; i < len(shares[arg[2]])-1; i++ { - shares[arg[2]][i] = shares[arg[2]][i+1] - } - shares[arg[2]] = shares[arg[2]][:i] - } - } - gs[i].Commands[item].Shares = shares - - default: - delete(index, gs[i].Name) - delete(current.Index, gs[i].Name) - } - } - - default: - m.Echo("%s:caches\n", group.Name) - if void != nil { - for k, c := range void.Caches { - m.Echo(" %s: %s\n", k, c.Value) - } - } - for k, c := range group.Caches { - m.Echo(" %s: %s\n", k, c.Value) - } - m.Echo("%s:configs\n", group.Name) - if void != nil { - for k, c := range void.Configs { - m.Echo(" %s: %s\n", k, c.Value) - } - } - for k, c := range group.Configs { - m.Echo(" %s: %s\n", k, c.Value) - } - m.Echo("%s:commands\n", group.Name) - if void != nil { - for k, c := range void.Commands { - m.Echo(" %s: %s\n", k, c.Name) - } - } - for k, c := range group.Commands { - m.Echo(" %s: %s %v\n", k, c.Name, c.Shares) - } - m.Echo("%s:contexts\n", group.Name) - if void != nil { - for k, c := range void.Index { - m.Echo(" %s: %s\n", k, c.Name) - } - } - for k, c := range group.Index { - m.Echo(" %s: %s\n", k, c.Name) } } // }}} }}, diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 49f592c3..051fb780 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -643,42 +643,46 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", if !m.Options("dir") { m.Option("dir", m.Cap("directory")) } + + check := m.Spawn().Cmd("/share", "/upload", "dir", m.Option("dir")) + if !check.Results(0) { + m.Copy(check, "append") + return + } + aaa := check.Appendv("aaa").(*ctx.Message) + // 输出文件 s, e := os.Stat(m.Option("dir")) if m.Assert(e); !s.IsDir() { http.ServeFile(w, r, m.Option("dir")) return } - - if false { - - check := m.Spawn().Cmd("/share", "/upload", "dir", m.Option("dir")) - if !check.Results(0) { - m.Copy(check, "append") - return - } - aaa := check.Appendv("aaa").(*ctx.Message) - - // 共享列表 - share := m.Sess("share", m.Target()) - index := share.Target().Index - if index != nil && index[aaa.Append("username")] != nil { - for k, v := range index[aaa.Append("username")].Index { - for _, j := range v.Commands { - for _, n := range j.Shares { - for _, nn := range n { - if match, e := regexp.MatchString(nn, m.Option("dir")); m.Assert(e) && match { - share.Add("append", "group", k) - share.Add("append", "value", nn) - share.Add("append", "delete", "delete") - } + // 共享列表 + share := m.Sess("share", m.Target()) + index := share.Target().Index + m.Log("fuck", "%v", share.Target().Index) + m.Log("fuck", "%v", aaa.Format()) + if index != nil && index[aaa.Cap("username")] != nil { + for k, v := range index[aaa.Cap("username")].Index { + m.Log("fuck", "%v", v.Commands) + for _, j := range v.Commands { + m.Log("fuck", "%v", j.Shares) + for _, n := range j.Shares { + for _, nn := range n { + if match, e := regexp.MatchString(nn, m.Option("dir")); m.Assert(e) && match { + share.Add("append", "group", k) + share.Add("append", "value", nn) + share.Add("append", "delete", "delete") } } } } } - share.Sort("value", "string") - share.Sort("argument", "string") + } + share.Sort("value", "string") + share.Sort("argument", "string") + + if false { } // 输出目录 @@ -751,8 +755,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", } m.Append("title", "upload") - // m.Append("tmpl", "userinfo", "share", "list", "git", "upload", "create") - m.Append("tmpl", "list", "git", "upload", "create") + m.Append("tmpl", "userinfo", "share", "list", "git", "upload", "create") m.Append("template", m.Conf("upload_main"), m.Conf("upload_tmpl")) // }}} }}, @@ -813,10 +816,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", msg := check.Appendv("aaa").(*ctx.Message).Spawn(m.Target()) if m.Options("shareto") { - msg.Cmd("right", "add", m.Option("shareto"), "command", arg[0], arg[1], arg[2]) + msg.Cmd("right", m.Option("shareto"), "add", "command", arg[0], arg[1], arg[2]) } if m.Options("notshareto") { - msg.Cmd("right", "del", m.Option("notshareto"), "command", arg[0], arg[1], arg[2]) + msg.Cmd("right", m.Option("notshareto"), "del", "command", arg[0], arg[1], arg[2]) } m.Echo("ok") // }}} @@ -825,7 +828,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", w := m.Optionv("response").(http.ResponseWriter) //{{{ if login := m.Spawn().Cmd("/login"); login.Has("redirect") { aaa := m.Appendv("aaa").(*ctx.Message) - if msg := m.Spawn().Cmd("right", "check", aaa.Cap("username"), arg); msg.Results(0) { + if msg := m.Spawn().Cmd("right", aaa.Cap("username"), "check", arg); msg.Results(0) { m.Copy(login, "append").Echo(msg.Result(0)) return }