diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 24b4cdac..402e9a98 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -71,6 +71,9 @@ const ( CMD = "cmd" ARG = "arg" DIR = "dir" + RUN = "run" + RES = "res" + ERR = "err" ) const ( RESTART = "restart" diff --git a/base/mdb/search.go b/base/mdb/search.go index 7e4138ac..e2d214f0 100644 --- a/base/mdb/search.go +++ b/base/mdb/search.go @@ -30,7 +30,7 @@ func init() { if strings.Contains(arg[1], ";") { arg = strings.Split(arg[1], ";") } - m.Option(FIELDS, "pod,ctx,cmd,time,size,type,name,text") + m.Option(FIELDS, kit.Select("pod,ctx,cmd,time,size,type,name,text", m.Option(FIELDS))) for _, k := range strings.Split(arg[0], ",") { m.Richs(SEARCH, nil, k, func(key string, value map[string]interface{}) { m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, arg[0], arg[1], kit.Select("", arg, 2)) diff --git a/base/web/share.go b/base/web/share.go index 3777ad66..3d6cd57c 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -30,8 +30,10 @@ func _share_local(m *ice.Message, arg ...string) { switch ls := strings.Split(p, "/"); ls[0] { case "etc", "var": // 私有文件 - m.Render(STATUS, http.StatusUnauthorized, "not auth") - return + if m.Option(ice.MSG_USERROLE) == aaa.VOID { + m.Render(STATUS, http.StatusUnauthorized, "not auth") + return + } default: if m.Warn(!m.Right(ls), ice.ErrNotAuth, m.Option(ice.MSG_USERROLE), " of ", p) { m.Render(STATUS, http.StatusUnauthorized, "not auth") diff --git a/core/code/bench.go b/core/code/bench.go index ff9f4e94..d773a544 100644 --- a/core/code/bench.go +++ b/core/code/bench.go @@ -2,6 +2,7 @@ package code import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" "github.com/shylinux/toolkits/util/bench" @@ -14,43 +15,7 @@ import ( "sync/atomic" ) -func _bench_list(m *ice.Message, zone string, id string, field ...interface{}) { - m.Richs(BENCH, nil, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) { - val = val[kit.MDB_META].(map[string]interface{}) - if zone = kit.Format(kit.Value(val, kit.MDB_ZONE)); id == "" { - m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { - // 查看信息 - // m.Push("操作", m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行")) - m.Push(zone, value, []string{ - kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE, - kit.MDB_NAME, NCONN, NREQS, kit.MDB_TEXT, - }, val) - }) - return - } - m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) { - // 查看信息 - m.Push("detail", value) - m.Push(kit.MDB_KEY, "操作") - // m.Push(kit.MDB_VALUE, m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行")) - }) - }) -} -func _bench_show(m *ice.Message, nconn, nreq int64, list []*http.Request) { - var body int64 - s, e := bench.HTTP(nconn, nreq, list, func(req *http.Request, res *http.Response) { - n, _ := io.Copy(ioutil.Discard, res.Body) - atomic.AddInt64(&body, n) - }) - m.Assert(e) - - m.Echo(s.Show()) - m.Echo("body: %d\n", body) -} -func _bench_engine(m *ice.Message, kind, name, target string, arg ...string) { - for i := 0; i < len(arg); i += 2 { - m.Option(arg[i], arg[i+1]) - } +func _bench_http(m *ice.Message, kind, name, target string, arg ...string) { nconn := kit.Int64(kit.Select("10", m.Option(NCONN))) nreqs := kit.Int64(kit.Select("1000", m.Option(NREQS))) m.Echo("nconn: %d nreqs: %d\n", nconn, nreqs*nconn) @@ -72,90 +37,60 @@ func _bench_engine(m *ice.Message, kind, name, target string, arg ...string) { list = append(list, req) } } - _bench_show(m, nconn, nreqs, list) -} -func _bench_modify(m *ice.Message, zone, id, k, v, old string) { - m.Richs(BENCH, nil, zone, func(key string, val map[string]interface{}) { - switch k { - case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME: - // m.Warn(true, mdb.ErrDenyModify, k) - return - } - - m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) { - // 修改信息 - m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old) - kit.Value(value, k, v) - }) + var body int64 + s, e := bench.HTTP(nconn, nreqs, list, func(req *http.Request, res *http.Response) { + n, _ := io.Copy(ioutil.Discard, res.Body) + atomic.AddInt64(&body, n) }) -} -func _bench_insert(m *ice.Message, zone, kind, name, text string, nconn, nreqs string, arg ...string) { - m.Richs(BENCH, nil, zone, func(key string, value map[string]interface{}) { - id := m.Grow(BENCH, kit.Keys(kit.MDB_HASH, key), kit.Dict( - kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text, - NCONN, nconn, NREQS, nreqs, kit.MDB_EXTRA, kit.Dict(arg), - )) - m.Log_INSERT(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name) - m.Echo("%d", id) - }) -} -func _bench_create(m *ice.Message, zone string, arg ...string) { - m.Rich(BENCH, nil, kit.Data(kit.MDB_ZONE, zone, arg)) - m.Log_CREATE(kit.MDB_ZONE, zone) + m.Assert(e) + + m.Echo(s.Show()) + m.Echo("body: %d\n", body) + m.Option(ice.MSG_PROCESS, "_inner") } -const BENCH = "bench" const ( NCONN = "nconn" NREQS = "nreqs" ) +const BENCH = "bench" + func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - BENCH: {Name: "bench", Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)}, + BENCH: {Name: BENCH, Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)}, }, Commands: map[string]*ice.Command{ - BENCH: {Name: "bench zone=auto id=auto auto", Help: "性能压测", Action: map[string]*ice.Action{ + BENCH: {Name: "bench zone=auto id=auto auto insert", Help: "性能压测", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - _bench_create(m, arg[0]) + m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, arg) }}, - mdb.INSERT: {Name: "insert zone type name text nconn nreqs", Help: "插入", Hand: func(m *ice.Message, arg ...string) { - _bench_insert(m, arg[0], arg[1], arg[2], - kit.Select("http://localhost:9020/code/bench?cmd="+arg[2], arg, 3), - kit.Select("3", arg, 4), kit.Select("10", arg, 5)) + mdb.INSERT: {Name: "insert zone type=http,redis name text nconn=3 nreqs=10", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, kit.MDB_ZONE, arg[1]) + m.Cmdy(mdb.INSERT, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:]) }}, - mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - _bench_modify(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), arg[0], arg[1], kit.Select("", arg, 2)) + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, BENCH, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE)) }}, - mdb.ENGINE: {Name: "engine type name text arg...", Help: "引擎", Hand: func(m *ice.Message, arg ...string) { - _bench_engine(m, arg[0], arg[1], arg[2], arg[3:]...) - }}, - - kit.MDB_SHOW: {Name: "show type name text arg...", Help: "运行", Hand: func(m *ice.Message, arg ...string) { - if len(arg) < 4 { - m.Richs(BENCH, nil, m.Option(kit.MDB_ZONE), func(key string, val map[string]interface{}) { - m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, m.Option(kit.MDB_ID), func(index int, value map[string]interface{}) { - arg = kit.Simple(value[kit.MDB_TYPE], value[kit.MDB_NAME], value[kit.MDB_TEXT], value[kit.MDB_EXTRA]) - }) - }) + cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { + switch m.Option(kit.MDB_TYPE) { + case "http": + _bench_http(m, m.Option(kit.MDB_TYPE), m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT)) } - if len(arg) > 2 { - m.Option(kit.MDB_TYPE, arg[0]) - m.Option(kit.MDB_NAME, arg[1]) - m.Option(kit.MDB_TEXT, arg[2]) - for i := 3; i < len(arg)-1; i++ { - m.Option(arg[i], arg[i+1]) - } - } - m.Cmdy(mdb.ENGINE, m.Option(kit.MDB_TYPE), m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _bench_list(m, kit.Select(kit.MDB_FOREACH, arg, 0), kit.Select("", arg, 1)) + m.Option(mdb.FIELDS, kit.Select("time,count,zone", kit.Select("time,id,type,name,text,nconn,nreqs", mdb.DETAIL, len(arg) > 1), len(arg) > 0)) + m.Cmdy(mdb.SELECT, BENCH, "", mdb.ZONE, arg) + m.PushAction(kit.Select(mdb.REMOVE, cli.RUN, len(arg) > 0)) }}, - "/" + BENCH: {Name: "/bench cmd...", Help: "性能压测", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + + "/bench": {Name: "/bench cmd...", Help: "性能压测", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmdy(m.Optionv("cmd")) }}, }, diff --git a/core/code/code.shy b/core/code/code.shy index caea0695..fcbc8c07 100644 --- a/core/code/code.shy +++ b/core/code/code.shy @@ -6,10 +6,8 @@ chapter "code" # field "发布" web.code.publish # field "升级" web.code.upgrade -field "查看" web.code.inner -return - field "编辑" web.code.vimer +field "查看" web.code.inner field "收藏" web.code.favor field "测试" web.code.bench field "优化" web.code.pprof diff --git a/core/code/favor.go b/core/code/favor.go index bf67c356..8ca57a7e 100644 --- a/core/code/favor.go +++ b/core/code/favor.go @@ -18,11 +18,12 @@ func init() { FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TOPIC)}, }, Commands: map[string]*ice.Command{ - FAVOR: {Name: "favor topic id auto create export import", Help: "收藏夹", Action: map[string]*ice.Action{ + FAVOR: {Name: "favor topic id auto insert export import", Help: "收藏夹", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, FAVOR, "", mdb.HASH, arg) }}, mdb.INSERT: {Name: "insert topic=数据结构 type=go name=hi text=hello path file line", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, FAVOR, "", mdb.HASH, kit.MDB_TOPIC, arg[1]) m.Cmdy(mdb.INSERT, FAVOR, _sub_key(m, m.Option(kit.MDB_TOPIC)), mdb.LIST, arg[2:]) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { @@ -46,7 +47,7 @@ func init() { } }}, - INNER: {Name: "inner", Help: "inner", Hand: func(m *ice.Message, arg ...string) { + INNER: {Name: "inner", Help: "源代码", Hand: func(m *ice.Message, arg ...string) { if len(arg) > 0 && arg[0] == mdb.RENDER { m.Cmdy(INNER, arg[1:]) return @@ -56,7 +57,7 @@ func init() { m.Push(kit.SSH_ARG, kit.Format([]string{m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE), m.Option(kit.MDB_LINE)})) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(mdb.FIELDS, kit.Select("time,count,topic", kit.Select("time,id,type,name,text,path,file,line", mdb.DETAIL, len(arg) > 1)), len(arg) > 0) + m.Option(mdb.FIELDS, kit.Select("time,count,topic", kit.Select("time,id,type,name,text,path,file,line", mdb.DETAIL, len(arg) > 1), len(arg) > 0)) m.Cmdy(mdb.SELECT, FAVOR, "", mdb.ZONE, arg) m.PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0)) }}, diff --git a/core/code/go.go b/core/code/go.go index e3776ae5..cb1e16a6 100644 --- a/core/code/go.go +++ b/core/code/go.go @@ -14,22 +14,32 @@ import ( ) func _go_find(m *ice.Message, key string) { + fields := kit.Split(m.Option(mdb.FIELDS)) for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, "find", ".", "-name", key), "\n") { if p == "" { continue } - m.Push("file", strings.TrimPrefix(p, "./")) - m.Push("line", 1) - m.Push("text", "") + for _, k := range fields { + switch k { + case kit.MDB_FILE: + m.Push(k, strings.TrimPrefix(p, "./")) + case kit.MDB_LINE: + m.Push(k, 1) + case kit.MDB_TEXT: + m.Push(k, "") + } + } } } func _go_tags(m *ice.Message, key string) { - ls := strings.Split(key, ".") - key = ls[len(ls)-1] - if _, e := os.Stat(path.Join(m.Option(cli.CMD_DIR), ".tags")); e != nil { m.Cmd(cli.SYSTEM, "gotags", "-R", "-f", ".tags", "./") } + + fields := kit.Split(m.Option(mdb.FIELDS)) + ls := strings.Split(key, ".") + key = ls[len(ls)-1] + for _, l := range strings.Split(m.Cmdx(cli.SYSTEM, "grep", "^"+key+"\\>", ".tags"), "\n") { ls := strings.SplitN(l, "\t", 2) if len(ls) < 2 { @@ -42,22 +52,35 @@ func _go_tags(m *ice.Message, key string) { text := strings.TrimSuffix(strings.TrimPrefix(ls[0], "/^"), "$/") line := kit.Int(text) - p := path.Join(m.Option(cli.CMD_DIR), file) - f, e := os.Open(p) + f, e := os.Open(path.Join(m.Option(cli.CMD_DIR), file)) m.Assert(e) + defer f.Close() + bio := bufio.NewScanner(f) for i := 1; bio.Scan(); i++ { if i == line || bio.Text() == text { - m.Push("file", strings.TrimPrefix(file, "./")) - m.Push("line", i) - m.Push("text", bio.Text()) + for _, k := range fields { + switch k { + case kit.MDB_FILE: + m.Push(k, strings.TrimPrefix(file, "./")) + case kit.MDB_LINE: + m.Push(k, i) + case kit.MDB_TEXT: + m.Push(k, bio.Text()) + } + } } } } - m.Sort("line", "int") } func _go_grep(m *ice.Message, key string) { - m.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n") + fields := kit.Split(m.Option(mdb.FIELDS)) + + msg := m.Spawn() + msg.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n") + msg.Table(func(index int, value map[string]string, head []string) { + m.Push("", value, fields) + }) } func _go_help(m *ice.Message, key string) { p := m.Cmd(cli.SYSTEM, "go", "doc", key).Append(cli.CMD_OUT) @@ -70,13 +93,20 @@ func _go_help(m *ice.Message, key string) { } res := strings.Join(ls, "\n") - m.Push("file", key+".godoc") - m.Push("line", 1) - m.Push("text", string(res)) + for _, k := range kit.Split(m.Option(mdb.FIELDS)) { + switch k { + case kit.MDB_FILE: + m.Push(k, key+".godoc") + case kit.MDB_LINE: + m.Push(k, 1) + case kit.MDB_TEXT: + m.Push(k, string(res)) + } + } } const GO = "go" -const GODOC = "godoc" +const DOC = "godoc" const MOD = "mod" const SUM = "sum" @@ -84,20 +114,20 @@ func init() { Index.Register(&ice.Context{Name: GO, Help: "go", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(mdb.PLUGIN, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.SEARCH, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.ENGINE, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, GO, m.Prefix(GO)) + m.Cmd(mdb.RENDER, mdb.CREATE, GO, m.Prefix(GO)) + m.Cmd(mdb.ENGINE, mdb.CREATE, GO, m.Prefix(GO)) + m.Cmd(mdb.SEARCH, mdb.CREATE, GO, m.Prefix(GO)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, GODOC, GO, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, GODOC, GODOC, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.SEARCH, mdb.CREATE, GODOC, GO, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, DOC, m.Prefix(DOC)) + m.Cmd(mdb.RENDER, mdb.CREATE, DOC, m.Prefix(DOC)) + m.Cmd(mdb.SEARCH, mdb.CREATE, DOC, m.Prefix(GO)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, MOD, MOD, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, MOD, MOD, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, MOD, m.Prefix(MOD)) + m.Cmd(mdb.RENDER, mdb.CREATE, MOD, m.Prefix(MOD)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, SUM, SUM, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, SUM, SUM, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, SUM, m.Prefix(SUM)) + m.Cmd(mdb.RENDER, mdb.CREATE, SUM, m.Prefix(SUM)) }}, SUM: {Name: SUM, Help: "sum", Action: map[string]*ice.Action{ @@ -116,7 +146,10 @@ func init() { m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, }}, - GODOC: {Name: GODOC, Help: "godoc", Action: map[string]*ice.Action{ + DOC: {Name: DOC, Help: "doc", Action: map[string]*ice.Action{ + mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { + m.Echo(m.Conf(GO, "meta.plug")) + }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Option(cli.CMD_DIR, arg[2]) m.Echo(m.Cmdx(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], "."+arg[0]))) @@ -126,16 +159,6 @@ func init() { mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(GO, "meta.plug")) }}, - mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == kit.MDB_FOREACH { - return - } - m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) - _go_find(m, kit.Select("main", arg, 1)) - _go_tags(m, kit.Select("main", arg, 1)) - _go_help(m, kit.Select("main", arg, 1)) - _go_grep(m, kit.Select("main", arg, 1)) - }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, @@ -148,7 +171,17 @@ func init() { } m.Set(ice.MSG_APPEND) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == kit.MDB_FOREACH { + return + } + m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) + _go_find(m, kit.Select("main", arg, 1)) + _go_tags(m, kit.Select("main", arg, 1)) + _go_help(m, kit.Select("main", arg, 1)) + _go_grep(m, kit.Select("main", arg, 1)) + }}, + }}, }, Configs: map[string]*ice.Config{ GO: {Name: GO, Help: "go", Value: kit.Data( @@ -165,7 +198,7 @@ func init() { ), "plug", kit.Dict( "split", kit.Dict( - "space", " \t", + "space", "\t ", "operator", "{[(&.,:;!|<>)]}", ), "prefix", kit.Dict( diff --git a/core/code/inner.go b/core/code/inner.go index 7f9313cc..25e87459 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -53,7 +53,7 @@ const INNER = "inner" func init() { Index.Merge(&ice.Context{ Commands: map[string]*ice.Command{ - INNER: {Name: "inner path=src/ file=main.go line=1 auto project search", Help: "阅读器", Meta: kit.Dict( + INNER: {Name: "inner path=src/ file=main.go line=1 auto project search", Help: "源代码", Meta: kit.Dict( "display", "/plugin/local/code/inner.js", "style", "editor", "trans", kit.Dict("project", "项目"), ), Action: map[string]*ice.Action{ @@ -71,18 +71,13 @@ func init() { _inner_show(m, arg[0], arg[1], arg[2], arg[3:]...) }}, mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + m.Option(mdb.FIELDS, "file,line,text") m.Cmdy(mdb.SEARCH, arg) }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(FAVOR, mdb.INPUTS, arg) - }}, - FAVOR: {Name: "favor", Help: "收藏", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(FAVOR, mdb.INSERT, arg) - }}, - nfs.DIR: {Name: "dir", Help: "目录", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(nfs.DIR, arg) - }}, + FAVOR: {Name: "favor insert", Help: "收藏"}, + mdb.INPUTS: {Name: "favor inputs", Help: "补全"}, + nfs.DIR: {Name: "dir", Help: "目录"}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) < 2 { m.Cmdy(nfs.DIR, kit.Select("./", arg, 0)) @@ -92,7 +87,7 @@ func init() { }}, }, Configs: map[string]*ice.Config{ - INNER: {Name: "inner", Help: "阅读器", Value: kit.Data( + INNER: {Name: "inner", Help: "源代码", Value: kit.Data( "source", kit.Dict( "license", "true", "makefile", "true", "shy", "true", "py", "true", @@ -102,7 +97,6 @@ func init() { "log", "true", "err", "true", "md", "true", "conf", "true", "toml", "true", - "ts", "true", "tsx", "true", "vue", "true", "sass", "true", ), "plug", kit.Dict( "makefile", kit.Dict( diff --git a/core/code/pprof.go b/core/code/pprof.go index 188bea61..0eb929f8 100644 --- a/core/code/pprof.go +++ b/core/code/pprof.go @@ -2,7 +2,11 @@ package code import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" + "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/tcp" + "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" "net/http" @@ -10,72 +14,14 @@ import ( "strings" ) -func _pprof_list(m *ice.Message, zone string, id string, field ...interface{}) { - m.Richs(PPROF, nil, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) { - val = val[kit.MDB_META].(map[string]interface{}) - if zone = kit.Format(kit.Value(val, kit.MDB_ZONE)); id == "" { - m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { - // 列表信息 - // m.Push("操作", m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行")) - m.Push(zone, value, []string{ - kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE, - kit.MDB_NAME, kit.MDB_TEXT, SECONDS, BINNARY, SERVICE, - }, val) - }) - } else { - m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) { - // 详细信息 - m.Push("detail", value) - m.Push(kit.MDB_KEY, "操作") - // m.Push(kit.MDB_VALUE, m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行")) - }) - } - }) -} -func _pprof_modify(m *ice.Message, zone, id, k, v, old string) { - k = kit.Select(k, m.Option(kit.MDB_KEY)) - m.Richs(PPROF, nil, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) { - switch k { - case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME: - // m.Warn(true, mdb.ErrDenyModify, k) - return - case BINNARY, SERVICE, SECONDS: - // 修改信息 - m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old) - val = val[kit.MDB_META].(map[string]interface{}) - kit.Value(val, k, v) - return - } - - m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) { - // 修改信息 - m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old) - kit.Value(value, k, v) - }) - }) -} -func _pprof_insert(m *ice.Message, zone, kind, name, text string, arg ...string) { - m.Richs(PPROF, nil, zone, func(key string, val map[string]interface{}) { - id := m.Grow(PPROF, kit.Keys(kit.MDB_HASH, key), kit.Dict( - kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text, - kit.MDB_EXTRA, kit.Dict(arg), - )) - m.Log_INSERT(kit.MDB_META, PPROF, kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name) - m.Echo("%d", id) - }) -} -func _pprof_create(m *ice.Message, zone string, binnary, service string, seconds string, arg ...string) { - m.Rich(PPROF, nil, kit.Data(kit.MDB_ZONE, zone, BINNARY, binnary, SERVICE, service, SECONDS, seconds, arg)) - m.Log_CREATE(kit.MDB_ZONE, zone) -} - -const PPROF = "pprof" const ( BINNARY = "binnary" SERVICE = "service" SECONDS = "seconds" ) +const PPROF = "pprof" + func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ @@ -84,29 +30,55 @@ func init() { )}, }, Commands: map[string]*ice.Command{ - PPROF: {Name: "pprof zone=auto id=auto auto", Help: "性能分析", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create zone [binnary [service [seconds]]]", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - _pprof_create(m, arg[0], kit.Select("bin/ice.bin", arg, 1), - kit.Select("http://localhost:9020/code/pprof/profile", arg, 2), kit.Select("3", arg, 3)) + PPROF: {Name: "pprof zone=auto id=auto auto create", Help: "性能分析", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create zone binnary service seconds", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, PPROF, "", mdb.HASH, arg) }}, - mdb.INSERT: {Name: "insert zone type name [text]", Help: "插入", Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 2 { - arg = append(arg, "") + mdb.INSERT: {Name: "insert zone type name text", Help: "插入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:]) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, PPROF, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE)) + }}, + + cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { + msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, m.Option(SERVICE), SECONDS, m.Option(SECONDS)) + + cmd := kit.Simple(m.Confv(PPROF, "meta.pprof"), "-text", m.Option(BINNARY), msg.Append(kit.MDB_FILE)) + res := strings.Split(m.Cmdx(cli.SYSTEM, cmd), "\n") + if len(res) > 20 { + res = res[:20] } - if len(arg) == 3 { - arg = append(arg, "") - } - _pprof_insert(m, arg[0], arg[1], arg[2], kit.Select("http://localhost:9020/code/bench?cmd="+arg[2], arg, 3), arg[4:]...) + + m.Cmd(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_TEXT, strings.Join(res, "\n"), kit.MDB_FILE, msg.Append(kit.MDB_FILE)) + m.Echo(strings.Join(res, "\n")) + m.Option(ice.MSG_PROCESS, "_inner") }}, - mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - _pprof_modify(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), arg[0], arg[1], kit.Select("", arg, 2)) - }}, - kit.MDB_SHOW: {Name: "show type name text arg...", Help: "运行", Hand: func(m *ice.Message, arg ...string) { - // _pprof_show(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID)) + web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) { + m.Option(ice.MSG_PROCESS, "_inner") + u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) + p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.Right) + + m.Cmd(cli.DAEMON, m.Confv(PPROF, "meta.pprof"), "-http="+p, m.Option(BINNARY), m.Option(kit.MDB_FILE)) + m.Echo("http://%s/ui/top", p) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _pprof_list(m, kit.Select(kit.MDB_FOREACH, arg, 0), kit.Select("", arg, 1)) + m.Option(mdb.FIELDS, kit.Select("time,count,zone,binnary,service,seconds", kit.Select("time,id,text,binnary,file", mdb.DETAIL, len(arg) > 1), len(arg) > 0)) + m.Cmdy(mdb.SELECT, PPROF, "", mdb.ZONE, arg) + if len(arg) == 0 { + m.PushAction(cli.RUN, mdb.REMOVE) + + } else { + m.Table(func(index int, value map[string]string, head []string) { + m.PushDownload("pprof.pd.gz", value[kit.MDB_FILE]) + m.PushButton(web.SERVE) + }) + } }}, + "/pprof/": {Name: "/pprof/", Help: "性能分析", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.R.URL.Path = strings.Replace("/code"+m.R.URL.Path, "code", "debug", 1) http.DefaultServeMux.ServeHTTP(m.W, m.R) diff --git a/core/code/vimer.go b/core/code/vimer.go index ae6090f2..1cb70472 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -1,46 +1,34 @@ package code import ( + "strings" + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/nfs" - "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" "path" ) -func _vimer_path(m *ice.Message, arg ...string) string { - return path.Join(m.Option(ice.MSG_LOCAL), path.Join(arg...)) -} -func _vimer_upload(m *ice.Message, dir string) { - up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) - if p := _vimer_path(m, dir, up[1]); m.Option(ice.MSG_USERPOD) == "" { - m.Cmdy(web.CACHE, web.WATCH, up[0], p) - } else { - m.Cmdy(web.SPIDE, web.SPIDE_DEV, web.SPIDE_SAVE, p, web.SPIDE_GET, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+up[0])) - } -} - const VIMER = "vimer" func init() { Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{}, Commands: map[string]*ice.Command{ - VIMER: {Name: "vimer path=usr/demo file=hi.sh line=1 刷新:button=auto save project search", Help: "编辑器", Meta: kit.Dict( + VIMER: {Name: "vimer path=src/ file=main.go line=1 刷新:button=auto save display project search", Help: "编辑器", Meta: kit.Dict( "display", "/plugin/local/code/vimer.js", "style", "editor", - "trans", kit.Dict("project", "项目", "search", "搜索"), + "trans", kit.Dict("display", "运行", "project", "项目", "search", "搜索"), ), Action: map[string]*ice.Action{ - web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { - _vimer_upload(m, m.Option(kit.MDB_PATH)) - }}, nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.SAVE, path.Join(m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE))) }}, ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - if !m.Warn(!m.Right(arg)) { - m.Cmdy(arg) + if arg = kit.Split(strings.Join(arg, " ")); !m.Warn(!m.Right(arg)) { + if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 { + m.Cmdy(cli.SYSTEM, arg) + } } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/misc.go b/misc.go index 467ff819..971d7a87 100644 --- a/misc.go +++ b/misc.go @@ -86,7 +86,7 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message { case "a": m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), name)) case "download": - m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), path.Base(kit.Select(name, arg, 0)), name)) + m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), path.Base(name), name)) default: m.Push(key, name) } diff --git a/type.go b/type.go index 87bd702b..5cfb0f23 100644 --- a/type.go +++ b/type.go @@ -104,7 +104,7 @@ func (c *Context) _hand(m *Message, cmd *Command, key string, k string, h *Actio } } if h.Hand == nil { - m.Cmdy(kit.Split(h.Name)) + m.Cmdy(kit.Split(h.Name), arg) } else { h.Hand(m, arg...) }