mirror of
https://shylinux.com/x/icebergs
synced 2025-05-06 13:17:03 +08:00
add mdb.engine
This commit is contained in:
parent
d4da81ce94
commit
600ace0c40
@ -1,8 +1,8 @@
|
||||
package aaa
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/toolkits"
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
const ( // 用户角色
|
||||
@ -35,6 +35,13 @@ func _role_list(m *ice.Message, userrole string) {
|
||||
}
|
||||
})
|
||||
}
|
||||
func _role_user(m *ice.Message, userrole string, username ...string) {
|
||||
m.Richs(ROLE, nil, userrole, func(key string, value map[string]interface{}) {
|
||||
for _, user := range username {
|
||||
kit.Value(value, kit.Keys(USER, user), true)
|
||||
}
|
||||
})
|
||||
}
|
||||
func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
|
||||
if userrole == ROOT {
|
||||
// 超级用户
|
||||
@ -99,7 +106,7 @@ func init() {
|
||||
ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ROLE: {Name: "role [role]", Help: "角色", Action: map[string]*ice.Action{
|
||||
ROLE: {Name: "role [role [user...]]", Help: "角色", Action: map[string]*ice.Action{
|
||||
White: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
|
||||
_role_white(m, arg[0], kit.Keys(arg[1:]), true)
|
||||
}},
|
||||
@ -112,6 +119,9 @@ func init() {
|
||||
}
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 1 {
|
||||
_role_user(m, arg[0], arg[1:]...)
|
||||
}
|
||||
_role_list(m, kit.Select("", arg, 0))
|
||||
}},
|
||||
},
|
||||
|
@ -1,11 +1,11 @@
|
||||
package aaa
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/base/gdb"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
"github.com/shylinux/toolkits"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"strings"
|
||||
)
|
||||
@ -55,11 +55,16 @@ func UserRoot(m *ice.Message) {
|
||||
cli.PassWord = cli.UserName
|
||||
_user_create(m, cli.UserName, cli.PassWord)
|
||||
}
|
||||
func UserRole(m *ice.Message, username interface{}) string {
|
||||
if username == cli.UserName {
|
||||
func UserRole(m *ice.Message, username interface{}) (role string) {
|
||||
if role = VOID; username == cli.UserName {
|
||||
return ROOT
|
||||
}
|
||||
return VOID
|
||||
m.Richs(ROLE, nil, TECH, func(key string, value map[string]interface{}) {
|
||||
if kit.Value(value, kit.Keys(USER, username)) == true {
|
||||
role = TECH
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
func UserLogin(m *ice.Message, username, password string) bool {
|
||||
if _user_login(m, username, password) {
|
||||
|
@ -1,9 +1,10 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/ctx"
|
||||
"github.com/shylinux/toolkits"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"os"
|
||||
"os/user"
|
||||
@ -78,6 +79,10 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
|
||||
n := kit.Int(kit.Select("20", m.Conf(RUNTIME, "host.GOMAXPROCS")))
|
||||
m.Logs("host", "gomaxprocs", n)
|
||||
runtime.GOMAXPROCS(n)
|
||||
|
||||
m.Cmdy(mdb.ENGINE, mdb.CREATE, "shell", m.AddCmd(&ice.Command{Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(SYSTEM, arg[2])
|
||||
}}))
|
||||
}},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Save(RUNTIME, SYSTEM)
|
||||
|
28
base/mdb/engine.go
Normal file
28
base/mdb/engine.go
Normal file
@ -0,0 +1,28 @@
|
||||
package mdb
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
const ENGINE = "engine"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
ENGINE: {Name: "engine", Help: "引擎", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ENGINE: {Name: "engine type name text arg...", Help: "引擎", Action: map[string]*ice.Action{
|
||||
CREATE: {Name: "create type name [text]", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Rich(ENGINE, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, kit.Select("", arg, 2)))
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if m.Richs(ENGINE, nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), arg)
|
||||
}) == nil {
|
||||
m.Cmdy(arg[0], ENGINE, arg)
|
||||
}
|
||||
}},
|
||||
}}, nil)
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package mdb
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/toolkits"
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
"github.com/shylinux/toolkits/task"
|
||||
|
||||
"encoding/csv"
|
||||
@ -179,6 +179,9 @@ func _dict_export(m *ice.Message, prefix, key, file string) {
|
||||
m.Log_EXPORT(kit.MDB_FILE, p)
|
||||
}
|
||||
|
||||
const (
|
||||
ErrDenyModify = "deny modify "
|
||||
)
|
||||
const (
|
||||
CSV = "csv"
|
||||
JSON = "json"
|
||||
@ -201,9 +204,6 @@ const (
|
||||
DELETE = "delete"
|
||||
SELECT = "select"
|
||||
MODIFY = "modify"
|
||||
|
||||
PARSER = "parser"
|
||||
ADVISE = "advise"
|
||||
)
|
||||
|
||||
var Index = &ice.Context{Name: "mdb", Help: "数据模块",
|
||||
@ -242,5 +242,7 @@ var Index = &ice.Context{Name: "mdb", Help: "数据模块",
|
||||
}
|
||||
|
||||
func init() {
|
||||
ice.Index.Register(Index, nil, IMPORT, EXPORT, SELECT, SEARCH, RENDER)
|
||||
ice.Index.Register(Index, nil, IMPORT, EXPORT, SELECT,
|
||||
PLUGIN, ENGINE, SEARCH, RENDER,
|
||||
)
|
||||
}
|
||||
|
26
base/mdb/plugin.go
Normal file
26
base/mdb/plugin.go
Normal file
@ -0,0 +1,26 @@
|
||||
package mdb
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
const PLUGIN = "plugin"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
PLUGIN: {Name: "plugin", Help: "插件", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
PLUGIN: {Name: "plugin type name text arg...", Help: "插件", Action: map[string]*ice.Action{
|
||||
CREATE: {Name: "create type name [text]", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Rich(PLUGIN, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, kit.Select("", arg, 2)))
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Richs(PLUGIN, nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), arg)
|
||||
})
|
||||
}},
|
||||
}}, nil)
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package mdb
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/toolkits"
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
const RENDER = "render"
|
||||
@ -19,7 +19,7 @@ func init() {
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Richs(RENDER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), RENDER, arg[0], arg[1], kit.Select("", arg, 2))
|
||||
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), arg[0], arg[1], kit.Select("", arg, 2))
|
||||
})
|
||||
}},
|
||||
}}, nil)
|
||||
|
@ -3,6 +3,7 @@ package web
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/aaa"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
"github.com/skip2/go-qrcode"
|
||||
|
||||
@ -89,3 +90,34 @@ func RenderStatus(msg *ice.Message, code int, text string) { // name path expire
|
||||
msg.W.WriteHeader(code)
|
||||
msg.W.Write([]byte(text))
|
||||
}
|
||||
|
||||
var RENDER = struct {
|
||||
Button string
|
||||
Field string
|
||||
A string
|
||||
}{
|
||||
Button: "button",
|
||||
Field: "field",
|
||||
A: "a",
|
||||
}
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Commands: map[string]*ice.Command{
|
||||
mdb.RENDER: {Action: map[string]*ice.Action{
|
||||
RENDER.Button: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo(`<input type="button" value="%s">`, arg[0])
|
||||
}},
|
||||
RENDER.Field: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo(`<fieldset><legend>%s(%s)</legend><form></form></fieldset>`, arg[0], arg[1])
|
||||
}},
|
||||
RENDER.A: {Hand: func(m *ice.Message, arg ...string) {
|
||||
u := kit.Select(m.Conf(SHARE, "meta.domain"), arg, 1)
|
||||
m.Echo(`<a href="%s" target="_blank">%s</a>`, u, arg[0])
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Echo(`<input type="%s" value="%s">`, arg[0], arg[1])
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
}
|
||||
|
@ -125,7 +125,9 @@ func _space_echo(msg *ice.Message, source, target []string, c *websocket.Conn, n
|
||||
msg.Log("send", "%v->%v %v %v", source, target, msg.Detailv(), msg.Format("meta"))
|
||||
}
|
||||
func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
|
||||
if msg.Right(msg.Detailv()) {
|
||||
msg = msg.Cmd()
|
||||
}
|
||||
msg.Set("_option")
|
||||
_space_echo(msg, []string{}, kit.Revert(source)[1:], c, name)
|
||||
msg.Cost("%v->%v %v %v", source, target, msg.Detailv(), msg.Format("append"))
|
||||
|
@ -97,6 +97,10 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Load()
|
||||
|
||||
for k := range c.Commands[mdb.RENDER].Action {
|
||||
m.Cmdy(mdb.RENDER, mdb.CREATE, k, mdb.RENDER, c.Cap(ice.CTX_FOLLOW))
|
||||
}
|
||||
|
||||
m.Cmd(SPIDE, mdb.CREATE, "self", kit.Select("http://:9020", m.Conf(cli.RUNTIME, "conf.ctx_self")))
|
||||
m.Cmd(SPIDE, mdb.CREATE, "dev", kit.Select("http://:9020", m.Conf(cli.RUNTIME, "conf.ctx_dev")))
|
||||
m.Cmd(SPIDE, mdb.CREATE, "shy", kit.Select("https://shylinux.com:443", m.Conf(cli.RUNTIME, "conf.ctx_shy")))
|
||||
|
@ -1,14 +1,16 @@
|
||||
package code
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
"github.com/shylinux/toolkits/logs"
|
||||
log "github.com/shylinux/toolkits/logs"
|
||||
"github.com/shylinux/toolkits/util/bench"
|
||||
"github.com/shylinux/toolkits/util/bench/redis"
|
||||
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
@ -16,19 +18,13 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
BENCH = "bench"
|
||||
NCONN = "nconn"
|
||||
NREQS = "nreqs"
|
||||
)
|
||||
|
||||
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("操作", `<input type="button" value="运行">`)
|
||||
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,
|
||||
@ -40,18 +36,16 @@ func _bench_list(m *ice.Message, zone string, id string, field ...interface{}) {
|
||||
// 查看信息
|
||||
m.Push("detail", value)
|
||||
m.Push(kit.MDB_KEY, "操作")
|
||||
m.Push(kit.MDB_VALUE, `<input type="button" value="运行">`)
|
||||
m.Push(kit.MDB_VALUE, m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行"))
|
||||
})
|
||||
})
|
||||
}
|
||||
func _bench_show(m *ice.Message, nconn, nreq int64, list []*http.Request) {
|
||||
nout, e := os.OpenFile("/dev/null", os.O_WRONLY, 0660)
|
||||
m.Assert(e)
|
||||
m.Log_CONF(NCONN, nconn, NREQS, nreq)
|
||||
|
||||
var body int64
|
||||
m.Logs(NCONN, nconn, NREQS, nreq)
|
||||
s, e := bench.HTTP(nconn, nreq, list, func(req *http.Request, res *http.Response) {
|
||||
n, _ := io.Copy(nout, res.Body)
|
||||
n, _ := io.Copy(ioutil.Discard, res.Body)
|
||||
atomic.AddInt64(&body, n)
|
||||
})
|
||||
m.Assert(e)
|
||||
@ -60,92 +54,26 @@ func _bench_show(m *ice.Message, nconn, nreq int64, list []*http.Request) {
|
||||
m.Echo("body: %d\n", body)
|
||||
}
|
||||
func _bench_redis(m *ice.Message, nconn, nreq int64, hosts []string, cmds []string) {
|
||||
m.Logs("info", "hosts", hosts, "cmds", cmds, nreq, nconn)
|
||||
s, e := redis.Redis(nconn, nreq, hosts, cmds, func(cmd string, arg []interface{}, reply interface{}) {
|
||||
})
|
||||
m.Log_CONF(NCONN, nconn, NREQS, nreq, "cmds", cmds, "hosts", hosts)
|
||||
|
||||
s, e := redis.Redis(nconn, nreq, hosts, cmds, nil)
|
||||
m.Assert(e)
|
||||
m.Echo("cmds: %s QPS: %.2f n/s AVG: %s time: %s \n", cmds, s.QPS, log.FmtDuration(s.Cost/time.Duration(s.NReq)), log.FmtDuration(s.EndTime.Sub(s.BeginTime)))
|
||||
}
|
||||
func _bench_modify(m *ice.Message, zone, id, pro, set, old string) {
|
||||
m.Richs(BENCH, nil, zone, func(key string, val map[string]interface{}) {
|
||||
switch pro {
|
||||
case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
|
||||
m.Warn(true, "deny modify %v", pro)
|
||||
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, pro, kit.MDB_VALUE, set, "old", old)
|
||||
kit.Value(value, pro, set)
|
||||
})
|
||||
})
|
||||
}
|
||||
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) {
|
||||
if m.Richs(BENCH, nil, zone, nil) == nil {
|
||||
m.Rich(BENCH, nil, kit.Data(kit.MDB_ZONE, zone,
|
||||
// 添加信息
|
||||
arg))
|
||||
m.Log_CREATE(kit.MDB_ZONE, zone)
|
||||
}
|
||||
m.Echo("cmds: %s QPS: %.2f n/s AVG: %s time: %s \n", cmds, s.QPS,
|
||||
log.FmtDuration(s.Cost/time.Duration(s.NReq)), log.FmtDuration(s.EndTime.Sub(s.BeginTime)))
|
||||
}
|
||||
func _bench_engine(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)
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
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{
|
||||
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_bench_create(m, arg[0])
|
||||
}},
|
||||
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.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))
|
||||
}},
|
||||
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_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])
|
||||
}
|
||||
}
|
||||
|
||||
target := kit.Select(m.Option(kit.MDB_TEXT), arg, 2)
|
||||
if strings.HasPrefix(target, "redis://") {
|
||||
hosts := []string{}
|
||||
cmds := strings.Split((m.Option(kit.MDB_NAME)), ",")
|
||||
for _, v := range strings.Split(target, ",") {
|
||||
hosts = append(hosts, strings.TrimPrefix(v, "redis://"))
|
||||
}
|
||||
nconn := kit.Int64(kit.Select("10", m.Option(NCONN)))
|
||||
nreqs := kit.Int64(kit.Select("5000", m.Option(NREQS)))
|
||||
m.Echo("nconn: %d nreqs: %d\n", nconn, nreqs*nconn)
|
||||
|
||||
cmds := strings.Split(name, ",")
|
||||
for _, cmd := range cmds {
|
||||
_bench_redis(m, nconn, nreqs, hosts, []string{cmd})
|
||||
}
|
||||
@ -169,12 +97,90 @@ func init() {
|
||||
list = append(list, req)
|
||||
}
|
||||
}
|
||||
_bench_show(m, kit.Int64(kit.Select(m.Option(NCONN))), kit.Int64(kit.Select(m.Option(NREQS))), list)
|
||||
_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)
|
||||
})
|
||||
})
|
||||
}
|
||||
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 (
|
||||
NCONN = "nconn"
|
||||
NREQS = "nreqs"
|
||||
)
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
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{
|
||||
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_bench_create(m, arg[0])
|
||||
}},
|
||||
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.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.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])
|
||||
})
|
||||
})
|
||||
}
|
||||
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))
|
||||
}},
|
||||
"/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"))
|
||||
}},
|
||||
},
|
||||
|
@ -255,4 +255,4 @@ export %s
|
||||
},
|
||||
}
|
||||
|
||||
func init() { web.Index.Register(Index, &web.Frame{}) }
|
||||
func init() { web.Index.Register(Index, &web.Frame{}, BENCH, PPROF) }
|
||||
|
@ -98,6 +98,13 @@ func _inner_show(m *ice.Message, name string) {
|
||||
}
|
||||
|
||||
switch m.Set(ice.MSG_RESULT); p {
|
||||
case "go":
|
||||
if strings.HasSuffix(name, "test.go") {
|
||||
m.Cmdy(cli.SYSTEM, "go", "test", "-v", "./"+name)
|
||||
} else {
|
||||
m.Cmdy(cli.SYSTEM, "go", "run", "./"+name)
|
||||
}
|
||||
|
||||
case "csv":
|
||||
m.CSV(m.Cmdx("nfs.cat", name))
|
||||
case "md":
|
||||
@ -131,7 +138,6 @@ func init() {
|
||||
"show", kit.Dict(
|
||||
"sh", []string{"bash"},
|
||||
"py", []string{"python"},
|
||||
"go", []string{"go", "run"},
|
||||
"js", []string{"node"},
|
||||
),
|
||||
)},
|
||||
|
@ -14,25 +14,16 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
var PPROF = ice.Name("pprof", Index)
|
||||
|
||||
const (
|
||||
BINNARY = "binnary"
|
||||
SERVICE = "service"
|
||||
SECONDS = "seconds"
|
||||
)
|
||||
|
||||
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("操作", `<input type="button" value="运行">`)
|
||||
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,
|
||||
kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE,
|
||||
kit.MDB_NAME, kit.MDB_TEXT, SECONDS, BINNARY, SERVICE,
|
||||
}, val)
|
||||
})
|
||||
} else {
|
||||
@ -40,7 +31,7 @@ func _pprof_list(m *ice.Message, zone string, id string, field ...interface{}) {
|
||||
// 详细信息
|
||||
m.Push("detail", value)
|
||||
m.Push(kit.MDB_KEY, "操作")
|
||||
m.Push(kit.MDB_VALUE, `<input type="button" value="运行">`)
|
||||
m.Push(kit.MDB_VALUE, m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行"))
|
||||
})
|
||||
}
|
||||
})
|
||||
@ -101,25 +92,25 @@ func _pprof_show(m *ice.Message, zone string, id string) {
|
||||
m.Push("bin", bin)
|
||||
})
|
||||
}
|
||||
func _pprof_modify(m *ice.Message, zone, id, pro, set, old string) {
|
||||
pro = kit.Select(pro, m.Option(kit.MDB_KEY))
|
||||
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 pro {
|
||||
switch k {
|
||||
case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
|
||||
m.Warn(true, "deny modify %v", pro)
|
||||
m.Warn(true, mdb.ErrDenyModify, k)
|
||||
return
|
||||
case BINNARY, SERVICE, SECONDS:
|
||||
// 修改信息
|
||||
m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_KEY, pro, kit.MDB_VALUE, set, "old", old)
|
||||
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, pro, set)
|
||||
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, pro, kit.MDB_VALUE, set, "old", old)
|
||||
kit.Value(value, pro, set)
|
||||
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)
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -127,21 +118,24 @@ 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.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.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"
|
||||
)
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
|
14
logs.go
14
logs.go
@ -1,11 +1,10 @@
|
||||
package ice
|
||||
|
||||
import (
|
||||
"github.com/shylinux/toolkits"
|
||||
"github.com/shylinux/toolkits/logs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
log "github.com/shylinux/toolkits/logs"
|
||||
|
||||
"fmt"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@ -26,7 +25,7 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message {
|
||||
|
||||
case LOG_CMDS, LOG_START, LOG_SERVE:
|
||||
prefix, suffix = "\033[32m", "\033[0m"
|
||||
case LOG_AUTH, LOG_COST:
|
||||
case LOG_AUTH, LOG_CONF, LOG_COST:
|
||||
prefix, suffix = "\033[33m", "\033[0m"
|
||||
case LOG_WARN, LOG_ERROR, LOG_CLOSE:
|
||||
prefix, suffix = "\033[31m", "\033[0m"
|
||||
@ -59,11 +58,10 @@ func (m *Message) Logs(level string, arg ...interface{}) *Message {
|
||||
func (m *Message) Info(str string, arg ...interface{}) *Message {
|
||||
return m.log(LOG_INFO, str, arg...)
|
||||
}
|
||||
func (m *Message) Warn(err bool, str string, arg ...interface{}) bool {
|
||||
func (m *Message) Warn(err bool, arg ...interface{}) bool {
|
||||
if err {
|
||||
m.Echo("warn: ").Echo(str, arg...)
|
||||
_, file, line, _ := runtime.Caller(1)
|
||||
return m.log(LOG_WARN, "%s:%d %s", file, line, fmt.Sprintf(str, arg...)) != nil
|
||||
m.meta[MSG_RESULT] = append([]string{"warn: "}, kit.Simple(arg...)...)
|
||||
return m.log(LOG_WARN, fmt.Sprint(arg...)) != nil
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user