mirror of
https://shylinux.com/x/icebergs
synced 2025-04-28 02:02:02 +08:00
opt pprof
This commit is contained in:
parent
beb3482c66
commit
d4bb2126b0
@ -71,6 +71,9 @@ const (
|
||||
CMD = "cmd"
|
||||
ARG = "arg"
|
||||
DIR = "dir"
|
||||
RUN = "run"
|
||||
RES = "res"
|
||||
ERR = "err"
|
||||
)
|
||||
const (
|
||||
RESTART = "restart"
|
||||
|
@ -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))
|
||||
|
@ -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")
|
||||
|
@ -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"))
|
||||
}},
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
}},
|
||||
|
115
core/code/go.go
115
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(
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
2
misc.go
2
misc.go
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user