From 911f679a4093762991a73d97a023de2265131b0a Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 8 Nov 2018 22:32:22 +0800 Subject: [PATCH] tce add cli.runtime --- src/contexts/cli/cli.go | 88 ++++++++++++++++++++++++++++++++++--- src/contexts/ctx/ctx.go | 48 +------------------- src/contexts/nfs/nfs.go | 50 +++++++++++++++++++++ src/examples/code/code.go | 54 +++++++++++------------ src/toolkit/kit.go | 14 +++--- usr/librarys/context.js | 2 +- usr/template/code/code.tmpl | 2 +- 7 files changed, 168 insertions(+), 90 deletions(-) diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index b145b17b..96ac3a15 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -2,10 +2,15 @@ package cli import ( "contexts/ctx" + "io/ioutil" + "syscall" + "toolkit" + "fmt" "os" "os/exec" "regexp" + "runtime" "strconv" "strings" "time" @@ -137,10 +142,11 @@ var Index = &ctx.Context{Name: "cli", 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", - ".py": "python", - ".shy": "source", + "sh": "bash", + "py": "python", + "shy": "source", }, Help: "系统命令超时"}, + "cmd_timeout": &ctx.Config{Name: "cmd_timeout", Value: "60s", Help: "系统命令超时"}, "cmd_combine": &ctx.Config{Name: "cmd_combine", Value: map[string]interface{}{ "vi": map[string]interface{}{"active": true}, @@ -216,7 +222,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", msg := m for k, v := range m.Confv("cmd_script").(map[string]interface{}) { - if strings.HasSuffix(detail[0], k) { + if strings.HasSuffix(detail[0], "."+k) { detail = append([]string{v.(string)}, detail...) msg = m.Spawn(cli.target) break @@ -307,7 +313,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", for _, v := range exports { m.Log("info", "export %v", v) if v["file"] != "" { - m.Spawn().Copy(msg, "option").Copy(msg, "append").Copy(msg, "result").Cmd("export", v["file"]) + m.Sess("nfs").Copy(msg, "option").Copy(msg, "append").Copy(msg, "result").Cmd("export", v["file"]) } if v["cache"] != "" { if v["index"] == "result" { @@ -327,7 +333,11 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", if len(rest) > 0 { pipe := m.Spawn().Copy(msg, "option").Copy(msg, "append").Cmd("cmd", rest) - msg.Set("result").Set("append").Copy(pipe, "result").Copy(pipe, "append") + + msg.Set("result").Set("append") + m.Log("fuck", "what %v", msg.Meta) + msg.Copy(pipe, "result").Copy(pipe, "append") + m.Log("fuck", "what %v", msg.Meta) } m.Target().Message().Set("result").Set("append").Copy(msg, "result").Copy(msg, "append") @@ -633,7 +643,13 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", m.Copy(msg, "target") } - m.Start(fmt.Sprintf("shell%d", m.Capi("nshell", 1)), "shell", key, arg[0]) + name := fmt.Sprintf("shell%d", m.Capi("nshell", 1)) + if arg[0] == "stdio" { + name = "shy" + } + + m.Start(name, "shell", key, arg[0]) + if arg[0] == "stdio" { if m.Sess("nfs").Cmd("path", m.Confx("init.shy", arg, 1)).Results(0) { m.Spawn().Add("option", "scan_end", "false").Cmd("source", m.Conf("init.shy")) @@ -846,6 +862,64 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", } } }}, + "sysinfo": &ctx.Command{Name: "sysinfo", Help: "sysinfo", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + sys := &syscall.Sysinfo_t{} + syscall.Sysinfo(sys) + + d, e := time.ParseDuration(fmt.Sprintf("%ds", sys.Uptime)) + m.Assert(e) + m.Append("NumCPU", runtime.NumCPU()) + m.Append("uptime", d) + m.Append("procs", sys.Procs) + + m.Append("total", kit.FmtSize(sys.Totalram)) + m.Append("free", kit.FmtSize(sys.Freeram)) + m.Append("mper", fmt.Sprintf("%d%%", sys.Freeram*100/sys.Totalram)) + + fs := &syscall.Statfs_t{} + syscall.Statfs("./", fs) + m.Append("blocks", kit.FmtSize(fs.Blocks*uint64(fs.Bsize))) + m.Append("bavail", kit.FmtSize(fs.Bavail*uint64(fs.Bsize))) + m.Append("bper", fmt.Sprintf("%d%%", fs.Bavail*100/fs.Blocks)) + + m.Append("files", fs.Files) + m.Append("ffree", fs.Ffree) + m.Append("fper", fmt.Sprintf("%d%%", fs.Ffree*100/fs.Files)) + + m.Table() + }}, + "runtime": &ctx.Command{Name: "runtime", Help: "runtime", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + mem := &runtime.MemStats{} + runtime.ReadMemStats(mem) + m.Append("NumGoroutine", runtime.NumGoroutine()) + m.Append("NumGC", mem.NumGC) + m.Append("other", kit.FmtSize(mem.OtherSys)) + m.Append("stack", kit.FmtSize(mem.StackSys)) + + m.Append("heapsys", kit.FmtSize(mem.HeapSys)) + m.Append("heapinuse", kit.FmtSize(mem.HeapInuse)) + m.Append("heapidle", kit.FmtSize(mem.HeapIdle)) + m.Append("heapalloc", kit.FmtSize(mem.HeapAlloc)) + + m.Append("lookups", mem.Lookups) + m.Append("objects", mem.HeapObjects) + m.Table() + }}, + "develop": &ctx.Command{Name: "develop", Help: "develop", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + m.Append("nclient", strings.Count(m.Spawn().Cmd("system", "tmux", "list-clients").Result(0), "\n")) + m.Append("nsesion", strings.Count(m.Spawn().Cmd("system", "tmux", "list-sessions").Result(0), "\n")) + m.Append("nwindow", strings.Count(m.Spawn().Cmd("system", "tmux", "list-windows", "-a").Result(0), "\n")) + m.Append("npane", strings.Count(m.Spawn().Cmd("system", "tmux", "list-panes", "-a").Result(0), "\n")) + + m.Append("ncommand", strings.Count(m.Spawn().Cmd("system", "tmux", "list-commands").Result(0), "\n")) + m.Append("nkey", strings.Count(m.Spawn().Cmd("system", "tmux", "list-keys").Result(0), "\n")) + m.Append("nbuffer", strings.Count(m.Spawn().Cmd("system", "tmux", "list-buffers").Result(0), "\n")) + nw, _ := ioutil.ReadFile("var/.nwrite") + m.Append("nwrite", string(nw)) + nr, _ := ioutil.ReadFile("var/.nread") + m.Append("nread", string(nr)) + m.Table() + }}, "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) { diff --git a/src/contexts/ctx/ctx.go b/src/contexts/ctx/ctx.go index 6d70fa6e..99b3df6d 100644 --- a/src/contexts/ctx/ctx.go +++ b/src/contexts/ctx/ctx.go @@ -3205,6 +3205,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", if m.Meta["parse"][1] != "" { value = Chain(m, value, m.Meta["parse"][1]) } + m.Log("fuck", "what %v", value) switch val := value.(type) { case map[string]interface{}: @@ -3281,7 +3282,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", return } - m.Table() + m.Set("result").Table() }}, "import": &Command{Name: "import filename", Help: "导入数据", Hand: func(m *Message, c *Context, key string, arg ...string) { f, e := os.Open(arg[0]) @@ -3324,51 +3325,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心", } m.Table() }}, - "export": &Command{Name: "export filename", Help: "导出数据", Hand: func(m *Message, c *Context, key string, arg ...string) { - f, e := os.Create(arg[0]) - m.Assert(e) - defer f.Close() - - switch { - case strings.HasSuffix(arg[0], ".json"): - data := []interface{}{} - - nrow := len(m.Meta[m.Meta["append"][0]]) - for i := 0; i < nrow; i++ { - line := map[string]interface{}{} - for _, k := range m.Meta["append"] { - line[k] = m.Meta[k][i] - } - data = append(data, line) - } - en := json.NewEncoder(f) - en.SetIndent("", " ") - en.Encode(data) - - case strings.HasSuffix(arg[0], ".csv"): - w := csv.NewWriter(f) - - line := []string{} - for _, v := range m.Meta["append"] { - line = append(line, v) - } - w.Write(line) - - nrow := len(m.Meta[m.Meta["append"][0]]) - for i := 0; i < nrow; i++ { - line := []string{} - for _, k := range m.Meta["append"] { - line = append(line, m.Meta[k][i]) - } - w.Write(line) - } - w.Flush() - default: - for _, v := range m.Meta["result"] { - f.WriteString(v) - } - } - }}, }, } diff --git a/src/contexts/nfs/nfs.go b/src/contexts/nfs/nfs.go index f4808efd..451a541e 100644 --- a/src/contexts/nfs/nfs.go +++ b/src/contexts/nfs/nfs.go @@ -3,6 +3,7 @@ package nfs import ( "bufio" "contexts/ctx" + "encoding/csv" "encoding/json" "errors" "fmt" @@ -47,6 +48,10 @@ func open(m *ctx.Message, name string, arg ...int) (string, *os.File, error) { paths := m.Confv("paths").([]interface{}) for _, v := range paths { p := path.Join(v.(string), name) + if len(arg) > 0 { + name = p + break + } if s, e := os.Stat(p); e == nil && !s.IsDir() { name = p break @@ -1029,6 +1034,51 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心", } } }}, + "export": &ctx.Command{Name: "export filename", Help: "导出数据", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + _, f, e := open(m, arg[0], os.O_WRONLY|os.O_CREATE|os.O_TRUNC) + m.Assert(e) + defer f.Close() + + switch { + case strings.HasSuffix(arg[0], ".json"): + data := []interface{}{} + + nrow := len(m.Meta[m.Meta["append"][0]]) + for i := 0; i < nrow; i++ { + line := map[string]interface{}{} + for _, k := range m.Meta["append"] { + line[k] = m.Meta[k][i] + } + data = append(data, line) + } + en := json.NewEncoder(f) + en.SetIndent("", " ") + en.Encode(data) + + case strings.HasSuffix(arg[0], ".csv"): + w := csv.NewWriter(f) + + line := []string{} + for _, v := range m.Meta["append"] { + line = append(line, v) + } + w.Write(line) + + nrow := len(m.Meta[m.Meta["append"][0]]) + for i := 0; i < nrow; i++ { + line := []string{} + for _, k := range m.Meta["append"] { + line = append(line, m.Meta[k][i]) + } + w.Write(line) + } + w.Flush() + default: + for _, v := range m.Meta["result"] { + f.WriteString(v) + } + } + }}, "pwd": &ctx.Command{Name: "pwd [all] | [[index] path] ", Help: "工作目录,all: 查看所有, index path: 设置路径, path: 设置当前路径", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { if len(arg) > 0 && arg[0] == "all" { diff --git a/src/examples/code/code.go b/src/examples/code/code.go index 8b5166ab..5edae5db 100644 --- a/src/examples/code/code.go +++ b/src/examples/code/code.go @@ -33,6 +33,30 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, "index": []interface{}{ map[string]interface{}{"name": "head", "template": "head"}, + map[string]interface{}{"name": "sysinfo", "help": "sysinfo", "template": "componet", + "context": "cli", "command": "sysinfo", + "inputs": []interface{}{ + map[string]interface{}{"type": "button", "label": "refresh"}, + }, + "pre_run": true, + "display_result": "", + }, + map[string]interface{}{"name": "runtime", "help": "runtime", "template": "componet", + "context": "cli", "command": "runtime", + "inputs": []interface{}{ + map[string]interface{}{"type": "button", "label": "refresh"}, + }, + "pre_run": true, + "display_result": "", + }, + map[string]interface{}{"name": "develop", "help": "develop", "template": "componet", + "context": "cli", "command": "develop", + "inputs": []interface{}{ + map[string]interface{}{"type": "button", "label": "refresh"}, + }, + "pre_run": true, + "display_result": "", + }, map[string]interface{}{"name": "clipbaord", "help": "clipbaord", "template": "clipboard"}, map[string]interface{}{"name": "buffer", "help": "buffer", "template": "componet", "context": "cli", "command": "tmux", "arguments": []interface{}{"buffer"}, "inputs": []interface{}{ @@ -43,7 +67,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "pre_run": true, }, map[string]interface{}{"name": "command", "help": "command", "template": "componet", - "context": "cli.shell1", "command": "source", "arguments": []interface{}{"@cmd"}, + "context": "cli.shy", "command": "source", "arguments": []interface{}{"@cmd"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "cmd", "value": "", "class": "cmd", "clipstack": "clistack", @@ -68,7 +92,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, }, map[string]interface{}{"name": "upload", "help": "upload", "template": "componet", - "form_type": "upload", + "context": "web", "command": "upload", "form_type": "upload", "inputs": []interface{}{ map[string]interface{}{"type": "file", "name": "upload"}, map[string]interface{}{"type": "submit", "value": "submit"}, @@ -111,32 +135,6 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", map[string]interface{}{"type": "text", "name": "dir", "label": "dir"}, }, }, - map[string]interface{}{"name": "web_site", "help": "web_site", "template": "componet", - "context": "web", "command": "config", "arguments": []interface{}{ - "web_site", "format_field", "site", "%s", - }, - "display_result": "", - }, - map[string]interface{}{"name": "prompt", "help": "prompt", "template": "componet", - "context": "nfs.stdio", "command": "prompt", "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": "exec", "help": "exec", "template": "componet", - "context": "nfs.stdio", "command": "exec", "arguments": []interface{}{"@string"}, - "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "string"}, - }, - }, - map[string]interface{}{"name": "show", "help": "show", "template": "componet", - "context": "nfs.stdio", "command": "show", "arguments": []interface{}{"\n", "@string", "\n"}, - "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "string", "label": "string"}, - map[string]interface{}{"type": "button", "label": "refresh"}, - }, - }, map[string]interface{}{"name": "tail", "template": "tail"}, }, }, Help: "组件列表"}, diff --git a/src/toolkit/kit.go b/src/toolkit/kit.go index e2a5f289..286e5272 100644 --- a/src/toolkit/kit.go +++ b/src/toolkit/kit.go @@ -8,17 +8,17 @@ import ( "path" ) -func FmtSize(size int64) string { - if size > 1000000000 { - return fmt.Sprintf("%d.%dG", size/1000000000, size/100000000%100) +func FmtSize(size uint64) string { + if size > 1<<30 { + return fmt.Sprintf("%d.%dG", size>>30, (size>>20)%1024*100/1024) } - if size > 1000000 { - return fmt.Sprintf("%d.%dM", size/100000, size/100000%100) + if size > 1<<20 { + return fmt.Sprintf("%d.%dM", size>>20, (size>>10)%1024*100/1024) } - if size > 1000 { - return fmt.Sprintf("%d.%dK", size/1000, size/100%100) + if size > 1<<10 { + return fmt.Sprintf("%d.%dK", size>>10, size%1024*100/1024) } return fmt.Sprintf("%dB", size) diff --git a/usr/librarys/context.js b/usr/librarys/context.js index a2e52208..53d822ea 100644 --- a/usr/librarys/context.js +++ b/usr/librarys/context.js @@ -56,7 +56,7 @@ context = { return ""; } - document.cookie = key+"="+value; + document.cookie = key+"="+value+";path=/"; return this.Cookie(key); }, Cache: function(key, cb, sync) { diff --git a/usr/template/code/code.tmpl b/usr/template/code/code.tmpl index a38a513e..a2cf9ffd 100644 --- a/usr/template/code/code.tmpl +++ b/usr/template/code/code.tmpl @@ -3,7 +3,7 @@ -{{option .Meta "page_title"}} +code