1
0
forked from x/ContextOS

add componet.ctx

This commit is contained in:
shaoying 2018-11-11 16:21:16 +08:00
parent e167d1522c
commit 1b86db71df
9 changed files with 190 additions and 80 deletions

View File

@ -4,5 +4,4 @@
config load var/counter.json counter
source etc/local.shy
source etc/demo.shy
~shy

View File

@ -2,6 +2,7 @@ package cli
import (
"contexts/ctx"
"path"
"toolkit"
"fmt"
@ -84,9 +85,10 @@ func (cli *CLI) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server
":": []string{"command"},
"::": []string{"command", "list"},
"pwd": []string{"nfs.pwd"},
"dir": []string{"nfs.dir"},
"git": []string{"nfs.git"},
"pwd": []string{"nfs.pwd"},
"path": []string{"nfs.path"},
"dir": []string{"nfs.dir"},
"git": []string{"nfs.git"},
}
return s
@ -139,8 +141,8 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
"init.shy": &ctx.Config{Name: "init.shy", Value: "etc/init.shy", Help: "启动脚本"},
"exit.shy": &ctx.Config{Name: "exit.shy", Value: "etc/exit.shy", Help: "启动脚本"},
"time_unit": &ctx.Config{Name: "time_unit", Value: "1000", Help: "时间倍数"},
"time_close": &ctx.Config{Name: "time_close(open/close)", Value: "open", Help: "时间区间"},
"time_unit": &ctx.Config{Name: "time_unit", Value: "1000", Help: "时间倍数"},
"time_close": &ctx.Config{Name: "time_close(open/close)", Value: "open", Help: "时间区间"},
"cmd_script": &ctx.Config{Name: "cmd_script", Value: map[string]interface{}{
"sh": "bash",
@ -149,6 +151,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
}, Help: "系统命令超时"},
"cmd_timeout": &ctx.Config{Name: "cmd_timeout", Value: "60s", Help: "系统命令超时"},
"source_list": &ctx.Config{Name: "source_list", Value: []interface{}{}, Help: "系统命令超时"},
"cmd_combine": &ctx.Config{Name: "cmd_combine", Value: map[string]interface{}{
"vi": map[string]interface{}{"active": true},
"top": map[string]interface{}{"active": true},
@ -610,6 +613,15 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
return
}
m.Confv("source_list", -1, map[string]interface{}{
"source_word": strings.Join(arg, " "),
"source_time": m.Time(),
})
if m.Options("current_ctx") {
args := []string{"context", m.Option("current_ctx")}
arg = append(args, arg...)
}
m.Sess("yac").Call(func(msg *ctx.Message) *ctx.Message {
switch msg.Cmd().Detail(0) {
case "cmd":
@ -624,6 +636,11 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
m.Copy(msg, "append").Copy(msg, "result")
}
}},
"run": &ctx.Command{Name: "run", Help: "脚本参数", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
name := path.Join(m.Option("dir_root"), m.Option("download_dir"), arg[0])
msg := m.Spawn(c).Cmd("cmd", name)
m.Copy(msg, "append").Copy(msg, "result")
}},
"sleep": &ctx.Command{Name: "sleep time", Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if d, e := time.ParseDuration(arg[0]); m.Assert(e) {

View File

@ -2796,6 +2796,9 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch action {
case "cmd":
msg.Cmd(arg)
if !msg.Hand {
msg = msg.Sess("cli").Cmd("cmd", arg)
}
m.Copy(msg, "append").Copy(msg, "result")
case "switch":
m.target = msg.target
@ -3045,13 +3048,15 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch action {
case "save":
f, e := os.Create(which)
m.Assert(e)
defer f.Close()
// f, e := os.Create(which)
// m.Assert(e)
// defer f.Close()
//
buf, e := json.MarshalIndent(save, "", " ")
m.Assert(e)
f.Write(buf)
m.Sess("nfs").Add("option", "data", string(buf)).Cmd("save", which)
// f.Write(buf)
case "export":
buf, e := json.MarshalIndent(save, "", " ")
m.Assert(e)

View File

@ -199,6 +199,15 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
"extra_field": 2, "extra_fields": 1, "extra_format": 1, "trans_field": 1, "trans_map": 2},
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if _, ok := m.Target().Server.(*MDB); m.Assert(ok) {
if len(arg) == 0 {
msg := m.Spawn().Cmd("query", "show tables")
for _, v := range msg.Meta[msg.Meta["append"][0]] {
m.Add("append", "table", v)
}
m.Table()
return
}
table := m.Confx("table", arg, 0)
if v := m.Confv("tables", table); v != nil {
table = v.(string)

View File

@ -84,6 +84,7 @@ func dir(m *ctx.Message, name string, level int, deep bool, trip int, fields []s
continue
}
f, _ := os.Stat(f.Name())
if !(m.Confx("dir_type") == "file" && f.IsDir() ||
m.Confx("dir_type") == "dir" && !f.IsDir()) {
for _, field := range fields {
@ -1009,6 +1010,9 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
}
}},
"save": &ctx.Command{Name: "save file string...", Help: "保存文件, file: 保存的文件, string: 保存的内容", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if len(arg) == 1 && m.Has("data") {
arg = append(arg, m.Option("data"))
}
if p, f, e := open(m, arg[0], os.O_WRONLY|os.O_CREATE|os.O_TRUNC); m.Assert(e) {
defer f.Close()

View File

@ -283,9 +283,9 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
"componet_group": &ctx.Config{Name: "component_group", Value: "index", Help: "默认组件"},
"componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{
"index": []interface{}{
map[string]interface{}{"name": "head", "template": "head"},
map[string]interface{}{"name": "clipbaord", "help": "clipbaord", "template": "clipboard"},
map[string]interface{}{"name": "time", "help": "time", "template": "componet",
map[string]interface{}{"componet_name": "head", "template": "head"},
map[string]interface{}{"componet_name": "clipbaord", "componet_help": "clipbaord", "template": "clipboard"},
map[string]interface{}{"componet_name": "time", "componet_help": "time", "template": "componet",
"context": "cli", "command": "time", "arguments": []interface{}{"@string"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "time_format",
@ -295,7 +295,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
map[string]interface{}{"type": "button", "label": "refresh"},
},
},
map[string]interface{}{"name": "tail", "template": "tail"},
map[string]interface{}{"componet_name": "tail", "template": "tail"},
},
}, Help: "组件列表"},
},
@ -617,8 +617,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
value := val.(map[string]interface{})
m.Add("append", "group", k)
m.Add("append", "order", i)
m.Add("append", "name", value["name"])
m.Add("append", "help", value["help"])
m.Add("append", "componet_name", value["componet_name"])
m.Add("append", "componet_help", value["componet_help"])
m.Add("append", "context", value["context"])
m.Add("append", "command", value["command"])
}
@ -628,8 +628,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
for i, val := range m.Confv("componet", arg[0]).([]interface{}) {
value := val.(map[string]interface{})
m.Add("append", "order", i)
m.Add("append", "name", value["name"])
m.Add("append", "help", value["help"])
m.Add("append", "componet_name", value["componet_name"])
m.Add("append", "componet_help", value["componet_help"])
m.Add("append", "context", value["context"])
m.Add("append", "command", value["command"])
}
@ -647,7 +647,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
}
} else {
m.Confv("componet", []interface{}{arg[0], arg[1]}, map[string]interface{}{
"name": arg[2], "help": arg[3],
"componet_name": arg[2], "componet_help": arg[3],
"context": m.Confx("componet_context", arg, 4),
"command": m.Confx("componet_command", arg, 5),
})
@ -742,13 +742,13 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
for count := 0; count == 0; group, order, right = "login", "", true {
for _, v := range m.Confv("componet", group).([]interface{}) {
val := v.(map[string]interface{})
if order != "" && val["name"].(string) != order {
if order != "" && val["componet_name"].(string) != order {
continue
}
order_right := right
if !order_right && login != nil {
if role := login.Confv("right", []interface{}{group, val["name"], "right", "role"}); role != nil && role.(string) == "share" {
if role := login.Confv("right", []interface{}{group, val["componet_name"], "right", "role"}); role != nil && role.(string) == "share" {
order_right = true
}
}
@ -770,7 +770,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
}
count++
msg.Option("componet_order", val["name"].(string))
msg.Option("componet_order", val["componet_name"].(string))
for k, v := range val {
if msg.Option(k) != "" {
@ -823,7 +823,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
}
if msg.Appends("directory") {
m.Append("page_redirect", fmt.Sprintf("/download?file=%s", msg.Append("directory")))
m.Append("page_redirect", fmt.Sprintf("/download/%s", msg.Append("directory")))
return
}

View File

@ -22,11 +22,11 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
"componet_group": &ctx.Config{Name: "component_group", Value: "index", Help: "默认组件"},
"componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{
"login": []interface{}{
map[string]interface{}{"name": "head", "template": "head"},
map[string]interface{}{"name": "userinfo", "help": "userinfo",
map[string]interface{}{"componet_name": "head", "template": "head"},
map[string]interface{}{"componet_name": "userinfo", "componet_help": "userinfo",
"context": "aaa", "command": "userinfo", "arguments": []interface{}{"@sessid"},
},
map[string]interface{}{"name": "login", "help": "login", "template": "componet",
map[string]interface{}{"componet_name": "login", "componet_help": "login", "template": "componet",
"context": "aaa", "command": "login", "arguments": []interface{}{"@username", "@password"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "username", "label": "username"},
@ -35,12 +35,12 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
},
"display_append": "", "display_result": "", "result_reload": "10",
},
map[string]interface{}{"name": "tail", "template": "tail"},
map[string]interface{}{"componet_name": "tail", "template": "tail"},
},
"index": []interface{}{
map[string]interface{}{"name": "head", "template": "head"},
map[string]interface{}{"name": "clipbaord", "help": "clipbaord", "template": "clipboard"},
map[string]interface{}{"name": "buffer", "help": "buffer", "template": "componet",
map[string]interface{}{"componet_name": "head", "template": "head"},
map[string]interface{}{"componet_name": "clipbaord", "componet_help": "clipbaord", "template": "clipboard"},
map[string]interface{}{"componet_name": "buffer", "componet_help": "buffer", "template": "componet",
"context": "cli", "command": "tmux", "arguments": []interface{}{"buffer"}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "limit", "label": "limit", "value": "3"},
map[string]interface{}{"type": "text", "name": "index", "label": "index"},
@ -48,7 +48,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
},
"pre_run": true,
},
map[string]interface{}{"name": "time", "help": "time", "template": "componet",
map[string]interface{}{"componet_name": "time", "componet_help": "time", "template": "componet",
"context": "cli", "command": "time", "arguments": []interface{}{"@string"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "time_format",
@ -58,25 +58,14 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
map[string]interface{}{"type": "button", "label": "refresh"},
},
},
map[string]interface{}{"name": "time", "help": "time", "template": "componet",
"context": "cli", "command": "time", "arguments": []interface{}{"@string"},
"file_name": "nice-2006-01-02_1504.txt",
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "time_format",
"label": "format", "value": "2006-01-02 15:04:05",
},
map[string]interface{}{"type": "text", "name": "string", "label": "string"},
map[string]interface{}{"type": "button", "label": "refresh"},
},
},
map[string]interface{}{"name": "json", "help": "json", "template": "componet",
map[string]interface{}{"componet_name": "json", "componet_help": "json", "template": "componet",
"context": "nfs", "command": "json", "arguments": []interface{}{"@string"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "string", "label": "string"},
map[string]interface{}{"type": "button", "label": "refresh"},
},
},
map[string]interface{}{"name": "dir", "help": "dir", "template": "componet",
map[string]interface{}{"componet_name": "dir", "componet_help": "dir", "template": "componet",
"context": "nfs", "command": "dir", "arguments": []interface{}{"@dir", "dir_sort", "@sort_order", "@sort_field"},
"pre_run": true, "display_result": "",
"inputs": []interface{}{
@ -109,7 +98,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
map[string]interface{}{"type": "text", "name": "dir", "label": "dir"},
},
},
map[string]interface{}{"name": "upload", "help": "upload", "template": "componet",
map[string]interface{}{"componet_name": "upload", "componet_help": "upload", "template": "componet",
"context": "web", "command": "upload", "form_type": "upload",
"inputs": []interface{}{
map[string]interface{}{"type": "file", "name": "upload"},
@ -117,24 +106,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
},
"display_result": "",
},
map[string]interface{}{"name": "command", "help": "command", "template": "componet",
"context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "cmd", "value": "",
"class": "cmd", "clipstack": "clistack",
},
},
},
map[string]interface{}{"name": "command_result", "help": "command_result", "template": "componet",
"context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"},
"display_result": "", "file_name": "result_2006_0102_1504.txt",
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "cmd", "value": "",
"class": "cmd", "clipstack": "clistack",
},
},
},
map[string]interface{}{"name": "command_append", "help": "command_append", "template": "componet",
map[string]interface{}{"componet_name": "download", "componet_help": "download", "template": "componet",
"context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"},
"display_result": "", "file_name": "",
"inputs": []interface{}{
@ -144,7 +116,46 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
},
},
},
map[string]interface{}{"name": "develop", "help": "develop", "template": "componet",
map[string]interface{}{"componet_name": "ctx", "componet_help": "ctx", "template": "componet",
"context": "cli.shy", "command": "context", "arguments": []interface{}{"@ctx", "list"},
"display_result": "",
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "ctx", "value": "shy"},
map[string]interface{}{"type": "button", "label": "refresh"},
},
},
map[string]interface{}{"componet_name": "command", "componet_help": "command", "template": "componet",
"context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "cmd", "value": "",
"class": "cmd", "clipstack": "clistack",
},
},
},
map[string]interface{}{"componet_name": "command1", "componet_help": "command1", "template": "componet",
"context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "cmd", "value": "",
"class": "cmd", "clipstack": "clistack",
},
},
},
map[string]interface{}{"componet_name": "command2", "componet_help": "command2", "template": "componet",
"context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"},
"inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "cmd", "value": "",
"class": "cmd", "clipstack": "clistack",
},
},
},
map[string]interface{}{"componet_name": "command_list", "componet_help": "command_list", "template": "componet",
"context": "cli", "command": "config", "arguments": []interface{}{"source_list"},
"pre_run": true, "display_result": "",
"inputs": []interface{}{
map[string]interface{}{"type": "button", "label": "refresh"},
},
},
map[string]interface{}{"componet_name": "develop", "componet_help": "develop", "template": "componet",
"context": "web.code", "command": "config", "arguments": []interface{}{"counter"},
"inputs": []interface{}{
map[string]interface{}{"type": "button", "label": "refresh"},
@ -152,7 +163,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
"pre_run": true,
"display_result": "",
},
map[string]interface{}{"name": "windows", "help": "windows", "template": "componet",
map[string]interface{}{"componet_name": "windows", "componet_help": "windows", "template": "componet",
"context": "cli", "command": "windows",
"inputs": []interface{}{
map[string]interface{}{"type": "button", "label": "refresh"},
@ -160,7 +171,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
"pre_run": true,
"display_result": "",
},
map[string]interface{}{"name": "runtime", "help": "runtime", "template": "componet",
map[string]interface{}{"componet_name": "runtime", "componet_help": "runtime", "template": "componet",
"context": "cli", "command": "runtime",
"inputs": []interface{}{
map[string]interface{}{"type": "button", "label": "refresh"},
@ -168,7 +179,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
"pre_run": true,
"display_result": "",
},
map[string]interface{}{"name": "sysinfo", "help": "sysinfo", "template": "componet",
map[string]interface{}{"componet_name": "sysinfo", "componet_help": "sysinfo", "template": "componet",
"context": "cli", "command": "sysinfo",
"inputs": []interface{}{
map[string]interface{}{"type": "button", "label": "refresh"},
@ -176,7 +187,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心",
"pre_run": true,
"display_result": "",
},
map[string]interface{}{"name": "tail", "template": "tail"},
map[string]interface{}{"componet_name": "tail", "template": "tail"},
},
}, Help: "组件列表"},
},

View File

@ -22,12 +22,13 @@ function send_command(form, cb) {
msg = msg[0]
var result = document.querySelector("code.result."+data["componet_name"]+" pre")
result && (result.innerHTML = (msg.result || []).join(""))
var append = document.querySelector("table.append."+data["componet_name"])
append && (append.innerHTML = "")
if (msg && (msg.append || msg.result)) {
result && (result.innerHTML = (msg.result || []).join(""))
append && (append.innerHTML = "")
}
if (append && msg.append) {
if (append && msg && msg.append) {
var tr = append_child(append, "tr")
for (var i in msg.append) {
append_child(tr, "th", msg.append[i])
@ -218,7 +219,13 @@ function init_append(event) {
}
function init_result(event) {
var result = document.querySelectorAll("code.result pre").forEach(function(item) {
item.onselect = function(event) {
console.log(event)
}
item.onclick = function(event) {
console.log(event)
return
copy_to_clipboard(event.target.innerText)
}
})
@ -284,7 +291,11 @@ function init_download(event) {
if (event.target.tagName == "TD") {
copy_to_clipboard(event.target.innerText.trim())
var name = event.target.innerText.trim()
option["dir"].value += name
if (option["dir"].value && !option["dir"].value.endsWith("/")) {
option["dir"].value += "/"+name
} else {
option["dir"].value += name
}
if (name.endsWith("/")) {
context.Cookie("download_dir", option["dir"].value)
}
@ -306,6 +317,59 @@ function init_download(event) {
}
}
send_command(option, function(){
option["dir"].value = context.Cookie("download_dir")
})
}
}
function init_context() {
var append = document.querySelector("table.append.ctx")
var option = document.querySelector("form.option.ctx")
insert_before(append, "input", {
"type": "button",
"value": "ctx",
"onclick": function(event) {
option["ctx"].value = "ctx"
send_command(option)
context.Cookie("current_ctx", option["ctx"].value)
return true
}
})
insert_before(append, "input", {
"type": "button",
"value": "shy",
"onclick": function(event) {
option["ctx"].value = "shy"
send_command(option)
context.Cookie("current_ctx", option["ctx"].value)
return true
}
})
insert_before(append, "input", {
"type": "button",
"value": "mdb",
"onclick": function(event) {
option["ctx"].value = "mdb"
send_command(option)
context.Cookie("current_ctx", option["ctx"].value)
return true
}
})
option["ctx"].value = context.Cookie("current_ctx")
send_command(option)
append.onchange = append.onclick = function(event) {
console.log(event)
if (event.target.tagName == "TD") {
var name = event.target.innerText.trim()
copy_to_clipboard(name)
option["ctx"].value = name
context.Cookie("current_ctx", option["ctx"].value)
} else if (event.target.tagName == "TH") {
}
send_command(option)
}
}
@ -315,4 +379,5 @@ window.onload = function() {
init_append()
init_result()
init_download()
init_context()
}

View File

@ -118,18 +118,18 @@
{{end}}
{{define "componet"}}
<fieldset><legend title="{{option .Meta "help"}}">{{option .Meta "help"}}({{option .Meta "context"}}.{{option .Meta "command"}})</legend>
<fieldset><legend title="{{option .Meta "componet_help"}}">{{option .Meta "componet_help"}}({{option .Meta "context"}}.{{option .Meta "command"}})</legend>
{{$form_type := option . "form_type"|meta}}
{{if eq $form_type "upload"}}
{{end}}
<form class="option {{option .Meta "name"}}"
<form class="option {{option .Meta "componet_name"}}"
data-last_componet_group="{{option . "last_componet_group"|meta}}"
data-last_componet_order="{{option . "last_componet_order"|meta}}"
data-componet_group="{{option . "componet_group"|meta}}"
data-componet_order="{{option . "componet_order"|meta}}"
data-componet_name="{{option . "name"|meta}}"
data-componet_help="{{option . "help"|meta}}"
data-componet_name="{{option . "componet_name"|meta}}"
data-componet_help="{{option . "componet_help"|meta}}"
{{if eq $form_type "upload"}}
method="POST" action="/upload" enctype="multipart/form-data"
onsubmit="onaction(event,'upload')"
@ -183,7 +183,7 @@
{{if index .Meta "display_append"}}
{{option .Meta "display_append"}}
{{else}}
<table class="append {{option .Meta "name"}}">
<table class="append {{option .Meta "componet_name"}}">
{{$msg := .}}
<tr>{{range $field := append .}}<th>{{$field}}</th>{{end}}</tr>
{{range $line := table .}}
@ -195,7 +195,7 @@
{{if index .Meta "display_result"}}
{{option .Meta "display_result"}}
{{else}}
<code class="result {{option .Meta "name"}}"><pre>{{result .Meta}}</pre></code>
<code class="result {{option .Meta "componet_name"}}"><pre>{{result .Meta}}</pre></code>
{{end}}
</fieldset>
{{end}}