1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-29 02:29:22 +08:00

opt pprof

This commit is contained in:
shaoying 2020-10-20 21:26:13 +08:00
parent beb3482c66
commit d4bb2126b0
12 changed files with 186 additions and 260 deletions

View File

@ -71,6 +71,9 @@ const (
CMD = "cmd" CMD = "cmd"
ARG = "arg" ARG = "arg"
DIR = "dir" DIR = "dir"
RUN = "run"
RES = "res"
ERR = "err"
) )
const ( const (
RESTART = "restart" RESTART = "restart"

View File

@ -30,7 +30,7 @@ func init() {
if strings.Contains(arg[1], ";") { if strings.Contains(arg[1], ";") {
arg = strings.Split(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], ",") { for _, k := range strings.Split(arg[0], ",") {
m.Richs(SEARCH, nil, k, func(key string, value map[string]interface{}) { 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)) m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, arg[0], arg[1], kit.Select("", arg, 2))

View File

@ -30,8 +30,10 @@ func _share_local(m *ice.Message, arg ...string) {
switch ls := strings.Split(p, "/"); ls[0] { switch ls := strings.Split(p, "/"); ls[0] {
case "etc", "var": case "etc", "var":
// 私有文件 // 私有文件
if m.Option(ice.MSG_USERROLE) == aaa.VOID {
m.Render(STATUS, http.StatusUnauthorized, "not auth") m.Render(STATUS, http.StatusUnauthorized, "not auth")
return return
}
default: default:
if m.Warn(!m.Right(ls), ice.ErrNotAuth, m.Option(ice.MSG_USERROLE), " of ", p) { if m.Warn(!m.Right(ls), ice.ErrNotAuth, m.Option(ice.MSG_USERROLE), " of ", p) {
m.Render(STATUS, http.StatusUnauthorized, "not auth") m.Render(STATUS, http.StatusUnauthorized, "not auth")

View File

@ -2,6 +2,7 @@ package code
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"github.com/shylinux/toolkits/util/bench" "github.com/shylinux/toolkits/util/bench"
@ -14,43 +15,7 @@ import (
"sync/atomic" "sync/atomic"
) )
func _bench_list(m *ice.Message, zone string, id string, field ...interface{}) { func _bench_http(m *ice.Message, kind, name, target string, arg ...string) {
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])
}
nconn := kit.Int64(kit.Select("10", m.Option(NCONN))) nconn := kit.Int64(kit.Select("10", m.Option(NCONN)))
nreqs := kit.Int64(kit.Select("1000", m.Option(NREQS))) nreqs := kit.Int64(kit.Select("1000", m.Option(NREQS)))
m.Echo("nconn: %d nreqs: %d\n", nconn, nreqs*nconn) 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) list = append(list, req)
} }
} }
_bench_show(m, nconn, nreqs, list)
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)
})
m.Assert(e)
m.Echo(s.Show())
m.Echo("body: %d\n", body)
m.Option(ice.MSG_PROCESS, "_inner")
} }
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)
})
})
}
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)
}
const BENCH = "bench"
const ( const (
NCONN = "nconn" NCONN = "nconn"
NREQS = "nreqs" NREQS = "nreqs"
) )
const BENCH = "bench"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ 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{ 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) { 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) { mdb.INSERT: {Name: "insert zone type=http,redis name text nconn=3 nreqs=10", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
_bench_insert(m, arg[0], arg[1], arg[2], m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, kit.MDB_ZONE, arg[1])
kit.Select("http://localhost:9020/code/bench?cmd="+arg[2], arg, 3), m.Cmdy(mdb.INSERT, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:])
kit.Select("3", arg, 4), kit.Select("10", arg, 5))
}}, }},
mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { mdb.MODIFY: {Name: "modify", 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)) 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) { cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
_bench_engine(m, arg[0], arg[1], arg[2], arg[3:]...) 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))
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])
})
})
} }
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) { }, 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")) m.Cmdy(m.Optionv("cmd"))
}}, }},
}, },

View File

@ -6,10 +6,8 @@ chapter "code"
# field "发布" web.code.publish # field "发布" web.code.publish
# field "升级" web.code.upgrade # field "升级" web.code.upgrade
field "查看" web.code.inner
return
field "编辑" web.code.vimer field "编辑" web.code.vimer
field "查看" web.code.inner
field "收藏" web.code.favor field "收藏" web.code.favor
field "测试" web.code.bench field "测试" web.code.bench
field "优化" web.code.pprof field "优化" web.code.pprof

View File

@ -18,11 +18,12 @@ func init() {
FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TOPIC)}, FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TOPIC)},
}, },
Commands: map[string]*ice.Command{ 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) { mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, FAVOR, "", mdb.HASH, arg) 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) { 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:]) 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) { 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 { if len(arg) > 0 && arg[0] == mdb.RENDER {
m.Cmdy(INNER, arg[1:]) m.Cmdy(INNER, arg[1:])
return 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)})) 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) { }, 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.Cmdy(mdb.SELECT, FAVOR, "", mdb.ZONE, arg)
m.PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0)) m.PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0))
}}, }},

View File

