forked from x/icebergs
opt code
This commit is contained in:
parent
ee6adfdbf9
commit
09e1dac68c
@ -216,6 +216,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
|
||||
if m.Option(ice.MSG_PROMPT, m.Confv("prompt", "meta.PS1")); f.out == os.Stdout {
|
||||
f.printf(m, "\033[0m")
|
||||
}
|
||||
m.Cmd(ice.WEB_FAVOR, "cmd.history", "cmd", kit.Select("stdio", arg, 0), line)
|
||||
|
||||
// 解析命令
|
||||
f.parse(m, line)
|
||||
|
@ -682,13 +682,14 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
|
||||
var data map[string][]string
|
||||
m.Assert(json.NewDecoder(res.Body).Decode(&data))
|
||||
m.Info("res: %s", kit.Formats(data))
|
||||
if len(data["append"]) > 0 {
|
||||
for i := range data[data["append"][0]] {
|
||||
for _, k := range data["append"] {
|
||||
if len(data[ice.MSG_APPEND]) > 0 {
|
||||
for i := range data[data[ice.MSG_APPEND][0]] {
|
||||
for _, k := range data[ice.MSG_APPEND] {
|
||||
m.Push(k, data[k][i])
|
||||
}
|
||||
}
|
||||
}
|
||||
m.Resultv(data[ice.MSG_RESULT])
|
||||
|
||||
case "raw":
|
||||
if b, e := ioutil.ReadAll(res.Body); m.Assert(e) {
|
||||
@ -790,31 +791,32 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
|
||||
name := m.Conf(ice.CLI_RUNTIME, "node.name")
|
||||
user := m.Conf(ice.CLI_RUNTIME, "boot.username")
|
||||
|
||||
m.Hold(1).Gos(m, func(m *ice.Message) {
|
||||
m.Richs(ice.WEB_SPIDE, nil, dev, func(key string, value map[string]interface{}) {
|
||||
m.Hold(1).Gos(m, func(msg *ice.Message) {
|
||||
msg.Richs(ice.WEB_SPIDE, nil, dev, func(key string, value map[string]interface{}) {
|
||||
proto := kit.Select("ws", "wss", kit.Format(kit.Value(value, "client.protocol")) == "https")
|
||||
host := kit.Format(kit.Value(value, "client.hostname"))
|
||||
|
||||
for i := 0; i < m.Confi(ice.WEB_SPACE, "meta.redial.c"); i++ {
|
||||
if u, e := url.Parse(kit.MergeURL(proto+"://"+host+"/space/", "node", node, "name", name, "user", user, "share", value["share"])); m.Assert(e) {
|
||||
if s, e := net.Dial("tcp", host); !m.Warn(e != nil, "%s", e) {
|
||||
if s, _, e := websocket.NewClient(s, u, nil, m.Confi(ice.WEB_SPACE, "meta.buffer.r"), m.Confi(ice.WEB_SPACE, "meta.buffer.w")); !m.Warn(e != nil, "%s", e) {
|
||||
for i := 0; i < msg.Confi(ice.WEB_SPACE, "meta.redial.c"); i++ {
|
||||
if u, e := url.Parse(kit.MergeURL(proto+"://"+host+"/space/", "node", node, "name", name, "user", user, "share", value["share"])); msg.Assert(e) {
|
||||
if s, e := net.Dial("tcp", host); !msg.Warn(e != nil, "%s", e) {
|
||||
if s, _, e := websocket.NewClient(s, u, nil, msg.Confi(ice.WEB_SPACE, "meta.buffer.r"), msg.Confi(ice.WEB_SPACE, "meta.buffer.w")); !msg.Warn(e != nil, "%s", e) {
|
||||
msg = m.Spawn()
|
||||
|
||||
// 连接成功
|
||||
m.Rich(ice.WEB_SPACE, nil, kit.Dict(
|
||||
msg.Rich(ice.WEB_SPACE, nil, kit.Dict(
|
||||
kit.MDB_TYPE, ice.WEB_MASTER, kit.MDB_NAME, dev, "user", kit.Value(value, "client.hostname"),
|
||||
"socket", s,
|
||||
))
|
||||
m.Log(ice.LOG_CMDS, "%d conn %s success %s", i, dev, u)
|
||||
if i = 0; web.HandleWSS(m, true, s, dev) {
|
||||
msg.Log(ice.LOG_CMDS, "%d conn %s success %s", i, dev, u)
|
||||
if i = 0; web.HandleWSS(msg, true, s, dev) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 断线重连
|
||||
sleep := time.Duration(rand.Intn(m.Confi(ice.WEB_SPACE, "meta.redial.a"))*i+i*m.Confi(ice.WEB_SPACE, "meta.redial.b")) * time.Millisecond
|
||||
m.Info("%d sleep: %s reconnect: %s", i, sleep, u)
|
||||
sleep := time.Duration(rand.Intn(msg.Confi(ice.WEB_SPACE, "meta.redial.a"))*i+i*msg.Confi(ice.WEB_SPACE, "meta.redial.b")) * time.Millisecond
|
||||
msg.Info("%d sleep: %s reconnect: %s", i, sleep, u)
|
||||
time.Sleep(sleep)
|
||||
}
|
||||
}
|
||||
@ -1053,6 +1055,9 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
|
||||
kit.MDB_TYPE, arg[1], kit.MDB_NAME, arg[2], kit.MDB_TEXT, arg[3],
|
||||
"extra", kit.Dict(arg[4:]),
|
||||
))
|
||||
m.Richs(ice.WEB_FAVOR, nil, favor, func(key string, value map[string]interface{}) {
|
||||
kit.Value(value, "meta.time", m.Time())
|
||||
})
|
||||
m.Log(ice.LOG_INSERT, "favor: %s index: %d name: %s text: %s", favor, index, arg[2], arg[3])
|
||||
m.Echo("%d", index)
|
||||
}},
|
||||
@ -1531,7 +1536,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
|
||||
// 共享列表
|
||||
m.Grows(ice.WEB_SHARE, nil, "", "", func(key int, value map[string]interface{}) {
|
||||
m.Push(kit.Format(key), value, []string{kit.MDB_TIME, "share", kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
|
||||
m.Push("link", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.share"), value["share"], value["share"]))
|
||||
m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.link"), value["share"], value["share"]))
|
||||
})
|
||||
return
|
||||
}
|
||||
|
1
conf.go
1
conf.go
@ -166,6 +166,7 @@ const ( // CHAT
|
||||
CHAT_RIVER = "river"
|
||||
)
|
||||
const ( // TYPE
|
||||
TYPE_SPIDE = "spide"
|
||||
TYPE_SPACE = "space"
|
||||
TYPE_STORY = "story"
|
||||
|
||||
|
@ -5,6 +5,8 @@ import (
|
||||
_ "github.com/shylinux/icebergs/base"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
"github.com/shylinux/toolkits"
|
||||
|
||||
"strings"
|
||||
)
|
||||
|
||||
var Index = &ice.Context{Name: "chat", Help: "聊天中心",
|
||||
@ -484,6 +486,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
|
||||
return
|
||||
}
|
||||
|
||||
m.Cmd(ice.WEB_FAVOR, "cmd.history", "cmd", m.Option(ice.MSG_SESSID)[:6], strings.Join(cmds, " "))
|
||||
// 执行命令
|
||||
m.Cmdy(cmds).Option("cmds", cmds)
|
||||
}},
|
||||
|
@ -99,7 +99,7 @@ var Index = &ice.Context{Name: "code", Help: "编程中心",
|
||||
case "prune":
|
||||
list := []string{}
|
||||
m.Richs("login", nil, "*", func(key string, value map[string]interface{}) {
|
||||
if value["status"] == "logout" {
|
||||
if len(arg) > 1 && arg[1] == "all" || value["status"] == "logout" {
|
||||
list = append(list, key)
|
||||
}
|
||||
})
|
||||
@ -108,6 +108,7 @@ var Index = &ice.Context{Name: "code", Help: "编程中心",
|
||||
m.Log(ice.LOG_DELETE, "%s: %s", value, m.Conf("login", kit.Keys("hash", value)))
|
||||
m.Conf("login", kit.Keys("hash", value), "")
|
||||
})
|
||||
m.Echo("%d", len(list))
|
||||
|
||||
case "exit":
|
||||
// 退出会话
|
||||
|
@ -62,9 +62,9 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
||||
"stack": {Name: "stack", Help: "结构", Value: kit.Data("template", stack)},
|
||||
"chart": {Name: "chart", Help: "绘图", Value: kit.Data("template", prefix, "suffix", `</svg>`)},
|
||||
|
||||
"draw": {Name: "draw", Help: "思维导图", Value: kit.Data(kit.MDB_SHORT, "name", "path", "usr/local", "regs", ".*\\.svg", "prefix", `<svg vertion="1.1" xmlns="http://www.w3.org/2000/svg" width="%v" height="%v">`, "suffix", `</svg>`)},
|
||||
"data": {Name: "data", Help: "数据表格", Value: kit.Data(kit.MDB_SHORT, "name", "path", "usr/local", "regs", ".*\\.csv")},
|
||||
"word": {Name: "word", Help: "语言文字", Value: kit.Data(kit.MDB_SHORT, "name", "path", "usr/local", "regs", ".*\\.shy",
|
||||
"draw": {Name: "draw", Help: "思维导图", Value: kit.Data(kit.MDB_SHORT, "name", "path", "", "regs", ".*\\.svg", "prefix", `<svg vertion="1.1" xmlns="http://www.w3.org/2000/svg" width="%v" height="%v">`, "suffix", `</svg>`)},
|
||||
"data": {Name: "data", Help: "数据表格", Value: kit.Data(kit.MDB_SHORT, "name", "path", "", "regs", ".*\\.csv")},
|
||||
"word": {Name: "word", Help: "语言文字", Value: kit.Data(kit.MDB_SHORT, "name", "path", "", "regs", ".*\\.shy",
|
||||
"alias", map[string]interface{}{
|
||||
"label": []interface{}{"chart", "label"},
|
||||
"chain": []interface{}{"chart", "chain"},
|
||||
@ -75,8 +75,8 @@ var Index = &ice.Context{Name: "wiki", Help: "文档中心",
|
||||
"premenu": []interface{}{"title", "premenu"},
|
||||
},
|
||||
)},
|
||||
"walk": {Name: "walk", Help: "走遍世界", Value: kit.Data(kit.MDB_SHORT, "name", "path", "usr/local", "regs", ".*\\.csv")},
|
||||
"feel": {Name: "feel", Help: "影音媒体", Value: kit.Data(kit.MDB_SHORT, "name", "path", "usr/local", "regs", ".*\\.(png|JPG|MOV|m4v)")},
|
||||
"walk": {Name: "walk", Help: "走遍世界", Value: kit.Data(kit.MDB_SHORT, "name", "path", "", "regs", ".*\\.csv")},
|
||||
"feel": {Name: "feel", Help: "影音媒体", Value: kit.Data(kit.MDB_SHORT, "name", "path", "", "regs", ".*\\.(png|JPG|MOV|m4v)")},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
|
@ -1,108 +0,0 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/aaa"
|
||||
"github.com/shylinux/toolkits"
|
||||
|
||||
"bytes"
|
||||
"crypto/hmac"
|
||||
"crypto/sha1"
|
||||
"encoding/base32"
|
||||
"encoding/binary"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func gen() string {
|
||||
buf := bytes.NewBuffer([]byte{})
|
||||
binary.Write(buf, binary.BigEndian, time.Now().Unix()/30)
|
||||
b := hmac.New(sha1.New, buf.Bytes()).Sum(nil)
|
||||
return strings.ToUpper(base32.StdEncoding.EncodeToString(b[:]))
|
||||
}
|
||||
|
||||
func get(key string) string {
|
||||
buf := []byte{}
|
||||
now := kit.Int64(time.Now().Unix() / 30)
|
||||
for i := 0; i < 8; i++ {
|
||||
buf = append(buf, byte((now >> ((7 - i) * 8))))
|
||||
}
|
||||
|
||||
s, _ := base32.StdEncoding.DecodeString(strings.ToUpper(key))
|
||||
|
||||
hm := hmac.New(sha1.New, s)
|
||||
hm.Write(buf)
|
||||
b := hm.Sum(nil)
|
||||
|
||||
o := b[len(b)-1] & 0x0F
|
||||
p := b[o : o+4]
|
||||
p[0] = p[0] & 0x7f
|
||||
res := int64(p[0])<<24 + int64(p[1])<<16 + int64(p[2])<<8 + int64(p[3])
|
||||
return kit.Format("%06d", res%1000000)
|
||||
}
|
||||
|
||||
var Index = &ice.Context{Name: "auth", Help: "auth",
|
||||
Caches: map[string]*ice.Cache{},
|
||||
Configs: map[string]*ice.Config{
|
||||
"auth": {Name: "auth", Help: "auth", Value: kit.Data(kit.MDB_SHORT, "name")},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Load()
|
||||
}},
|
||||
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Save("auth")
|
||||
}},
|
||||
|
||||
"new": {Name: "new user [secrete]", Help: "创建动态码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Richs("auth", nil, "*", func(key string, value map[string]interface{}) {
|
||||
m.Push(key, value, []string{"name", "username", "website"})
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
m.Append("_output", "qrcode")
|
||||
if len(arg) == 1 {
|
||||
if m.Richs("auth", nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Echo("otpauth://totp/%s?secret=%s", value["name"], value["secrete"])
|
||||
}) != nil {
|
||||
return
|
||||
}
|
||||
arg = append(arg, gen())
|
||||
}
|
||||
|
||||
data := kit.Dict("name", arg[0], "secrete", arg[1])
|
||||
for i := 2; i < len(arg)-1; i += 2 {
|
||||
kit.Value(data, arg[i], arg[i+1])
|
||||
}
|
||||
|
||||
n := m.Rich("auth", nil, data)
|
||||
m.Log(ice.LOG_CREATE, "%s", n)
|
||||
|
||||
m.Cmdy(ice.WEB_SHARE, "optauth", arg[0], kit.Format("otpauth://totp/%s?secret=%s", arg[0], arg[1]))
|
||||
}},
|
||||
"get": {Name: "get user [secrete]", Help: "获取动态码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Richs("auth", nil, "*", func(key string, value map[string]interface{}) {
|
||||
m.Push("name", value["name"])
|
||||
m.Push("code", m.Cmdx("get", value["name"], value["secrete"]))
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if len(arg) == 1 {
|
||||
m.Richs("auth", nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
arg = append(arg, kit.Format(value["secrete"]))
|
||||
})
|
||||
}
|
||||
if len(arg) == 1 {
|
||||
arg = append(arg, m.Cmdx("new", arg[0]))
|
||||
}
|
||||
|
||||
m.Echo(get(arg[1]))
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
func init() { aaa.Index.Register(Index, nil) }
|
@ -1,9 +0,0 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [],
|
||||
"init": function(can, msg, cb, output, action, option) {},
|
||||
})
|
||||
Volcanos("onaction", {help: "控件菜单", list: []})
|
||||
Volcanos("onchoice", {help: "控件交互", list: ["刷新"]
|
||||
"刷新": function(event, can, value, cmd, target) {},
|
||||
})
|
||||
Volcanos("ondetail", {help: "控件详情", list: []})
|
||||
Volcanos("onexport", {help: "导出数据", list: []})
|
@ -1 +0,0 @@
|
||||
title "auth"
|
@ -3,7 +3,7 @@ package crx
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
"github.com/shylinux/icebergs/core/chat"
|
||||
"github.com/shylinux/icebergs/core/code"
|
||||
"github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
@ -13,12 +13,7 @@ var Index = &ice.Context{Name: "chrome", Help: "浏览器",
|
||||
"chrome": {Name: "chrome", Help: "chrome", Value: kit.Data(kit.MDB_SHORT, "name", "history", "url.history")},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
"/crx": {Name: "/crx", Help: "/crx", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "history":
|
||||
m.Cmdy(ice.WEB_FAVOR, m.Conf("chrome", "meta.history"), "spide", arg[3], arg[2])
|
||||
}
|
||||
}},
|
||||
|
||||
"chrome": {Name: "chrome", Help: "浏览器", List: kit.List(
|
||||
kit.MDB_INPUT, "text", "name", "name", "action", "auto",
|
||||
kit.MDB_INPUT, "text", "name", "wid", "action", "auto",
|
||||
@ -81,7 +76,53 @@ var Index = &ice.Context{Name: "chrome", Help: "浏览器",
|
||||
// 下发命令
|
||||
m.Cmdy(ice.WEB_SPACE, arg[0], "bookmark", arg[1:])
|
||||
}},
|
||||
|
||||
ice.WEB_LOGIN: {Name: "_login", Help: "_login", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Option("you", "")
|
||||
m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) {
|
||||
// 查找空间
|
||||
m.Option("you", value["you"])
|
||||
})
|
||||
|
||||
m.Info("%s %s cmd: %v sub: %v", m.Option("you"), m.Option(ice.MSG_USERURL), m.Optionv("cmds"), m.Optionv("sub"))
|
||||
}},
|
||||
"/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy("help")
|
||||
}},
|
||||
"/login": {Name: "/login", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy("login", "init", c.Name)
|
||||
}},
|
||||
"/logout": {Name: "/logout", Help: "登出", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy("login", "exit")
|
||||
}},
|
||||
|
||||
"/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 {
|
||||
// 添加收藏
|
||||
cmds := []string{ice.WEB_FAVOR, m.Option("tab"), ice.TYPE_SPIDE, m.Option("note"), arg[0]}
|
||||
if m.Cmdy(cmds); m.Option("you") != "" {
|
||||
m.Cmdy(ice.WEB_SPACE, m.Option("you"), cmds)
|
||||
}
|
||||
return
|
||||
}
|
||||
}},
|
||||
|
||||
"/crx": {Name: "/crx", Help: "/crx", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Info("what %v", m.Option("sid"))
|
||||
switch arg[0] {
|
||||
case "login":
|
||||
m.Cmdy(ice.WEB_SPIDE, "dev", "msg", "/code/chrome/login", "sid", m.Option("sid"))
|
||||
|
||||
case "bookmark":
|
||||
m.Cmdy(ice.WEB_SPIDE, "dev", "/code/chrome/favor", "cmds", arg[2], "note", arg[3],
|
||||
"tab", kit.Select(m.Conf("chrome", "meta.history"), arg, 4), "sid", m.Option("sid"), "type", "spide")
|
||||
|
||||
case "history":
|
||||
m.Cmdy(ice.WEB_SPIDE, "dev", "/code/chrome/favor", "cmds", arg[2], "note", arg[3],
|
||||
"tab", m.Conf("chrome", "meta.history"), "sid", m.Option("sid"))
|
||||
}
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
func init() { chat.Index.Register(Index, &web.Frame{}) }
|
||||
func init() { code.Index.Register(Index, &web.Frame{}) }
|
||||
|
@ -25,9 +25,16 @@ var Index = &ice.Context{Name: "docker", Help: "虚拟机",
|
||||
}},
|
||||
"auto": {Name: "auto", Help: "自动化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
prefix := []string{ice.CLI_SYSTEM, "docker"}
|
||||
|
||||
if m.Cmd(prefix, "container", "start", arg[0]).Append("code") != "1" {
|
||||
// 启动容器
|
||||
return
|
||||
}
|
||||
|
||||
// 创建容器
|
||||
pid := m.Cmdx(prefix, "run", "-dt", "-w", "/root", "--name", arg[0], "--mount", kit.Format("type=bind,source=%s,target=/root",
|
||||
kit.Path(m.Conf(ice.WEB_DREAM, "meta.path"), arg[0])), "alpine")
|
||||
pid := m.Cmdx(prefix, "run", "-dt", "-w", "/root", "--name", arg[0],
|
||||
// "--mount", kit.Format("type=bind,source=%s,target=/root", kit.Path(m.Conf(ice.WEB_DREAM, "meta.path"), arg[0])),
|
||||
"alpine")
|
||||
m.Log(ice.LOG_CREATE, "%s: %s", arg[0], pid)
|
||||
|
||||
m.Cmd(ice.WEB_FAVOR, kit.Select("alpine.auto", arg, 1)).Table(func(index int, value map[string]string, head []string) {
|
||||
|
@ -33,8 +33,8 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
|
||||
"format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}",
|
||||
"fields", "id,tag,pane,tty,height,width",
|
||||
)},
|
||||
"relay": {Name: "relay", Help: "跳板", Value: kit.Data(
|
||||
"tail", kit.Dict(
|
||||
"relay": {Name: "relay", Help: "跳板", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
|
||||
"count", 100, "sleep", "100ms", "tail", kit.Dict(
|
||||
"verify", "Verification code:",
|
||||
"password", "Password:",
|
||||
"login", "[relay ~]$",
|
||||
@ -48,10 +48,10 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
|
||||
if m.Richs(ice.WEB_FAVOR, nil, "tmux.auto", nil) == nil {
|
||||
m.Cmd(ice.WEB_FAVOR, "tmux.auto", ice.TYPE_SHELL, "脚本", `curl $ctx_dev/publish/auto.sh > auto.sh`)
|
||||
m.Cmd(ice.WEB_FAVOR, "tmux.auto", ice.TYPE_SHELL, "脚本", `source auto.sh`)
|
||||
m.Cmd(ice.WEB_FAVOR, "tmux.auto", ice.TYPE_SHELL, "脚本", `ShyLogin`)
|
||||
m.Cmd(ice.WEB_FAVOR, "tmux.auto", ice.TYPE_SHELL, "脚本", `ShyInit && ShyLogin && trap ShyLogout EXIT`)
|
||||
}
|
||||
|
||||
for _, v := range []string{"auto.sh", "auto.vim"} {
|
||||
for _, v := range []string{"auto.sh", "auto.vim", "auto.tmux"} {
|
||||
p := path.Join(m.Conf("web.code.publish", "meta.path"), v)
|
||||
if _, e := os.Stat(p); e != nil && os.IsNotExist(e) {
|
||||
// 下载脚本
|
||||
@ -61,7 +61,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
|
||||
}
|
||||
}
|
||||
}},
|
||||
"auto": {Name: "auto", Help: "自动化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
"auto": {Name: "auto dream", Help: "自动化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
|
||||
|
||||
// 共享空间
|
||||
@ -79,9 +79,18 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
|
||||
m.Cmd(prefix, "new-session", "-ds", arg[0])
|
||||
}
|
||||
|
||||
if m.Option("local") != "" {
|
||||
// 自动虚拟
|
||||
m.Cmd("local", m.Option("local"), arg[0])
|
||||
}
|
||||
if m.Option("relay") != "" {
|
||||
// 自动认证
|
||||
m.Cmd("relay", arg[0], m.Option("relay"))
|
||||
m.Cmd("relay", m.Option("relay"), arg[0])
|
||||
}
|
||||
|
||||
for _, v := range kit.Simple(m.Optionv("before")) {
|
||||
// 前置命令
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], v, "Enter")
|
||||
}
|
||||
|
||||
// 连接参数
|
||||
@ -93,9 +102,12 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
|
||||
case "shell":
|
||||
// 发送命令
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], value["text"], "Enter")
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
}
|
||||
})
|
||||
|
||||
for _, v := range kit.Simple(m.Optionv("after")) {
|
||||
// 后置命令
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], v, "Enter")
|
||||
}
|
||||
}},
|
||||
@ -269,51 +281,70 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
|
||||
m.Cmdy(prefix, "capture-pane", "-pt", kit.Select("", arg, 0)).Set("append")
|
||||
}},
|
||||
|
||||
"relay": {Name: "relay", Help: "跳板", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
"local": {Name: "local which target", Help: "虚拟机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
|
||||
|
||||
m.Richs("aaa.auth.auth", nil, kit.Select("relay", arg, 1), func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], kit.Format("ssh %s@%s", value["username"], value["website"]), "Enter")
|
||||
|
||||
for i := 0; i < 10; i++ {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
tail := m.Cmdx(prefix, "capture-pane", "-p")
|
||||
if strings.HasSuffix(strings.TrimSpace(tail), m.Conf("relay", "meta.tail.login")) {
|
||||
for _, v := range kit.Simple(value["init"]) {
|
||||
if v != "" {
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], v, "Enter")
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[1], "docker exec -it ", arg[1], " bash", "Enter")
|
||||
}},
|
||||
"relay": {Name: "relay which target", Help: "跳板机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
|
||||
if len(arg) == 0 {
|
||||
// 认证列表
|
||||
m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) {
|
||||
m.Push(key, value, []string{"name", "username", "website"})
|
||||
})
|
||||
return
|
||||
}
|
||||
if len(arg) == 1 {
|
||||
// 认证详情
|
||||
m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Push("detail", value)
|
||||
})
|
||||
return
|
||||
}
|
||||
if len(arg) > 4 {
|
||||
// 添加认证
|
||||
m.Rich(cmd, nil, kit.Dict(
|
||||
kit.MDB_NAME, arg[0], kit.MDB_TEXT, arg[1],
|
||||
"username", arg[2], "website", arg[3], "password", arg[4],
|
||||
))
|
||||
return
|
||||
}
|
||||
|
||||
m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
// 登录命令
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[1], kit.Format("ssh %s@%s", value["username"], value["website"]), "Enter")
|
||||
|
||||
sleep := kit.Duration(m.Conf(cmd, "meta.sleep"))
|
||||
for i := 0; i < kit.Int(m.Conf(cmd, "meta.count")); i++ {
|
||||
time.Sleep(sleep)
|
||||
list := strings.Split(strings.TrimSpace(m.Cmdx(prefix, "capture-pane", "-p")), "\n")
|
||||
|
||||
if tail := list[len(list)-1]; tail == m.Conf(cmd, "meta.tail.login") {
|
||||
// 登录成功
|
||||
break
|
||||
}
|
||||
|
||||
if strings.HasSuffix(strings.TrimSpace(tail), m.Conf("relay", "meta.tail.verify")) {
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], m.Cmdx("aaa.auth.get", "relay"), "Enter")
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.HasSuffix(strings.TrimSpace(tail), m.Conf("relay", "meta.tail.password")) {
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[0], value["password"], "Enter")
|
||||
continue
|
||||
} else if tail == m.Conf(cmd, "meta.tail.password") {
|
||||
// 输入密码
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[1], value["password"], "Enter")
|
||||
} else if tail == m.Conf(cmd, "meta.tail.verify") {
|
||||
// 输入密码
|
||||
m.Cmdy(prefix, "send-keys", "-t", arg[1], m.Cmdx("aaa.totp.get", value["text"]), "Enter")
|
||||
}
|
||||
}
|
||||
})
|
||||
}},
|
||||
"/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
// prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
|
||||
|
||||
// 当前会话
|
||||
current := ""
|
||||
m.Cmd("session").Table(func(index int, value map[string]string, head []string) {
|
||||
if value["tag"] == "1" {
|
||||
// 当前会话
|
||||
current = value["session"]
|
||||
}
|
||||
})
|
||||
|
||||
switch arg = kit.Split(kit.Select("tmux.auto", arg, 0)); arg[0] {
|
||||
default:
|
||||
m.Cmd("auto", current, arg)
|
||||
m.Append("_output", "void")
|
||||
m.Cmd("auto", current, arg)
|
||||
}
|
||||
}},
|
||||
},
|
||||
|
@ -190,8 +190,11 @@ autocmd! VimLeave * call ShyLogout()
|
||||
autocmd! BufReadPost * call ShySync("bufs")
|
||||
autocmd! BufReadPost * call ShySync("read")
|
||||
autocmd! BufWritePre * call ShySync("write")
|
||||
" autocmd! CmdlineLeave * call ShySync("exec")
|
||||
autocmd! CmdWinLeave * call ShySync("exec")
|
||||
if exists("CmdlineLeave")
|
||||
autocmd! CmdlineLeave * call ShySync("exec")
|
||||
else
|
||||
autocmd! CmdWinLeave * call ShySync("exec")
|
||||
endif
|
||||
" autocmd! QuickFixCmdPost * call ShyCheck("fixs")
|
||||
autocmd! InsertLeave * call ShySync("insert")
|
||||
|
||||
|
@ -35,6 +35,9 @@ ShyLog() {
|
||||
}
|
||||
|
||||
# 发送数据
|
||||
ShyWord() {
|
||||
echo "$*"|sed "s/\ /%20/g"|sed "s/|/%7C/g"|sed "s/\;/%3B/g"|sed "s/\[/%5B/g"|sed "s/\]/%5D/g"
|
||||
}
|
||||
ShyLine() {
|
||||
echo "$*"|sed -e 's/\"/\\\"/g' -e 's/\n/\\n/g'
|
||||
}
|
||||
@ -68,11 +71,13 @@ ShyHelp() {
|
||||
ShyLogin() {
|
||||
HOST=`hostname` ctx_sid=`ShyPost login "" share "${ctx_share}" pid "$$" pane "${TMUX_PANE}" hostname "${HOST}" username "${USER}"`
|
||||
echo "${ctx_welcome}"
|
||||
echo "${ctx_dev}"
|
||||
echo "sid: ${ctx_sid}"
|
||||
echo "begin: ${ctx_begin}"
|
||||
echo "${ctx_dev} "
|
||||
echo -n "sid: ${ctx_sid} "
|
||||
echo "begin: ${ctx_begin} "
|
||||
export ctx_sid
|
||||
}
|
||||
ShyLogout() {
|
||||
ShySync history
|
||||
echo ${ctx_goodbye} && [ "$ctx_sid" != "" ] && ShyPost logout
|
||||
}
|
||||
|
||||
@ -92,12 +97,23 @@ ShySend() {
|
||||
-F "SHELL=${SHELL}" -F "pwd=${PWD}" -F "sid=${ctx_sid}"
|
||||
}
|
||||
|
||||
ShyRelay() {
|
||||
which=docker && [ "$1" != "" ] && which=$1 && shift
|
||||
arg="" && for cmd in "$@"; do
|
||||
arg="$arg&after="`echo $cmd|sed s/\;/%3B/g|sed s/\ /%20/g`
|
||||
ShyLocal() {
|
||||
which=alpine && [ "$1" != "" ] && which=$1 && shift
|
||||
favor=tmux.auto && [ "$1" != "" ] && favor=$1 && shift
|
||||
step=before arg="" && for cmd in "$@"; do
|
||||
[ "$cmd" = after ] && step=after && continue
|
||||
arg="$arg&$step="`ShyWord $cmd`
|
||||
done
|
||||
${ctx_curl} -s "$ctx_dev/code/tmux/favor?relay=$which&cmds=tmux.auto&$arg" &
|
||||
${ctx_curl} -s "$ctx_dev/code/tmux/favor?local=$which&cmds=$favor&$arg" &
|
||||
}
|
||||
ShyRelay() {
|
||||
which=relay && [ "$1" != "" ] && which=$1 && shift
|
||||
favor=tmux.auto && [ "$1" != "" ] && favor=$1 && shift
|
||||
step=before arg="" && for cmd in "$@"; do
|
||||
[ "$cmd" = after ] && step=after && continue
|
||||
arg="$arg&$step="`ShyWord $cmd`
|
||||
done
|
||||
${ctx_curl} -s "$ctx_dev/code/tmux/favor?relay=$which&cmds=$favor&$arg" &
|
||||
}
|
||||
|
||||
# 同步数据
|
||||
@ -115,7 +131,7 @@ ShySync() {
|
||||
ctx_begin=${ctx_begin:=$ctx_end}
|
||||
ctx_count=`expr $ctx_end - $ctx_begin`
|
||||
ShyEcho "sync $ctx_begin-$ctx_end count $ctx_count to $ctx_dev"
|
||||
history|tail -n $ctx_count |while read line; do
|
||||
HISTTIMEFORMAT="%F %T " history|tail -n $ctx_count |while read line; do
|
||||
ShyPost sync history arg "$line" >/dev/null
|
||||
done
|
||||
ctx_begin=$ctx_end
|
||||
@ -178,9 +194,8 @@ ShyInit() {
|
||||
fi
|
||||
|
||||
echo "url: ${ctx_url}"
|
||||
echo "pid: $$"
|
||||
echo "begin: ${ctx_begin}"
|
||||
echo "share: ${ctx_share}"
|
||||
echo "pane: $TMUX_PANE"
|
||||
echo -n "pid: $$ "
|
||||
echo -n "begin: ${ctx_begin} "
|
||||
echo -n "share: ${ctx_share} "
|
||||
echo "pane: $TMUX_PANE "
|
||||
}
|
||||
ShyInit && trap ShyLogout EXIT
|
||||
|
@ -48,9 +48,9 @@ var Index = &ice.Context{Name: "zsh", Help: "命令行",
|
||||
"/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "history":
|
||||
vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 2)
|
||||
cmds := []string{ice.WEB_FAVOR, m.Conf("zsh", "meta.history"), ice.TYPE_SHELL, vs[0], kit.Select("", vs, 1),
|
||||
"sid", m.Option("sid"), "pwd", m.Option("pwd")}
|
||||
vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 4)
|
||||
cmds := []string{ice.WEB_FAVOR, m.Conf("zsh", "meta.history"), ice.TYPE_SHELL, vs[0], kit.Select("", vs, 3),
|
||||
"sid", m.Option("sid"), "pwd", m.Option("pwd"), "time", vs[1] + " " + vs[2]}
|
||||
|
||||
if m.Cmd(cmds); m.Option("you") != "" {
|
||||
m.Cmd(ice.WEB_SPACE, m.Option("you"), cmds)
|
||||
@ -154,15 +154,22 @@ var Index = &ice.Context{Name: "zsh", Help: "命令行",
|
||||
"/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 && arg[0] != "sh" {
|
||||
// 添加收藏
|
||||
cmds := []string{ice.WEB_FAVOR, kit.Select("zsh.history", m.Option("tab")), ice.TYPE_SHELL, m.Option("note"), arg[0]}
|
||||
cmds := []string{ice.WEB_FAVOR, kit.Select("zsh.history", m.Option("tab")), kit.Select(ice.TYPE_SHELL, m.Option("type")), m.Option("note"), arg[0]}
|
||||
if m.Cmdy(cmds); m.Option("you") != "" {
|
||||
m.Cmdy(ice.WEB_SPACE, m.Option("you"), cmds)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if m.Option("tab") == "" {
|
||||
// 收藏列表
|
||||
m.Cmdy(ice.WEB_SPACE, m.Option("you"), ice.WEB_FAVOR)
|
||||
m.Table()
|
||||
return
|
||||
}
|
||||
|
||||
m.Echo("#/bin/sh\n\n")
|
||||
m.Cmd(ice.WEB_SPACE, m.Option("you"), ice.WEB_FAVOR, kit.Select("zsh.history", m.Option("tab"))).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Cmd(ice.WEB_SPACE, m.Option("you"), ice.WEB_FAVOR, m.Option("tab")).Table(func(index int, value map[string]string, head []string) {
|
||||
switch value["type"] {
|
||||
case ice.TYPE_SHELL:
|
||||
// 查看收藏
|
||||
|
5
type.go
5
type.go
@ -758,6 +758,9 @@ func (m *Message) Appendv(key string, arg ...interface{}) []string {
|
||||
return m.meta[key]
|
||||
}
|
||||
func (m *Message) Resultv(arg ...interface{}) []string {
|
||||
if len(arg) > 0 {
|
||||
m.meta[MSG_RESULT] = kit.Simple(arg...)
|
||||
}
|
||||
return m.meta[MSG_RESULT]
|
||||
}
|
||||
func (m *Message) Result(arg ...interface{}) string {
|
||||
@ -767,7 +770,7 @@ func (m *Message) Result(arg ...interface{}) string {
|
||||
return kit.Select("", m.meta[MSG_RESULT], v)
|
||||
}
|
||||
}
|
||||
return strings.Join(m.Resultv(), "")
|
||||
return strings.Join(m.Resultv(arg...), "")
|
||||
}
|
||||
|
||||
func (m *Message) Log(level string, str string, arg ...interface{}) *Message {
|
||||
|
Loading…
x
Reference in New Issue
Block a user