1
0
forked from x/ContextOS
This commit is contained in:
shaoying 2018-09-28 10:51:55 +08:00
parent 89a8668715
commit 29430ae745
2 changed files with 172 additions and 31 deletions

View File

@ -2841,7 +2841,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
} else { } else {
m.Add("append", "context", "") m.Add("append", "context", "")
} }
if msg.target.Message != nil { if msg.target.message != nil {
m.Add("append", "message", msg.target.message.code) m.Add("append", "message", msg.target.message.code)
} else { } else {
m.Add("append", "message", "") m.Add("append", "message", "")
@ -2902,7 +2902,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
"command": &Command{ "command": &Command{
Name: "command [all|add cmd arg...|list [begin [end]]|test [begin [end]]|delete cmd]", Name: "command [all|add cmd arg...|list [begin [end]]|test [begin [end]]|delete cmd]",
Help: "查看或修改命令", Help: "查看或修改命令",
Form: map[string]int{"list_name": 1, "list_help": 1, "condition": -1}, Form: map[string]int{"list_name": 1, "list_help": 1, "list_cache": 2, "list_index": 1, "condition": -1},
Hand: func(m *Message, c *Context, key string, arg ...string) { Hand: func(m *Message, c *Context, key string, arg ...string) {
if len(arg) == 0 { // {{{ if len(arg) == 0 { // {{{
keys := []string{} keys := []string{}
@ -2944,11 +2944,36 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
if m.target.Commands == nil { if m.target.Commands == nil {
m.target.Commands = map[string]*Command{} m.target.Commands = map[string]*Command{}
} }
cache_name := ""
cache_index := ""
if m.Has("list_cache") {
cache_name = m.Meta["list_cache"][0]
cache_index = m.Meta["list_cache"][1]
m.Cap(cache_name, cache_name, "", cache_index)
}
list_index := 0
if m.Has("list_index") {
if m.Option("list_index") == "_" {
list_index = -1
} else {
list_index = m.Optioni("list_index")
}
}
m.target.Commands[m.Cap("list_count")] = &Command{ m.target.Commands[m.Cap("list_count")] = &Command{
Name: strings.Join(arg[1:], " "), Name: strings.Join(arg[1:], " "),
Help: m.Confx("list_help"), Help: m.Confx("list_help"),
Hand: func(m *Message, c *Context, key string, args ...string) { Hand: func(m *Message, c *Context, key string, args ...string) {
m.Log("fcuK", "wat %v %v", args, list_index)
li := list_index
if li == -1 {
if len(args) > 0 {
if i, e := strconv.Atoi(args[0]); e == nil {
li, args = i, args[1:]
}
}
}
list := []string{} list := []string{}
j := 0 j := 0
for i := 1; i < len(arg); i++ { for i := 1; i < len(arg); i++ {
@ -2962,7 +2987,16 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
list = append(list, args[j:]...) list = append(list, args[j:]...)
msg := m.Spawn().Cmd(list) msg := m.Spawn().Cmd(list)
if len(msg.Meta["append"]) > 0 {
for i, _ := range msg.Meta[msg.Meta["append"][0]] {
m.Add("append", "index", i)
}
}
if cache_name != "" && li > -1 {
m.Echo(m.Cap(cache_name, msg.Meta[cache_index][li]))
} else {
m.Copy(msg, "result").Copy(msg, "append") m.Copy(msg, "result").Copy(msg, "append")
}
}, },
} }
@ -2995,7 +3029,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
} }
for i := begin; i < end; i++ { for i := begin; i < end; i++ {
if c, ok := m.target.Commands[fmt.Sprintf("%d", i)]; ok { if c, ok := m.target.Commands[fmt.Sprintf("%d", i)]; ok {
m.Echo("%d(%s): %s\n", i, c.Help, c.Name) m.Echo("%d(%s): %s\n", i, c.Help, strings.Replace(c.Name, "\n", " ", -1))
} }
} }
return return
@ -3461,6 +3495,21 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
} }
} // }}} } // }}}
}}, }},
"format": &Command{
Name: "format",
Help: "format",
Hand: func(m *Message, c *Context, key string, arg ...string) {
values := []interface{}{}
for _, v := range arg[1:] {
if v[0] == '$' {
values = append(values, m.Cap(v[1:]))
} else {
values = append(values, v)
}
}
m.Echo(arg[0], values...)
m.Append("format", m.Result(0))
}},
}, },
} }

