1
0
forked from x/ContextOS

add aaa.short

This commit is contained in:
shaoying 2019-09-21 18:05:03 +08:00
parent 22274aed00
commit ac2a42a6fd
14 changed files with 200 additions and 54 deletions

View File

@ -1,2 +1,8 @@
~cli
upgrade plugin context
upgrade plugin storage
upgrade plugin love
~aaa
role root user shy shaoying

View File

@ -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"])

View File

@ -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

View File

@ -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

View File

@ -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)},

View File

@ -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,
}

View File

@ -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...)
}

View File

@ -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
}},

View File

@ -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
}},

View File

@ -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)

View File

@ -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

View File

@ -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
}

View File

@ -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)
},
}

View File

@ -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"