forked from x/icebergs
opt route
This commit is contained in:
parent
30a2c5be81
commit
4fa7affeff
@ -76,6 +76,11 @@ func _ssh_script(m *ice.Message, name string) io.Reader {
|
||||
if s, e := os.Open(name); e == nil {
|
||||
return s
|
||||
}
|
||||
switch strings.Split(name, "/")[0] {
|
||||
case "etc", "var":
|
||||
m.Warn(true, ice.ErrNotFound)
|
||||
return nil
|
||||
}
|
||||
|
||||
if msg := m.Cmd("web.spide", "dev", "GET", path.Join("/share/local/", name)); msg.Result(0) != ice.ErrWarn {
|
||||
bio := bytes.NewBuffer([]byte(msg.Result()))
|
||||
@ -337,6 +342,9 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
|
||||
}
|
||||
|
||||
s := _ssh_script(m, arg[0])
|
||||
if s == nil {
|
||||
return true
|
||||
}
|
||||
buf := bytes.NewBuffer(make([]byte, 0, 4096))
|
||||
defer func() { m.Echo(buf.String()) }()
|
||||
|
||||
|
@ -23,9 +23,7 @@ func _dream_list(m *ice.Message) {
|
||||
m.Push(kit.MDB_TYPE, "none")
|
||||
m.Push(kit.MDB_STATUS, gdb.STOP)
|
||||
}
|
||||
for _, k := range []string{"start", "stop", "restart"} {
|
||||
m.Push(k, m.Cmdx("_render", RENDER.Button, k))
|
||||
}
|
||||
m.PushRender("action", "button", "start,stop,restart")
|
||||
})
|
||||
m.Sort(kit.MDB_NAME)
|
||||
}
|
||||
|
@ -4,84 +4,91 @@ import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/aaa"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"strings"
|
||||
)
|
||||
|
||||
func _route_travel(m *ice.Message, route string) {
|
||||
if route == "" {
|
||||
m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
|
||||
switch val[kit.MDB_TYPE] {
|
||||
case SERVER:
|
||||
if val[kit.MDB_NAME] == cli.NodeName {
|
||||
// 避免循环
|
||||
return
|
||||
}
|
||||
|
||||
// 远程查询
|
||||
m.Cmd(SPACE, val[kit.MDB_NAME], ROUTE).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE])
|
||||
m.Push(kit.MDB_ROUTE, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_ROUTE]))
|
||||
})
|
||||
fallthrough
|
||||
case WORKER:
|
||||
// 本机查询
|
||||
m.Push(kit.MDB_TYPE, val[kit.MDB_TYPE])
|
||||
m.Push(kit.MDB_ROUTE, val[kit.MDB_NAME])
|
||||
}
|
||||
})
|
||||
} else {
|
||||
m.Cmd(SPACE, route, ROUTE).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE])
|
||||
m.Push(kit.MDB_ROUTE, kit.Keys(route, value[kit.MDB_ROUTE]))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const ROUTE = "route"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
ROUTE: {Name: ROUTE, Help: "路由", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)},
|
||||
ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ROUTE: {Name: "route route auto 启动 创建 邀请", Help: "路由", Action: map[string]*ice.Action{
|
||||
"create": {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy("web.code.install", "contexts", kit.Select("base", m.Option("type")))
|
||||
ROUTE: {Name: "route route=auto cmd=@key auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{
|
||||
"invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy("web.code.install", "contexts", "tmux")
|
||||
m.Cmdy("web.code.install", "contexts", "base")
|
||||
}},
|
||||
"start": {Name: "start type=server,worker name@key", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
if p := m.Option("route"); p != "" {
|
||||
m.Option("route", "")
|
||||
m.Cmdy(SPACE, p, "route", "create", arg)
|
||||
return
|
||||
"inputs": {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "cmd":
|
||||
m.Cmdy(SPACE, m.Option("route"), "command")
|
||||
default:
|
||||
m.Cmdy(SPACE, m.Option("route"), "dream")
|
||||
}
|
||||
m.Cmdy("dream", "start", m.Option("name"))
|
||||
}},
|
||||
"start": {Name: "start type=worker,server name=hi@key", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SPACE, m.Option("route"), "dream", "start", arg)
|
||||
m.Sleep("3s")
|
||||
}},
|
||||
"stop": {Name: "stop", Help: "结束", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SPACE, m.Option("route"), "exit")
|
||||
}},
|
||||
"inputs": {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SPACE, m.Option("route"), "dream")
|
||||
}},
|
||||
"invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER)))
|
||||
m.Sleep("3s")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 {
|
||||
m.Cmd(SPACE, arg[0], ROUTE).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE])
|
||||
m.Push(kit.MDB_ROUTE, kit.Keys(arg[0], value[kit.MDB_ROUTE]))
|
||||
})
|
||||
if len(arg) > 1 && arg[0] != "" {
|
||||
m.Cmdy(SPACE, arg[0], kit.Split(strings.Join(arg[1:], " ")))
|
||||
return
|
||||
}
|
||||
|
||||
m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
|
||||
switch val[kit.MDB_TYPE] {
|
||||
case SERVER:
|
||||
if val[kit.MDB_NAME] == cli.NodeName {
|
||||
// 避免循环
|
||||
return
|
||||
}
|
||||
|
||||
// 远程查询
|
||||
m.Cmd(SPACE, val[kit.MDB_NAME], ROUTE).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE])
|
||||
m.Push(kit.MDB_ROUTE, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_ROUTE]))
|
||||
})
|
||||
fallthrough
|
||||
case WORKER:
|
||||
// 本机查询
|
||||
m.Push(kit.MDB_TYPE, val[kit.MDB_TYPE])
|
||||
m.Push(kit.MDB_ROUTE, val[kit.MDB_NAME])
|
||||
}
|
||||
})
|
||||
if m.W == nil {
|
||||
if _route_travel(m, kit.Select("", arg, 0)); m.W == nil {
|
||||
return
|
||||
}
|
||||
|
||||
m.Table(func(index int, value map[string]string, field []string) {
|
||||
m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, RENDER.A, value[kit.MDB_ROUTE],
|
||||
kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", value[kit.MDB_ROUTE])))
|
||||
m.PushRender(kit.MDB_LINK, "a", value[kit.MDB_ROUTE],
|
||||
kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod", value[kit.MDB_ROUTE]))))
|
||||
switch value[kit.MDB_TYPE] {
|
||||
case SERVER:
|
||||
m.Push("action", m.Cmdx(mdb.RENDER, RENDER.Button, "启动"))
|
||||
m.PushRender("action", "button", "启动")
|
||||
case WORKER:
|
||||
m.Push("action", m.Cmdx(mdb.RENDER, RENDER.Button, "结束"))
|
||||
m.PushRender("action", "button", "结束")
|
||||
}
|
||||
})
|
||||
m.Sort("route")
|
||||
m.Sort(kit.MDB_ROUTE)
|
||||
}},
|
||||
"/route/": {Name: "/route/", Help: "路由器", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
switch arg[0] {
|
||||
|
@ -21,7 +21,7 @@ func _space_list(m *ice.Message, space string) {
|
||||
if space == "" {
|
||||
m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
|
||||
m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
|
||||
m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, RENDER.A, value[kit.MDB_NAME], kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME]))))
|
||||
m.PushRender(kit.MDB_LINK, "a", kit.Format(value[kit.MDB_NAME]), kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME])))
|
||||
})
|
||||
m.Sort(kit.MDB_NAME)
|
||||
return
|
||||
@ -30,7 +30,7 @@ func _space_list(m *ice.Message, space string) {
|
||||
m.Richs(SPACE, nil, space, func(key string, value map[string]interface{}) {
|
||||
m.Push("detail", value)
|
||||
m.Push(kit.MDB_KEY, kit.MDB_LINK)
|
||||
m.Push(kit.MDB_VALUE, kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME])))
|
||||
m.PushRender(kit.MDB_VALUE, "a", kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value[kit.MDB_NAME])))
|
||||
})
|
||||
}
|
||||
func _space_dial(m *ice.Message, dev, name string, arg ...string) {
|
||||
@ -138,11 +138,11 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
|
||||
|
||||
if len(target) == 0 {
|
||||
if msg.Option(ice.MSG_USERROLE, aaa.UserRole(msg, msg.Option(ice.MSG_USERNAME))) == aaa.VOID {
|
||||
role := msg.Cmdx(SPIDE, SPIDE_DEV, SPIDE_MSG, SPIDE_GET, "/chat/header", "_action", aaa.USERROLE, "who", msg.Option(ice.MSG_USERNAME))
|
||||
role := msg.Cmdx(SPIDE, SPIDE_DEV, SPIDE_MSG, SPIDE_GET, "/chat/header", "cmds", aaa.USERROLE, "who", msg.Option(ice.MSG_USERNAME))
|
||||
msg.Option(ice.MSG_USERROLE, kit.Select(role, aaa.TECH, role == aaa.ROOT))
|
||||
}
|
||||
msg.Log_AUTH(aaa.USERROLE, msg.Option(ice.MSG_USERROLE), aaa.USERNAME, msg.Option(ice.MSG_USERNAME))
|
||||
|
||||
msg.Log_AUTH(aaa.USERNAME, msg.Option(ice.MSG_USERNAME), aaa.USERROLE, msg.Option(ice.MSG_USERROLE))
|
||||
if msg.Optionv(ice.MSG_HANDLE, "true"); !msg.Warn(!safe, ice.ErrNotAuth) {
|
||||
// 本地执行
|
||||
msg.Option("_dev", name)
|
||||
@ -197,8 +197,6 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) {
|
||||
})
|
||||
}
|
||||
|
||||
const SPACE = "space"
|
||||
|
||||
const (
|
||||
MASTER = "master"
|
||||
SERVER = "server"
|
||||
@ -206,10 +204,12 @@ const (
|
||||
BETTER = "better"
|
||||
)
|
||||
|
||||
const SPACE = "space"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
SPACE: {Name: "space", Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
|
||||
SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
|
||||
"redial", kit.Dict("a", 3000, "b", 1000, "c", 1000, "r", 4096, "w", 4096),
|
||||
"timeout", kit.Dict("c", "180s"),
|
||||
)},
|
||||
|
@ -348,7 +348,7 @@ func init() {
|
||||
case SPIDE_MSG:
|
||||
var data map[string][]string
|
||||
m.Assert(json.NewDecoder(res.Body).Decode(&data))
|
||||
m.Info("res: %s", kit.Formats(data))
|
||||
m.Info("res: %s", kit.Format(data))
|
||||
for _, k := range data[ice.MSG_APPEND] {
|
||||
for i := range data[k] {
|
||||
m.Push(k, data[k][i])
|
||||
|
@ -23,8 +23,12 @@ func init() {
|
||||
INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install",
|
||||
"contexts", kit.Dict(
|
||||
"tmux", `yum install -y tmux
|
||||
curl -o tmux.conf {{.Option "httphost"}}/publish/tmux.conf
|
||||
tmux -f tmux.conf`,
|
||||
"base", `mkdir contexts; cd contexts
|
||||
export ctx_dev={{.Option "httphost"}}; (curl $ctx_dev/publish/ice.sh || wget -O - $ctx_dev/publish/ice.sh) | sh
|
||||
export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; curl $ctx_dev/publish/ice.sh |sh
|
||||
export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; wget -O - $ctx_dev/publish/ice.sh | sh
|
||||
bin/ice.sh`,
|
||||
"miss", `
|
||||
yum install -y git vim make go
|
||||
|
17
misc.go
17
misc.go
@ -62,6 +62,23 @@ func (m *Message) AddCmd(cmd *Command) string {
|
||||
return kit.Keys(m.target.Cap(CTX_FOLLOW), name)
|
||||
}
|
||||
|
||||
func (m *Message) PushRender(key, view, name string, arg ...string) *Message {
|
||||
switch view {
|
||||
case "button":
|
||||
list := []string{}
|
||||
for _, k := range kit.Split(name) {
|
||||
list = append(list, fmt.Sprintf(`<input type="button" value="%s">`, k))
|
||||
}
|
||||
m.Push(key, strings.Join(list, ""))
|
||||
case "a":
|
||||
if m.W != nil {
|
||||
m.Push(key, fmt.Sprintf(`<a href="%s" target="_blank">%s</a>`, kit.Select(name, arg, 0), name))
|
||||
}
|
||||
default:
|
||||
m.Push(key, name)
|
||||
}
|
||||
return m
|
||||
}
|
||||
func (m *Message) PushAction(list ...interface{}) {
|
||||
m.Table(func(index int, value map[string]string, head []string) {
|
||||
action := []string{}
|
||||
|
@ -76,14 +76,17 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台",
|
||||
m.Cmdy(code.INSTALL, path.Base(m.Conf(TMUX, kit.META_SOURCE)), arg)
|
||||
}},
|
||||
|
||||
TEXT: {Name: "text 保存:button 清空:button text:textarea", Help: "文本", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 && arg[0] != "" {
|
||||
m.Cmd(_tmux, "set-buffer", arg[0])
|
||||
}
|
||||
TEXT: {Name: "text auto 保存:button 清空:button text:textarea", Help: "文本", Action: map[string]*ice.Action{
|
||||
"save": {Name: "save", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(arg) > 0 && arg[0] != "" {
|
||||
m.Cmd(_tmux, "set-buffer", arg[0])
|
||||
}
|
||||
|
||||
text := m.Cmdx(_tmux, "show-buffer")
|
||||
m.Cmdy("web.wiki.image", "qrcode", text)
|
||||
m.Echo("\n<span>%s</span>", text).Render("")
|
||||
text := m.Cmdx(_tmux, "show-buffer")
|
||||
m.Cmdy("web.wiki.image", "qrcode", text)
|
||||
m.Echo("\n<span>%s</span>", text).Render("")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
}},
|
||||
BUFFER: {Name: "buffer [buffer=auto [value]] auto", Help: "缓存", Action: map[string]*ice.Action{
|
||||
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
5
type.go
5
type.go
@ -161,7 +161,7 @@ func (c *Context) Merge(s *Context, x Server) *Context {
|
||||
list := []interface{}{}
|
||||
for _, v := range kit.Split(kit.Select(k, a.Name), " ", " ")[1:] {
|
||||
item := kit.Dict(kit.MDB_INPUT, "text", kit.MDB_VALUE, "@key")
|
||||
ls := kit.Split(v, " ", ":=@")
|
||||
ls, value := kit.Split(v, " ", ":=@"), ""
|
||||
kit.Value(item, kit.MDB_NAME, ls[0])
|
||||
for i := 1; i < len(ls); i += 2 {
|
||||
switch ls[i] {
|
||||
@ -173,9 +173,10 @@ func (c *Context) Merge(s *Context, x Server) *Context {
|
||||
kit.Value(item, "values", strings.Split(ls[i+1], ","))
|
||||
} else {
|
||||
kit.Value(item, kit.MDB_VALUE, ls[i+1])
|
||||
value = ls[i+1]
|
||||
}
|
||||
case "@":
|
||||
kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"=")
|
||||
kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"="+value)
|
||||
}
|
||||
}
|
||||
list = append(list, item)
|
||||
|
Loading…
x
Reference in New Issue
Block a user