1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-28 02:02:02 +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"
ARG = "arg"
DIR = "dir"
RUN = "run"
RES = "res"
ERR = "err"
)
const (
RESTART = "restart"

View File

@ -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))

View File

@ -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")

View File

@ -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"))
}},
},

View File

@ -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

View File

@ -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))
}},

View File

@ -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(

View File

@ -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(

View File

@ -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)

View File

@ -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) {

View File

@ -86,7 +86,7 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message {
case "a":
m.Push(key, fmt.Sprintf(`<a href="%s" target="_blank">%s</a>`, kit.Select(name, arg, 0), name))
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:
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 {
m.Cmdy(kit.Split(h.Name))
m.Cmdy(kit.Split(h.Name), arg)
} else {
h.Hand(m, arg...)
}