diff --git a/base/aaa/aaa.go b/base/aaa/aaa.go
index 8517be05..150144e1 100644
--- a/base/aaa/aaa.go
+++ b/base/aaa/aaa.go
@@ -2,6 +2,7 @@ package aaa
import (
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
)
@@ -9,27 +10,28 @@ const (
ErrNotAuth = "not auth: "
)
const (
- USERZONE = "userzone"
- USERNICK = "usernick"
- USERNAME = "username"
- HOSTNAME = "hostname"
- PASSWORD = "password"
+ IP = "ip"
+ UA = "ua"
+
USERROLE = "userrole"
- USERNODE = "usernode"
- HOSTPORT = "hostport"
+ USERNAME = "username"
+ PASSWORD = "password"
+ USERNICK = "usernick"
+ USERZONE = "userzone"
SESSID = "sessid"
)
+const AAA = "aaa"
-var Index = &ice.Context{Name: "aaa", Help: "认证模块", Commands: map[string]*ice.Command{
+var Index = &ice.Context{Name: AAA, Help: "认证模块", Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Rich(ROLE, nil, kit.Dict(kit.MDB_NAME, VOID, White, kit.Dict(), Black, kit.Dict()))
m.Rich(ROLE, nil, kit.Dict(kit.MDB_NAME, TECH, Black, kit.Dict(), White, kit.Dict()))
m.Load()
- m.Cmd("mdb.search", "create", "user", "user", "aaa")
+ m.Cmd(mdb.SEARCH, mdb.CREATE, USER, USER, AAA)
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Save(USER, SESS, ROLE)
+ m.Save()
}},
}}
diff --git a/base/aaa/aaa.shy b/base/aaa/aaa.shy
new file mode 100644
index 00000000..cbd8e872
--- /dev/null
+++ b/base/aaa/aaa.shy
@@ -0,0 +1,5 @@
+chapter "aaa"
+
+field "用户" user
+field "会话" sess
+field "角色" role
diff --git a/base/aaa/role.go b/base/aaa/role.go
index fbada273..86dbc22c 100644
--- a/base/aaa/role.go
+++ b/base/aaa/role.go
@@ -2,6 +2,7 @@ package aaa
import (
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"strings"
@@ -16,6 +17,9 @@ const ( // 角色操作
White = "white"
Black = "black"
Right = "right"
+
+ WHITE = "white"
+ BLACK = "black"
)
const ( // 返回结果
OK = "ok"
@@ -103,10 +107,10 @@ const ROLE = "role"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- 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{
- ROLE: {Name: "role [role [user...]]", Help: "角色", Action: map[string]*ice.Action{
+ ROLE: {Name: "role role auto 添加", Help: "角色", Action: map[string]*ice.Action{
White: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
_role_white(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", "."), true)
}},
@@ -118,11 +122,27 @@ func init() {
m.Echo(OK)
}
}},
+ mdb.CREATE: {Name: "create zone=white,black role=void@key key=", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ m.Richs(ROLE, nil, m.Option(ROLE), func(key string, value map[string]interface{}) {
+ list := value[m.Option(kit.MDB_ZONE)].(map[string]interface{})
+ m.Log_CREATE(ROLE, m.Option(ROLE), list[m.Option(kit.MDB_KEY)])
+ list[m.Option(kit.MDB_KEY)] = true
+ })
+ }},
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Richs(ROLE, nil, m.Option(ROLE), func(key string, value map[string]interface{}) {
+ list := value[m.Option(kit.MDB_ZONE)].(map[string]interface{})
+ m.Log_REMOVE(ROLE, m.Option(ROLE), list[m.Option(kit.MDB_KEY)])
+ delete(list, m.Option(kit.MDB_KEY))
+ })
+ }},
}, 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))
+ m.PushAction(mdb.REMOVE)
}},
},
}, nil)
diff --git a/base/aaa/sess.go b/base/aaa/sess.go
index 9b264904..43762758 100644
--- a/base/aaa/sess.go
+++ b/base/aaa/sess.go
@@ -6,14 +6,9 @@ import (
kit "github.com/shylinux/toolkits"
)
-func _sess_list(m *ice.Message) {
- m.Richs(SESS, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_KEY, USERNAME, USERROLE})
- })
-}
func _sess_auth(m *ice.Message, sessid string, username string, userrole string) {
m.Richs(SESS, nil, sessid, func(value map[string]interface{}) {
- if m.Option(ice.MSG_USERROLE) == ROOT {
+ if value = kit.GetMeta(value); m.Option(ice.MSG_USERROLE) == ROOT {
value[USERROLE] = userrole
} else if m.Option(ice.MSG_USERROLE) == TECH && userrole != ROOT {
value[USERROLE] = userrole
@@ -26,7 +21,10 @@ func _sess_auth(m *ice.Message, sessid string, username string, userrole string)
}
func _sess_check(m *ice.Message, sessid string) {
m.Richs(SESS, nil, sessid, func(value map[string]interface{}) {
+ value = kit.GetMeta(value)
m.Richs(USER, nil, value[USERNAME], func(value map[string]interface{}) {
+ value = kit.GetMeta(value)
+
if m.Option(ice.MSG_USERNICK, value[USERNICK]) == "" {
if name := kit.Format(value[USERNAME]); len(name) > 10 {
m.Option(ice.MSG_USERNICK, name[:10])
@@ -46,13 +44,14 @@ func _sess_create(m *ice.Message, username string) string {
if m.Richs(USER, nil, username, nil) == nil {
_user_create(m, username, "")
}
- h := m.Rich(SESS, nil, kit.Dict(
- kit.MDB_TIME, m.Time(m.Conf(SESS, "meta.expire")),
+
+ m.Cmdy(mdb.INSERT, SESS, "", mdb.HASH,
USERNAME, username, "from", m.Option(ice.MSG_SESSID),
- ))
- m.Log_CREATE(SESSID, h, USERNAME, username)
- m.Echo(h)
- return h
+ kit.MDB_TIME, m.Time(m.Conf(SESS, "meta.expire")),
+ "agent", m.Option(ice.MSG_USERUA),
+ "ip", m.Option(ice.MSG_USERIP),
+ )
+ return m.Result()
}
func SessCheck(m *ice.Message, sessid string) *ice.Message {
@@ -69,22 +68,27 @@ const SESS = "sess"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- SESS: {Name: "sess", Help: "会话", Value: kit.Data(
+ SESS: {Name: SESS, Help: "会话", Value: kit.Data(
kit.MDB_SHORT, "uniq", "expire", "720h",
)},
},
Commands: map[string]*ice.Command{
- SESS: {Name: "sess", Help: "会话", Action: map[string]*ice.Action{
- mdb.CREATE: {Name: "create [username]", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- _sess_create(m, kit.Select("", arg, 0))
+ SESS: {Name: "sess hash auto", Help: "会话", Action: map[string]*ice.Action{
+ "auth": {Name: "auth sessid username [userrole]", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
+ _sess_auth(m, arg[0], arg[1], kit.Select("", arg, 2))
}},
"check": {Name: "check sessid", Help: "校验", Hand: func(m *ice.Message, arg ...string) {
_sess_check(m, arg[0])
}},
- "auth": {Name: "auth sessid username [userrole]", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
- _sess_auth(m, arg[0], arg[1], kit.Select("", arg, 2))
+
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, SESS, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _sess_list(m) }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Option(mdb.FIELDS, kit.Select("time,hash,username,userrole", mdb.DETAIL, len(arg) > 0))
+ m.Cmdy(mdb.SELECT, SESS, "", mdb.HASH, kit.MDB_HASH, arg)
+ m.PushAction(mdb.REMOVE)
+ }},
},
}, nil)
}
diff --git a/base/aaa/user.go b/base/aaa/user.go
index 25f617d4..ee09d0b6 100644
--- a/base/aaa/user.go
+++ b/base/aaa/user.go
@@ -2,23 +2,12 @@ package aaa
import (
ice "github.com/shylinux/icebergs"
- "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"strings"
)
-const (
- USER_CREATE = "user.create"
-)
-
-func _user_list(m *ice.Message) {
- m.Richs(USER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- m.Push(key, value, []string{kit.MDB_TIME, USERZONE, USERNICK, USERNAME})
- })
- m.Sort(USERNAME)
-}
func _user_login(m *ice.Message, name, word string) (ok bool) {
if m.Richs(USER, nil, name, nil) == nil {
_user_create(m, name, "")
@@ -33,24 +22,10 @@ func _user_login(m *ice.Message, name, word string) (ok bool) {
})
return ok
}
-func _user_modify(m *ice.Message, name string, arg ...string) {
- if m.Richs(USER, nil, name, nil) == nil {
- _user_create(m, name, "")
- }
-
- m.Log_MODIFY(USERNAME, name, arg)
- m.Richs(USER, nil, name, func(key string, value map[string]interface{}) {
- for i := 0; i < len(arg)-1; i += 2 {
- kit.Value(value, arg[i], arg[i+1])
- }
- })
-}
func _user_create(m *ice.Message, name, word string) {
h := m.Rich(USER, nil, kit.Dict(
USERNAME, name, PASSWORD, word,
- USERNICK, name, USERNODE, cli.NodeName,
- USERZONE, m.Option(ice.MSG_USERZONE),
- USERNODE, cli.NodeName,
+ USERNICK, name, USERZONE, m.Option(ice.MSG_USERZONE),
))
m.Log_CREATE(USERNAME, name, "hash", h)
m.Event(USER_CREATE, name)
@@ -72,27 +47,30 @@ func _user_search(m *ice.Message, kind, name, text string, arg ...string) {
}
func UserRoot(m *ice.Message) {
- cli.PassWord = kit.Hashs("uniq")
- cli.PassWord = cli.UserName
- _user_create(m, cli.UserName, cli.PassWord)
+ ice.Info.PassWord = kit.Hashs("uniq")
+ ice.Info.PassWord = ice.Info.UserName
+ _user_create(m, ice.Info.UserName, ice.Info.PassWord)
}
func UserNick(m *ice.Message, username interface{}) (nick string) {
m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) {
+ value = kit.GetMeta(value)
nick = kit.Format(value[USERNICK])
})
return
}
func UserZone(m *ice.Message, username interface{}) (zone string) {
m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) {
+ value = kit.GetMeta(value)
zone = kit.Format(value[USERZONE])
})
return
}
func UserRole(m *ice.Message, username interface{}) (role string) {
- if role = VOID; username == cli.UserName {
+ if role = VOID; username == ice.Info.UserName {
return ROOT
}
m.Richs(ROLE, nil, TECH, func(key string, value map[string]interface{}) {
+ value = kit.GetMeta(value)
if kit.Value(value, kit.Keys(USER, username)) == true {
role = TECH
}
@@ -109,28 +87,33 @@ func UserLogin(m *ice.Message, username, password string) bool {
return false
}
+const (
+ USER_CREATE = "user.create"
+)
+
const USER = "user"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- USER: {Name: "user", Help: "用户", Value: kit.Data(kit.MDB_SHORT, USERNAME)},
+ USER: {Name: USER, Help: "用户", Value: kit.Data(kit.MDB_SHORT, USERNAME)},
},
Commands: map[string]*ice.Command{
- USER: {Name: "user", Help: "用户", Action: map[string]*ice.Action{
- mdb.CREATE: {Name: "create username [password]", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- _user_create(m, arg[0], kit.Select("", arg, 1))
+ USER: {Name: "user username auto", Help: "用户", Action: map[string]*ice.Action{
+ mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.MODIFY, USER, "", mdb.HASH, USERNAME, m.Option(USERNAME), arg)
}},
- mdb.MODIFY: {Name: "modify [key value]...", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
- _user_modify(m, m.Option(USERNAME), arg...)
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.REMOVE, USER, "", mdb.HASH, USERNAME, m.Option(USERNAME))
}},
mdb.SEARCH: {Name: "search type name text arg...", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
_user_search(m, arg[0], arg[1], kit.Select("", arg, 2))
}},
- "login": {Name: "login username password", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
- _user_login(m, arg[0], arg[1])
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _user_list(m) }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Option(mdb.FIELDS, kit.Select("time,userzone,usernick,username", mdb.DETAIL, len(arg) > 0))
+ m.Cmdy(mdb.SELECT, USER, "", mdb.HASH, USERNAME, arg)
+ m.PushAction(mdb.REMOVE)
+ }},
},
}, nil)
}
diff --git a/base/cli/cli.go b/base/cli/cli.go
index dde8168e..efcb1bf9 100644
--- a/base/cli/cli.go
+++ b/base/cli/cli.go
@@ -2,12 +2,8 @@ package cli
import (
ice "github.com/shylinux/icebergs"
- "github.com/shylinux/icebergs/base/ctx"
- "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
- "bytes"
- "io/ioutil"
"os"
"os/user"
"path"
@@ -15,27 +11,15 @@ import (
"strings"
)
-var UserName = ""
-var PassWord = ""
-var HostName = ""
-var PathName = ""
-var NodeName = ""
-var NodeType = ""
-
func NodeInfo(m *ice.Message, kind, name string) {
name = strings.ReplaceAll(name, ".", "_")
m.Conf(RUNTIME, "node.type", kind)
m.Conf(RUNTIME, "node.name", name)
- NodeName = name
- NodeType = kind
+ ice.Info.NodeName = name
+ ice.Info.NodeType = kind
}
-const RUNTIME = "runtime"
-
var Index = &ice.Context{Name: "cli", Help: "命令模块",
- Configs: map[string]*ice.Config{
- RUNTIME: {Name: "runtime", Help: "运行环境", Value: kit.Dict()},
- },
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load()
@@ -46,7 +30,6 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
m.Conf(RUNTIME, "conf.ctx_shy", os.Getenv("ctx_shy"))
m.Conf(RUNTIME, "conf.ctx_pid", os.Getenv("ctx_pid"))
m.Conf(RUNTIME, "conf.ctx_user", os.Getenv("ctx_user"))
- m.Conf(RUNTIME, "conf.ctx_pod", os.Getenv("ctx_pod"))
// 主机信息
m.Conf(RUNTIME, "host.GOARCH", runtime.GOARCH)
@@ -54,11 +37,6 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
m.Conf(RUNTIME, "host.pid", os.Getpid())
// 启动信息
- if m.Conf(RUNTIME, "boot.username", kit.Select(os.Getenv("USER"), os.Getenv("ctx_user"))) == "" {
- if user, e := user.Current(); e == nil && user.Name != "" {
- m.Conf(RUNTIME, "boot.username", kit.Select(user.Name, os.Getenv("ctx_user")))
- }
- }
if name, e := os.Hostname(); e == nil {
m.Conf(RUNTIME, "boot.hostname", kit.Select(name, os.Getenv("HOSTNAME")))
}
@@ -70,9 +48,14 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
name = ls[len(ls)-1]
m.Conf(RUNTIME, "boot.pathname", name)
}
- UserName = m.Conf(RUNTIME, "boot.username")
- HostName = m.Conf(RUNTIME, "boot.hostname")
- PathName = m.Conf(RUNTIME, "boot.pathname")
+ if m.Conf(RUNTIME, "boot.username", kit.Select(os.Getenv("USER"), os.Getenv("ctx_user"))) == "" {
+ if user, e := user.Current(); e == nil && user.Name != "" {
+ m.Conf(RUNTIME, "boot.username", kit.Select(user.Name, os.Getenv("ctx_user")))
+ }
+ }
+ ice.Info.HostName = m.Conf(RUNTIME, "boot.hostname")
+ ice.Info.PathName = m.Conf(RUNTIME, "boot.pathname")
+ ice.Info.UserName = m.Conf(RUNTIME, "boot.username")
// 启动记录
count := kit.Int(m.Conf(RUNTIME, "boot.count")) + 1
@@ -83,84 +66,20 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
NodeInfo(m, "worker", m.Conf(RUNTIME, "boot.pathname"))
m.Info("runtime %v", kit.Formats(m.Confv(RUNTIME)))
- n := kit.Int(kit.Select("20", m.Conf(RUNTIME, "host.GOMAXPROCS")))
+ n := kit.Int(kit.Select("1", 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])
- }}))
+ // 版本信息
+ m.Conf(RUNTIME, "build.time", ice.Info.Build.Time)
+ m.Conf(RUNTIME, "build.version", ice.Info.Build.Version)
+ m.Conf(RUNTIME, "build.hostname", ice.Info.Build.HostName)
+ m.Conf(RUNTIME, "build.username", ice.Info.Build.UserName)
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Save(RUNTIME, SYSTEM, DAEMON)
- }},
-
- "proc": {Name: "proc name=auto PID=auto auto", Help: "进程管理", Action: map[string]*ice.Action{
- "kill": {Name: "kill", Help: "结束", Hand: func(m *ice.Message, arg ...string) {
- if p, e := os.FindProcess(kit.Int(m.Option("PID"))); m.Assert(e) {
- m.Assert(p.Kill())
- }
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- msg := m.Spawn()
- msg.Split(m.Cmdx(SYSTEM, "ps", "ux"), "", " ", "\n")
- msg.Table(func(index int, value map[string]string, head []string) {
- if m.Appendv(ice.MSG_APPEND, "action", head); len(arg) == 2 && value["PID"] == arg[1] {
- m.PushRender("action", "button", "结束")
- m.Push("", value)
- return
- }
- if len(arg) == 0 || len(arg) == 1 && strings.Contains(value["COMMAND"], arg[0]) {
- m.PushRender("action", "button", "结束")
- m.Push("", value)
- }
- })
- }},
- RUNTIME: {Name: "runtime name auto", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- switch kit.Select("", arg, 0) {
- case "procinfo":
- m.Split(m.Cmdx(SYSTEM, "ps", "u"), "", " ", "\n")
-
- case "hostinfo":
- if f, e := os.Open("/proc/cpuinfo"); e == nil {
- defer f.Close()
- if b, e := ioutil.ReadAll(f); e == nil {
- m.Push("nCPU", bytes.Count(b, []byte("processor")))
- }
- }
- if f, e := os.Open("/proc/meminfo"); e == nil {
- defer f.Close()
- if b, e := ioutil.ReadAll(f); e == nil {
- for i, ls := range strings.Split(string(b), "\n") {
- vs := kit.Split(ls, ": ")
- m.Push(strings.TrimSpace(vs[0]), kit.FmtSize(kit.Int64(strings.TrimSpace(vs[1]))*1024))
- if i > 1 {
- break
- }
- }
- }
- }
- m.Push("uptime", kit.Split(m.Cmdx(SYSTEM, "uptime"), ",")[0])
- case "diskinfo":
- m.Spawn().Split(m.Cmdx(SYSTEM, "df", "-h"), "", " ", "\n").Table(func(index int, value map[string]string, head []string) {
- if strings.HasPrefix(value["Filesystem"], "/dev") {
- m.Push("", value, head)
- }
- })
- case "ifconfig":
- m.Cmdy("tcp.host")
- case "userinfo":
- m.Split(m.Cmdx(SYSTEM, "who"), "user term time", " ", "\n")
-
- case "hostname":
- m.Conf(RUNTIME, "boot.hostname", arg[1])
- HostName = arg[1]
- m.Echo(HostName)
- default:
- m.Cmdy(ctx.CONFIG, RUNTIME, arg)
- }
+ m.Save()
}},
},
}
-func init() { ice.Index.Register(Index, nil, RUNTIME, SYSTEM, DAEMON, PYTHON) }
+func init() { ice.Index.Register(Index, nil, RUNTIME, SYSTEM, DAEMON, PYTHON, OUTPUT) }
diff --git a/base/cli/cli.shy b/base/cli/cli.shy
new file mode 100644
index 00000000..4b31e58f
--- /dev/null
+++ b/base/cli/cli.shy
@@ -0,0 +1,9 @@
+chapter "cli"
+
+field "命令" system
+field "输出" output
+field "守护" daemon
+field "脚本" python
+
+field "环境" runtime
+field "进程" cli.proc
diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index 14dcf1d1..d6b599d8 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -2,6 +2,8 @@ package cli
import (
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/aaa"
+ "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"fmt"
@@ -10,15 +12,6 @@ import (
"strings"
)
-const (
- ErrStart = "daemon start: "
-)
-const (
- StatusError = "error"
- StatusStart = "start"
- StatusClose = "close"
-)
-
func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
if f, p, e := kit.Create(out); m.Assert(e) {
m.Log_EXPORT(kit.MDB_META, DAEMON, CMD_STDOUT, p)
@@ -35,30 +28,40 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
return
}
- h := m.Rich(DAEMON, nil, kit.Dict(
- kit.MDB_TYPE, "shell", kit.MDB_NAME, strings.Join(cmd.Args, " "),
- kit.SSH_DIR, cmd.Dir, kit.SSH_PID, cmd.Process.Pid, kit.MDB_STATUS, StatusStart,
- kit.MDB_EXTRA, kit.Dict(CMD_STDOUT, out, CMD_STDERR, err),
- ))
- m.Log_EXPORT(kit.MDB_META, DAEMON, kit.MDB_KEY, h, kit.SSH_PID, cmd.Process.Pid)
+ h := m.Cmdx(mdb.INSERT, DAEMON, "", mdb.HASH,
+ kit.MDB_STATUS, Status.Start, kit.SSH_CMD, strings.Join(cmd.Args, " "),
+ kit.SSH_DIR, cmd.Dir, kit.SSH_ENV, cmd.Env, kit.SSH_PID, cmd.Process.Pid,
+ CMD_STDOUT, out, CMD_STDERR, err,
+ aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE),
+ aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA),
+ )
m.Echo("%d", cmd.Process.Pid)
- m.Gos(m, func(m *ice.Message) {
- if e := cmd.Wait(); e != nil {
- m.Warn(e != nil, ErrStart, cmd.Args, " ", e)
- m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) {
- kit.Value(value, kit.MDB_STATUS, StatusError)
- kit.Value(value, kit.Keys(kit.MDB_EXTRA, kit.MDB_ERROR), e)
- })
+ m.Go(func() {
+ if e := cmd.Wait(); m.Warn(e != nil, ErrStart, cmd.Args, " ", e) {
+ m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h,
+ kit.MDB_STATUS, Status.Error, kit.MDB_ERROR, e)
} else {
- m.Cost("%v exit: %v", cmd.Args, cmd.ProcessState.ExitCode())
- m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) {
- kit.Value(value, kit.MDB_STATUS, StatusClose)
- })
+ m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode())
+ m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h,
+ kit.MDB_STATUS, Status.Stop)
}
})
}
+const ErrStart = "daemon start: "
+
+var Status = struct{ Error, Start, Stop string }{
+ Error: "error",
+ Start: "start",
+ Stop: "stop",
+}
+
+const (
+ START = "start"
+ STOP = "stop"
+)
+
const DAEMON = "daemon"
func init() {
@@ -67,40 +70,45 @@ func init() {
DAEMON: {Name: DAEMON, Help: "守护进程", Value: kit.Data(kit.MDB_PATH, "var/daemon")},
},
Commands: map[string]*ice.Command{
- DAEMON: {Name: "daemon hash 查看:button=auto 清理:button", Help: "守护进程", Action: map[string]*ice.Action{
- "delete": {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Richs(DAEMON, "", m.Option(kit.MDB_HASH), func(key string, value map[string]interface{}) {
- m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "")
- m.Log_DELETE(DAEMON, kit.Format(value))
- })
+ DAEMON: {Name: "daemon hash auto 添加 清理", Help: "守护进程", Action: map[string]*ice.Action{
+ START: {Name: "start cmd env dir", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ m.Option(CMD_TYPE, DAEMON)
+ m.Cmdy(SYSTEM, kit.Split(m.Option("cmd")))
}},
- "prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
- m.Richs(DAEMON, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- if value["status"] == "error" || strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.SSH_PID]), "\n") == 1 {
- m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "")
- m.Log_DELETE(DAEMON, kit.Format(value))
- }
- })
- }},
- "stop": {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
- m.Richs(DAEMON, "", m.Option(kit.MDB_HASH), func(key string, value map[string]interface{}) {
+ STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmd(mdb.SELECT, DAEMON, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)).Table(func(index int, value map[string]string, head []string) {
+ m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), kit.MDB_STATUS, Status.Stop)
m.Cmdy(SYSTEM, "kill", "-9", value[kit.SSH_PID])
- if strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.SSH_PID]), "\n") == 1 {
- value[kit.MDB_STATUS] = StatusClose
- }
})
}},
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, DAEMON, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
+ }},
+ mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.PRUNES, DAEMON, "", mdb.HASH, kit.MDB_STATUS, Status.Error)
+ m.Cmdy(mdb.PRUNES, DAEMON, "", mdb.HASH, kit.MDB_STATUS, Status.Stop)
+ }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
- m.Option("fields", "time,hash,status,pid,name,dir")
- m.Cmdy("mdb.select", DAEMON, "", kit.MDB_HASH)
- m.Sort("time", "time_r")
- m.PushAction("停止", "删除")
- return
- }
+ m.Option(mdb.FIELDS, "time,hash,status,pid,cmd,dir")
+ m.Cmdy(mdb.SELECT, DAEMON, "", mdb.HASH)
+ m.Table(func(index int, value map[string]string, head []string) {
+ switch value[kit.MDB_STATUS] {
+ case Status.Start:
+ m.PushButton(STOP)
+ default:
+ m.PushButton(mdb.REMOVE)
+ }
+ })
- m.Option(CMD_TYPE, DAEMON)
- m.Cmdy(SYSTEM, arg)
+ } else if m.Richs(DAEMON, "", arg[0], nil) != nil {
+ m.Option(mdb.FIELDS, mdb.DETAIL)
+ m.Cmdy(mdb.SELECT, DAEMON, "", mdb.HASH, kit.MDB_HASH, arg)
+
+ } else {
+ m.Option(CMD_TYPE, DAEMON)
+ m.Cmdy(SYSTEM, arg)
+ }
}},
},
}, nil)
diff --git a/base/cli/output.go b/base/cli/output.go
new file mode 100644
index 00000000..af28c385
--- /dev/null
+++ b/base/cli/output.go
@@ -0,0 +1,63 @@
+package cli
+
+import (
+ ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/mdb"
+ kit "github.com/shylinux/toolkits"
+
+ "io"
+)
+
+const OUTPUT = "output"
+
+func init() {
+ Index.Merge(&ice.Context{
+ Configs: map[string]*ice.Config{
+ OUTPUT: {Name: OUTPUT, Help: "输出", Value: kit.Data()},
+ },
+ Commands: map[string]*ice.Command{
+ OUTPUT: {Name: "output hash id auto", Help: "输出", Action: map[string]*ice.Action{
+ mdb.CREATE: {Name: "create cmd", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ h := m.Cmdx(mdb.INSERT, OUTPUT, "", mdb.HASH, kit.MDB_STATUS, Status.Start, arg)
+ r, w := io.Pipe()
+ m.Go(func() {
+ buf := make([]byte, 1024)
+ for {
+ if n, e := r.Read(buf); e != nil || n == 0 {
+ break
+ } else {
+ m.Grow(OUTPUT, kit.Keys(kit.MDB_HASH, h), kit.Dict(
+ kit.SSH_RES, string(buf[:n]),
+ ))
+ }
+ }
+ m.Cmd(mdb.MODIFY, OUTPUT, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, Status.Stop)
+ })
+ m.Option(OUTPUT, w)
+ m.Echo(h)
+ }},
+ mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.MODIFY, OUTPUT, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg)
+ }},
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, OUTPUT, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
+ }},
+ mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.PRUNES, OUTPUT, "", mdb.HASH, kit.MDB_STATUS, Status.Stop)
+ }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 {
+ m.Option(mdb.FIELDS, "time,hash,status,name")
+ m.Cmdy(mdb.SELECT, OUTPUT, "", mdb.HASH)
+ m.PushAction(mdb.REMOVE)
+ return
+ }
+
+ m.Option("_control", "_page")
+ m.Option(mdb.FIELDS, kit.Select("time,id,res", mdb.DETAIL, len(arg) > 1))
+ m.Cmdy(mdb.SELECT, OUTPUT, kit.Keys(kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, arg[1:])
+ m.Sort(kit.MDB_ID)
+ }},
+ },
+ }, nil)
+}
diff --git a/base/cli/proc.go b/base/cli/proc.go
new file mode 100644
index 00000000..8236aac3
--- /dev/null
+++ b/base/cli/proc.go
@@ -0,0 +1,37 @@
+package cli
+
+import (
+ ice "github.com/shylinux/icebergs"
+ kit "github.com/shylinux/toolkits"
+
+ "os"
+ "strings"
+)
+
+func init() {
+ Index.Merge(&ice.Context{
+ Configs: map[string]*ice.Config{},
+ Commands: map[string]*ice.Command{
+ "proc": {Name: "proc name=ice.bin PID auto", Help: "进程管理", Action: map[string]*ice.Action{
+ "kill": {Name: "kill", Help: "结束", Hand: func(m *ice.Message, arg ...string) {
+ if p, e := os.FindProcess(kit.Int(m.Option("PID"))); m.Assert(e) {
+ m.Assert(p.Kill())
+ }
+ }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ msg := m.Spawn()
+ msg.Split(m.Cmdx(SYSTEM, "ps", "ux"), "", " ", "\n")
+ msg.Table(func(index int, value map[string]string, head []string) {
+ if m.Appendv(ice.MSG_APPEND, "action", head); len(arg) > 1 && value["PID"] != arg[1] {
+ return
+ }
+ if len(arg) > 0 && !strings.Contains(value["COMMAND"], arg[0]) {
+ return
+ }
+ m.PushButton("结束")
+ m.Push("", value)
+ })
+ }},
+ },
+ }, nil)
+}
diff --git a/base/cli/python.go b/base/cli/python.go
index 2f63d996..e7fbbfd3 100644
--- a/base/cli/python.go
+++ b/base/cli/python.go
@@ -1,12 +1,10 @@
package cli
import (
- "path"
- "runtime"
- "strings"
-
ice "github.com/shylinux/icebergs"
kit "github.com/shylinux/toolkits"
+
+ "path"
)
const PYTHON = "python"
@@ -15,38 +13,35 @@ func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
PYTHON: {Name: "python", Help: "脚本命令", Value: kit.Data(
- "windows", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz",
- "darwin", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz",
- "linux", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz",
-
+ "source", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz",
"qrcode", `import pyqrcode; print(pyqrcode.create('%s').terminal(module_color='%s', quiet_zone=1))`,
- PYTHON, "python", "pip", "pip",
)},
},
Commands: map[string]*ice.Command{
- PYTHON: {Name: "python 编译:button 下载:button", Help: "脚本命令", Action: map[string]*ice.Action{
+ PYTHON: {Name: "python port path auto 启动:button 构建 下载", Help: "脚本命令", Action: map[string]*ice.Action{
"download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy("web.code.install", "download", m.Conf(PYTHON, kit.Keys(kit.MDB_META, runtime.GOOS)))
+ m.Cmdy("web.code.install", "download", m.Conf(PYTHON, "meta.source"))
}},
- "compile": {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) {
- name := path.Base(strings.TrimSuffix(strings.TrimSuffix(m.Conf(PYTHON, kit.Keys(kit.MDB_META, runtime.GOOS)), ".tar.xz"), "zip"))
- m.Option(CMD_DIR, path.Join(m.Conf("web.code.install", kit.META_PATH), name))
- m.Cmdy(SYSTEM, "./configure", "--prefix="+kit.Path("usr/local"))
- m.Cmdy(SYSTEM, "make", "-j8")
- m.Cmdy(SYSTEM, "make", "install")
+ "build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy("web.code.install", "build", m.Conf(PYTHON, "meta.source"))
+ }},
+ "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy("web.code.install", "start", m.Conf(PYTHON, "meta.source"), "bin/python3")
}},
- "install": {Name: "install arg...", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.pip"), "install", arg)
- }},
"qrcode": {Name: "qrcode text color", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
prefix := []string{SYSTEM, m.Conf(PYTHON, kit.Keys(kit.MDB_META, PYTHON))}
m.Cmdy(prefix, "-c", kit.Format(m.Conf(PYTHON, "meta.qrcode"),
kit.Select("hello world", arg, 0), kit.Select("blue", arg, 1)))
}},
+ "pip": {Name: "pip", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.pip"), "install", arg)
+ }},
+ "run": {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.python"), arg)
+ }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- prefix := []string{SYSTEM, m.Conf(PYTHON, kit.Keys(kit.MDB_META, PYTHON))}
- m.Cmdy(prefix, arg)
+ m.Cmdy("web.code.install", path.Base(m.Conf(PYTHON, kit.META_SOURCE)), arg)
}},
},
}, nil)
diff --git a/base/cli/runtime.go b/base/cli/runtime.go
new file mode 100644
index 00000000..8e6e51fd
--- /dev/null
+++ b/base/cli/runtime.go
@@ -0,0 +1,73 @@
+package cli
+
+import (
+ ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/ctx"
+ kit "github.com/shylinux/toolkits"
+
+ "bytes"
+ "io/ioutil"
+ "os"
+ "strings"
+)
+
+const RUNTIME = "runtime"
+
+func init() {
+ Index.Merge(&ice.Context{
+ Configs: map[string]*ice.Config{
+ RUNTIME: {Name: RUNTIME, Help: "运行环境", Value: kit.Dict()},
+ },
+ Commands: map[string]*ice.Command{
+ RUNTIME: {Name: "runtime info=procinfo,hostinfo,diskinfo,ifconfig,hostname,userinfo,bootinfo auto", Help: "运行环境", Action: map[string]*ice.Action{
+ "procinfo": {Name: "procinfo", Help: "procinfo", Hand: func(m *ice.Message, arg ...string) {
+ m.Split(m.Cmdx(SYSTEM, "ps", "u"), "", " ", "\n")
+ }},
+ "hostinfo": {Name: "hostinfo", Help: "hostinfo", Hand: func(m *ice.Message, arg ...string) {
+ if f, e := os.Open("/proc/cpuinfo"); e == nil {
+ defer f.Close()
+ if b, e := ioutil.ReadAll(f); e == nil {
+ m.Push("nCPU", bytes.Count(b, []byte("processor")))
+ }
+ }
+ if f, e := os.Open("/proc/meminfo"); e == nil {
+ defer f.Close()
+ if b, e := ioutil.ReadAll(f); e == nil {
+ for i, ls := range strings.Split(string(b), "\n") {
+ vs := kit.Split(ls, ": ")
+ m.Push(strings.TrimSpace(vs[0]), kit.FmtSize(kit.Int64(strings.TrimSpace(vs[1]))*1024))
+ if i > 1 {
+ break
+ }
+ }
+ }
+ }
+ m.Push("uptime", kit.Split(m.Cmdx(SYSTEM, "uptime"), ",")[0])
+ }},
+ "diskinfo": {Name: "diskinfo", Help: "diskinfo", Hand: func(m *ice.Message, arg ...string) {
+ m.Spawn().Split(m.Cmdx(SYSTEM, "df", "-h"), "", " ", "\n").Table(func(index int, value map[string]string, head []string) {
+ if strings.HasPrefix(value["Filesystem"], "/dev") {
+ m.Push("", value, head)
+ }
+ })
+ }},
+ "ifconfig": {Name: "ifconfig", Help: "ifconfig", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy("tcp.host")
+ }},
+ "hostname": {Name: "hostname", Help: "hostname", Hand: func(m *ice.Message, arg ...string) {
+ m.Conf(RUNTIME, "boot.hostname", arg[1])
+ ice.Info.HostName = arg[1]
+ m.Echo(ice.Info.HostName)
+ }},
+ "userinfo": {Name: "userinfo", Help: "userinfo", Hand: func(m *ice.Message, arg ...string) {
+ m.Split(m.Cmdx(SYSTEM, "who"), "user term time", " ", "\n")
+ }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) > 0 && arg[0] == "bootinfo" {
+ arg = arg[1:]
+ }
+ m.Cmdy(ctx.CONFIG, RUNTIME, arg)
+ }},
+ },
+ }, nil)
+}
diff --git a/base/cli/system.go b/base/cli/system.go
index 583f8a30..9b241b03 100644
--- a/base/cli/system.go
+++ b/base/cli/system.go
@@ -2,19 +2,60 @@ package cli
import (
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/aaa"
+ "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"bytes"
"fmt"
+ "io"
"os"
"os/exec"
"strings"
- "time"
)
+func _system_show(m *ice.Message, cmd *exec.Cmd) {
+ m.Cmd(mdb.INSERT, SYSTEM, "", mdb.LIST, "cmd", strings.Join(cmd.Args, " "), "dir", cmd.Dir, "env", strings.Join(cmd.Env, ","),
+ aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE),
+ aaa.IP, m.Option(ice.MSG_USERIP), aaa.UA, m.Option(ice.MSG_USERUA),
+ )
+
+ if w, ok := m.Optionv("output").(io.WriteCloser); ok {
+ cmd.Stderr = w
+ cmd.Stdout = w
+
+ if e := cmd.Run(); e != nil {
+ m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", e.Error())
+ } else {
+ m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode())
+ }
+ } else {
+ err := bytes.NewBuffer(make([]byte, 0, 1024))
+ out := bytes.NewBuffer(make([]byte, 0, 1024))
+ cmd.Stderr = err
+ cmd.Stdout = out
+ defer func() {
+ m.Push(CMD_ERR, err.String())
+ m.Push(CMD_OUT, out.String())
+ m.Echo(kit.Select(err.String(), out.String()))
+ }()
+
+ if e := cmd.Run(); e != nil {
+ m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", kit.Select(e.Error(), err.String()))
+ } else {
+ m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode(), "err", err.Len(), "out", out.Len())
+ }
+ }
+
+ m.Push(kit.MDB_TIME, m.Time())
+ m.Push(CMD_CODE, int(cmd.ProcessState.ExitCode()))
+}
+
+const ErrRun = "cli run err: "
+
const (
- CMD_STDOUT = "cmd_stdout"
CMD_STDERR = "cmd_stderr"
+ CMD_STDOUT = "cmd_stdout"
CMD_TYPE = "cmd_type"
CMD_DIR = "cmd_dir"
@@ -25,38 +66,25 @@ const (
CMD_CODE = "cmd_code"
)
-const ErrRun = "run err "
-
-func _system_show(m *ice.Message, cmd *exec.Cmd) {
- out := bytes.NewBuffer(make([]byte, 0, 1024))
- err := bytes.NewBuffer(make([]byte, 0, 1024))
- cmd.Stdout = out
- cmd.Stderr = err
- defer func() {
- m.Cost("%v exit: %v out: %v err: %v ",
- cmd.Args, cmd.ProcessState.ExitCode(), out.Len(), err.Len())
- }()
-
- if e := cmd.Run(); e != nil {
- m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", kit.Select(e.Error(), err.String()))
- }
-
- m.Push(kit.MDB_TIME, m.Time())
- m.Push(CMD_CODE, int(cmd.ProcessState.ExitCode()))
- m.Push(CMD_ERR, err.String())
- m.Push(CMD_OUT, out.String())
- m.Echo(out.String())
-}
-
const SYSTEM = "system"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- SYSTEM: {Name: "system", Help: "系统命令", Value: kit.Data()},
+ SYSTEM: {Name: SYSTEM, Help: "系统命令", Value: kit.Data()},
},
Commands: map[string]*ice.Command{
- SYSTEM: {Name: "system cmd 执行:button 清空:button", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) {
+ SYSTEM: {Name: "system id auto", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) {
+ if len(arg) == 0 || kit.Int(arg[0]) > 0 {
+ m.Option("_control", "_page")
+ m.Option(mdb.FIELDS, kit.Select("time,id,cmd,dir,env", mdb.DETAIL, len(arg) > 0))
+ m.Cmdy(mdb.SELECT, SYSTEM, "", mdb.LIST, kit.MDB_ID, arg)
+ return
+ }
+
+ if len(arg) == 1 {
+ arg = kit.Split(arg[0])
+ }
cmd := exec.Command(arg[0], arg[1:]...)
// 运行目录
@@ -83,29 +111,6 @@ func init() {
_system_show(m, cmd)
}
}},
- "ssh_user": {Name: "ssh_user", Help: "ssh_user", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) {
- msg := m.Cmd(SYSTEM, "who")
- msg.Split(msg.Result(), "name term begin", " \t", "\n")
- msg.Table(func(index int, value map[string]string, head []string) {
- m.Push("name", value["name"])
- m.Push("term", value["term"])
-
- ls := strings.Split(value["begin"], "(")
- ls[0] = strings.Join(kit.Split(ls[0], " \t"), " ")
- if len(ls) > 1 {
- m.Push("ip", strings.TrimSuffix(ls[1], ")"))
- }
-
- t, e := time.ParseInLocation("2006 Jan 2 15:04", "2020 "+ls[0], time.Local)
- if e != nil {
- t, _ = time.ParseInLocation("2006-01-02 15:04", ls[0], time.Local)
- }
- m.Push("begin", t.Format("2006-01-02 15:04:05"))
- d := time.Since(t)
- d = d / time.Millisecond * time.Millisecond
- m.Push("duration", d.String())
- })
- }},
},
}, nil)
}
diff --git a/base/ctx/cmd.go b/base/ctx/command.go
similarity index 65%
rename from base/ctx/cmd.go
rename to base/ctx/command.go
index 36dd9544..7657deb9 100644
--- a/base/ctx/cmd.go
+++ b/base/ctx/command.go
@@ -8,19 +8,15 @@ import (
"strings"
)
-func _command_list(m *ice.Message, all bool, name string) {
+func _command_list(m *ice.Message, name string) {
p := m.Spawn(m.Source())
- if all {
- p = ice.Pulse
- }
-
if name != "" {
p.Search(name, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
m.Push("key", s.Cap(ice.CTX_FOLLOW))
m.Push("name", kit.Format(cmd.Name))
m.Push("help", kit.Simple(cmd.Help)[0])
- m.Push("meta", kit.Format(cmd.Meta))
- m.Push("list", kit.Format(cmd.List))
+ m.Push("meta", kit.Formats(cmd.Meta))
+ m.Push("list", kit.Formats(cmd.List))
})
return
}
@@ -28,8 +24,7 @@ func _command_list(m *ice.Message, all bool, name string) {
list := []string{}
for k := range p.Target().Commands {
if k[0] == '/' || k[0] == '_' {
- // 内部命令
- continue
+ continue // 内部命令
}
list = append(list, k)
}
@@ -48,9 +43,8 @@ const COMMAND = "command"
func init() {
Index.Merge(&ice.Context{
Commands: map[string]*ice.Command{
- COMMAND: {Name: "command [all] command", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- all, arg := _parse_arg_all(m, arg...)
- _command_list(m, all, strings.Join(arg, "."))
+ COMMAND: {Name: "command key auto", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _command_list(m, strings.Join(arg, "."))
}},
},
}, nil)
diff --git a/base/ctx/conf.go b/base/ctx/config.go
similarity index 90%
rename from base/ctx/conf.go
rename to base/ctx/config.go
index 330aff8f..b082b362 100644
--- a/base/ctx/conf.go
+++ b/base/ctx/config.go
@@ -12,17 +12,13 @@ import (
"strings"
)
-func _config_list(m *ice.Message, all bool) {
+func _config_list(m *ice.Message) {
p := m.Spawn(m.Source())
- if all {
- p = ice.Pulse
- }
list := []string{}
for k := range p.Target().Configs {
if k[0] == '/' || k[0] == '_' {
- // 内部命令
- continue
+ continue // 内部配置
}
list = append(list, k)
}
@@ -85,19 +81,19 @@ func _config_make(m *ice.Message, chain string, arg ...string) {
}
}
func _config_rich(m *ice.Message, name string, key string, arg ...string) {
- m.Rich(name, key, kit.Dict(arg))
+ m.Rich(name, key, kit.Data(arg))
}
func _config_grow(m *ice.Message, name string, key string, arg ...string) {
m.Grow(name, key, kit.Dict(arg))
}
-const CONFIG = "config"
const (
SAVE = "save"
LOAD = "load"
RICH = "rich"
GROW = "grow"
)
+const CONFIG = "config"
func init() {
Index.Merge(&ice.Context{
@@ -105,7 +101,7 @@ func init() {
CONFIG: {Name: "config", Help: "配置", Value: kit.Data("path", "var/conf")},
},
Commands: map[string]*ice.Command{
- CONFIG: {Name: "config [all] [chain [key [arg...]]]", Help: "配置", Action: map[string]*ice.Action{
+ CONFIG: {Name: "config key auto", Help: "配置", Action: map[string]*ice.Action{
SAVE: {Name: "save", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
_config_save(m, arg[0], arg[1:]...)
}},
@@ -119,8 +115,8 @@ func init() {
_config_grow(m, arg[0], arg[1], arg[2:]...)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if all, arg := _parse_arg_all(m, arg...); len(arg) == 0 {
- _config_list(m, all)
+ if len(arg) == 0 {
+ _config_list(m)
return
}
_config_make(m, arg[0], arg[1:]...)
diff --git a/base/ctx/context.go b/base/ctx/context.go
new file mode 100644
index 00000000..137ee01b
--- /dev/null
+++ b/base/ctx/context.go
@@ -0,0 +1,39 @@
+package ctx
+
+import (
+ ice "github.com/shylinux/icebergs"
+ kit "github.com/shylinux/toolkits"
+)
+
+func _context_list(m *ice.Message, all bool) {
+ m.Travel(func(p *ice.Context, s *ice.Context) {
+ m.Push(kit.MDB_NAME, kit.Select("ice", s.Cap(ice.CTX_FOLLOW)))
+ m.Push(ice.CTX_STATUS, s.Cap(ice.CTX_STATUS))
+ m.Push(ice.CTX_STREAM, s.Cap(ice.CTX_STREAM))
+ m.Push(kit.MDB_HELP, s.Help)
+ })
+}
+
+const CONTEXT = "context"
+
+func init() {
+ Index.Merge(&ice.Context{
+ Commands: map[string]*ice.Command{
+ CONTEXT: {Name: "context name=web.chat action=context,command,config key auto", Help: "模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Search(kit.Select("ice", arg, 0)+".", func(p *ice.Context, s *ice.Context, key string) {
+ msg := m.Spawn(s)
+ defer m.Copy(msg)
+
+ switch kit.Select(CONTEXT, arg, 1) {
+ case CONTEXT:
+ _context_list(msg, true)
+ case COMMAND:
+ msg.Cmdy(COMMAND, arg[2:])
+ case CONFIG:
+ msg.Cmdy(CONFIG, arg[2:])
+ }
+ })
+ }},
+ },
+ }, nil)
+}
diff --git a/base/ctx/ctx.go b/base/ctx/ctx.go
index cf7ad06d..5b0839f5 100644
--- a/base/ctx/ctx.go
+++ b/base/ctx/ctx.go
@@ -1,68 +1,15 @@
package ctx
import (
- "strings"
-
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
+
+ "strings"
)
-func _parse_arg_all(m *ice.Message, arg ...string) (bool, []string) {
- if len(arg) > 0 && arg[0] == "all" {
- return true, arg[1:]
- }
- return false, arg
-}
-
-func _context_list(m *ice.Message, all bool) {
- p := m.Spawn(m.Source())
- if all {
- p = ice.Pulse
- }
-
- p.Travel(func(p *ice.Context, s *ice.Context) {
- if p != nil {
- m.Push("ups", kit.Select("shy", p.Cap(ice.CTX_FOLLOW)))
- } else {
- m.Push("ups", "shy")
- }
- m.Push(kit.MDB_NAME, s.Name)
- m.Push(ice.CTX_STATUS, s.Cap(ice.CTX_STATUS))
- m.Push(ice.CTX_STREAM, s.Cap(ice.CTX_STREAM))
- m.Push("help", s.Help)
- })
-}
-
-const CONTEXT = "context"
-
var Index = &ice.Context{Name: "ctx", Help: "配置模块",
Commands: map[string]*ice.Command{
- CONTEXT: {Name: "context [all] [name [command|config arg...]]", Help: "模块", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if all, arg := _parse_arg_all(m, arg...); len(arg) == 0 {
- _context_list(m, all)
- return
- }
-
- if len(arg) > 1 && arg[1] == COMMAND {
- m.Search(arg[0]+".", func(sup *ice.Context, sub *ice.Context, key string) {
- m.Copy(m.Spawn(sub).Cmd(COMMAND, arg[2:]))
- })
- } else {
- m.Search(arg[0]+".", func(p *ice.Context, s *ice.Context, key string) {
- msg := m.Spawn(s)
- switch kit.Select(CONTEXT, arg, 1) {
- case CONTEXT:
- _context_list(msg, true)
- case COMMAND:
- msg.Cmdy(COMMAND, arg[0], arg[2:])
- case CONFIG:
- msg.Cmdy(CONFIG, arg[2:])
- }
- m.Copy(msg)
- })
- }
- }},
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(mdb.SEARCH, mdb.CREATE, COMMAND, m.AddCmd(&ice.Command{Hand: func(m *ice.Message, c *ice.Context, cc string, arg ...string) {
arg = arg[1:]
diff --git a/base/ctx/ctx.shy b/base/ctx/ctx.shy
new file mode 100644
index 00000000..7a5fcec3
--- /dev/null
+++ b/base/ctx/ctx.shy
@@ -0,0 +1,6 @@
+chapter "ctx"
+
+field "模块" context
+field "命令" command
+field "配置" config
+
diff --git a/base/gdb/event.go b/base/gdb/event.go
index 94e52996..f070148b 100644
--- a/base/gdb/event.go
+++ b/base/gdb/event.go
@@ -13,7 +13,7 @@ func _event_listen(m *ice.Message, event string, cmd string) {
func _event_action(m *ice.Message, event string, arg ...string) {
m.Option(mdb.FIELDS, "time,id,cmd")
m.Cmd(mdb.SELECT, EVENT, kit.Keys(kit.MDB_HASH, kit.Hashs(event)), mdb.LIST).Table(func(index int, value map[string]string, head []string) {
- m.Cmd(kit.Split(value[kit.SSH_CMD]), event, arg).Cost("event %v %v", event, arg)
+ m.Cmd(kit.Split(value[kit.SSH_CMD]), event, arg).Cost(EVENT, event, "arg", arg)
})
}
diff --git a/base/lex/lex.go b/base/lex/lex.go
index b9d84bd3..a3f83b1f 100644
--- a/base/lex/lex.go
+++ b/base/lex/lex.go
@@ -7,7 +7,6 @@ import (
const LEX = "lex"
var Index = &ice.Context{Name: LEX, Help: "词法模块",
- Configs: map[string]*ice.Config{},
Commands: map[string]*ice.Command{
"hi": {Name: "hi", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Echo("hello %s world", c.Name)
diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go
index 7cb14121..424f628e 100644
--- a/base/mdb/mdb.go
+++ b/base/mdb/mdb.go
@@ -12,13 +12,13 @@ import (
"strings"
)
-func _fields(m *ice.Message) []string {
- return kit.Split(kit.Select("time,hash,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ",")))
-}
func _file_name(m *ice.Message, arg ...string) string {
return kit.Select(path.Join("usr/export", path.Join(arg[:2]...)), arg, 3)
}
+func _hash_fields(m *ice.Message) []string {
+ return kit.Split(kit.Select("time,hash,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ",")))
+}
func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) {
m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1])
m.Echo(m.Rich(prefix, chain, kit.Data(arg)))
@@ -33,7 +33,7 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) {
if field == kit.MDB_HASH && value == RANDOM {
value = kit.MDB_RANDOMS
}
- fields := _fields(m)
+ fields := _hash_fields(m)
m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) {
if val[kit.MDB_META] != nil {
val = val[kit.MDB_META].(map[string]interface{})
@@ -86,13 +86,11 @@ func _hash_import(m *ice.Message, prefix, chain, file string) {
count := 0
if m.Conf(prefix, kit.Keys(chain, kit.MDB_META, kit.MDB_SHORT)) == "" {
for k, data := range list {
- // 导入数据
m.Conf(prefix, kit.Keys(chain, kit.MDB_HASH, k), data)
count++
}
} else {
for _, data := range list {
- // 导入数据
m.Rich(prefix, chain, data)
count++
}
@@ -102,7 +100,7 @@ func _hash_import(m *ice.Message, prefix, chain, file string) {
m.Echo("%d", count)
}
func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) {
- fields := kit.Split(kit.Select("time,hash,type,name,text", m.Option(FIELDS)))
+ fields := _hash_fields(m)
m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
if val[kit.MDB_META] != nil {
val = val[kit.MDB_META].(map[string]interface{})
@@ -137,6 +135,9 @@ func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) {
m.Sort(kit.MDB_COUNT, "int_r")
}
+func _list_fields(m *ice.Message) []string {
+ return kit.Split(kit.Select("time,id,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ",")))
+}
func _list_insert(m *ice.Message, prefix, chain string, arg ...string) {
m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1])
m.Echo("%d", m.Grow(prefix, chain, kit.Dict(arg)))
@@ -144,8 +145,11 @@ func _list_insert(m *ice.Message, prefix, chain string, arg ...string) {
func _list_delete(m *ice.Message, prefix, chain, field, value string) {
}
func _list_select(m *ice.Message, prefix, chain, field, value string) {
- fields := kit.Split(kit.Select("time,id,type,name,text", m.Option(FIELDS)))
- m.Grows(prefix, chain, field, value, func(index int, val map[string]interface{}) {
+ if value == "" {
+ field = ""
+ }
+ fields := _list_fields(m)
+ m.Grows(prefix, chain, kit.Select(m.Option("cache.field"), field), kit.Select(m.Option("cache.value"), value), func(index int, val map[string]interface{}) {
if val[kit.MDB_META] != nil {
val = val[kit.MDB_META].(map[string]interface{})
}
@@ -257,9 +261,12 @@ func _list_inputs(m *ice.Message, prefix, chain string, field, value string) {
m.Sort(kit.MDB_COUNT, "int_r")
}
+func _zone_fields(m *ice.Message) []string {
+ return kit.Split(kit.Select("zone,id,time,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ",")))
+}
func _zone_select(m *ice.Message, prefix, chain, zone string, id string) {
cb := m.Optionv("cache.cb")
- fields := kit.Split(kit.Select("zone,id,time,type,name,text", m.Option(FIELDS)))
+ fields := _zone_fields(m)
m.Richs(prefix, chain, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) {
if val[kit.MDB_META] != nil {
val = val[kit.MDB_META].(map[string]interface{})
@@ -301,7 +308,7 @@ func _zone_export(m *ice.Message, prefix, chain, file string) {
w := csv.NewWriter(f)
defer w.Flush()
- fields := kit.Split(kit.Select("zone,id,time,type,name,text", m.Option(FIELDS)))
+ fields := _zone_fields(m)
w.Write(fields)
count := 0
diff --git a/base/ssh/_trash.go b/base/ssh/_trash.go
deleted file mode 100644
index 2f826dd7..00000000
--- a/base/ssh/_trash.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package ssh
-
-func (f *Frame) history(m *ice.Message, line string) string {
- favor := m.Conf(SOURCE, kit.Keys(kit.MDB_META, web.FAVOR))
- if strings.HasPrefix(strings.TrimSpace(line), "!!") {
- if len(line) == 2 {
- line = m.Cmd(web.FAVOR, favor).Append(kit.MDB_TEXT)
- }
- } else if strings.HasPrefix(strings.TrimSpace(line), "!") {
- if len(line) == 1 {
- // 历史记录
- msg := m.Cmd(web.FAVOR, favor)
- msg.Sort(kit.MDB_ID)
- msg.Appendv(ice.MSG_APPEND, kit.MDB_TIME, kit.MDB_ID, kit.MDB_TEXT)
- f.printf(m, msg.Table().Result())
- return ""
- }
- if i, e := strconv.Atoi(line[1:]); e == nil {
- // 历史命令
- line = kit.Format(kit.Value(m.Cmd(web.FAVOR, favor, i).Optionv("value"), kit.MDB_TEXT))
- } else {
- f.printf(m, m.Cmd("history", "search", line[1:]).Table().Result())
- return ""
- }
- } else if strings.TrimSpace(line) != "" && f.source == STDIO {
- // 记录历史
- m.Cmd(web.FAVOR, favor, "cmd", f.source, line)
- }
- return line
-}
-
-const (
- REMOTE = "remote"
- QRCODE = "qrcode"
-)
-
-func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- REMOTE: {Name: "remote", Help: "远程连接", Value: kit.Data()},
- },
- Commands: map[string]*ice.Command{
-
- QRCODE: {Name: "qrcode arg...", Help: "命令提示", Action: map[string]*ice.Action{
- "json": {Name: "json [key val]...", Help: "json", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(cli.PYTHON, QRCODE, kit.Format(kit.Parse(nil, "", arg...)))
- m.Render(ice.RENDER_RESULT)
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Cmdy(cli.PYTHON, QRCODE, strings.Join(arg, ""))
- m.Render(ice.RENDER_RESULT)
- }},
- REMOTE: {Name: "remote user remote port local", Help: "远程连接", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- key := m.Rich(REMOTE, nil, kit.Dict(
- "user", arg[0], "remote", arg[1], "port", arg[2], "local", arg[3],
- ))
- m.Echo(key)
- m.Info(key)
-
- m.Gos(m, func(m *ice.Message) {
- for {
- m.Cmd(cli.SYSTEM, "ssh", "-CNR", kit.Format("%s:%s:22", arg[2], kit.Select("localhost", arg, 3)),
- kit.Format("%s@%s", arg[0], arg[1]))
- m.Info("reconnect after 10s")
- time.Sleep(time.Second * 10)
- }
- })
- }},
- },
- }, nil)
-}
diff --git a/base/ssh/channel.go b/base/ssh/channel.go
index edddb4a5..242efb25 100644
--- a/base/ssh/channel.go
+++ b/base/ssh/channel.go
@@ -52,7 +52,7 @@ func _ssh_watch(m *ice.Message, meta map[string]string, h string, input io.Reade
switch buf[i] {
case '\r', '\n':
cmd := strings.TrimSpace(string(buf[:i]))
- m.Log_IMPORT(aaa.HOSTNAME, meta[aaa.HOSTNAME], aaa.USERNAME, meta[aaa.USERNAME], CMD, cmd)
+ m.Log_IMPORT(tcp.HOSTNAME, meta[tcp.HOSTNAME], aaa.USERNAME, meta[aaa.USERNAME], CMD, cmd)
m.Cmdy(mdb.INSERT, CHANNEL, kit.Keys(kit.MDB_HASH, h), mdb.LIST, kit.MDB_TYPE, CMD, kit.MDB_TEXT, cmd)
i = 0
default:
diff --git a/base/ssh/connect.go b/base/ssh/connect.go
index ae6577cc..14d1d5e0 100644
--- a/base/ssh/connect.go
+++ b/base/ssh/connect.go
@@ -24,7 +24,7 @@ func _ssh_conn(m *ice.Message, conn net.Conn, username, hostport string) (*ssh.C
c, chans, reqs, err := ssh.NewClientConn(conn, hostport, &ssh.ClientConfig{
User: username, Auth: methods, HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
- m.Logs(CONNECT, aaa.HOSTNAME, hostname, aaa.HOSTPORT, remote.String())
+ m.Logs(CONNECT, tcp.HOSTNAME, hostname, tcp.HOSTPORT, remote.String())
return nil
},
})
diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go
index ba514dc0..66766c27 100644
--- a/base/ssh/scripts.go
+++ b/base/ssh/scripts.go
@@ -283,7 +283,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
r, f.stdout = os.Stdin, os.Stdout
m.Option("_option", ice.MSG_USERNAME)
- m.Option(ice.MSG_USERNAME, cli.UserName)
+ m.Option(ice.MSG_USERNAME, ice.Info.UserName)
m.Option(ice.MSG_USERROLE, aaa.ROOT)
m.Option(ice.MSG_USERZONE, "boot")
aaa.UserRoot(m)
@@ -355,7 +355,7 @@ func init() {
}
if arg[0] == STDIO {
- m.Option("_control", "page")
+ m.Option("_control", "_page")
} else {
m.Option("cache.limit", "-1")
}
diff --git a/base/ssh/service.go b/base/ssh/service.go
index 54550141..27030005 100644
--- a/base/ssh/service.go
+++ b/base/ssh/service.go
@@ -23,7 +23,7 @@ import (
)
func _ssh_meta(conn ssh.ConnMetadata) map[string]string {
- return map[string]string{aaa.USERNAME: conn.User(), aaa.HOSTPORT: conn.RemoteAddr().String()}
+ return map[string]string{aaa.USERNAME: conn.User(), tcp.HOSTPORT: conn.RemoteAddr().String()}
}
func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
@@ -31,7 +31,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
meta, err := _ssh_meta(conn), errors.New(ice.ErrNotAuth)
if tcp.IsLocalHost(m, strings.Split(conn.RemoteAddr().String(), ":")[0]) {
- m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User())
+ m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User())
err = nil // 本机用户
} else {
m.Cmd(mdb.SELECT, SERVICE, kit.Keys(kit.MDB_HASH, h), mdb.LIST).Table(func(index int, value map[string]string, head []string) {
@@ -42,8 +42,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e != nil, e) {
if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 {
- m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.HOSTNAME, value[kit.MDB_NAME])
- meta[aaa.HOSTNAME] = kit.Select("", kit.Split(value[kit.MDB_NAME], "@"), 1)
+ m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[kit.MDB_NAME])
+ meta[tcp.HOSTNAME] = kit.Select("", kit.Split(value[kit.MDB_NAME], "@"), 1)
err = nil // 认证成功
}
}
@@ -56,7 +56,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
meta, err := _ssh_meta(conn), errors.New(ice.ErrNotAuth)
m.Richs(aaa.USER, "", conn.User(), func(k string, value map[string]interface{}) {
if string(password) == kit.Format(value[aaa.PASSWORD]) {
- m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD]))))
+ m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD]))))
err = nil // 密码登录
}
})
@@ -64,7 +64,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
},
BannerCallback: func(conn ssh.ConnMetadata) string {
- m.Log_IMPORT(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User())
+ m.Log_IMPORT(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User())
return m.Conf(SERVICE, "meta.welcome")
},
}
@@ -94,8 +94,8 @@ func _ssh_accept(m *ice.Message, h string, c net.Conn) {
}
}
func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh.Channel, requests <-chan *ssh.Request) {
- m.Logs(CHANNEL, aaa.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
- defer m.Logs("dischan", aaa.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
+ m.Logs(CHANNEL, tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
+ defer m.Logs("dischan", tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
shell := kit.Select("bash", os.Getenv("SHELL"))
list := []string{"PATH=" + os.Getenv("PATH")}
@@ -110,7 +110,7 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh
meta[CHANNEL] = h
for request := range requests {
- m.Logs("request", aaa.HOSTPORT, c.RemoteAddr(), kit.MDB_TYPE, request.Type)
+ m.Logs("request", tcp.HOSTPORT, c.RemoteAddr(), kit.MDB_TYPE, request.Type)
switch request.Type {
case "pty-req":
diff --git a/base/ssh/ssh.go b/base/ssh/ssh.go
index 1e13b5ca..4aeba28a 100644
--- a/base/ssh/ssh.go
+++ b/base/ssh/ssh.go
@@ -14,7 +14,7 @@ var Index = &ice.Context{Name: SSH, Help: "终端模块", Commands: map[string]*
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if _, ok := m.Target().Server().(*Frame); ok {
- m.Done()
+ m.Done(true)
}
m.Richs(SERVICE, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
kit.Value(value, "meta.status", tcp.CLOSE)
diff --git a/base/tcp/client.go b/base/tcp/client.go
index 985e094c..5ba6d00d 100644
--- a/base/tcp/client.go
+++ b/base/tcp/client.go
@@ -56,10 +56,11 @@ func init() {
},
Commands: map[string]*ice.Command{
CLIENT: {Name: "client hash auto 清理", Help: "客户端", Action: map[string]*ice.Action{
- DIAL: {Name: "dial port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
+ DIAL: {Name: "dial type name port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
c, e := net.Dial(TCP, m.Option(HOST)+":"+m.Option(PORT))
h := m.Cmdx(mdb.INSERT, CLIENT, "", mdb.HASH, PORT, m.Option(PORT), HOST, m.Option(HOST),
- kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e))
+ kit.MDB_TYPE, m.Option(kit.MDB_TYPE), kit.MDB_NAME, m.Option(kit.MDB_NAME),
+ kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e))
c = &Conn{m: m, h: h, s: &Stat{}, Conn: c}
if e == nil {
@@ -92,10 +93,10 @@ func init() {
m.Cmdy(mdb.PRUNES, CLIENT, "", mdb.HASH, kit.MDB_STATUS, CLOSE)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Option(mdb.FIELDS, kit.Select("time,hash,status,name,host,port,error,nread,nwrite", mdb.DETAIL, len(arg) > 0))
+ m.Option(mdb.FIELDS, kit.Select("time,hash,status,type,name,host,port,error,nread,nwrite", mdb.DETAIL, len(arg) > 0))
if m.Cmdy(mdb.SELECT, CLIENT, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) == 0 {
m.Table(func(index int, value map[string]string, head []string) {
- m.PushButton(kit.Select("", "删除", value[kit.MDB_STATUS] == CLOSE))
+ m.PushButton(kit.Select("", "删除", value[kit.MDB_STATUS] == OPEN))
})
}
}},
diff --git a/base/tcp/host.go b/base/tcp/host.go
index e94bc7d2..bbb10969 100644
--- a/base/tcp/host.go
+++ b/base/tcp/host.go
@@ -60,6 +60,10 @@ func _islocalhost(m *ice.Message, ip string) (ok bool) {
}
func IsLocalHost(m *ice.Message, ip string) bool { return _islocalhost(m, ip) }
+const (
+ HOSTPORT = "hostport"
+ HOSTNAME = "hostname"
+)
const HOST = "host"
func init() {
diff --git a/base/tcp/server.go b/base/tcp/server.go
index d1ac8705..fac22a89 100644
--- a/base/tcp/server.go
+++ b/base/tcp/server.go
@@ -27,7 +27,8 @@ func (l Listener) Accept() (net.Conn, error) {
ls = strings.Split(strings.TrimPrefix(c.RemoteAddr().String(), "["), "]:")
}
h := l.m.Cmdx(mdb.INSERT, CLIENT, "", mdb.HASH, HOST, ls[0], PORT, ls[1],
- kit.MDB_NAME, l.m.Option(kit.MDB_NAME), kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e))
+ kit.MDB_TYPE, l.m.Option(kit.MDB_TYPE), kit.MDB_NAME, l.m.Option(kit.MDB_NAME),
+ kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e))
return &Conn{m: l.m, h: h, s: &Stat{}, Conn: c}, e
}
@@ -50,10 +51,10 @@ func init() {
},
Commands: map[string]*ice.Command{
SERVER: {Name: "server hash auto 清理", Help: "服务器", Action: map[string]*ice.Action{
- LISTEN: {Name: "LISTEN port=9010 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
+ LISTEN: {Name: "LISTEN type name port=9010 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
l, e := net.Listen(TCP, m.Option(HOST)+":"+m.Option(PORT))
- h := m.Cmdx(mdb.INSERT, SERVER, "", mdb.HASH, PORT, m.Option(PORT), HOST, m.Option(HOST),
- kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e))
+ h := m.Cmdx(mdb.INSERT, SERVER, "", mdb.HASH, arg,
+ kit.MDB_STATUS, kit.Select(ERROR, OPEN, e == nil), kit.MDB_ERROR, kit.Format(e))
l = &Listener{m: m, h: h, s: &Stat{}, Listener: l}
if e == nil {
@@ -105,7 +106,7 @@ func init() {
m.Cmdy(mdb.PRUNES, SERVER, "", mdb.HASH, kit.MDB_STATUS, CLOSE)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Option(mdb.FIELDS, kit.Select("time,hash,status,name,host,port,error,nconn", mdb.DETAIL, len(arg) > 0))
+ m.Option(mdb.FIELDS, kit.Select("time,hash,status,type,name,host,port,error,nconn", mdb.DETAIL, len(arg) > 0))
if m.Cmdy(mdb.SELECT, SERVER, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) == 0 {
m.Table(func(index int, value map[string]string, head []string) {
m.PushButton(kit.Select("", "删除", value[kit.MDB_STATUS] == CLOSE))
diff --git a/base/web/cache.go b/base/web/cache.go
index 8bd355fc..75f16a6d 100644
--- a/base/web/cache.go
+++ b/base/web/cache.go
@@ -13,31 +13,13 @@ import (
)
func _cache_name(m *ice.Message, h string) string {
- return path.Join(m.Conf(CACHE, "meta.path"), h[:2], h)
-}
-
-func _cache_list(m *ice.Message, key string) {
- if key == "" {
- m.Grows(CACHE, nil, "", "", func(index int, value map[string]interface{}) {
- // 缓存列表
- m.Push("", value, []string{kit.MDB_TIME, kit.MDB_ID, DATA, kit.MDB_TYPE})
- m.Push(kit.MDB_SIZE, kit.FmtSize(kit.Int64(value[kit.MDB_SIZE])))
- m.Push("", value, []string{kit.MDB_NAME, kit.MDB_TEXT})
- })
- m.Sort(kit.MDB_ID, "int_r")
- return
- }
- m.Richs(CACHE, nil, key, func(key string, value map[string]interface{}) {
- // 缓存详情
- m.Push("detail", value)
- })
+ return path.Join(m.Conf(CACHE, kit.META_PATH), h[:2], h)
}
func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // file size
if name == "" {
return
}
- if len(text) > 512 {
- // 存入文件
+ if len(text) > 512 { // 存入文件
p := m.Cmdx(nfs.SAVE, _cache_name(m, kit.Hashs(text)), text)
text, arg = p, kit.Simple(p, len(text))
}
@@ -46,17 +28,9 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi
size := kit.Int(kit.Select(kit.Format(len(text)), arg, 1))
file := kit.Select("", arg, 0)
text = kit.Select(file, text)
- h := m.Rich(CACHE, nil, kit.Dict(
+ h := m.Cmdx(mdb.INSERT, CACHE, "", mdb.HASH,
kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text,
- kit.MDB_FILE, file, kit.MDB_SIZE, size,
- ))
- m.Log_CREATE(CACHE, h, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
-
- // 添加记录
- m.Grow(CACHE, nil, kit.Dict(
- kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text,
- kit.MDB_SIZE, size, DATA, h,
- ))
+ kit.MDB_FILE, file, kit.MDB_SIZE, size)
// 返回结果
m.Push(kit.MDB_TIME, m.Time())
@@ -68,15 +42,15 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi
m.Push(DATA, h)
}
func _cache_watch(m *ice.Message, key, file string) {
- m.Richs(CACHE, nil, key, func(key string, value map[string]interface{}) {
- if value[kit.MDB_FILE] == nil {
+ m.Option(mdb.FIELDS, "time,hash,size,type,name,text,file")
+ m.Cmd(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, key).Table(func(index int, value map[string]string, head []string) {
+ if value[kit.MDB_FILE] == "" {
m.Cmdy(nfs.SAVE, file, value[kit.MDB_TEXT])
} else {
m.Cmdy(nfs.LINK, file, value[kit.MDB_FILE])
}
})
}
-
func _cache_catch(m *ice.Message, name string) (file, size string) {
if f, e := os.Open(name); m.Assert(e) {
defer f.Close()
@@ -99,7 +73,7 @@ func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size stri
buf.Seek(0, os.SEEK_SET)
if n, e := io.Copy(f, buf); m.Assert(e) {
m.Log_IMPORT(kit.MDB_FILE, p, kit.MDB_SIZE, kit.FmtSize(int64(n)))
- return h.Header.Get("Content-Type"), h.Filename, p, kit.Format(n)
+ return h.Header.Get(ContentType), h.Filename, p, kit.Format(n)
}
}
}
@@ -108,7 +82,7 @@ func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size stri
func _cache_download(m *ice.Message, r *http.Response) (file, size string) {
defer r.Body.Close()
- total := kit.Int(kit.Select("1", r.Header.Get("Content-Length")))
+ total := kit.Int(kit.Select("1", r.Header.Get(ContentLength)))
if f, p, e := kit.Create(path.Join("var/tmp", kit.Hashs("uniq"))); m.Assert(e) {
size, buf := 0, make([]byte, 1024)
for {
@@ -160,18 +134,15 @@ const CACHE = "cache"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- CACHE: {Name: "cache", Help: "缓存池", Value: kit.Data(
- kit.MDB_SHORT, kit.MDB_TEXT,
- kit.MDB_PATH, "var/file",
- kit.MDB_STORE, "var/data",
- kit.MDB_FSIZE, "200000",
- kit.MDB_LIMIT, "50",
- kit.MDB_LEAST, "30",
+ CACHE: {Name: CACHE, Help: "缓存池", Value: kit.Data(
+ kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_PATH, "var/file",
+ kit.MDB_STORE, "var/data", kit.MDB_FSIZE, "200000",
+ kit.MDB_LIMIT, "50", kit.MDB_LEAST, "30",
)},
},
Commands: map[string]*ice.Command{
- CACHE: {Name: "cache data=auto auto", Help: "缓存池", Action: map[string]*ice.Action{
- WATCH: {Name: "watch key file", Help: "查看", Hand: func(m *ice.Message, arg ...string) {
+ CACHE: {Name: "cache hash auto", Help: "缓存池", Action: map[string]*ice.Action{
+ WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
_cache_watch(m, arg[0], arg[1])
}},
WRITE: {Name: "write type name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
@@ -186,15 +157,16 @@ func init() {
_cache_save(m, kind, name, "", file, size)
}},
DOWNLOAD: {Name: "download type name", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
- if r, ok := m.Optionv("response").(*http.Response); ok {
+ if r, ok := m.Optionv(RESPONSE).(*http.Response); ok {
file, size := _cache_download(m, r)
_cache_save(m, arg[0], arg[1], "", file, size)
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Option(mdb.FIELDS, "time,size,type,name,text,file")
- m.Cmdy(mdb.SELECT, m.Prefix(CACHE), "", mdb.HASH, kit.MDB_HASH, arg)
+ m.Option(mdb.FIELDS, "time,hash,size,type,name,text,file")
+ m.Cmdy(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, arg)
}},
+
"/cache/": {Name: "/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Richs(CACHE, nil, arg[0], func(key string, value map[string]interface{}) {
if value[kit.MDB_FILE] == nil {
diff --git a/base/web/dream.go b/base/web/dream.go
index 96c154cc..e990800e 100644
--- a/base/web/dream.go
+++ b/base/web/dream.go
@@ -4,6 +4,7 @@ import (
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/icebergs/base/nfs"
kit "github.com/shylinux/toolkits"
@@ -14,33 +15,35 @@ import (
)
func _dream_list(m *ice.Message) {
- // 任务列表
- m.Cmdy(nfs.DIR, m.Conf(DREAM, "meta.path"), "time name").Table(func(index int, value map[string]string, head []string) {
+ m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "time size name").Table(func(index int, value map[string]string, head []string) {
if m.Richs(SPACE, nil, value[kit.MDB_NAME], func(key string, value map[string]interface{}) {
m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE])
m.Push(kit.MDB_STATUS, gdb.START)
+ m.PushButton(gdb.STOP)
}) == nil {
- m.Push(kit.MDB_TYPE, "none")
+ m.Push(kit.MDB_TYPE, WORKER)
m.Push(kit.MDB_STATUS, gdb.STOP)
+ m.PushButton(gdb.START)
}
- m.PushRender("action", "button", "start,stop,restart")
})
- m.Sort(kit.MDB_NAME)
+ m.Sort(kit.MDB_NAME, "str_r")
}
func _dream_show(m *ice.Message, name string) {
// 规范命名
if !strings.Contains(name, "-") || !strings.HasPrefix(name, "20") {
- name = m.Time("20060102-") + name
+ name = m.Time("20060102-") + strings.ReplaceAll(name, "-", "_")
}
// 创建目录
- p := path.Join(m.Conf(DREAM, "meta.path"), name)
+ p := path.Join(m.Conf(DREAM, kit.META_PATH), name)
os.MkdirAll(p, ice.MOD_DIR)
- if m.Option("repos") != "" {
- m.Cmd("web.code.git.repos", "create", "remote", m.Option("repos"), "path", p)
+ // 下载代码
+ if m.Option(kit.SSH_REPOS) != "" {
+ m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, m.Option(kit.SSH_REPOS), kit.MDB_PATH, p)
}
+ // 任务脚本
miss := path.Join(p, "etc/miss.sh")
if _, e := os.Stat(miss); e != nil {
m.Cmd(nfs.SAVE, miss, m.Conf(DREAM, "meta.miss"))
@@ -49,39 +52,36 @@ func _dream_show(m *ice.Message, name string) {
if b, e := ioutil.ReadFile(path.Join(p, m.Conf(gdb.SIGNAL, "meta.pid"))); e == nil {
if s, e := os.Stat("/proc/" + string(b)); e == nil && s.IsDir() {
m.Info("already exists %v", string(b))
- // 已经启动
- return
+ return // 已经启动
}
}
if m.Richs(SPACE, nil, name, nil) == nil {
- // 启动任务
- m.Option(cli.CMD_DIR, p)
- m.Option(cli.CMD_STDERR, path.Join(p, m.Conf(DREAM, "meta.env.ctx_log")))
+ m.Optionv(cli.CMD_DIR, p)
m.Optionv(cli.CMD_ENV, kit.Simple(
"ctx_dev", m.Conf(cli.RUNTIME, "conf.ctx_dev"),
"PATH", kit.Path(path.Join(p, "bin"))+":"+os.Getenv("PATH"),
- "USER", cli.UserName,
- m.Confv(DREAM, "meta.env"),
+ "USER", ice.Info.UserName, m.Confv(DREAM, "meta.env"),
))
+ // 启动任务
+ m.Optionv(cli.CMD_STDERR, path.Join(p, m.Conf(DREAM, "meta.env.ctx_log")))
m.Cmd(cli.DAEMON, m.Confv(DREAM, "meta.cmd"), "self", name)
}
m.Cmdy(nfs.DIR, p)
}
-const DREAM = "dream"
const (
DREAM_START = "dream.start"
DREAM_STOP = "dream.stop"
)
+const DREAM = "dream"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- DREAM: {Name: "dream", Help: "梦想家", Value: kit.Data("path", "usr/local/work",
- "cmd", []interface{}{"ice.bin", SPACE, "connect"}, "env", kit.Dict(
- "ctx_log", "bin/boot.log", "ctx_mod", "ctx,log,gdb,ssh",
- ),
+ DREAM: {Name: DREAM, Help: "梦想家", Value: kit.Data("path", "usr/local/work",
+ "cmd", []interface{}{"ice.bin", SPACE, "connect"},
+ "env", kit.Dict("ctx_log", "bin/boot.log"),
"miss", `#!/bin/bash
[ -f ~/.ish/plug.sh ] || [ -f ./.ish/plug.sh ] || git clone ${ISH_CONF_HUB_PROXY:="https://"}github.com/shylinux/intshell ./.ish
[ "$ISH_CONF_PRE" != "" ] || source ./.ish/plug.sh || source ~/.ish/plug.sh
@@ -97,29 +97,26 @@ ish_miss_prepare_install
)},
},
Commands: map[string]*ice.Command{
- DREAM: {Name: "dream [name [cmd...]] auto", Help: "梦想家", Meta: kit.Dict("detail", []interface{}{"启动", "停止"}), Action: map[string]*ice.Action{
- gdb.START: {Name: "start type name", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
- m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME)))
- _dream_show(m, m.Option(kit.MDB_NAME))
+ DREAM: {Name: "dream name path auto 启动", Help: "梦想家", Action: map[string]*ice.Action{
+ gdb.START: {Name: "start type=worker,server name repos", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
+ _dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME))))
}},
gdb.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(SPACE, m.Option(kit.MDB_NAME), "exit", "1")
+ m.Cmdy(SPACE, m.Option(kit.MDB_NAME), "exit", "0")
}},
- gdb.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(SPACE, m.Option(kit.MDB_NAME), "exit", "1")
- m.Sleep("1s")
- _dream_show(m, m.Option(kit.MDB_NAME))
+ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
+ switch arg[0] {
+ case kit.MDB_NAME:
+ m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,time")
+ }
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
_dream_list(m)
return
}
- if len(arg) > 1 {
- m.Cmdy(SPACE, arg[0], arg[1:])
- return
- }
- _dream_show(m, arg[0])
+ m.Option(nfs.DIR_ROOT, path.Join(m.Conf(DREAM, kit.META_PATH), arg[0]))
+ m.Cmdy(nfs.DIR, arg[1:])
}},
},
}, nil)
diff --git a/base/web/render.go b/base/web/render.go
index 471d1500..df83b2b8 100644
--- a/base/web/render.go
+++ b/base/web/render.go
@@ -3,7 +3,6 @@ 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"
@@ -14,26 +13,6 @@ import (
"time"
)
-func URL(m *ice.Message, path string, arg ...interface{}) string {
- list := kit.Simple(arg)
- if m.Option("pod") != "" {
- list = append(list, "pod", m.Option("pod"))
- }
- return kit.MergeURL2(m.R.Header.Get("Origin"), path, list)
-}
-func Count(m *ice.Message, cmd, key, name string) int {
- count := kit.Int(m.Conf(cmd, kit.Keys(key, name)))
- m.Conf(cmd, kit.Keys(key, name), count+1)
- return count
-}
-func Format(key string, arg ...interface{}) string {
- switch args := kit.Simple(arg); key {
- case "a":
- return fmt.Sprintf("%s", kit.Format(args[0]), kit.Select(kit.Format(args[0]), args, 1))
- }
- return ""
-}
-
const (
STATUS = "status"
COOKIE = "cookie"
@@ -97,69 +76,7 @@ func RenderCookie(msg *ice.Message, value string, arg ...string) { // name path
expire := time.Now().Add(kit.Duration(kit.Select(msg.Conf(aaa.SESS, "meta.expire"), arg, 2)))
http.SetCookie(msg.W, &http.Cookie{Value: value, Name: kit.Select(ice.MSG_SESSID, arg, 0), Path: kit.Select("/", arg, 1), Expires: expire})
}
-func RenderStatus(msg *ice.Message, code int, text string) { // name path expire
+func RenderStatus(msg *ice.Message, code int, text string) {
msg.W.WriteHeader(code)
msg.W.Write([]byte(text))
}
-
-var RENDER = struct {
- A string
- IMG string
- Video string
- Field string
- Frame string
- Button string
-
- Download string
-}{
- A: "a",
- IMG: "img",
- Video: "video",
- Field: "field",
- Frame: "frame",
- Button: "button",
-
- Download: "download",
-}
-
-func init() {
- Index.Merge(&ice.Context{
- Commands: map[string]*ice.Command{
- "_render": {Action: map[string]*ice.Action{
- RENDER.A: {Hand: func(m *ice.Message, arg ...string) {
- // u := kit.Select(m.Conf(SHARE, "meta.domain"), arg, 1)
- u := kit.Select(arg[0], arg, 1)
- m.Echo(`%s`, u, arg[0])
- }},
- RENDER.IMG: {Hand: func(m *ice.Message, arg ...string) {
- m.Echo(`
`, arg[0], kit.Select("120", arg, 1))
- }},
- RENDER.Video: {Hand: func(m *ice.Message, arg ...string) {
- m.Echo(`