1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-02 11:37:01 +08:00
This commit is contained in:
harveyshao 2022-08-05 23:44:09 +08:00
parent 441013508b
commit 3b5b2b717b
20 changed files with 75 additions and 43 deletions

View File

@ -66,7 +66,6 @@ func init() {
}}, }},
CHECK: {Name: "check sessid", Help: "检查", Hand: func(m *ice.Message, arg ...string) { CHECK: {Name: "check sessid", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
_sess_check(m, m.Option(SESSID)) _sess_check(m, m.Option(SESSID))
m.Debug("what %v", m.FormatsMeta())
}}, }},
}, mdb.HashAction(mdb.SHORT, mdb.UNIQ, mdb.FIELD, "time,hash,userrole,username,usernick,ip,ua", mdb.EXPIRE, "720h"))}, }, mdb.HashAction(mdb.SHORT, mdb.UNIQ, mdb.FIELD, "time,hash,userrole,username,usernick,ip,ua", mdb.EXPIRE, "720h"))},
}) })

View File

@ -25,12 +25,13 @@ func _user_login(m *ice.Message, name, word string) {
if m.Warn(name == "", ice.ErrNotValid, name) { if m.Warn(name == "", ice.ErrNotValid, name) {
return return
} }
if !mdb.HashSelectDetail(m, name, nil) { if !mdb.HashSelectDetail(m.Spawn(), name, nil) {
_user_create(m, VOID, name, word) _user_create(m.Spawn(), name, word)
} }
m.Debug("what %v", m.FormatMeta())
_source := logs.FileLineMeta(logs.FileLine(-1, 3)) _source := logs.FileLineMeta(logs.FileLine(-1, 3))
mdb.HashSelectDetail(m, name, func(value ice.Map) { mdb.HashSelectDetail(m.Spawn(), name, func(value ice.Map) {
if m.Warn(word != "" && word != kit.Format(kit.Value(value, kit.Keys(mdb.EXTRA, PASSWORD))), ice.ErrNotRight) { if m.Warn(word != "" && word != kit.Format(kit.Value(value, kit.Keys(mdb.EXTRA, PASSWORD))), ice.ErrNotRight) {
return return
} }
@ -41,6 +42,7 @@ func _user_login(m *ice.Message, name, word string) {
_source, _source,
) )
}) })
m.Debug("what %v", m.FormatMeta())
} }
const ( const (

View File

@ -38,7 +38,8 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
return true return true
} }
file := kit.Select(BENCH, m.Conf(SHOW, kit.Keys(l.l, FILE))) // file := kit.Select(BENCH, m.Conf(SHOW, kit.Keys(l.l, FILE)))
file := BENCH
view := m.Confm(VIEW, m.Conf(SHOW, kit.Keys(l.l, VIEW))) view := m.Confm(VIEW, m.Conf(SHOW, kit.Keys(l.l, VIEW)))
bio := m.Confv(FILE, kit.Keys(file, FILE)).(*bufio.Writer) bio := m.Confv(FILE, kit.Keys(file, FILE)).(*bufio.Writer)
if bio == nil { if bio == nil {

View File

@ -279,12 +279,14 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
} }
} }
func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) { func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) {
msg.Debug("what %v", msg.Append("extra.password"))
aaa.SessCheck(msg, msg.Option(ice.MSG_SESSID)) // 会话认证 aaa.SessCheck(msg, msg.Option(ice.MSG_SESSID)) // 会话认证
msg.Debug("what %v", msg.FormatsMeta())
msg.Debug("what %v", msg.Append("extra.password"))
if msg.Config("staffname") != "" { if msg.Config("staffname") != "" {
aaa.UserLogin(msg, r.Header.Get("Staffname"), "") aaa.UserLogin(msg, r.Header.Get("Staffname"), "")
} }
msg.Debug("what %v", msg.Append("extra.password"))
if msg.Option(ice.MSG_USERNAME) == "" && msg.Config(tcp.LOCALHOST) == ice.TRUE && tcp.IsLocalHost(msg, msg.Option(ice.MSG_USERIP)) { if msg.Option(ice.MSG_USERNAME) == "" && msg.Config(tcp.LOCALHOST) == ice.TRUE && tcp.IsLocalHost(msg, msg.Option(ice.MSG_USERIP)) {
aaa.UserRoot(msg) // 本机认证 aaa.UserRoot(msg) // 本机认证

View File

@ -99,6 +99,9 @@ const ACTION = "action"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{ web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg) m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg)
}}, }},

