From ac2a42a6fd514295bf03871abdcbceb903390102 Mon Sep 17 00:00:00 2001 From: shaoying Date: Sat, 21 Sep 2019 18:05:03 +0800 Subject: [PATCH] add aaa.short --- etc/common.shy | 6 +++++ etc/dotsfile/shy.vim | 2 +- etc/exit.shy | 1 + etc/init.shy | 8 +++---- src/contexts/aaa/aaa.go | 37 ++++++++++++++++++++++++++-- src/contexts/cli/version.go | 2 +- src/contexts/ctx/misc.go | 7 ++++++ src/contexts/ssh/ssh.go | 29 ++++++++++++++-------- src/contexts/yac/yac.go | 17 +++++++------ src/examples/chat/chat.go | 48 +++++++++++++++++++++++-------------- src/plugin/love/index.shy | 12 ++++------ src/toolkit/misc.go | 48 ++++++++++++++++++++++++++++++++++--- usr/librarys/context.js | 26 ++++++++++++++++++++ usr/librarys/example.js | 11 +++++++++ 14 files changed, 200 insertions(+), 54 deletions(-) diff --git a/etc/common.shy b/etc/common.shy index 029decdd..5825dd4e 100644 --- a/etc/common.shy +++ b/etc/common.shy @@ -1,2 +1,8 @@ +~cli + upgrade plugin context + upgrade plugin storage + upgrade plugin love + ~aaa role root user shy shaoying + diff --git a/etc/dotsfile/shy.vim b/etc/dotsfile/shy.vim index 921ceef1..b0816b9d 100644 --- a/etc/dotsfile/shy.vim +++ b/etc/dotsfile/shy.vim @@ -46,7 +46,7 @@ call Keys("Statment", ["var", "let"]) call Keys("Statment", ["if", "else", "else if", "for", "end"]) call Keys("Statment", ["label", "goto"]) " context nfs -call Keys("SubCommand", ["import", "export", "load", "save"]) +" call Keys("SubCommand", ["import", "export", "load", "save"]) " context ctx call Keys("Argument", ["list", "map"]) diff --git a/etc/exit.shy b/etc/exit.shy index f88bbb98..814f280f 100644 --- a/etc/exit.shy +++ b/etc/exit.shy @@ -3,6 +3,7 @@ config save var/data/work.json work ~aaa config save var/tmp/auth.json auth + config save var/tmp/short.json short ~cli config save var/tmp/runtime.json runtime diff --git a/etc/init.shy b/etc/init.shy index 960d8654..cfebef44 100644 --- a/etc/init.shy +++ b/etc/init.shy @@ -1,7 +1,8 @@ ~cli - config load tmp/runtime.json runtime + config load var/tmp/runtime.json runtime ~aaa - config load tmp/auth.json auth + config load var/tmp/short.json short + config load var/tmp/auth.json auth ~ssh config load var/data/work.json work config load var/data/flow.json flow @@ -14,5 +15,4 @@ source local.shy ~cli - upgrade plugin context - upgrade plugin love + diff --git a/src/contexts/aaa/aaa.go b/src/contexts/aaa/aaa.go index 25801a4e..6bcaf5cb 100644 --- a/src/contexts/aaa/aaa.go +++ b/src/contexts/aaa/aaa.go @@ -2,6 +2,7 @@ package aaa import ( "gopkg.in/gomail.v2" + "strconv" "contexts/ctx" "toolkit" @@ -101,6 +102,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", "secrete": map[string]interface{}{"password": true, "token": true, "uuid": true, "ppid": true}, }, Help: "散列"}, + "short": &ctx.Config{Name: "short", Value: map[string]interface{}{}, Help: "散列"}, "email": &ctx.Config{Name: "email", Value: map[string]interface{}{ "self": "shylinux@163.com", "smtp": "smtp.163.com", "port": "25", }, Help: "邮件服务"}, @@ -602,7 +604,38 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", } return }}, + "short": &ctx.Command{Name: "short", Help: "短码", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + // cc2309e0cb95ab3cabced1b3e7141105 + if len(arg) == 0 { + return + } + length := 6 + short := arg[0][:length] + if len(arg[0]) == 32 { + m.Confm("aaa.short", short, func(index int, value string) { + if value == arg[0] { + m.Echo("%s%02x", short, index) + } + }) + if m.Result() != "" { + return + } + + m.Confv("aaa.short", []string{short, "-2"}, arg[0]) + if v, ok := m.Confv("aaa.short", short).([]interface{}); ok { + m.Echo("%s%02x", short, len(v)-1) + } + + } else { + if i, e := strconv.ParseInt(arg[0][length:], 16, 64); e == nil { + m.Echo(m.Conf("aaa.short", []interface{}{short, int(i)})) + } else { + m.Echo(arg[0]) + } + } + return + }}, "relay": &ctx.Command{Name: "relay [rid] [check userrole]|[count num]|[share [type [role [name [count]]]]]", Help: "授权", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { // 授权列表 if len(arg) == 0 { @@ -746,8 +779,8 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心", // 生成证书 template := x509.Certificate{ - SerialNumber: big.NewInt(1), - IsCA: true, + SerialNumber: big.NewInt(1), + IsCA: true, BasicConstraintsValid: true, KeyUsage: x509.KeyUsageCertSign, Subject: pkix.Name{CommonName: kit.Format(common)}, diff --git a/src/contexts/cli/version.go b/src/contexts/cli/version.go index 6a14ba68..7c167a18 100644 --- a/src/contexts/cli/version.go +++ b/src/contexts/cli/version.go @@ -4,5 +4,5 @@ var version = struct { host string self int }{ - "2019-09-21 10:07:14", "com.mac", 573, + "2019-09-21 18:02:29", "mac", 621, } diff --git a/src/contexts/ctx/misc.go b/src/contexts/ctx/misc.go index 5a59f830..9c8fc244 100644 --- a/src/contexts/ctx/misc.go +++ b/src/contexts/ctx/misc.go @@ -202,6 +202,13 @@ func (m *Message) Format(arg ...interface{}) string { } return strings.Join(meta, " ") } +func (m *Message) Short(arg ...string) { + for _, k := range arg { + if v := m.Option(k); v != "" && len(v) != 32 { + m.Option(k, m.Cmdx("aaa.short", v)) + } + } +} func (m *Message) Err(str string, arg ...interface{}) { m.Echo("").Echo("error: ").Echo(str, arg...) } diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index 1ae93c00..c465521b 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -3,7 +3,6 @@ package ssh import ( "bufio" "contexts/ctx" - "encoding/json" "fmt" "os/exec" "sort" @@ -134,6 +133,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", }, }, Help: "组件列表"}, + "data": {Name: "data", Value: map[string]interface{}{"path": "var/data"}, Help: "聊天数据"}, "flow": {Name: "flow", Value: map[string]interface{}{}, Help: "聊天群组"}, "work": {Name: "work", Value: map[string]interface{}{}, Help: "工作信息"}, "node": {Name: "node", Value: map[string]interface{}{}, Help: "节点信息"}, @@ -467,8 +467,8 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", for _, v := range arg[1:] { data := m.Confm("flow", []string{m.Option("river"), "data", v}) - kit.Marshal(data["meta"], path.Join("var/data", m.Option("river"), v, "/meta.json")) - kit.Marshal(data["list"], path.Join("var/data", m.Option("river"), v, "/list.csv")) + kit.Marshal(data["meta"], path.Join(m.Conf("ssh.data", "path"), m.Option("river"), v, "/meta.json")) + kit.Marshal(data["list"], path.Join(m.Conf("ssh.data", "path"), m.Option("river"), v, "/list.csv")) l := len(data["list"].([]interface{})) m.Push("table", v).Push("count", l) @@ -536,23 +536,32 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Confv("flow", []string{m.Option("river"), "data", arg[1], "list", kit.Format(index), arg[i]}, arg[i+1]) } case "import": - msg := m.Cmd("nfs.import", arg[2:]) + if len(arg) < 3 { + m.Cmdy("ssh.data", "show", arg) + return + } + id := m.Confi("flow", []string{m.Option("river"), "data", arg[1], "meta", "count"}) - msg.Table(func(maps map[string]string) { + m.Cmd("nfs.import", arg[2:]).Table(func(maps map[string]string) { data := map[string]interface{}{} - extra := map[string]interface{}{} for k, v := range maps { m.Push(k, v) data[k] = v } - json.Unmarshal(([]byte)(maps["extra"]), &data) - data["extra"] = extra - id++ - data["id"] = id + if id++; id == 1 { + m.Cmd("ssh.data", "create", arg[1], data) + } + + data["id"] = id + data["extra"] = kit.UnMarshalm(maps["extra"]) m.Confv("flow", []string{m.Option("river"), "data", arg[1], "list", "-2"}, data) }) m.Confi("flow", []string{m.Option("river"), "data", arg[1], "meta", "count"}, id) + m.Cmd("ssh.data", "save", arg[1]) + case "export": + m.Append("directory", path.Join(m.Conf("ssh.data", "path"), m.Option("river"), arg[1], "/list.csv")) + m.Table() } return }}, diff --git a/src/contexts/yac/yac.go b/src/contexts/yac/yac.go index c76f4862..f14d4c7f 100644 --- a/src/contexts/yac/yac.go +++ b/src/contexts/yac/yac.go @@ -328,7 +328,8 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", // 命令语句 map[string]interface{}{"page": "word", "hash": "word", "word": []interface{}{"mul{", "~", "!", "\\?", "\\?\\?", "exe", "str", "[\\-a-zA-Z0-9_:/.%*]+", "=", "<", ">$", ">@", ">", "\\|", "}"}}, map[string]interface{}{"page": "cmd", "hash": "cmd", "word": []interface{}{"rep{", "word", "}"}}, - map[string]interface{}{"page": "com", "hash": "com", "word": []interface{}{"mul{", ";", "#[^\n]*\n?", "\n", "}"}}, + map[string]interface{}{"page": "com", "hash": "cmd", "word": []interface{}{"rep{", ";", "cmd", "}"}}, + map[string]interface{}{"page": "com", "hash": "com", "word": []interface{}{"mul{", "#[^\n]*\n?", "\n", "}"}}, map[string]interface{}{"page": "line", "hash": "line", "word": []interface{}{"opt{", "mul{", "stm", "cmd", "}", "}", "com"}}, // 复合语句 @@ -348,6 +349,7 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", map[string]interface{}{"page": "stm", "hash": "else", "word": []interface{}{"else", "opt{", "if", "exp", "}"}}, map[string]interface{}{"page": "stm", "hash": "end", "word": []interface{}{"end"}}, + // 标签语句 map[string]interface{}{"page": "stm", "hash": "label", "word": []interface{}{"label", "key"}}, map[string]interface{}{"page": "stm", "hash": "goto", "word": []interface{}{"goto", "key"}}, /* @@ -373,6 +375,7 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", "text": true, "select": true, "button": true, + "upfile": true, "textarea": true, "exports": true, "feature": true, @@ -1174,12 +1177,12 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", "init": init, "type": right, - "ctx": m.Cap("module"), - "cmd": cmd, - "args": args, - "inputs": inputs, - "exports": exports, - "feature": feature, + "ctx": m.Cap("module"), + "cmd": cmd, + "args": args, + "inputs": inputs, + "exports": exports, + "feature": feature, }) return }}, diff --git a/src/examples/chat/chat.go b/src/examples/chat/chat.go index 87266a9b..f80b658d 100644 --- a/src/examples/chat/chat.go +++ b/src/examples/chat/chat.go @@ -6,6 +6,24 @@ import ( "toolkit" ) +func check(m *ctx.Message, arg []string) ([]string, string, bool) { + if !m.Options("sessid") || !m.Options("username") { + return nil, "", false + } + + rid := m.Option("river") + if len(arg[0]) != 32 { + arg[0] = m.Cmdx("aaa.short", arg[0]) + } + if m.Confs("flow", arg[0]) { + rid, arg = arg[0], arg[1:] + } + if rid != "" && len(rid) != 32 { + rid = m.Cmdx("aaa.short", rid) + } + return arg, rid, true +} + var Index = &ctx.Context{Name: "chat", Help: "会议中心", Caches: map[string]*ctx.Cache{}, Configs: map[string]*ctx.Config{ @@ -98,7 +116,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", case "relay": relay := m.Cmdx("aaa.relay", "share", arg[1:]) m.Log("info", "relay: %s", relay) - m.Echo(relay) + m.Echo(m.Cmdx("aaa.short", relay)) return case "rename": m.Cmd("aaa.auth", "username", m.Option("username"), "data", "nickname", arg[1]) @@ -193,7 +211,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", return } - m.Push("key", key) + m.Push("key", m.Cmdx("aaa.short", key)) m.Push("nick", kit.Chains(value, "conf.nick")) m.Push("create_user", kit.Chains(value, "conf.create_user")) m.Push("create_time", kit.Chains(value, "conf.create_time")) @@ -214,9 +232,10 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", return } - rid := m.Option("river") - if m.Confs("flow", arg[0]) { - rid, arg = arg[0], arg[1:] + // 登录失败 + arg, rid, ok := check(m, arg) + if !ok { + return } switch arg[0] { @@ -279,15 +298,11 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", }}, "storm": &ctx.Command{Name: "storm [rid] [[delete] group [index [arg...]]]", Help: "风雨", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { // 登录失败 - if !m.Options("sessid") || !m.Options("username") { + arg, rid, ok := check(m, arg) + if !ok { return } - rid := m.Option("river") - if m.Confs("flow", arg[0]) { - rid, arg = arg[0], arg[1:] - } - // 命令列表 if len(arg) == 0 { m.Confm("flow", []string{rid, "tool"}, func(key string, value map[string]interface{}) { @@ -312,8 +327,9 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", m.Set("option", "init") m.Set("option", "view") if len(arg) == 1 { + short := m.Cmdx("aaa.short", rid) m.Confm("flow", []string{rid, "tool", arg[0], "list"}, func(index int, tool map[string]interface{}) { - m.Push("river", rid) + m.Push("river", short) m.Push("storm", arg[0]) m.Push("action", index) @@ -346,15 +362,11 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", }}, "steam": &ctx.Command{Name: "steam rid [user node]|[spawn name [route group index name]...]", Help: "天空", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { // 登录失败 - if !m.Options("sessid") || !m.Options("username") { + arg, rid, ok := check(m, arg) + if !ok { return } - rid := m.Option("river") - if m.Confs("flow", arg[0]) { - rid, arg = arg[0], arg[1:] - } - // 上传请求 if up := m.Conf("flow", []string{rid, "conf.route"}); up != m.Conf("runtime", "node.route") { m.Cmdy("ssh._remote", up, "context", "chat", "steam", rid, arg) diff --git a/src/plugin/love/index.shy b/src/plugin/love/index.shy index d1abdcfa..9c4e2c23 100644 --- a/src/plugin/love/index.shy +++ b/src/plugin/love/index.shy @@ -1,7 +1,3 @@ -kit imports "导入" "" "" private "ssh.data" "import" \ - text "love" name table \ - text "" name file \ - button "导入" fun meet "第一眼" private \ text "love" name table imports plugin_table \ @@ -11,9 +7,9 @@ fun meet "第一眼" private \ if $2 == "" || $3 == "" copy ssh.data show _ - return + else + copy ssh.data insert _ when _ where __ end - copy ssh.data insert _ when _ where __ end kit date "日历" "index.js" "index.css" protected "cli.date" _ nature _ \ @@ -34,8 +30,8 @@ fun delay "以后告诉你" private \ if $2 == "" || $3 == "" copy ssh.data show _ - return + else + copy ssh.data insert _ when _ what __ end - copy ssh.data insert _ when _ what __ end diff --git a/src/toolkit/misc.go b/src/toolkit/misc.go index b5c7624d..cb526cbe 100644 --- a/src/toolkit/misc.go +++ b/src/toolkit/misc.go @@ -1,9 +1,13 @@ package kit import ( + "bytes" + "crypto/md5" "encoding/csv" + "encoding/hex" "encoding/json" "fmt" + "io" "io/ioutil" "os" "path" @@ -64,15 +68,15 @@ func Split(str string, c byte, n int) []string { } func FmtSize(size int64) string { if size > 1<<30 { - return fmt.Sprintf("%d.%dG", size>>30, (size>>20)%1024*100/1024) + return fmt.Sprintf("%d.%dG", size>>30, (size>>20)%1024*100>>10) } if size > 1<<20 { - return fmt.Sprintf("%d.%dM", size>>20, (size>>10)%1024*100/1024) + return fmt.Sprintf("%d.%dM", size>>20, (size>>10)%1024*100>>10) } if size > 1<<10 { - return fmt.Sprintf("%d.%dK", size>>10, size%1024*100/1024) + return fmt.Sprintf("%d.%dK", size>>10, size%1024*100>>10) } return fmt.Sprintf("%dB", size) @@ -164,3 +168,41 @@ func IsLocalIP(ip string) bool { } return false } +func Hashx(f io.Reader) string { + md := md5.New() + io.Copy(md, f) + h := md.Sum(nil) + return hex.EncodeToString(h[:]) +} +func Lines(p string, args ...interface{}) []string { + b, e := ioutil.ReadFile(p) + if e != nil { + return nil + } + bs := bytes.Split(b, []byte("\n")) + + res := make([]string, 0, len(bs)) + for _, v := range bs { + if len(args) > 0 { + switch arg := args[0].(type) { + case func(string) string: + res = append(res, arg(string(v))) + continue + case func(string): + arg(string(v)) + } + } + res = append(res, string(v)) + } + return res +} +func Linex(p string) map[string]string { + meta := map[string]string{} + Lines(p, func(value string) { + if strings.Contains(value, ":") { + bs := strings.SplitN(value, ":", 2) + meta[strings.TrimSpace(bs[0])] = strings.TrimSpace(bs[1]) + } + }) + return meta +} diff --git a/usr/librarys/context.js b/usr/librarys/context.js index a7dfd07e..39f0a059 100644 --- a/usr/librarys/context.js +++ b/usr/librarys/context.js @@ -204,4 +204,30 @@ ctx = context = { xhr.setRequestHeader("Accept", "application/json") xhr.send(args.join("&")) }, + Upload: function(file, cb, detail) { + var data = new FormData() + data.append("upload", file) + + var xhr = new XMLHttpRequest() + xhr.onload = function(event) { + var msg = JSON.parse(xhr.responseText||'{"result":[]}') + typeof cb == "function" && cb(event, msg) + } + + xhr.onreadystatechange = function() { + if (xhr.readyState != 4) { + return + } + if (xhr.status != 200) { + return + } + } + + xhr.upload.onprogress = function(event) { + typeof detail == "function" && detail(event) + } + + xhr.open("POST", "/upload", true) + xhr.send(data) + }, } diff --git a/usr/librarys/example.js b/usr/librarys/example.js index cbf3095e..7f8bc767 100644 --- a/usr/librarys/example.js +++ b/usr/librarys/example.js @@ -723,6 +723,9 @@ function Plugin(page, pane, field, runs) { name = item.name || "input" var input = {type: "input", name: name, data: item} switch (item.type) { + case "upfile": + item.type = "file" + break case "select": kit.classList.add(item, "args") input.type = "select", input.list = item.values.map(function(value) { @@ -868,6 +871,14 @@ function Plugin(page, pane, field, runs) { plugin.show_after(plugin.msg) }, show_after: function(msg) {}, + upload: function(event) { + ctx.Upload(option.upload.files[0], function(event, msg) { + kit.OrderTable(kit.AppendTable(kit.AppendChilds(output, "table"), ctx.Table(msg), msg.append)) + page.ontoast("上传成功") + }, function(event) { + page.ontoast(), page.ontoast("上传进度 "+parseInt(event.loaded*100/event.total)+"%") + }) + }, ondaemon: { inner: function(msg, cb) { output.style.maxWidth = pane.target.clientWidth-20+"px"