@ -14,22 +14,32 @@ import (
) )
func _go_find(m *ice.Message, key string) { 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") { for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, "find", ".", "-name", key), "\n") {
if p == "" { if p == "" {
continue continue
} }
m.Push("file", strings.TrimPrefix(p, "./")) for _, k := range fields {
m.Push("line", 1) switch k {
m.Push("text", "") 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) { 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 { if _, e := os.Stat(path.Join(m.Option(cli.CMD_DIR), ".tags")); e != nil {
m.Cmd(cli.SYSTEM, "gotags", "-R", "-f", ".tags", "./") 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") { for _, l := range strings.Split(m.Cmdx(cli.SYSTEM, "grep", "^"+key+"\\>", ".tags"), "\n") {
ls := strings.SplitN(l, "\t", 2) ls := strings.SplitN(l, "\t", 2)
if len(ls) < 2 { if len(ls) < 2 {
@ -42,22 +52,35 @@ func _go_tags(m *ice.Message, key string) {
text := strings.TrimSuffix(strings.TrimPrefix(ls[0], "/^"), "$/") text := strings.TrimSuffix(strings.TrimPrefix(ls[0], "/^"), "$/")
line := kit.Int(text) line := kit.Int(text)
p := path.Join(m.Option(cli.CMD_DIR), file) f, e := os.Open(path.Join(m.Option(cli.CMD_DIR), file))
f, e := os.Open(p)
m.Assert(e) m.Assert(e)
defer f.Close()
bio := bufio.NewScanner(f) bio := bufio.NewScanner(f)
for i := 1; bio.Scan(); i++ { for i := 1; bio.Scan(); i++ {
if i == line || bio.Text() == text { if i == line || bio.Text() == text {
m.Push("file", strings.TrimPrefix(file, "./")) for _, k := range fields {
m.Push("line", i) switch k {
m.Push("text", bio.Text()) 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) { 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) { func _go_help(m *ice.Message, key string) {
p := m.Cmd(cli.SYSTEM, "go", "doc", key).Append(cli.CMD_OUT) 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") res := strings.Join(ls, "\n")
m.Push("file", key+".godoc") for _, k := range kit.Split(m.Option(mdb.FIELDS)) {
m.Push("line", 1) switch k {
m.Push("text", string(res)) 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 GO = "go"
const GODOC = "godoc" const DOC = "godoc"
const MOD = "mod" const MOD = "mod"
const SUM = "sum" const SUM = "sum"
@ -84,20 +114,20 @@ func init() {
Index.Register(&ice.Context{Name: GO, Help: "go", Index.Register(&ice.Context{Name: GO, Help: "go",
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { 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.PLUGIN, mdb.CREATE, GO, m.Prefix(GO))
m.Cmd(mdb.RENDER, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, GO, m.Prefix(GO))
m.Cmd(mdb.SEARCH, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.ENGINE, mdb.CREATE, GO, m.Prefix(GO))
m.Cmd(mdb.ENGINE, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW)) 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.PLUGIN, mdb.CREATE, DOC, m.Prefix(DOC))
m.Cmd(mdb.RENDER, mdb.CREATE, GODOC, GODOC, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, DOC, m.Prefix(DOC))
m.Cmd(mdb.SEARCH, mdb.CREATE, GODOC, GO, c.Cap(ice.CTX_FOLLOW)) 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.PLUGIN, mdb.CREATE, MOD, m.Prefix(MOD))
m.Cmd(mdb.RENDER, mdb.CREATE, MOD, MOD, c.Cap(ice.CTX_FOLLOW)) 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.PLUGIN, mdb.CREATE, SUM, m.Prefix(SUM))
m.Cmd(mdb.RENDER, mdb.CREATE, SUM, SUM, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, SUM, m.Prefix(SUM))
}}, }},
SUM: {Name: SUM, Help: "sum", Action: map[string]*ice.Action{ 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])) 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) { mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, arg[2]) m.Option(cli.CMD_DIR, arg[2])
m.Echo(m.Cmdx(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], "."+arg[0]))) 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) { mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(m.Conf(GO, "meta.plug")) 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) { mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
}}, }},
@ -148,7 +171,17 @@ func init() {
} }
m.Set(ice.MSG_APPEND) 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{ Configs: map[string]*ice.Config{
GO: {Name: GO, Help: "go", Value: kit.Data( GO: {Name: GO, Help: "go", Value: kit.Data(

View File

@ -53,7 +53,7 @@ const INNER = "inner"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Commands: map[string]*ice.Command{ 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", "display", "/plugin/local/code/inner.js", "style", "editor",
"trans", kit.Dict("project", "项目"), "trans", kit.Dict("project", "项目"),
), Action: map[string]*ice.Action{ ), Action: map[string]*ice.Action{
@ -71,18 +71,13 @@ func init() {
_inner_show(m, arg[0], arg[1], arg[2], arg[3:]...) _inner_show(m, arg[0], arg[1], arg[2], arg[3:]...)
}}, }},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.FIELDS, "file,line,text")
m.Cmdy(mdb.SEARCH, arg) m.Cmdy(mdb.SEARCH, arg)
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { FAVOR: {Name: "favor insert", Help: "收藏"},
m.Cmdy(FAVOR, mdb.INPUTS, arg) mdb.INPUTS: {Name: "favor inputs", Help: "补全"},
}}, nfs.DIR: {Name: "dir", Help: "目录"},
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)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) < 2 { if len(arg) < 2 {
m.Cmdy(nfs.DIR, kit.Select("./", arg, 0)) m.Cmdy(nfs.DIR, kit.Select("./", arg, 0))
@ -92,7 +87,7 @@ func init() {
}}, }},
}, },
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
INNER: {Name: "inner", Help: "阅读器", Value: kit.Data( INNER: {Name: "inner", Help: "源代码", Value: kit.Data(
"source", kit.Dict( "source", kit.Dict(
"license", "true", "makefile", "true", "license", "true", "makefile", "true",
"shy", "true", "py", "true", "shy", "true", "py", "true",
@ -102,7 +97,6 @@ func init() {
"log", "true", "err", "true", "log", "true", "err", "true",
"md", "true", "conf", "true", "toml", "true", "md", "true", "conf", "true", "toml", "true",
"ts", "true", "tsx", "true", "vue", "true", "sass", "true",
), ),
"plug", kit.Dict( "plug", kit.Dict(
"makefile", kit.Dict( "makefile", kit.Dict(

View File

@ -2,7 +2,11 @@ package code
import ( import (
ice "github.com/shylinux/icebergs" 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/mdb"
"github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"net/http" "net/http"
@ -10,72 +14,14 @@ import (
"strings" "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 ( const (
BINNARY = "binnary" BINNARY = "binnary"
SERVICE = "service" SERVICE = "service"
SECONDS = "seconds" SECONDS = "seconds"
) )
const PPROF = "pprof"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
@ -84,29 +30,55 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
PPROF: {Name: "pprof zone=auto id=auto auto", Help: "性能分析", Action: map[string]*ice.Action{ 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) { 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), m.Cmdy(mdb.INSERT, PPROF, "", mdb.HASH, arg)
kit.Select("http://localhost:9020/code/pprof/profile", arg, 2), kit.Select("3", arg, 3))
}}, }},
mdb.INSERT: {Name: "insert zone type name [text]", Help: "插入", Hand: func(m *ice.Message, arg ...string) { mdb.INSERT: {Name: "insert zone type name text", Help: "插入", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 2 { m.Cmdy(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:])
arg = append(arg, "") }},
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, "") 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"))
_pprof_insert(m, arg[0], arg[1], arg[2], kit.Select("http://localhost:9020/code/bench?cmd="+arg[2], arg, 3), arg[4:]...) m.Option(ice.MSG_PROCESS, "_inner")
}}, }},
mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { web.SERVE: {Name: "serve", 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)) m.Option(ice.MSG_PROCESS, "_inner")
}}, u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
kit.MDB_SHOW: {Name: "show type name text arg...", Help: "运行", Hand: func(m *ice.Message, arg ...string) { p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.Right)
// _pprof_show(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID))
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) { }, 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) { "/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) m.R.URL.Path = strings.Replace("/code"+m.R.URL.Path, "code", "debug", 1)
http.DefaultServeMux.ServeHTTP(m.W, m.R) http.DefaultServeMux.ServeHTTP(m.W, m.R)

View File

@ -1,46 +1,34 @@
package code package code
import ( import (
"strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/nfs"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"path" "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" const VIMER = "vimer"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{},
Commands: map[string]*ice.Command{ 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", "display", "/plugin/local/code/vimer.js", "style", "editor",
"trans", kit.Dict("project", "项目", "search", "搜索"), "trans", kit.Dict("display", "运行", "project", "项目", "search", "搜索"),
), Action: map[string]*ice.Action{ ), 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) { 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))) 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) { ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
if !m.Warn(!m.Right(arg)) { if arg = kit.Split(strings.Join(arg, " ")); !m.Warn(!m.Right(arg)) {
m.Cmdy(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) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {

View File

@ -86,7 +86,7 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message {
case "a": case "a":
m.Push(key, fmt.Sprintf(`<a href="%s" target="_blank">%s</a>`, kit.Select(name, arg, 0), name)) m.Push(key, fmt.Sprintf(`<a href="%s" target="_blank">%s</a>`, kit.Select(name, arg, 0), name))
case "download": case "download":
m.Push(key, fmt.Sprintf(`<a href="%s" download="%s">%s</a>`, kit.Select(name, arg, 0), path.Base(kit.Select(name, arg, 0)), name)) m.Push(key, fmt.Sprintf(`<a href="%s" download="%s">%s</a>`, kit.Select(name, arg, 0), path.Base(name), name))
default: default:
m.Push(key, name) m.Push(key, name)
} }

View File

@ -104,7 +104,7 @@ func (c *Context) _hand(m *Message, cmd *Command, key string, k string, h *Actio
} }
} }
if h.Hand == nil { if h.Hand == nil {
m.Cmdy(kit.Split(h.Name)) m.Cmdy(kit.Split(h.Name), arg)
} else { } else {
h.Hand(m, arg...) h.Hand(m, arg...)
} }