1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-06 21:26:54 +08:00

add mdb.engine

This commit is contained in:
shaoying 2020-06-24 07:44:10 +08:00
parent d4da81ce94
commit 600ace0c40
15 changed files with 243 additions and 125 deletions

View File

@ -1,8 +1,8 @@
package aaa package aaa
import ( import (
"github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
const ( // 用户角色 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) { func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
if userrole == ROOT { if userrole == ROOT {
// 超级用户 // 超级用户
@ -99,7 +106,7 @@ func init() {
ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, ROLE: {Name: "role", Help: "角色", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)},
}, },
Commands: map[string]*ice.Command{ 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) { White: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
_role_white(m, arg[0], kit.Keys(arg[1:]), true) _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) { }, 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)) _role_list(m, kit.Select("", arg, 0))
}}, }},
}, },

View File

@ -1,11 +1,11 @@
package aaa package aaa
import ( import (
"github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/gdb" "github.com/shylinux/icebergs/base/gdb"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"strings" "strings"
) )
@ -55,11 +55,16 @@ func UserRoot(m *ice.Message) {
cli.PassWord = cli.UserName cli.PassWord = cli.UserName
_user_create(m, cli.UserName, cli.PassWord) _user_create(m, cli.UserName, cli.PassWord)
} }
func UserRole(m *ice.Message, username interface{}) string { func UserRole(m *ice.Message, username interface{}) (role string) {
if username == cli.UserName { if role = VOID; username == cli.UserName {
return ROOT 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 { func UserLogin(m *ice.Message, username, password string) bool {
if _user_login(m, username, password) { if _user_login(m, username, password) {

View File

@ -1,9 +1,10 @@
package cli package cli
import ( import (
"github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/toolkits" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"os" "os"
"os/user" "os/user"
@ -78,6 +79,10 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
n := kit.Int(kit.Select("20", m.Conf(RUNTIME, "host.GOMAXPROCS"))) n := kit.Int(kit.Select("20", m.Conf(RUNTIME, "host.GOMAXPROCS")))
m.Logs("host", "gomaxprocs", n) m.Logs("host", "gomaxprocs", n)
runtime.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) { ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save(RUNTIME, SYSTEM) m.Save(RUNTIME, SYSTEM)

28
base/mdb/engine.go Normal file
View 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)
}

View File

@ -1,8 +1,8 @@
package mdb package mdb
import ( import (
"github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"github.com/shylinux/toolkits/task" "github.com/shylinux/toolkits/task"
"encoding/csv" "encoding/csv"
@ -179,6 +179,9 @@ func _dict_export(m *ice.Message, prefix, key, file string) {
m.Log_EXPORT(kit.MDB_FILE, p) m.Log_EXPORT(kit.MDB_FILE, p)
} }
const (
ErrDenyModify = "deny modify "
)
const ( const (
CSV = "csv" CSV = "csv"
JSON = "json" JSON = "json"
@ -201,9 +204,6 @@ const (
DELETE = "delete" DELETE = "delete"
SELECT = "select" SELECT = "select"
MODIFY = "modify" MODIFY = "modify"
PARSER = "parser"
ADVISE = "advise"
) )
var Index = &ice.Context{Name: "mdb", Help: "数据模块", var Index = &ice.Context{Name: "mdb", Help: "数据模块",
@ -242,5 +242,7 @@ var Index = &ice.Context{Name: "mdb", Help: "数据模块",
} }
func init() { 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
View 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)
}

View File

@ -1,8 +1,8 @@
package mdb package mdb
import ( import (
"github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
const RENDER = "render" const RENDER = "render"
@ -19,7 +19,7 @@ func init() {
}}, }},
}, 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.Richs(RENDER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { 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) }}, nil)

View File

@ -3,6 +3,7 @@ package web
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"github.com/skip2/go-qrcode" "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.WriteHeader(code)
msg.W.Write([]byte(text)) 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)
}

View File

@ -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")) 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) { func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
msg = msg.Cmd() if msg.Right(msg.Detailv()) {
msg = msg.Cmd()
}
msg.Set("_option") msg.Set("_option")
_space_echo(msg, []string{}, kit.Revert(source)[1:], c, name) _space_echo(msg, []string{}, kit.Revert(source)[1:], c, name)
msg.Cost("%v->%v %v %v", source, target, msg.Detailv(), msg.Format("append")) msg.Cost("%v->%v %v %v", source, target, msg.Detailv(), msg.Format("append"))

View File

@ -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) { ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load() 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, "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, "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"))) m.Cmd(SPIDE, mdb.CREATE, "shy", kit.Select("https://shylinux.com:443", m.Conf(cli.RUNTIME, "conf.ctx_shy")))

View File

@ -1,14 +1,16 @@
package code package code
import ( import (
"github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" 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"
"github.com/shylinux/toolkits/util/bench/redis" "github.com/shylinux/toolkits/util/bench/redis"
"io" "io"
"io/ioutil"
"net/http" "net/http"
"os" "os"
"strings" "strings"
@ -16,19 +18,13 @@ import (
"time" "time"
) )
const (
BENCH = "bench"
NCONN = "nconn"
NREQS = "nreqs"
)
func _bench_list(m *ice.Message, zone string, id string, field ...interface{}) { 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{}) { 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{}) val = val[kit.MDB_META].(map[string]interface{})
if zone = kit.Format(kit.Value(val, kit.MDB_ZONE)); id == "" { 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.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{ m.Push(zone, value, []string{
kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE, kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE,
kit.MDB_NAME, NCONN, NREQS, kit.MDB_TEXT, 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("detail", value)
m.Push(kit.MDB_KEY, "操作") 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) { func _bench_show(m *ice.Message, nconn, nreq int64, list []*http.Request) {
nout, e := os.OpenFile("/dev/null", os.O_WRONLY, 0660) m.Log_CONF(NCONN, nconn, NREQS, nreq)
m.Assert(e)
var body int64 var body int64
m.Logs(NCONN, nconn, NREQS, nreq)
s, e := bench.HTTP(nconn, nreq, list, func(req *http.Request, res *http.Response) { 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) atomic.AddInt64(&body, n)
}) })
m.Assert(e) m.Assert(e)
@ -60,24 +54,64 @@ func _bench_show(m *ice.Message, nconn, nreq int64, list []*http.Request) {
m.Echo("body: %d\n", body) m.Echo("body: %d\n", body)
} }
func _bench_redis(m *ice.Message, nconn, nreq int64, hosts []string, cmds []string) { func _bench_redis(m *ice.Message, nconn, nreq int64, hosts []string, cmds []string) {
m.Logs("info", "hosts", hosts, "cmds", cmds, nreq, nconn) m.Log_CONF(NCONN, nconn, NREQS, nreq, "cmds", cmds, "hosts", hosts)
s, e := redis.Redis(nconn, nreq, hosts, cmds, func(cmd string, arg []interface{}, reply interface{}) {
}) s, e := redis.Redis(nconn, nreq, hosts, cmds, nil)
m.Assert(e) 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)))
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) { 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)
if strings.HasPrefix(target, "redis://") {
hosts := []string{}
for _, v := range strings.Split(target, ",") {
hosts = append(hosts, strings.TrimPrefix(v, "redis://"))
}
cmds := strings.Split(name, ",")
for _, cmd := range cmds {
_bench_redis(m, nconn, nreqs, hosts, []string{cmd})
}
return
}
list := []*http.Request{}
for _, v := range strings.Split(target, ",") {
switch ls := kit.Split(v); ls[0] {
case http.MethodPost:
if f, e := os.Open(ls[2]); m.Assert(e) {
defer f.Close()
req, err := http.NewRequest(http.MethodPost, ls[1], f)
m.Assert(err)
list = append(list, req)
}
default:
req, err := http.NewRequest(http.MethodGet, v, nil)
m.Assert(err)
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{}) { m.Richs(BENCH, nil, zone, func(key string, val map[string]interface{}) {
switch pro { switch k {
case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME: case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
m.Warn(true, "deny modify %v", pro) m.Warn(true, mdb.ErrDenyModify, k)
return return
} }
m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) { 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) m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old)
kit.Value(value, pro, set) kit.Value(value, k, v)
}) })
}) })
} }
@ -85,23 +119,23 @@ func _bench_insert(m *ice.Message, zone, kind, name, text string, nconn, nreqs s
m.Richs(BENCH, nil, zone, func(key string, value map[string]interface{}) { m.Richs(BENCH, nil, zone, func(key string, value map[string]interface{}) {
id := m.Grow(BENCH, kit.Keys(kit.MDB_HASH, key), kit.Dict( id := m.Grow(BENCH, kit.Keys(kit.MDB_HASH, key), kit.Dict(
kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text, kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text,
// 添加信息 NCONN, nconn, NREQS, nreqs, kit.MDB_EXTRA, kit.Dict(arg),
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.Log_INSERT(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
m.Echo("%d", id) m.Echo("%d", id)
}) })
} }
func _bench_create(m *ice.Message, zone string, arg ...string) { 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.Rich(BENCH, nil, kit.Data(kit.MDB_ZONE, zone, m.Log_CREATE(kit.MDB_ZONE, zone)
// 添加信息
arg))
m.Log_CREATE(kit.MDB_ZONE, zone)
}
} }
const BENCH = "bench"
const (
NCONN = "nconn"
NREQS = "nreqs"
)
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
@ -120,6 +154,11 @@ func init() {
mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { 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)) _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) { kit.MDB_SHOW: {Name: "show type name text arg...", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
if len(arg) < 4 { if len(arg) < 4 {
m.Richs(BENCH, nil, m.Option(kit.MDB_ZONE), func(key string, val map[string]interface{}) { m.Richs(BENCH, nil, m.Option(kit.MDB_ZONE), func(key string, val map[string]interface{}) {
@ -129,52 +168,19 @@ func init() {
}) })
} }
if len(arg) > 2 { if len(arg) > 2 {
m.Option(kit.MDB_TYPE, arg[0])
m.Option(kit.MDB_NAME, arg[1]) m.Option(kit.MDB_NAME, arg[1])
m.Option(kit.MDB_TEXT, arg[2]) m.Option(kit.MDB_TEXT, arg[2])
for i := 3; i < len(arg)-1; i++ { for i := 3; i < len(arg)-1; i++ {
m.Option(arg[i], arg[i+1]) 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))
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)
for _, cmd := range cmds {
_bench_redis(m, nconn, nreqs, hosts, []string{cmd})
}
return
}
list := []*http.Request{}
for _, v := range strings.Split(target, ",") {
switch ls := kit.Split(v); ls[0] {
case http.MethodPost:
if f, e := os.Open(ls[2]); m.Assert(e) {
defer f.Close()
req, err := http.NewRequest(http.MethodPost, ls[1], f)
m.Assert(err)
list = append(list, req)
}
default:
req, err := http.NewRequest(http.MethodGet, v, nil)
m.Assert(err)
list = append(list, req)
}
}
_bench_show(m, kit.Int64(kit.Select(m.Option(NCONN))), kit.Int64(kit.Select(m.Option(NREQS))), list)
}}, }},
}, 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)) _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")) m.Cmdy(m.Optionv("cmd"))
}}, }},
}, },