View File

@ -329,6 +329,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
"cert": &ctx.Config{Name: "cert", Value: "etc/cert.pem", Help: "路由数量"}, "cert": &ctx.Config{Name: "cert", Value: "etc/cert.pem", Help: "路由数量"},
"key": &ctx.Config{Name: "key", Value: "etc/key.pem", Help: "路由数量"}, "key": &ctx.Config{Name: "key", Value: "etc/key.pem", Help: "路由数量"},
"record": &ctx.Config{Name: "record", Value: map[string]interface{}{}, Help: "访问记录"}, "record": &ctx.Config{Name: "record", Value: map[string]interface{}{}, Help: "访问记录"},
"lark_msg": &ctx.Config{Name: "lark_msg", Value: []interface{}{}, Help: "聊天记录"},
"wiki_dir": &ctx.Config{Name: "wiki_dir", Value: "usr/wiki", Help: "路由数量"}, "wiki_dir": &ctx.Config{Name: "wiki_dir", Value: "usr/wiki", Help: "路由数量"},
"wiki_list_show": &ctx.Config{Name: "wiki_list_show", Value: map[string]interface{}{ "wiki_list_show": &ctx.Config{Name: "wiki_list_show", Value: map[string]interface{}{
"md": true, "md": true,
@ -587,13 +588,26 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
"get": &ctx.Command{ "get": &ctx.Command{
Name: "get [method GET|POST] [file name filename] url arg...", Name: "get [method GET|POST] [file name filename] url arg...",
Help: "访问服务, method: 请求方法, file: 发送文件, url: 请求地址, arg: 请求参数", Help: "访问服务, method: 请求方法, file: 发送文件, url: 请求地址, arg: 请求参数",
Form: map[string]int{"method": 1, "file": 2, "type": 1, "body": 1, "fields": 1}, Form: map[string]int{"method": 1, "headers": 2, "file": 2, "body_type": 1, "body": 1, "fields": 1, "value": 1, "json_route": 1, "json_key": 1},
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if web, ok := m.Target().Server.(*WEB); m.Assert(ok) { // {{{ if web, ok := m.Target().Server.(*WEB); m.Assert(ok) { // {{{
if web.client == nil { if web.client == nil {
web.client = &http.Client{} web.client = &http.Client{}
} }
if m.Has("value") {
args := strings.Split(m.Option("value"), " ")
values := []interface{}{}
for _, v := range args {
if len(v) > 1 && v[0] == '$' {
values = append(values, m.Cap(v[1:]))
} else {
values = append(values, v)
}
}
arg[0] = fmt.Sprintf(arg[0], values...)
}
method := m.Confx("method") method := m.Confx("method")
uri := web.Merge(m, arg[0], arg[1:]...) uri := web.Merge(m, arg[0], arg[1:]...)
m.Log("info", "%s %s", method, uri) m.Log("info", "%s %s", method, uri)
@ -610,7 +624,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Assert(e) m.Assert(e)
defer file.Close() defer file.Close()
if m.Option("type") == "json" { if m.Option("body_type") == "json" {
contenttype = "application/json" contenttype = "application/json"
body = file body = file
break break
@ -638,19 +652,32 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
contenttype = writer.FormDataContentType() contenttype = writer.FormDataContentType()
body = buf body = buf
writer.Close() writer.Close()
} else if m.Option("type") == "json" { } else if m.Option("body_type") == "json" {
if m.Options("body") { if m.Options("body") {
data := []interface{}{} data := []interface{}{}
for _, v := range arg[1:] { for _, v := range arg[1:] {
if len(v) > 1 && v[0] == '$' {
v = m.Cap(v[1:])
}
data = append(data, v) data = append(data, v)
} }
m.Log("body", "%v", fmt.Sprintf(m.Option("body"), data...))
body = strings.NewReader(fmt.Sprintf(m.Option("body"), data...)) body = strings.NewReader(fmt.Sprintf(m.Option("body"), data...))
} else { } else {
data := map[string]string{} data := map[string]interface{}{}
for i := 1; i < len(arg)-1; i++ { for i := 1; i < len(arg)-1; i += 2 {
switch arg[i+1] {
case "false":
data[arg[i]] = false
case "true":
data[arg[i]] = true
default:
if len(arg[i+1]) > 1 && arg[i+1][0] == '$' {
data[arg[i]] = m.Cap(arg[i+1][1:])
} else {
data[arg[i]] = arg[i+1] data[arg[i]] = arg[i+1]
} }
}
}
b, e := json.Marshal(data) b, e := json.Marshal(data)
m.Assert(e) m.Assert(e)
@ -669,12 +696,15 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
} }
m.Log("info", "content-type: %s", contenttype)
req, e := http.NewRequest(method, uri, body) req, e := http.NewRequest(method, uri, body)
m.Assert(e) m.Assert(e)
for i := 0; i < len(m.Meta["headers"]); i += 2 {
req.Header.Set(m.Meta["headers"][i], m.Meta["headers"][i+1])
}
if len(contenttype) > 0 { if len(contenttype) > 0 {
req.Header.Set("Content-Type", contenttype) req.Header.Set("Content-Type", contenttype)
m.Log("info", "content-type: %s", contenttype)
} }
for _, v := range web.cookie { for _, v := range web.cookie {
@ -689,11 +719,14 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
for _, v := range res.Cookies() { for _, v := range res.Cookies() {
web.cookie[v.Name] = v web.cookie[v.Name] = v
m.Log("info", "set-cookie %s: %v", v.Name, v.Value)
} }
if m.Confs("logheaders") {
for k, v := range res.Header { for k, v := range res.Header {
m.Log("info", "%s: %v", k, v) m.Log("info", "%s: %v", k, v)
} }
}
if m.Confs("output") { if m.Confs("output") {
if _, e := os.Stat(m.Conf("output")); e == nil { if _, e := os.Stat(m.Conf("output")); e == nil {
@ -717,32 +750,57 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
buf, e := ioutil.ReadAll(res.Body) buf, e := ioutil.ReadAll(res.Body)
m.Assert(e) m.Assert(e)
if res.Header.Get("Content-Type") == "application/json" { ct := res.Header.Get("Content-Type")
if len(ct) >= 16 && ct[:16] == "application/json" {
var result interface{} var result interface{}
json.Unmarshal(buf, &result) json.Unmarshal(buf, &result)
m.Option("response_json", result)
if m.Has("json_route") {
routes := strings.Split(m.Option("json_route"), ".")
for _, k := range routes {
if len(k) > 0 && k[0] == '$' {
k = m.Cap(k[1:])
}
switch r := result.(type) {
case map[string]interface{}:
result = r[k]
}
}
}
fields := map[string]bool{}
for _, k := range strings.Split(m.Option("fields"), " ") {
if k == "" {
continue
}
fields[k] = true
if len(fields) == 1 {
m.Meta["append"] = append(m.Meta["append"], "index")
}
m.Meta["append"] = append(m.Meta["append"], k)
}
switch ret := result.(type) { switch ret := result.(type) {
case map[string]interface{}: case map[string]interface{}:
m.Log("fuck", "fuck %v", ret)
m.Append("index", "0")
for k, v := range ret { for k, v := range ret {
switch value := v.(type) { switch value := v.(type) {
case string: case string:
m.Append(k, value) m.Append(k, strings.Replace(value, "\n", " ", -1))
case float64: case float64:
m.Append(k, fmt.Sprintf("%d", int(value))) m.Append(k, fmt.Sprintf("%d", int(value)))
default:
if _, ok := fields[k]; ok {
m.Append(k, fmt.Sprintf("%v", value))
}
} }
} }
m.Table() m.Table()
return return
case []interface{}: case []interface{}:
fields := map[string]bool{} for i, r := range ret {
for _, k := range strings.Split(m.Option("fields"), " ") { m.Add("append", "index", i)
if k != "" {
fields[k] = true
}
m.Meta["append"] = append(m.Meta["append"], k)
}
for _, r := range ret {
if rr, ok := r.(map[string]interface{}); ok { if rr, ok := r.(map[string]interface{}); ok {
for k, v := range rr { for k, v := range rr {
switch value := v.(type) { switch value := v.(type) {
@ -752,7 +810,11 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
case float64: case float64:
if _, ok := fields[k]; len(fields) == 0 || ok { if _, ok := fields[k]; len(fields) == 0 || ok {
m.Add("append", k, strings.Replace(fmt.Sprintf("%d", int(value)), "\n", " ", -1)) m.Add("append", k, fmt.Sprintf("%v", value))
}
case bool:
if _, ok := fields[k]; len(fields) == 0 || ok {
m.Add("append", k, fmt.Sprintf("%v", value))
} }
case map[string]interface{}: case map[string]interface{}:
for kk, vv := range value { for kk, vv := range value {
@ -761,20 +823,32 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Add("append", key, strings.Replace(fmt.Sprintf("%v", vv), "\n", " ", -1)) m.Add("append", key, strings.Replace(fmt.Sprintf("%v", vv), "\n", " ", -1))
} }
} }
default:
if _, ok := fields[k]; ok {
m.Add("append", k, fmt.Sprintf("%v", value))
} }
} }
} }
} }
}
if m.Has("json_key") {
m.Sort(m.Option("json_key"))
}
m.Meta["index"] = nil
for i, _ := range ret {
m.Add("append", "index", i)
}
m.Table() m.Table()
return return
} }
} }
result := string(buf) result := string(buf)
m.Echo("%s", result) m.Echo("%s", result)
// m.Append("response", result) // m.Append("response", result)
} // }}} } // }}}
}}, }},
"post": &ctx.Command{Name: "post", Help: "访问服务", "post": &ctx.Command{Name: "post", Help: "访问服务",
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
@ -1264,6 +1338,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
if b, e := json.Marshal(meta); m.Assert(e) { if b, e := json.Marshal(meta); m.Assert(e) {
w.Header().Set("Content-Type", "application/javascript") w.Header().Set("Content-Type", "application/javascript")
m.Log("json", "won %v", string(b))
w.Write(b) w.Write(b)
} }
// }}} // }}}
@ -1287,7 +1362,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
yac := m.Find("yac.parse4", true) yac := m.Find("yac.parse4", true)
msg := m.Sess("nfs").Cmd("dir", path.Join(m.Conf("wiki_dir"), "src", m.Option("dir")), "dir_name", "path") msg := m.Sess("nfs").Cmd("dir", path.Join(m.Conf("wiki_dir"), "src", m.Option("dir")), "dir_name", "path")
for i, v := range msg.Meta["filename"] { for _, v := range msg.Meta["filename"] {
name := strings.TrimSpace(v) name := strings.TrimSpace(v)
es := strings.Split(name, ".") es := strings.Split(name, ".")
switch es[len(es)-1] { switch es[len(es)-1] {
@ -1303,7 +1378,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
f, e := os.Open(name) f, e := os.Open(name)
m.Assert(e) m.Assert(e)
defer f.Close() defer f.Close()
m.Log("fuck", "%d/%d %s", i, len(msg.Meta["filename"]), v)
bio := bufio.NewScanner(f) bio := bufio.NewScanner(f)
for line := 1; bio.Scan(); line++ { for line := 1; bio.Scan(); line++ {
@ -1347,7 +1421,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
yac.Meta = nil yac.Meta = nil
} }
} }
m.Log("fuck", "parse %s", time.Now().Format("2006-01-02 15:04:05"))
}}, }},
"/wiki_body": &ctx.Command{Name: "/wiki_body", Help: "维基", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/wiki_body": &ctx.Command{Name: "/wiki_body", Help: "维基", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
which := path.Join(m.Conf("wiki_dir"), m.Confx("which")) which := path.Join(m.Conf("wiki_dir"), m.Confx("which"))
@ -1602,6 +1675,25 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
msg.Cmd("get", "method", "POST", "evaluating_add/", "questions", qs) msg.Cmd("get", "method", "POST", "evaluating_add/", "questions", qs)
m.Add("append", "hi", "hello") m.Add("append", "hi", "hello")
}}, }},
"/lark": &ctx.Command{Name: "user", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
r := m.Optionv("request").(*http.Request)
w := m.Optionv("response").(http.ResponseWriter)
data := map[string]interface{}{}
switch r.Header.Get("Content-Type") {
case "application/json":
b, e := ioutil.ReadAll(r.Body)
e = json.Unmarshal(b, &data)
m.Assert(e)
}
if _, ok := data["challenge"]; ok {
w.Header().Set("Content-Type", "application/javascript")
fmt.Fprintf(w, "{\"challenge\": \"%s\"}", data["challenge"])
return
}
m.Confv("lark_msg", "-1", data)
}},
"/lookup": &ctx.Command{Name: "user", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/lookup": &ctx.Command{Name: "user", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if len(arg) > 0 { if len(arg) > 0 {
m.Option("service", arg[0]) m.Option("service", arg[0])