View File

@ -55,7 +55,7 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeActions(ice.Actions{ CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, CMD) m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, CMD)
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SHY, mdb.NAME, "web.wiki.word") m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SHY, mdb.NAME, "web.wiki.word")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, "web.wiki.draw") m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, "web.wiki.draw")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.CSV, mdb.NAME, "web.wiki.data") m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.CSV, mdb.NAME, "web.wiki.data")

View File

@ -16,6 +16,9 @@ const FOOTER = "footer"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
FOOTER: {Name: "footer", Help: "状态栏", Actions: ice.MergeActions(ice.Actions{ FOOTER: {Name: "footer", Help: "状态栏", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
if aaa.Right(m, arg) { if aaa.Right(m, arg) {
if m.Cmdy(arg); m.IsErrNotFound() { if m.Cmdy(arg); m.IsErrNotFound() {

View File

@ -60,7 +60,7 @@ const HEADER = "header"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) { web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch kit.Select("", arg, 0) {
case web.P(HEADER): case web.P(HEADER):
switch kit.Select("", arg, 1) { switch kit.Select("", arg, 1) {
case "", aaa.LOGIN: case "", aaa.LOGIN:
@ -74,6 +74,9 @@ func init() {
m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg)
}}, }},
HEADER: {Name: "header", Help: "标题栏", Actions: ice.MergeActions(ice.Actions{ HEADER: {Name: "header", Help: "标题栏", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
}},
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) { aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) { if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0])) web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
@ -116,7 +119,9 @@ func init() {
m.Option(k, msg.Append(k)) m.Option(k, msg.Append(k))
} }
for _, k := range []string{aaa.AVATAR, aaa.BACKGROUND} { for _, k := range []string{aaa.AVATAR, aaa.BACKGROUND} {
m.Option(k, kit.Select(web.SHARE_LOCAL+k, kit.Select("void", msg.Append(k)), aaa.Right(m, msg.Append(k)))) if msg.Append(k) != "" && aaa.Right(m.Spawn(), msg.Append(k)) {
m.Option(k, web.SHARE_LOCAL+k)
}
} }
if m.Option(aaa.AVATAR) == "" && m.R.Header.Get("Staffname") != "" { if m.Option(aaa.AVATAR) == "" && m.R.Header.Get("Staffname") != "" {
m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname"))) m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname")))

View File

@ -18,7 +18,7 @@ const POD = "pod"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
POD: {Name: "pod", Help: "节点", Actions: ice.MergeActions(ice.Actions{ POD: {Name: "pod", Help: "节点", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, POD) }}, ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, POD) }},
}, ctx.CmdAction(), web.ApiAction("/pod/")), Hand: func(m *ice.Message, arg ...string) { }, ctx.CmdAction(), web.ApiAction("/pod/")), Hand: func(m *ice.Message, arg ...string) {
if web.OptionAgentIs(m, "curl", "Wget") { if web.OptionAgentIs(m, "curl", "Wget") {
aaa.UserRoot(m) aaa.UserRoot(m)

View File

@ -43,9 +43,9 @@ func _river_list(m *ice.Message) {
} }
} }
mdb.Richs(m, RIVER, nil, mdb.FOREACH, func(key string, value ice.Map) { m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(mdb.HASH, mdb.NAME)).Tables(func(value ice.Maps) {
mdb.Richs(m, RIVER, kit.Keys(mdb.HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), func(k string, val ice.Map) { m.Cmd(mdb.SELECT, m.PrefixKey(), kit.Keys(mdb.HASH, value[mdb.HASH], OCEAN), mdb.HASH, m.Option(ice.MSG_USERNAME)).Tables(func(value ice.Maps) {
m.Push(key, kit.GetMeta(value), []string{mdb.HASH, mdb.NAME}, kit.GetMeta(val)) m.Push("", value, []string{mdb.HASH, mdb.NAME}, value)
}) })
}) })
} }
@ -58,6 +58,9 @@ const RIVER = "river"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{ RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case cli.START, "创建空间": case cli.START, "创建空间":

View File

@ -14,7 +14,7 @@ const SSO = "sso"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
"/sso": {Name: "/sso", Help: "登录", Actions: ice.Actions{ "/sso": {Name: "/sso", Help: "登录", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, SSO) }}, ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, SSO) }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_USERNAME) == "" { if m.Option(ice.MSG_USERNAME) == "" {
web.RenderIndex(m, ice.VOLCANOS) web.RenderIndex(m, ice.VOLCANOS)

View File

@ -2,6 +2,7 @@ package chat
import ( import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
@ -53,18 +54,24 @@ func init() {
m.OptionFields("time,id,space,index,args,style,display") m.OptionFields("time,id,space,index,args,style,display")
msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1)) msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1))
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组 if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
if aaa.Right(m, arg[1]) {
msg.Push(ctx.INDEX, arg[1]) msg.Push(ctx.INDEX, arg[1])
} }
}
if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令 if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
if !m.Warn(aaa.Right(m, msg.Append(ctx.INDEX))) {
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:]) m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:])
}
return return
} }
if m.Copy(msg); len(arg) > 1 { // 命令插件 if m.Copy(msg); len(arg) > 1 { // 命令插件
m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) }) m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) })
if m.Length() > 0 {
m.ProcessField(arg[0], arg[1], ice.RUN) m.ProcessField(arg[0], arg[1], ice.RUN)
} }
}
}}, }},
}) })
} }