View File

@ -255,4 +255,4 @@ export %s
}, },
} }
func init() { web.Index.Register(Index, &web.Frame{}) } func init() { web.Index.Register(Index, &web.Frame{}, BENCH, PPROF) }

View File

@ -98,6 +98,13 @@ func _inner_show(m *ice.Message, name string) {
} }
switch m.Set(ice.MSG_RESULT); p { 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": case "csv":
m.CSV(m.Cmdx("nfs.cat", name)) m.CSV(m.Cmdx("nfs.cat", name))
case "md": case "md":
@ -131,7 +138,6 @@ func init() {
"show", kit.Dict( "show", kit.Dict(
"sh", []string{"bash"}, "sh", []string{"bash"},
"py", []string{"python"}, "py", []string{"python"},
"go", []string{"go", "run"},
"js", []string{"node"}, "js", []string{"node"},
), ),
)}, )},

View File

@ -14,25 +14,16 @@ import (
"strings" "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{}) { 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{}) { 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{}) val = val[kit.MDB_META].(map[string]interface{})
if zone = kit.Format(kit.Value(val, kit.MDB_ZONE)); id == "" { 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.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{ m.Push(zone, value, []string{
kit.MDB_ZONE, kit.MDB_ID, kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE,
kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT, kit.MDB_NAME, kit.MDB_TEXT, SECONDS, BINNARY, SERVICE,
SECONDS, BINNARY, SERVICE,
}, val) }, val)
}) })
} else { } else {
@ -40,7 +31,7 @@ func _pprof_list(m *ice.Message, zone string, id string, field ...interface{}) {
// 详细信息 // 详细信息
m.Push("detail", value) m.Push("detail", value)
m.Push(kit.MDB_KEY, "操作") 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) m.Push("bin", bin)
}) })
} }
func _pprof_modify(m *ice.Message, zone, id, pro, set, old string) { func _pprof_modify(m *ice.Message, zone, id, k, v, old string) {
pro = kit.Select(pro, m.Option(kit.MDB_KEY)) 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{}) { 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: case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
m.Warn(true, "deny modify %v", pro) m.Warn(true, mdb.ErrDenyModify, k)
return return
case BINNARY, SERVICE, SECONDS: 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{}) val = val[kit.MDB_META].(map[string]interface{})
kit.Value(val, pro, set) kit.Value(val, k, v)
return return
} }
m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) { 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) m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old)
kit.Value(value, pro, set) 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{}) { m.Richs(PPROF, nil, zone, func(key string, val map[string]interface{}) {
id := m.Grow(PPROF, kit.Keys(kit.MDB_HASH, key), kit.Dict( 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_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text,
// 添加信息
kit.MDB_EXTRA, kit.Dict(arg), kit.MDB_EXTRA, kit.Dict(arg),
)) ))
m.Log_INSERT(kit.MDB_META, PPROF, kit.MDB_ZONE, zone, m.Log_INSERT(kit.MDB_META, PPROF, kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
m.Echo("%d", id) m.Echo("%d", id)
}) })
} }
func _pprof_create(m *ice.Message, zone string, binnary, service string, seconds string, arg ...string) { 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, m.Rich(PPROF, nil, kit.Data(kit.MDB_ZONE, zone, BINNARY, binnary, SERVICE, service, SECONDS, seconds, arg))
// 添加信息
BINNARY, binnary, SERVICE, service, SECONDS, seconds, arg))
m.Log_CREATE(kit.MDB_ZONE, zone) m.Log_CREATE(kit.MDB_ZONE, zone)
} }
const PPROF = "pprof"
const (
BINNARY = "binnary"
SERVICE = "service"
SECONDS = "seconds"
)
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{

14
logs.go
View File

@ -1,11 +1,10 @@
package ice package ice
import ( import (
"github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"github.com/shylinux/toolkits/logs" log "github.com/shylinux/toolkits/logs"
"fmt" "fmt"
"runtime"
"strings" "strings"
) )
@ -26,7 +25,7 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message {
case LOG_CMDS, LOG_START, LOG_SERVE: case LOG_CMDS, LOG_START, LOG_SERVE:
prefix, suffix = "\033[32m", "\033[0m" prefix, suffix = "\033[32m", "\033[0m"
case LOG_AUTH, LOG_COST: case LOG_AUTH, LOG_CONF, LOG_COST:
prefix, suffix = "\033[33m", "\033[0m" prefix, suffix = "\033[33m", "\033[0m"
case LOG_WARN, LOG_ERROR, LOG_CLOSE: case LOG_WARN, LOG_ERROR, LOG_CLOSE:
prefix, suffix = "\033[31m", "\033[0m" 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 { func (m *Message) Info(str string, arg ...interface{}) *Message {
return m.log(LOG_INFO, str, arg...) 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 { if err {
m.Echo("warn: ").Echo(str, arg...) m.meta[MSG_RESULT] = append([]string{"warn: "}, kit.Simple(arg...)...)
_, file, line, _ := runtime.Caller(1) return m.log(LOG_WARN, fmt.Sprint(arg...)) != nil
return m.log(LOG_WARN, "%s:%d %s", file, line, fmt.Sprintf(str, arg...)) != nil
} }
return false return false
} }