View File

@ -26,7 +26,7 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeActions(ice.Actions{ TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, TOPIC) m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, TOPIC)
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {

View File

@ -43,7 +43,8 @@ func init() {
}, Commands: ice.Commands{ }, Commands: ice.Commands{
WORD: {Name: "word path=src/main.shy@key list play", Help: "语言文字", Actions: ice.MergeActions(ice.Actions{ WORD: {Name: "word path=src/main.shy@key list play", Help: "语言文字", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey("src/main.shy")) m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey())
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, "src/main.shy")
}}, }},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" { if arg[0] == mdb.FOREACH && arg[1] == "" {

View File

@ -518,7 +518,13 @@ func (m *Message) Appendv(key string, arg ...Any) []string {
if len(arg) > 0 { if len(arg) > 0 {
m.meta[key] = kit.Simple(arg...) m.meta[key] = kit.Simple(arg...)
} }
return m.meta[key] if v, ok := m.meta[key]; ok {
return v
}
if v, ok := m.meta[kit.Keys(EXTRA, key)]; ok {
return v
}
return nil
} }
func (m *Message) Resultv(arg ...Any) []string { func (m *Message) Resultv(arg ...Any) []string {
if len(arg) > 0 { if len(arg) > 0 {

View File

@ -17,7 +17,7 @@ import (
) )
func _ssh_exec(m *ice.Message, cmd string, arg []string, env []string, input io.Reader, output io.Writer, done func()) { func _ssh_exec(m *ice.Message, cmd string, arg []string, env []string, input io.Reader, output io.Writer, done func()) {
m.Log_IMPORT(CMD, cmd, ARG, arg, ENV, env) m.Logs(mdb.IMPORT, CMD, cmd, ARG, arg, ENV, env)
c := exec.Command(cmd, arg...) c := exec.Command(cmd, arg...)
// c.Env = env // c.Env = env
@ -52,7 +52,7 @@ func _ssh_watch(m *ice.Message, meta ice.Maps, h string, input io.Reader, output
switch buf[i] { switch buf[i] {
case '\r', '\n': case '\r', '\n':
cmd := strings.TrimSpace(string(buf[:i])) cmd := strings.TrimSpace(string(buf[:i]))
m.Log_IMPORT(tcp.HOSTNAME, meta[tcp.HOSTNAME], aaa.USERNAME, meta[aaa.USERNAME], CMD, cmd) m.Logs(mdb.IMPORT, tcp.HOSTNAME, meta[tcp.HOSTNAME], aaa.USERNAME, meta[aaa.USERNAME], CMD, cmd)
m.Cmdy(mdb.INSERT, CHANNEL, kit.Keys(mdb.HASH, h), mdb.LIST, mdb.TYPE, CMD, mdb.TEXT, cmd) m.Cmdy(mdb.INSERT, CHANNEL, kit.Keys(mdb.HASH, h), mdb.LIST, mdb.TYPE, CMD, mdb.TEXT, cmd)
i = 0 i = 0
default: default:
@ -70,7 +70,7 @@ func init() {
psh.Index.MergeCommands(ice.Commands{ psh.Index.MergeCommands(ice.Commands{
CHANNEL: {Name: "channel hash id auto", Help: "通道", Actions: ice.MergeActions(ice.Actions{ CHANNEL: {Name: "channel hash id auto", Help: "通道", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Richs(CHANNEL, "", mdb.FOREACH, func(key string, value ice.Map) { mdb.Richs(m, CHANNEL, "", mdb.FOREACH, func(key string, value ice.Map) {
kit.Value(value, kit.Keym(mdb.STATUS), tcp.CLOSE) kit.Value(value, kit.Keym(mdb.STATUS), tcp.CLOSE)
}) })
}}, }},
@ -85,7 +85,7 @@ func init() {
ctx.COMMAND: {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, CHANNEL, kit.Keys(mdb.HASH, m.Option(mdb.HASH)), m.Cmdy(mdb.INSERT, CHANNEL, kit.Keys(mdb.HASH, m.Option(mdb.HASH)),
mdb.LIST, mdb.TYPE, CMD, mdb.TEXT, m.Option(CMD)) mdb.LIST, mdb.TYPE, CMD, mdb.TEXT, m.Option(CMD))
m.Richs(CHANNEL, "", m.Option(mdb.HASH), func(key string, value ice.Map) { mdb.Richs(m, CHANNEL, "", m.Option(mdb.HASH), func(key string, value ice.Map) {
if w, ok := kit.Value(value, kit.Keym(INPUT)).(io.Writer); ok { if w, ok := kit.Value(value, kit.Keym(INPUT)).(io.Writer); ok {
w.Write([]byte(m.Option(CMD) + ice.NL)) w.Write([]byte(m.Option(CMD) + ice.NL))
} }

View File

@ -159,13 +159,13 @@ func init() {
CONNECT: {Name: "connect name auto", Help: "连接", Actions: ice.MergeActions(ice.Actions{ CONNECT: {Name: "connect name auto", Help: "连接", Actions: ice.MergeActions(ice.Actions{
tcp.OPEN: {Name: "open authfile username=shy password verfiy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "终端", Hand: func(m *ice.Message, arg ...string) { tcp.OPEN: {Name: "open authfile username=shy password verfiy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
aaa.UserRoot(m) aaa.UserRoot(m)
_ssh_open(m.OptionLoad(m.Option("authfile")), arg...) _ssh_open(nfs.OptionLoad(m, m.Option("authfile")), arg...)
m.Echo("exit %v@%v:%v\n", m.Option(aaa.USERNAME), m.Option(tcp.HOST), m.Option(tcp.PORT)) m.Echo("exit %v@%v:%v\n", m.Option(aaa.USERNAME), m.Option(tcp.HOST), m.Option(tcp.PORT))
}}, }},
tcp.DIAL: {Name: "dial name=shylinux username=shy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "添加", Hand: func(m *ice.Message, arg ...string) { tcp.DIAL: {Name: "dial name=shylinux username=shy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { m.Go(func() {
_ssh_conn(m, func(client *ssh.Client) { _ssh_conn(m, func(client *ssh.Client) {
m.Rich(CONNECT, "", kit.Dict( mdb.Rich(m, CONNECT, "", kit.Dict(
mdb.NAME, m.Option(mdb.NAME), mdb.NAME, m.Option(mdb.NAME),
aaa.USERNAME, m.Option(aaa.USERNAME), aaa.USERNAME, m.Option(aaa.USERNAME),
tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT), tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT),
@ -178,11 +178,11 @@ func init() {
}}, }},
SESSION: {Name: "session name", Help: "会话", Hand: func(m *ice.Message, arg ...string) { SESSION: {Name: "session name", Help: "会话", Hand: func(m *ice.Message, arg ...string) {
var client *ssh.Client var client *ssh.Client
m.Richs(CONNECT, "", m.Option(mdb.NAME), func(key string, value ice.Map) { mdb.Richs(m, CONNECT, "", m.Option(mdb.NAME), func(key string, value ice.Map) {
client, _ = value[CONNECT].(*ssh.Client) client, _ = value[CONNECT].(*ssh.Client)
}) })
h := m.Rich(SESSION, "", kit.Data(mdb.NAME, m.Option(mdb.NAME), mdb.STATUS, tcp.OPEN, CONNECT, m.Option(mdb.NAME))) h := mdb.Rich(m, SESSION, "", kit.Data(mdb.NAME, m.Option(mdb.NAME), mdb.STATUS, tcp.OPEN, CONNECT, m.Option(mdb.NAME)))
if session, e := _ssh_session(m, h, client); m.Assert(e) { if session, e := _ssh_session(m, h, client); m.Assert(e) {
session.Shell() session.Shell()
session.Wait() session.Wait()
@ -190,7 +190,7 @@ func init() {
m.Echo(h) m.Echo(h)
}}, }},
"command": {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) { "command": {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Richs(CONNECT, "", m.Option(mdb.NAME), func(key string, value ice.Map) { mdb.Richs(m, CONNECT, "", m.Option(mdb.NAME), func(key string, value ice.Map) {
if client, ok := value[CONNECT].(*ssh.Client); ok { if client, ok := value[CONNECT].(*ssh.Client); ok {
if session, e := client.NewSession(); m.Assert(e) { if session, e := client.NewSession(); m.Assert(e) {
defer session.Close() defer session.Close()
@ -201,7 +201,7 @@ func init() {
} }
}) })
}}, }},
}, mdb.HashActionStatus(mdb.SHORT, "name", mdb.FIELD, "time,name,status,username,host,port")), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashStatusAction(mdb.SHORT, "name", mdb.FIELD, "time,name,status,username,host,port")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) {
m.PushButton(kit.Select("", "command,session", value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) m.PushButton(kit.Select("", "command,session", value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE)
}) })

View File

@ -28,7 +28,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
meta, err := _ssh_meta(conn), errors.New(ice.ErrNotRight) meta, err := _ssh_meta(conn), errors.New(ice.ErrNotRight)
if tcp.IsLocalHost(m, strings.Split(conn.RemoteAddr().String(), ":")[0]) { if tcp.IsLocalHost(m, strings.Split(conn.RemoteAddr().String(), ":")[0]) {
m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) m.Logs(ice.LOG_AUTH, tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User())
err = nil // 本机用户 err = nil // 本机用户
} else { } else {
m.Cmd(mdb.SELECT, SERVICE, kit.Keys(mdb.HASH, h), mdb.LIST).Tables(func(value ice.Maps) { m.Cmd(mdb.SELECT, SERVICE, kit.Keys(mdb.HASH, h), mdb.LIST).Tables(func(value ice.Maps) {
@ -39,7 +39,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e) { if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e) {
if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 { if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 {
m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[mdb.NAME]) m.Logs(ice.LOG_AUTH, tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[mdb.NAME])
meta[tcp.HOSTNAME] = kit.Select("", kit.Split(value[mdb.NAME], "@"), 1) meta[tcp.HOSTNAME] = kit.Select("", kit.Split(value[mdb.NAME], "@"), 1)
err = nil // 认证成功 err = nil // 认证成功
} }
@ -52,14 +52,14 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) {
meta, err := _ssh_meta(conn), errors.New(ice.ErrNotRight) meta, err := _ssh_meta(conn), errors.New(ice.ErrNotRight)
if aaa.UserLogin(m, conn.User(), string(password)) { if aaa.UserLogin(m, conn.User(), string(password)) {
m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(string(password)))) m.Logs(ice.LOG_AUTH, tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(string(password))))
err = nil // 密码登录 err = nil // 密码登录
} }
return &ssh.Permissions{Extensions: meta}, err return &ssh.Permissions{Extensions: meta}, err
}, },
BannerCallback: func(conn ssh.ConnMetadata) string { BannerCallback: func(conn ssh.ConnMetadata) string {
m.Log_IMPORT(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) m.Logs(ice.LOG_AUTH, tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User())
return m.Conf(SERVICE, kit.Keym(WELCOME)) return m.Conf(SERVICE, kit.Keym(WELCOME))
}, },
} }
@ -106,14 +106,14 @@ func init() {
}, Commands: ice.Commands{ }, Commands: ice.Commands{
SERVICE: {Name: "service port id auto listen prunes", Help: "服务", Actions: ice.MergeActions(ice.Actions{ SERVICE: {Name: "service port id auto listen prunes", Help: "服务", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Richs(SERVICE, "", mdb.FOREACH, func(key string, value ice.Map) { mdb.Richs(m, SERVICE, "", mdb.FOREACH, func(key string, value ice.Map) {
if value = kit.GetMeta(value); kit.Value(value, mdb.STATUS) == tcp.OPEN { if value = kit.GetMeta(value); kit.Value(value, mdb.STATUS) == tcp.OPEN {
m.Cmd(SERVICE, tcp.LISTEN, tcp.PORT, value[tcp.PORT], value) m.Cmd(SERVICE, tcp.LISTEN, tcp.PORT, value[tcp.PORT], value)
} }
}) })
}}, }},
tcp.LISTEN: {Name: "listen port=9030 private=.ssh/id_rsa authkey=.ssh/authorized_keys", Help: "添加", Hand: func(m *ice.Message, arg ...string) { tcp.LISTEN: {Name: "listen port=9030 private=.ssh/id_rsa authkey=.ssh/authorized_keys", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
if m.Richs(SERVICE, "", m.Option(tcp.PORT), func(key string, value ice.Map) { if mdb.Richs(m, SERVICE, "", m.Option(tcp.PORT), func(key string, value ice.Map) {
kit.Value(value, kit.Keym(mdb.STATUS), tcp.OPEN) kit.Value(value, kit.Keym(mdb.STATUS), tcp.OPEN)
}) == nil { }) == nil {
m.Cmd(mdb.INSERT, SERVICE, "", mdb.HASH, tcp.PORT, m.Option(tcp.PORT), m.Cmd(mdb.INSERT, SERVICE, "", mdb.HASH, tcp.PORT, m.Option(tcp.PORT),
@ -159,7 +159,7 @@ func init() {
m.EchoScript(string(buf)) m.EchoScript(string(buf))
} }
}}, }},
}, mdb.HashActionStatus()), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashStatusAction()), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { // 服务列表 if len(arg) == 0 { // 服务列表
mdb.HashSelect(m, arg...) mdb.HashSelect(m, arg...)
m.PushAction(mdb.IMPORT, mdb.INSERT, mdb.EXPORT, aaa.INVITE) m.PushAction(mdb.IMPORT, mdb.INSERT, mdb.EXPORT, aaa.INVITE)

View File

@ -42,7 +42,7 @@ func _ssh_handle(m *ice.Message, meta ice.Maps, c net.Conn, channel ssh.Channel,
} }
defer tty.Close() defer tty.Close()
h := m.Rich(CHANNEL, "", kit.Data(mdb.STATUS, tcp.OPEN, TTY, tty.Name(), INPUT, pty, OUTPUT, tty, meta)) h := mdb.Rich(m, CHANNEL, "", kit.Data(mdb.STATUS, tcp.OPEN, TTY, tty.Name(), INPUT, pty, OUTPUT, tty, meta))
meta[CHANNEL] = h meta[CHANNEL] = h
for request := range requests { for request := range requests {

View File

@ -30,13 +30,13 @@ func _ssh_session(m *ice.Message, h string, client *ssh.Client) (*ssh.Session, e
break break
} }
m.Grow(SESSION, kit.Keys(mdb.HASH, h), kit.Dict( mdb.Grow(m, SESSION, kit.Keys(mdb.HASH, h), kit.Dict(
mdb.TYPE, RES, mdb.TEXT, string(buf[:n]), mdb.TYPE, RES, mdb.TEXT, string(buf[:n]),
)) ))
} }
}) })
m.Richs(SESSION, "", h, func(key string, value ice.Map) { mdb.Richs(m, SESSION, "", h, func(key string, value ice.Map) {
kit.Value(value, kit.Keym(OUTPUT), out, kit.Keym(INPUT), in) kit.Value(value, kit.Keym(OUTPUT), out, kit.Keym(INPUT), in)
}) })
@ -64,9 +64,9 @@ func init() {
m.Cmdy(SESSION, ctx.ACTION, ctx.COMMAND, CMD, m.Option(mdb.TEXT)) m.Cmdy(SESSION, ctx.ACTION, ctx.COMMAND, CMD, m.Option(mdb.TEXT))
}}, }},
ctx.COMMAND: {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Richs(SESSION, "", m.Option(mdb.NAME), func(key string, value ice.Map) { mdb.Richs(m, SESSION, "", m.Option(mdb.NAME), func(key string, value ice.Map) {
if w, ok := kit.Value(value, kit.Keym(INPUT)).(io.Writer); ok { if w, ok := kit.Value(value, kit.Keym(INPUT)).(io.Writer); ok {
m.Grow(SESSION, kit.Keys(mdb.HASH, key), kit.Dict(mdb.TYPE, CMD, mdb.TEXT, m.Option(CMD))) mdb.Grow(m, SESSION, kit.Keys(mdb.HASH, key), kit.Dict(mdb.TYPE, CMD, mdb.TEXT, m.Option(CMD)))
w.Write([]byte(m.Option(CMD) + ice.NL)) w.Write([]byte(m.Option(CMD) + ice.NL))
} }
}) })
@ -81,7 +81,7 @@ func init() {
} }
m.Action(ctx.COMMAND, mdb.PAGE) m.Action(ctx.COMMAND, mdb.PAGE)
m.OptionPage(kit.Slice(arg, 2)...) mdb.OptionPage(m, kit.Slice(arg, 2)...)
m.Fields(len(kit.Slice(arg, 1, 2)), "time,id,type,text") m.Fields(len(kit.Slice(arg, 1, 2)), "time,id,type,text")
mdb.ZoneSelect(m, kit.Slice(arg, 0, 2)...).Tables(func(value ice.Maps) { mdb.ZoneSelect(m, kit.Slice(arg, 0, 2)...).Tables(func(value ice.Maps) {
m.PushButton(kit.Select("", mdb.REPEAT, value[mdb.TYPE] == CMD)) m.PushButton(kit.Select("", mdb.REPEAT, value[mdb.TYPE] == CMD))