mirror of
https://shylinux.com/x/icebergs
synced 2025-06-25 18:17:29 +08:00
opt code
This commit is contained in:
parent
395b78ac26
commit
27938bc30d
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,6 +12,7 @@ pack/
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
*.log
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
@ -20,9 +20,6 @@ func _command_list(m *ice.Message, all bool, name string) {
|
||||
m.Push("name", kit.Format(cmd.Name))
|
||||
m.Push("help", kit.Simple(cmd.Help)[0])
|
||||
m.Push("meta", kit.Format(cmd.Meta))
|
||||
if len(cmd.List) == 0 {
|
||||
_command_make(m, cmd)
|
||||
}
|
||||
m.Push("list", kit.Format(cmd.List))
|
||||
})
|
||||
return
|
||||
@ -45,51 +42,6 @@ func _command_list(m *ice.Message, all bool, name string) {
|
||||
m.Push("help", kit.Simple(v.Help)[0])
|
||||
}
|
||||
}
|
||||
func _command_make(m *ice.Message, cmd *ice.Command) {
|
||||
var list []string
|
||||
switch name := cmd.Name.(type) {
|
||||
case []string, []interface{}:
|
||||
list = kit.Split(kit.Simple(name)[0])
|
||||
default:
|
||||
list = kit.Split(strings.Split(kit.Format(name), ";")[0])
|
||||
}
|
||||
|
||||
button := false
|
||||
for i, v := range list {
|
||||
if i == 0 {
|
||||
continue
|
||||
}
|
||||
switch ls := kit.Split(v, ":="); ls[0] {
|
||||
case "[", "]":
|
||||
case "auto":
|
||||
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "查看", "value", "auto")...)
|
||||
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "返回", "value", "Last")...)
|
||||
button = true
|
||||
default:
|
||||
kind, value := kit.Select("text", "button", button), ""
|
||||
if len(ls) == 3 {
|
||||
kind, value = ls[1], ls[2]
|
||||
} else if len(ls) == 2 {
|
||||
if strings.Contains(v, "=") {
|
||||
value = ls[1]
|
||||
} else {
|
||||
kind = ls[1]
|
||||
}
|
||||
}
|
||||
if kind == "button" {
|
||||
button = true
|
||||
}
|
||||
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, kind, "name", ls[0], "value", value)...)
|
||||
}
|
||||
}
|
||||
if len(cmd.List) == 0 {
|
||||
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "text", "name", "path")...)
|
||||
}
|
||||
if !button {
|
||||
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "查看")...)
|
||||
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "返回")...)
|
||||
}
|
||||
}
|
||||
|
||||
const COMMAND = "command"
|
||||
|
||||
|
@ -35,6 +35,9 @@ func _hash_select(m *ice.Message, prefix, key, field, value string) {
|
||||
}
|
||||
fields := strings.Split(kit.Select("time,hash,type,name,text", m.Option(FIELDS)), ",")
|
||||
m.Richs(prefix, key, value, func(key string, val map[string]interface{}) {
|
||||
if val[kit.MDB_META] != nil {
|
||||
val = val[kit.MDB_META].(map[string]interface{})
|
||||
}
|
||||
if field != "" && field != kit.MDB_HASH && value != val[field] && value != kit.MDB_FOREACH {
|
||||
return
|
||||
}
|
||||
@ -149,6 +152,9 @@ func _list_select(m *ice.Message, prefix, key, field, value string) {
|
||||
}
|
||||
m.Push("", val, fields, val[kit.MDB_META])
|
||||
})
|
||||
if m.Option(FIELDS) != "detail" {
|
||||
m.Sort(kit.MDB_ID, "int_r")
|
||||
}
|
||||
}
|
||||
func _list_modify(m *ice.Message, prefix, key string, field, value string, arg ...string) {
|
||||
m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) {
|
||||
|
@ -218,6 +218,9 @@ func _file_copy(m *ice.Message, name string, from ...string) {
|
||||
}
|
||||
}
|
||||
func _file_link(m *ice.Message, name string, from string) {
|
||||
if from == "" {
|
||||
return
|
||||
}
|
||||
os.MkdirAll(path.Dir(name), 0760)
|
||||
os.Remove(name)
|
||||
os.Link(from, name)
|
||||
|
@ -47,7 +47,7 @@ func init() {
|
||||
ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ROUTE: {Name: "route route=auto cmd=@key auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{
|
||||
ROUTE: {Name: "route route cmd auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{
|
||||
"invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy("web.code.install", "contexts", "base")
|
||||
}},
|
||||
|
@ -14,6 +14,7 @@ import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@ -177,6 +178,11 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
|
||||
m.Info(" ")
|
||||
}()
|
||||
}
|
||||
|
||||
if r.URL.Path == "/" && strings.Contains(r.Header.Get("User-Agent"), "curl") {
|
||||
http.ServeFile(w, r, path.Join(m.Conf(SERVE, "meta.intshell.path"), m.Conf(SERVE, "meta.intshell.index")))
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if strings.HasPrefix(r.URL.Path, "/debug") {
|
||||
@ -243,11 +249,15 @@ func init() {
|
||||
"publish", true,
|
||||
),
|
||||
|
||||
"intshell", kit.Dict(
|
||||
"path", "usr/intshell", "index", "index.sh", "require", ".ish/pluged",
|
||||
"repos", "https://github.com/shylinux/volcanos", "branch", "master",
|
||||
),
|
||||
|
||||
"static", kit.Dict("/", "usr/volcanos/"),
|
||||
"volcanos", kit.Dict("path", "usr/volcanos", "branch", "master",
|
||||
"repos", "https://github.com/shylinux/volcanos",
|
||||
"require", ".ish/pluged",
|
||||
"refresh", "5",
|
||||
"volcanos", kit.Dict("refresh", "5",
|
||||
"path", "usr/volcanos", "require", ".ish/pluged",
|
||||
"repos", "https://github.com/shylinux/volcanos", "branch", "master",
|
||||
), "page", kit.Dict(
|
||||
"index", "usr/volcanos/page/index.html",
|
||||
"share", "usr/volcanos/page/share.html",
|
||||
|
@ -2,6 +2,7 @@ package web
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
"github.com/shylinux/icebergs/base/tcp"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
@ -203,6 +204,10 @@ func init() {
|
||||
|
||||
// 请求地址
|
||||
uri, arg := arg[0], arg[1:]
|
||||
if strings.HasPrefix(uri, "ftp") {
|
||||
m.Cmdy(cli.SYSTEM, "wget", uri)
|
||||
return
|
||||
}
|
||||
// if n := m.Cmd("spide_rewrite", uri).Append("to"); n != "" && n != uri {
|
||||
// m.Logs("rewrite", "from", uri, "to", n)
|
||||
// uri = n
|
||||
|
@ -1,210 +1,27 @@
|
||||
package code
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
"github.com/shylinux/icebergs/base/nfs"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
VEDIO = "vedio"
|
||||
QRCODE = "qrcode"
|
||||
)
|
||||
const CODE = "code"
|
||||
|
||||
const ( // CODE
|
||||
// INSTALL = "_install"
|
||||
PREPARE = "_prepare"
|
||||
PROJECT = "_project"
|
||||
)
|
||||
|
||||
var Index = &ice.Context{Name: "code", Help: "编程中心",
|
||||
Configs: map[string]*ice.Config{
|
||||
"_install": {Name: "install", Help: "安装", Value: kit.Data(
|
||||
"path", "usr/install", "target", "usr/local",
|
||||
"linux", "https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz",
|
||||
"darwin", "https://dl.google.com/go/go1.14.6.darwin-amd64.tar.gz",
|
||||
"windows", "https://golang.google.cn/dl/go1.14.6.windows-amd64.zip",
|
||||
)},
|
||||
PREPARE: {Name: "prepare", Help: "配置", Value: kit.Data("path", "usr/prepare",
|
||||
"script", ".ish/pluged/golang/init.sh", "export", kit.Dict(
|
||||
"GOPROXY", "https://goproxy.cn,direct",
|
||||
"GOPRIVATE", "https://github.com",
|
||||
),
|
||||
)},
|
||||
PROJECT: {Name: "project", Help: "项目", Value: kit.Data("path", "usr/project")},
|
||||
|
||||
"login": {Name: "login", Help: "终端接入", Value: kit.Data()},
|
||||
},
|
||||
var Index = &ice.Context{Name: CODE, Help: "编程中心",
|
||||
Configs: map[string]*ice.Config{},
|
||||
Commands: map[string]*ice.Command{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Load()
|
||||
m.Cmd(mdb.ENGINE, mdb.CREATE, BENCH)
|
||||
m.Conf(INSTALL, "meta.contexts", _contexts)
|
||||
}},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Save(INSTALL)
|
||||
}},
|
||||
|
||||
"_install": {Name: "install url 安装:button", Help: "安装", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
target := m.Conf("_install", kit.Keys("meta", runtime.GOOS))
|
||||
|
||||
p := path.Join(m.Conf("_install", "meta.path"), path.Base(target))
|
||||
if _, e := os.Stat(p); e != nil {
|
||||
// 下载
|
||||
msg := m.Cmd(web.SPIDE, "dev", web.CACHE, http.MethodGet, target)
|
||||
m.Cmd(web.CACHE, web.WATCH, msg.Append(web.DATA), p)
|
||||
}
|
||||
|
||||
os.MkdirAll(m.Conf("_install", kit.Keys("meta.target")), ice.MOD_DIR)
|
||||
m.Cmdy(cli.SYSTEM, "tar", "xvf", p, "-C", m.Conf("_install", kit.Keys("meta.target")))
|
||||
}},
|
||||
PREPARE: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
export := []string{}
|
||||
kit.Fetch(m.Confv(PREPARE, "meta.export"), func(key string, val string) {
|
||||
export = append(export, key+"="+val)
|
||||
})
|
||||
|
||||
m.Cmd(nfs.SAVE, m.Conf(PREPARE, "meta.script"), kit.Format(`
|
||||
export GOROOT=%s GOPATH=%s:$GOPATH GOBIN=%s
|
||||
export PATH=$GOBIN:$GOROOT/bin:$PATH
|
||||
export %s
|
||||
`, kit.Path(m.Conf("_install", kit.Keys("meta.target")), "go"), kit.Path("src"), kit.Path("bin"), strings.Join(export, " ")))
|
||||
}},
|
||||
PROJECT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
}},
|
||||
|
||||
"login": {Name: "login key", Help: "登录", Meta: kit.Dict(
|
||||
"detail", []string{"编辑", "删除", "清理", "清空"},
|
||||
), Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 && arg[0] == "action" {
|
||||
switch arg[1] {
|
||||
case "modify", "编辑":
|
||||
m.Richs(cmd, nil, m.Option("key"), func(key string, value map[string]interface{}) {
|
||||
m.Logs(ice.LOG_MODIFY, cmd, key, "field", arg[2], "value", kit.Value(value, arg[2]), "->", arg[3])
|
||||
kit.Value(value, arg[2], arg[3])
|
||||
})
|
||||
|
||||
case "delete", "删除":
|
||||
m.Logs(ice.LOG_DELETE, cmd, m.Option("key"), "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key"))))
|
||||
m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key")), "")
|
||||
|
||||
case "prune", "清理":
|
||||
m.Cmdy(cmd, "prune")
|
||||
|
||||
case "clear", "清空":
|
||||
m.Cmdy(cmd, "prune", "all")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
switch kit.Select("list", arg, 0) {
|
||||
case "init":
|
||||
if m.Option("sid") != "" && m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}) != "" {
|
||||
// 复用会话
|
||||
m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}, "login")
|
||||
m.Logs(ice.LOG_AUTH, "sid", m.Option("sid"))
|
||||
m.Echo(m.Option("sid"))
|
||||
return
|
||||
}
|
||||
|
||||
you := m.Conf(web.SHARE, kit.Keys(kit.MDB_HASH, m.Option("share"), "name"))
|
||||
// 添加会话
|
||||
h := m.Rich(cmd, nil, kit.Dict(
|
||||
"type", kit.Select("zsh", arg, 1),
|
||||
"status", "login",
|
||||
"you", you,
|
||||
"pwd", m.Option("pwd"),
|
||||
"pid", m.Option("pid"),
|
||||
"pane", m.Option("pane"),
|
||||
"hostname", m.Option("hostname"),
|
||||
"username", m.Option("username"),
|
||||
))
|
||||
m.Logs(ice.LOG_AUTH, "sid", h, "you", you)
|
||||
m.Echo(h)
|
||||
|
||||
case "exit":
|
||||
// 退出会话
|
||||
m.Richs(cmd, nil, m.Option("sid"), func(key string, value map[string]interface{}) {
|
||||
m.Logs(ice.LOG_AUTH, "sid", m.Option("sid"))
|
||||
value["status"] = "logout"
|
||||
m.Echo(key)
|
||||
})
|
||||
|
||||
case "prune":
|
||||
list := []string{}
|
||||
m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) {
|
||||
if len(arg) > 1 && arg[1] == "all" || value["status"] == "logout" {
|
||||
list = append(list, key)
|
||||
}
|
||||
})
|
||||
|
||||
// 清理会话
|
||||
kit.Fetch(list, func(index int, value string) {
|
||||
m.Logs(ice.LOG_DELETE, "login", value, "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, value)))
|
||||
m.Conf(cmd, kit.Keys(kit.MDB_HASH, value), "")
|
||||
})
|
||||
m.Echo("%d", len(list))
|
||||
|
||||
case "list":
|
||||
// 会话列表
|
||||
m.Richs("login", nil, "*", func(key string, value map[string]interface{}) {
|
||||
m.Push(key, value, []string{"time", "key", "type", "status", "you"})
|
||||
pwd := strings.Split(kit.Format(value["pwd"]), "/")
|
||||
if len(pwd) > 3 {
|
||||
m.Push("pwd", strings.Join(pwd[len(pwd)-3:len(pwd)], "/"))
|
||||
} else {
|
||||
m.Push("pwd", value["pwd"])
|
||||
}
|
||||
m.Push(key, value, []string{"pid", "pane", "hostname", "username"})
|
||||
})
|
||||
|
||||
default:
|
||||
// 会话详情
|
||||
m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Push("detail", value)
|
||||
})
|
||||
}
|
||||
}},
|
||||
|
||||
"/miss/": {Name: "/miss/", Help: "任务", Action: map[string]*ice.Action{
|
||||
"pwd": {Name: "pwd", Help: "pwd", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Render(ice.RENDER_RESULT)
|
||||
m.Echo("hello world\n")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
u, e := url.QueryUnescape(m.Option("arg"))
|
||||
m.Assert(e)
|
||||
args := kit.Split(u)
|
||||
if len(arg) == 0 || arg[0] == "" {
|
||||
return
|
||||
}
|
||||
|
||||
m.Render(ice.RENDER_RESULT)
|
||||
if m.Cmdy(arg, args); len(m.Resultv()) == 0 {
|
||||
m.Table()
|
||||
}
|
||||
m.Conf(PUBLISH, "meta.contexts", _contexts)
|
||||
}},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }},
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
web.Index.Register(Index, &web.Frame{},
|
||||
INSTALL,
|
||||
COMPILE,
|
||||
UPGRADE,
|
||||
PUBLISH,
|
||||
BENCH,
|
||||
PPROF,
|
||||
INSTALL, COMPILE, PUBLISH, UPGRADE,
|
||||
INNER, VIMER, BENCH, PPROF,
|
||||
C, SH, GO, SHY, JS,
|
||||
)
|
||||
}
|
||||
|
@ -46,10 +46,7 @@ func _vimer_save(m *ice.Message, ext, file, dir string, text string) {
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
INNER = "inner"
|
||||
VIMER = "vimer"
|
||||
)
|
||||
const INNER = "inner"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
@ -84,23 +81,6 @@ func init() {
|
||||
}
|
||||
_inner_list(m, _inner_ext(arg[1]), arg[1], arg[0])
|
||||
}},
|
||||
VIMER: {Name: "vimer path=usr/demo file=hi.sh line=1 刷新:button=auto 保存:button 运行:button 项目:button", Help: "编辑器", Meta: kit.Dict(
|
||||
"display", "/plugin/local/code/vimer.js", "style", "editor",
|
||||
), Action: map[string]*ice.Action{
|
||||
web.UPLOAD: {Name: "upload path name", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.CACHE, web.UPLOAD)
|
||||
m.Cmdy(web.CACHE, web.WATCH, m.Option(web.DATA), path.Join(m.Option("path"), m.Option("name")))
|
||||
}},
|
||||
nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
|
||||
_vimer_save(m, arg[0], arg[1], arg[2], m.Option("content"))
|
||||
}},
|
||||
|
||||
"cmd": {Name: "cmd type file path", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(arg)
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(INNER, arg)
|
||||
}},
|
||||
},
|
||||
Configs: map[string]*ice.Config{
|
||||
INNER: {Name: "inner", Help: "阅读器", Value: kit.Data(
|
||||
|
@ -9,37 +9,11 @@ import (
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var _contexts = kit.Dict(
|
||||
"tmux", `
|
||||
# 终端环境
|
||||
curl -fLo /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo && yum -y update
|
||||
yum install -y tmux vim
|
||||
`,
|
||||
"base", `
|
||||
# 生产环境
|
||||
mkdir contexts; cd contexts
|
||||
export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; curl $ctx_dev/publish/ice.sh |sh
|
||||
bin/ice.sh`,
|
||||
"miss", `
|
||||
# 开发环境
|
||||
yum install -y make git go
|
||||
mkdir ~/.ssh &>/dev/null; touch ~/.ssh/config; [ -z "$(cat ~/.ssh/config|grep 'HOST {{.Option "hostname"}}')" ] && echo -e "HOST {{.Option "hostname"}}\n Port 9030" >> ~/.ssh/config
|
||||
export ISH_CONF_HUB_PROXY={{.Option "userhost"}}:.ish/pluged/
|
||||
git clone $ISH_CONF_HUB_PROXY/github.com/shylinux/contexts && cd contexts
|
||||
source etc/miss.sh
|
||||
|
||||
touch ~/.gitconfig; [ -z "$(cat ~/.gitconfig|grep '\[url \"{{.Option "userhost"}}')" ] && echo -e "[url \"{{.Option "userhost"}}:ish/pluged/\"]\n insteadOf=\"https://github.com/\"\n" >> ~/.gitconfig
|
||||
git clone https://github.com/shylinux/contexts && cd contexts
|
||||
source etc/miss.sh
|
||||
`,
|
||||
)
|
||||
|
||||
const INSTALL = "install"
|
||||
|
||||
func init() {
|
||||
@ -47,39 +21,32 @@ func init() {
|
||||
Configs: map[string]*ice.Config{
|
||||
INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install",
|
||||
"contexts", _contexts,
|
||||
kit.MDB_FIELD, "time,step,size,total,name,link",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
INSTALL: {Name: "install name=auto port=auto path=auto auto", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{
|
||||
"contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
|
||||
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
|
||||
m.Option("hostport", fmt.Sprintf("%s:%s", strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
|
||||
m.Option("hostname", strings.Split(u.Host, ":")[0])
|
||||
|
||||
m.Option("userhost", fmt.Sprintf("%s@%s", m.Option(ice.MSG_USERNAME), strings.Split(u.Host, ":")[0]))
|
||||
m.Option("hostpath", kit.Path("./.ish/pluged"))
|
||||
|
||||
if buf, err := kit.Render(m.Conf(INSTALL, kit.Keys("meta.contexts", kit.Select("base", arg, 0))), m); m.Assert(err) {
|
||||
m.Cmdy("web.wiki.spark", "shell", string(buf))
|
||||
}
|
||||
}},
|
||||
INSTALL: {Name: "install name port path auto", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{
|
||||
"download": {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
||||
name := path.Base(arg[0])
|
||||
if m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) {
|
||||
if _, e := os.Stat(path.Join(m.Conf(INSTALL, kit.META_PATH), kit.Format(value[kit.MDB_NAME]))); e == nil {
|
||||
m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_STEP, kit.MDB_SIZE, kit.MDB_TOTAL, kit.MDB_NAME, kit.MDB_LINK})
|
||||
m.Option("_process", "_progress")
|
||||
p := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
|
||||
|
||||
m.Option("_process", "_progress")
|
||||
m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD))
|
||||
if m.Cmd(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, name).Table(func(index int, value map[string]string, head []string) {
|
||||
if _, e := os.Stat(p); e == nil {
|
||||
m.Push("", value, kit.Split(m.Option(mdb.FIELDS)))
|
||||
}
|
||||
}) != nil && len(m.Appendv(kit.MDB_NAME)) > 0 {
|
||||
// 已经下载
|
||||
return
|
||||
}); len(m.Appendv(kit.MDB_NAME)) > 0 {
|
||||
return // 已经下载
|
||||
}
|
||||
|
||||
// 占位
|
||||
m.Cmd(nfs.SAVE, p, "")
|
||||
|
||||
// 进度
|
||||
m.Cmd(mdb.INSERT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, name, kit.MDB_LINK, arg[0])
|
||||
m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) {
|
||||
value = value[kit.MDB_META].(map[string]interface{})
|
||||
m.Optionv("progress", func(size int, total int) {
|
||||
s := size * 100 / total
|
||||
if s != kit.Int(value[kit.MDB_STEP]) && s%10 == 0 {
|
||||
@ -89,23 +56,11 @@ func init() {
|
||||
})
|
||||
})
|
||||
|
||||
// 占位
|
||||
p := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
|
||||
if strings.Contains(p, "/") {
|
||||
os.MkdirAll(path.Base(p), ice.MOD_DIR)
|
||||
}
|
||||
m.Cmd(cli.SYSTEM, "touch", p)
|
||||
|
||||
m.Option("_process", "_progress")
|
||||
m.Gos(m, func(m *ice.Message) {
|
||||
// 下载
|
||||
m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH))
|
||||
if strings.HasPrefix(arg[0], "ftp") {
|
||||
m.Cmdy(cli.SYSTEM, "wget", arg[0])
|
||||
} else {
|
||||
msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0])
|
||||
m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE))
|
||||
}
|
||||
msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0])
|
||||
m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE))
|
||||
|
||||
// 解压
|
||||
m.Cmd(cli.SYSTEM, "tar", "xvf", name)
|
||||
@ -117,7 +72,7 @@ func init() {
|
||||
case func(string):
|
||||
cb(p)
|
||||
default:
|
||||
if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, INSTALL)), arg[1:]); m.Append(cli.CMD_CODE) != "0" {
|
||||
if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, kit.Select("_install", m.Option("install")))), arg[1:]); m.Append(cli.CMD_CODE) != "0" {
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -125,16 +80,16 @@ func init() {
|
||||
if m.Cmdy(cli.SYSTEM, "make", "-j8"); m.Append(cli.CMD_CODE) != "0" {
|
||||
return
|
||||
}
|
||||
if m.Cmdy(cli.SYSTEM, "make", "PREFIX="+kit.Path(path.Join(p, INSTALL)), "install"); m.Append(cli.CMD_CODE) != "0" {
|
||||
return
|
||||
}
|
||||
|
||||
m.Cmdy(cli.SYSTEM, "mv", "INSTALL", "INSTALLS")
|
||||
m.Cmdy(cli.SYSTEM, "make", "PREFIX="+kit.Path(path.Join(p, kit.Select("_install", m.Option("install")))), "install")
|
||||
}},
|
||||
"spawn": {Name: "spawn link", Help: "新建", Hand: func(m *ice.Message, arg ...string) {
|
||||
port := m.Cmdx(tcp.PORT, "select")
|
||||
target := path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
|
||||
source := path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(arg[0]))
|
||||
|
||||
m.Cmd(nfs.DIR, path.Join(source, kit.Select("install", m.Option("install")))).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Cmd(nfs.DIR, path.Join(source, kit.Select("_install", m.Option("install")))).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[kit.MDB_PATH], "/"), target)
|
||||
})
|
||||
m.Echo(target)
|
||||
@ -155,34 +110,30 @@ func init() {
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
// 源码列表
|
||||
m.Option(mdb.FIELDS, "time,step,size,total,name,link")
|
||||
m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD))
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH)
|
||||
m.Sort(kit.MDB_TIME, "time_r")
|
||||
return
|
||||
}
|
||||
|
||||
arg[0] = path.Base(arg[0])
|
||||
if key := strings.Split(strings.Split(arg[0], "-")[0], ".")[0]; len(arg) == 1 {
|
||||
// 服务列表
|
||||
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||
m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) {
|
||||
// 服务列表
|
||||
if strings.Contains(value[kit.MDB_NAME], key) {
|
||||
m.Push(kit.MDB_TIME, value[kit.MDB_TIME])
|
||||
m.Push(kit.MDB_PORT, path.Base(value[kit.MDB_DIR]))
|
||||
m.Push(kit.MDB_STATUS, value[kit.MDB_STATUS])
|
||||
m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
|
||||
m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, web.RENDER.A,
|
||||
kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR]))))
|
||||
m.PushRender(kit.MDB_LINK, "a", kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR])))
|
||||
}
|
||||
})
|
||||
m.Sort(kit.MDB_TIME, "time_r")
|
||||
return
|
||||
}
|
||||
|
||||
// 目录列表
|
||||
m.Option(nfs.DIR_ROOT, path.Join(m.Conf(cli.DAEMON, kit.META_PATH), arg[1]))
|
||||
m.Cmdy(nfs.DIR, kit.Select("./", arg, 2))
|
||||
m.Sort(kit.MDB_TIME, "time_r")
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const PUBLISH = "publish"
|
||||
@ -37,10 +38,24 @@ func init() {
|
||||
Configs: map[string]*ice.Config{
|
||||
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/publish",
|
||||
"contexts", _contexts,
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
PUBLISH: {Name: "publish path=auto auto 火山架 冰山架 神农架", Help: "发布", Action: map[string]*ice.Action{
|
||||
"contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
|
||||
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
|
||||
m.Option("hostport", fmt.Sprintf("%s:%s", strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
|
||||
m.Option("hostname", strings.Split(u.Host, ":")[0])
|
||||
|
||||
m.Option("userhost", fmt.Sprintf("%s@%s", m.Option(ice.MSG_USERNAME), strings.Split(u.Host, ":")[0]))
|
||||
m.Option("hostpath", kit.Path("./.ish/pluged"))
|
||||
|
||||
if buf, err := kit.Render(m.Conf(INSTALL, kit.Keys("meta.contexts", kit.Select("base", arg, 0))), m); m.Assert(err) {
|
||||
m.Cmdy("web.wiki.spark", "shell", string(buf))
|
||||
}
|
||||
}},
|
||||
"ish": {Name: "ish", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
|
||||
_publish_file(m, "etc/conf/tmux.conf")
|
||||
m.Option(nfs.DIR_REG, ".*\\.(sh|vim|conf)")
|
||||
@ -64,3 +79,28 @@ func init() {
|
||||
},
|
||||
}, nil)
|
||||
}
|
||||
|
||||
var _contexts = kit.Dict(
|
||||
"tmux", `
|
||||
# 终端环境
|
||||
curl -fLo /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo && yum -y update
|
||||
yum install -y tmux
|
||||
`,
|
||||
"base", `
|
||||
# 生产环境
|
||||
mkdir contexts; cd contexts
|
||||
export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; curl $ctx_dev/publish/ice.sh |sh
|
||||
bin/ice.sh`,
|
||||
"miss", `
|
||||
# 开发环境
|
||||
yum install -y make git vim go
|
||||
mkdir ~/.ssh &>/dev/null; touch ~/.ssh/config; [ -z "$(cat ~/.ssh/config|grep 'HOST {{.Option "hostname"}}')" ] && echo -e "HOST {{.Option "hostname"}}\n Port 9030" >> ~/.ssh/config
|
||||
export ISH_CONF_HUB_PROXY={{.Option "userhost"}}:.ish/pluged/
|
||||
git clone $ISH_CONF_HUB_PROXY/github.com/shylinux/contexts && cd contexts
|
||||
source etc/miss.sh
|
||||
|
||||
touch ~/.gitconfig; [ -z "$(cat ~/.gitconfig|grep '\[url \"{{.Option "userhost"}}')" ] && echo -e "[url \"{{.Option "userhost"}}:ish/pluged/\"]\n insteadOf=\"https://github.com/\"\n" >> ~/.gitconfig
|
||||
git clone https://github.com/shylinux/contexts && cd contexts
|
||||
source etc/miss.sh
|
||||
`,
|
||||
)
|
||||
|
188
core/code/trash.go
Normal file
188
core/code/trash.go
Normal file
@ -0,0 +1,188 @@
|
||||
package code
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/base/nfs"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const ( // CODE
|
||||
// INSTALL = "_install"
|
||||
PREPARE = "_prepare"
|
||||
PROJECT = "_project"
|
||||
)
|
||||
|
||||
const TRASH = "trash"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
"_install": {Name: "install", Help: "安装", Value: kit.Data(
|
||||
"path", "usr/install", "target", "usr/local",
|
||||
"linux", "https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz",
|
||||
"darwin", "https://dl.google.com/go/go1.14.6.darwin-amd64.tar.gz",
|
||||
"windows", "https://golang.google.cn/dl/go1.14.6.windows-amd64.zip",
|
||||
)},
|
||||
PREPARE: {Name: "prepare", Help: "配置", Value: kit.Data("path", "usr/prepare",
|
||||
"script", ".ish/pluged/golang/init.sh", "export", kit.Dict(
|
||||
"GOPROXY", "https://goproxy.cn,direct",
|
||||
"GOPRIVATE", "https://github.com",
|
||||
),
|
||||
)},
|
||||
PROJECT: {Name: "project", Help: "项目", Value: kit.Data("path", "usr/project")},
|
||||
|
||||
"login": {Name: "login", Help: "终端接入", Value: kit.Data()},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
"_install": {Name: "install url 安装:button", Help: "安装", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
target := m.Conf("_install", kit.Keys("meta", runtime.GOOS))
|
||||
|
||||
p := path.Join(m.Conf("_install", "meta.path"), path.Base(target))
|
||||
if _, e := os.Stat(p); e != nil {
|
||||
// 下载
|
||||
msg := m.Cmd(web.SPIDE, "dev", web.CACHE, http.MethodGet, target)
|
||||
m.Cmd(web.CACHE, web.WATCH, msg.Append(web.DATA), p)
|
||||
}
|
||||
|
||||
os.MkdirAll(m.Conf("_install", kit.Keys("meta.target")), ice.MOD_DIR)
|
||||
m.Cmdy(cli.SYSTEM, "tar", "xvf", p, "-C", m.Conf("_install", kit.Keys("meta.target")))
|
||||
}},
|
||||
PREPARE: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
export := []string{}
|
||||
kit.Fetch(m.Confv(PREPARE, "meta.export"), func(key string, val string) {
|
||||
export = append(export, key+"="+val)
|
||||
})
|
||||
|
||||
m.Cmd(nfs.SAVE, m.Conf(PREPARE, "meta.script"), kit.Format(`
|
||||
export GOROOT=%s GOPATH=%s:$GOPATH GOBIN=%s
|
||||
export PATH=$GOBIN:$GOROOT/bin:$PATH
|
||||
export %s
|
||||
`, kit.Path(m.Conf("_install", kit.Keys("meta.target")), "go"), kit.Path("src"), kit.Path("bin"), strings.Join(export, " ")))
|
||||
}},
|
||||
PROJECT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
}},
|
||||
|
||||
"login": {Name: "login key", Help: "登录", Meta: kit.Dict(
|
||||
"detail", []string{"编辑", "删除", "清理", "清空"},
|
||||
), Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 && arg[0] == "action" {
|
||||
switch arg[1] {
|
||||
case "modify", "编辑":
|
||||
m.Richs(cmd, nil, m.Option("key"), func(key string, value map[string]interface{}) {
|
||||
m.Logs(ice.LOG_MODIFY, cmd, key, "field", arg[2], "value", kit.Value(value, arg[2]), "->", arg[3])
|
||||
kit.Value(value, arg[2], arg[3])
|
||||
})
|
||||
|
||||
case "delete", "删除":
|
||||
m.Logs(ice.LOG_DELETE, cmd, m.Option("key"), "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key"))))
|
||||
m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key")), "")
|
||||
|
||||
case "prune", "清理":
|
||||
m.Cmdy(cmd, "prune")
|
||||
|
||||
case "clear", "清空":
|
||||
m.Cmdy(cmd, "prune", "all")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
switch kit.Select("list", arg, 0) {
|
||||
case "init":
|
||||
if m.Option("sid") != "" && m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}) != "" {
|
||||
// 复用会话
|
||||
m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}, "login")
|
||||
m.Logs(ice.LOG_AUTH, "sid", m.Option("sid"))
|
||||
m.Echo(m.Option("sid"))
|
||||
return
|
||||
}
|
||||
|
||||
you := m.Conf(web.SHARE, kit.Keys(kit.MDB_HASH, m.Option("share"), "name"))
|
||||
// 添加会话
|
||||
h := m.Rich(cmd, nil, kit.Dict(
|
||||
"type", kit.Select("zsh", arg, 1),
|
||||
"status", "login",
|
||||
"you", you,
|
||||
"pwd", m.Option("pwd"),
|
||||
"pid", m.Option("pid"),
|
||||
"pane", m.Option("pane"),
|
||||
"hostname", m.Option("hostname"),
|
||||
"username", m.Option("username"),
|
||||
))
|
||||
m.Logs(ice.LOG_AUTH, "sid", h, "you", you)
|
||||
m.Echo(h)
|
||||
|
||||
case "exit":
|
||||
// 退出会话
|
||||
m.Richs(cmd, nil, m.Option("sid"), func(key string, value map[string]interface{}) {
|
||||
m.Logs(ice.LOG_AUTH, "sid", m.Option("sid"))
|
||||
value["status"] = "logout"
|
||||
m.Echo(key)
|
||||
})
|
||||
|
||||
case "prune":
|
||||
list := []string{}
|
||||
m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) {
|
||||
if len(arg) > 1 && arg[1] == "all" || value["status"] == "logout" {
|
||||
list = append(list, key)
|
||||
}
|
||||
})
|
||||
|
||||
// 清理会话
|
||||
kit.Fetch(list, func(index int, value string) {
|
||||
m.Logs(ice.LOG_DELETE, "login", value, "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, value)))
|
||||
m.Conf(cmd, kit.Keys(kit.MDB_HASH, value), "")
|
||||
})
|
||||
m.Echo("%d", len(list))
|
||||
|
||||
case "list":
|
||||
// 会话列表
|
||||
m.Richs("login", nil, "*", func(key string, value map[string]interface{}) {
|
||||
m.Push(key, value, []string{"time", "key", "type", "status", "you"})
|
||||
pwd := strings.Split(kit.Format(value["pwd"]), "/")
|
||||
if len(pwd) > 3 {
|
||||
m.Push("pwd", strings.Join(pwd[len(pwd)-3:len(pwd)], "/"))
|
||||
} else {
|
||||
m.Push("pwd", value["pwd"])
|
||||
}
|
||||
m.Push(key, value, []string{"pid", "pane", "hostname", "username"})
|
||||
})
|
||||
|
||||
default:
|
||||
// 会话详情
|
||||
m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Push("detail", value)
|
||||
})
|
||||
}
|
||||
}},
|
||||
|
||||
"/miss/": {Name: "/miss/", Help: "任务", Action: map[string]*ice.Action{
|
||||
"pwd": {Name: "pwd", Help: "pwd", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Render(ice.RENDER_RESULT)
|
||||
m.Echo("hello world\n")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
u, e := url.QueryUnescape(m.Option("arg"))
|
||||
m.Assert(e)
|
||||
args := kit.Split(u)
|
||||
if len(arg) == 0 || arg[0] == "" {
|
||||
return
|
||||
}
|
||||
|
||||
m.Render(ice.RENDER_RESULT)
|
||||
if m.Cmdy(arg, args); len(m.Resultv()) == 0 {
|
||||
m.Table()
|
||||
}
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
}
|
37
core/code/vimer.go
Normal file
37
core/code/vimer.go
Normal file
@ -0,0 +1,37 @@
|
||||
package code
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/nfs"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"path"
|
||||
)
|
||||
|
||||
const VIMER = "vimer"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{},
|
||||
Commands: map[string]*ice.Command{
|
||||
VIMER: {Name: "vimer path=usr/demo file=hi.sh line=1 刷新:button=auto 保存:button 运行:button 项目:button", Help: "编辑器", Meta: kit.Dict(
|
||||
"display", "/plugin/local/code/vimer.js", "style", "editor",
|
||||
), Action: map[string]*ice.Action{
|
||||
web.UPLOAD: {Name: "upload path name", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.CACHE, web.UPLOAD)
|
||||
m.Cmdy(web.CACHE, web.WATCH, m.Option(web.DATA), path.Join(m.Option("path"), m.Option("name")))
|
||||
}},
|
||||
nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
|
||||
_vimer_save(m, arg[0], arg[1], arg[2], m.Option("content"))
|
||||
}},
|
||||
|
||||
"cmd": {Name: "cmd type file path", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(arg)
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(INNER, arg)
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package code
|
||||
package wiki
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
@ -6,6 +6,8 @@ import (
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
const QRCODE = "qrcode"
|
||||
|
||||
func init() {
|
||||
Index.Register(&ice.Context{Name: QRCODE, Help: "二维码",
|
||||
Configs: map[string]*ice.Config{
|
@ -1,4 +1,4 @@
|
||||
package code
|
||||
package wiki
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
@ -15,7 +15,7 @@ func init() {
|
||||
|
||||
Index.Register(&ice.Context{Name: "m4v", Help: "视频",
|
||||
Configs: map[string]*ice.Config{
|
||||
VEDIO: {Name: "vedio", Help: "视频", Value: kit.Data()},
|
||||
VIDEO: {Name: "video", Help: "视频", Value: kit.Data()},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
"list": {Name: "list name", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
@ -85,8 +85,22 @@ func _refer_show(m *ice.Message, name, text string, arg ...string) {
|
||||
m.Render(ice.RENDER_TEMPLATE, m.Conf(REFER, "meta.template"))
|
||||
}
|
||||
func _spark_show(m *ice.Message, name, text string, arg ...string) {
|
||||
switch text = strings.TrimSpace(text); name {
|
||||
case "shell", "redis", "mysql":
|
||||
m.Echo(`<div class="story" data-type="spark" data-name="%s">`, name)
|
||||
for _, l := range strings.Split(text, "\n") {
|
||||
m.Echo("<div>")
|
||||
m.Echo(kit.Select(name+"> ", m.Conf(SPARK, kit.Keys("meta.prompt", name))))
|
||||
m.Echo("<span>")
|
||||
m.Echo(l)
|
||||
m.Echo("</span>")
|
||||
m.Echo("</div>")
|
||||
}
|
||||
m.Echo("</div>")
|
||||
return
|
||||
}
|
||||
|
||||
m.Option("style", kit.Select("", name))
|
||||
text = strings.TrimSpace(text)
|
||||
m.Optionv("list", kit.Split(text, "\n"))
|
||||
|
||||
_option(m, SPARK, name, text, arg...)
|
||||
@ -373,7 +387,7 @@ func init() {
|
||||
}
|
||||
_refer_show(m, arg[0], arg[1], arg[2:]...)
|
||||
}},
|
||||
SPARK: {Name: "spark [name] text", Help: "感悟", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
SPARK: {Name: "spark [name] text", Help: "灵感", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Echo(`<br class="story" data-type="spark">`)
|
||||
return
|
||||
@ -381,21 +395,6 @@ func init() {
|
||||
if len(arg) == 1 {
|
||||
arg = []string{"", arg[0]}
|
||||
}
|
||||
switch arg[0] {
|
||||
case "shell", "mysql", "redis":
|
||||
arg[1] = strings.TrimSpace(arg[1])
|
||||
m.Echo(`<div class="story" data-type="spark" data-name="%s">`, arg[0])
|
||||
for _, l := range strings.Split(arg[1], "\n") {
|
||||
m.Echo("<div>")
|
||||
m.Echo(kit.Select(arg[0]+"> ", m.Conf(SPARK, kit.Keys("meta.prompt", arg[0]))))
|
||||
m.Echo("<span>")
|
||||
m.Echo(l)
|
||||
m.Echo("</span>")
|
||||
m.Echo("</div>")
|
||||
}
|
||||
m.Echo("</div>")
|
||||
return
|
||||
}
|
||||
_spark_show(m, arg[0], kit.Select(arg[0], arg[1]), arg[2:]...)
|
||||
}},
|
||||
|
||||
|
@ -75,13 +75,6 @@ var Index = &ice.Context{Name: GIT, Help: "代码库",
|
||||
m.Cmdy(code.INSTALL, "download", m.Conf(GIT, kit.META_SOURCE))
|
||||
}},
|
||||
"build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Optionv("prepare", func(p string) {
|
||||
m.Option(cli.CMD_DIR, p)
|
||||
m.Cmd(cli.SYSTEM, "mv", "INSTALL", "INSTALLS")
|
||||
if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, code.INSTALL))); m.Append(cli.CMD_CODE) != "0" {
|
||||
return
|
||||
}
|
||||
})
|
||||
m.Cmdy(code.INSTALL, "build", m.Conf(GIT, kit.META_SOURCE))
|
||||
}},
|
||||
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -22,7 +22,7 @@ func init() {
|
||||
mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg)
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello file=hi.c line=1", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(m.Prefix(FAVOR), "", m.Option("topic"), func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg)
|
||||
})
|
||||
|
@ -1,12 +1,11 @@
|
||||
package zsh
|
||||
|
||||
import (
|
||||
"path"
|
||||
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/core/code"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"path"
|
||||
)
|
||||
|
||||
const BASH = "bash"
|
||||
@ -19,7 +18,7 @@ func init() {
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
BASH: {Name: "bash port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{
|
||||
BASH: {Name: "bash port path auto 启动 构建 下载", Help: "命令行", Action: map[string]*ice.Action{
|
||||
"download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(code.INSTALL, "download", m.Conf(BASH, kit.META_SOURCE))
|
||||
}},
|
||||
@ -27,10 +26,6 @@ func init() {
|
||||
m.Cmdy(code.INSTALL, "build", m.Conf(BASH, kit.META_SOURCE))
|
||||
}},
|
||||
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Optionv("prepare", func(p string) []string {
|
||||
m.Option(cli.CMD_DIR, p)
|
||||
return []string{}
|
||||
})
|
||||
m.Cmdy(code.INSTALL, "start", m.Conf(BASH, kit.META_SOURCE), "bin/bash")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
|
@ -1,9 +1,10 @@
|
||||
title "bash"
|
||||
refer `
|
||||
官网 https://www.gnu.org/software/bash/
|
||||
源码 http://ftp.gnu.org/gnu/bash/
|
||||
文档 https://www.gnu.org/software/bash/manual/bash.html
|
||||
源码 http://ftp.gnu.org/gnu/bash/
|
||||
`
|
||||
|
||||
chapter "源码"
|
||||
field "bash" web.code.zsh.bash
|
||||
field "bash" web.code.inner args `[ usr/install/bash-4.2.53/ input.c 625 ]`
|
||||
@ -13,16 +14,19 @@ spark shell `
|
||||
wget http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz
|
||||
tar xvf bash-4.2.53.tar.gz && cd bash-4.2.53
|
||||
|
||||
./configure --prefix=$PWD/install
|
||||
./configure --prefix=$PWD/_install
|
||||
make -j4 && make install
|
||||
`
|
||||
|
||||
section "使用体验"
|
||||
section "启动"
|
||||
spark shell `
|
||||
cd ./install
|
||||
cd ./_install
|
||||
./bin/bash
|
||||
`
|
||||
chapter "应用"
|
||||
|
||||
chapter "应用"
|
||||
web.code.zsh.sess contexts
|
||||
field "会话" web.code.zsh.sess
|
||||
field "收藏夹" web.code.zsh.favor
|
||||
field "同步流" web.code.zsh.sync
|
||||
field "同步流" web.favor
|
||||
|
||||
|
@ -2,38 +2,76 @@ package zsh
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
const FAVOR = "favor"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{},
|
||||
Configs: map[string]*ice.Config{
|
||||
FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TOPIC, kit.MDB_FIELD, "time,id,type,name,text",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
"/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 && arg[0] != "sh" {
|
||||
// 添加收藏
|
||||
m.Cmdy(web.FAVOR, kit.Select(m.Conf("zsh", "meta.history"), m.Option("tab")),
|
||||
kit.Select(web.TYPE_SHELL, m.Option("type")), m.Option("note"), arg[0])
|
||||
return
|
||||
}
|
||||
|
||||
if m.Option("tab") == "" {
|
||||
// 收藏列表
|
||||
m.Cmdy(web.FAVOR).Table()
|
||||
return
|
||||
}
|
||||
|
||||
m.Echo("#/bin/sh\n\n")
|
||||
m.Cmd(web.PROXY, m.Option("you"), web.FAVOR, m.Option("tab")).Table(func(index int, value map[string]string, head []string) {
|
||||
switch value["type"] {
|
||||
case web.TYPE_SHELL:
|
||||
// 查看收藏
|
||||
if m.Option("note") == "" || m.Option("note") == value["name"] {
|
||||
m.Echo("# %v\n%v\n\n", value["name"], value["text"])
|
||||
}
|
||||
FAVOR: {Name: "favor topic id auto 创建 导出 导入", Help: "收藏夹", Action: map[string]*ice.Action{
|
||||
mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg)
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello file=hi.c line=1", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(m.Prefix(FAVOR), "", m.Option(kit.MDB_TOPIC), func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg[2:])
|
||||
})
|
||||
}},
|
||||
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(m.Prefix(FAVOR), "", m.Option(kit.MDB_TOPIC), func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
|
||||
})
|
||||
}},
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.HASH, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC))
|
||||
}},
|
||||
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.EXPORT, m.Prefix(FAVOR), "", mdb.HASH)
|
||||
}},
|
||||
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.IMPORT, m.Prefix(FAVOR), "", mdb.HASH)
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case kit.MDB_TOPIC:
|
||||
m.Option(mdb.FIELDS, "topic,count")
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH)
|
||||
}
|
||||
})
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 {
|
||||
m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(FAVOR), kit.META_FIELD), mdb.DETAIL, len(arg) > 1))
|
||||
m.Richs(m.Prefix(FAVOR), "", arg[0], func(key string, value map[string]interface{}) {
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, arg[1:])
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
m.Option(mdb.FIELDS, "time,count,topic")
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH)
|
||||
m.PushAction("删除")
|
||||
}},
|
||||
|
||||
"/favor": {Name: "/favor", Help: "收藏", Action: map[string]*ice.Action{
|
||||
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo("#!/bin/sh\n\n")
|
||||
m.Cmdy(m.Prefix(FAVOR), m.Option("tab")).Table(func(index int, value map[string]string, head []string) {
|
||||
// 查看收藏
|
||||
if m.Option("note") == "" || m.Option("note") == value[kit.MDB_NAME] {
|
||||
m.Echo("# %v\n%v\n\n", value[kit.MDB_NAME], value[kit.MDB_TEXT])
|
||||
}
|
||||
})
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(m.Prefix(FAVOR)).Table()
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
|
@ -1,17 +1,21 @@
|
||||
package zsh
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{},
|
||||
Commands: map[string]*ice.Command{
|
||||
"/qrcode": {Name: "/qrcode", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(cli.PYTHON, "qrcode", "hi")
|
||||
}},
|
||||
"/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
list := kit.Split(m.Option("line"), m.Option("break"))
|
||||
word := list[kit.Int(m.Option("index"))]
|
||||
|
79
misc/zsh/sess.go
Normal file
79
misc/zsh/sess.go
Normal file
@ -0,0 +1,79 @@
|
||||
package zsh
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const SESS = "sess"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
SESS: {Name: SESS, Help: "会话流", Value: kit.Data(
|
||||
kit.MDB_FIELD, "time,hash,status,username,hostname,pid,pwd",
|
||||
"contexts", `export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -sL $ctx_dev >$ctx_temp; source $ctx_temp`,
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
SESS: {Name: "sess hash auto 导出 导入", Help: "会话流", Action: map[string]*ice.Action{
|
||||
"contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
|
||||
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
|
||||
|
||||
if buf, err := kit.Render(m.Conf(m.Prefix(SESS), "meta.contexts"), m); m.Assert(err) {
|
||||
m.Cmdy("web.wiki.spark", "shell", string(buf))
|
||||
}
|
||||
}},
|
||||
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.EXPORT, m.Prefix(SESS), "", mdb.HASH)
|
||||
}},
|
||||
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.IMPORT, m.Prefix(SESS), "", mdb.HASH)
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(SESS), kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, arg)
|
||||
}},
|
||||
"/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{
|
||||
"logout": {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option("sid"), kit.MDB_STATUS, "logout")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD))
|
||||
if strings.TrimSpace(m.Option("sid")) == "" {
|
||||
m.Option("sid", m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH,
|
||||
"status", "login", "username", m.Option("username"), "hostname", m.Option("hostname"), "pid", m.Option("pid"), "pwd", m.Option("pwd")))
|
||||
} else {
|
||||
m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option("sid"), kit.MDB_STATUS, "login")
|
||||
}
|
||||
m.Echo(m.Option("sid"))
|
||||
}},
|
||||
web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if f, _, e := m.R.FormFile(SUB); e == nil {
|
||||
defer f.Close()
|
||||
// 文件参数
|
||||
if b, e := ioutil.ReadAll(f); e == nil {
|
||||
m.Option(SUB, string(b))
|
||||
}
|
||||
}
|
||||
|
||||
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD))
|
||||
if strings.TrimSpace(m.Option("sid")) != "" {
|
||||
msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, strings.TrimSpace(m.Option("sid")))
|
||||
if m.Option("sid", msg.Append("hash")) != "" {
|
||||
m.Option("username", msg.Append("username"))
|
||||
m.Option("hostname", msg.Append("hostname"))
|
||||
}
|
||||
}
|
||||
m.Render(ice.RENDER_RESULT)
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
}
|
@ -2,14 +2,18 @@ package zsh
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/aaa"
|
||||
"github.com/shylinux/icebergs/base/mdb"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
ARG = "arg"
|
||||
SUB = "sub"
|
||||
PWD = "pwd"
|
||||
)
|
||||
const SYNC = "sync"
|
||||
const SHELL = "shell"
|
||||
|
||||
@ -17,58 +21,43 @@ func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data(
|
||||
kit.MDB_FIELD, "time,id,type,name,text",
|
||||
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,id,type,name,text",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if f, _, e := m.R.FormFile("sub"); e == nil {
|
||||
defer f.Close()
|
||||
// 文件参数
|
||||
if b, e := ioutil.ReadAll(f); e == nil {
|
||||
m.Option("sub", string(b))
|
||||
}
|
||||
}
|
||||
|
||||
m.Option("you", m.Conf("zsh", "meta.proxy"))
|
||||
m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) {
|
||||
// 查找空间
|
||||
m.Option("you", kit.Select(m.Conf("zsh", "meta.proxy"), value["you"]))
|
||||
})
|
||||
|
||||
m.Option("arg", strings.ReplaceAll(m.Option("arg"), "%20", " "))
|
||||
m.Logs(ice.LOG_AUTH, "you", m.Option("you"), "url", m.Option(ice.MSG_USERURL), "cmd", m.Optionv("cmds"), "sub", m.Optionv("sub"))
|
||||
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
|
||||
}},
|
||||
|
||||
SYNC: {Name: "sync id=auto auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{
|
||||
SYNC: {Name: "sync id auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{
|
||||
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST)
|
||||
}},
|
||||
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST)
|
||||
}},
|
||||
FAVOR: {Name: "favor topic name", Help: "收藏", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(m.Prefix(FAVOR), mdb.INSERT, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC),
|
||||
kit.MDB_TYPE, SHELL, kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_TEXT, m.Option(kit.MDB_TEXT))
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case kit.MDB_TOPIC:
|
||||
m.Cmdy(m.Prefix(FAVOR)).Appendv(ice.MSG_APPEND, kit.MDB_TOPIC, kit.MDB_COUNT, kit.MDB_TIME)
|
||||
}
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg)
|
||||
m.PushAction("收藏")
|
||||
}},
|
||||
"/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")), " ", 4)
|
||||
if strings.Contains(m.Option("SHELL"), "zsh") {
|
||||
vs = []string{vs[0], m.Time("2006-01-02"), m.Time("15:04:05"), strings.Join(vs[1:], " ")}
|
||||
}
|
||||
vs := strings.SplitN(strings.TrimSpace(m.Option(ARG)), " ", 4)
|
||||
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, vs[0],
|
||||
kit.MDB_TEXT, kit.Select("", vs, 3), "pwd", m.Option("pwd"), kit.MDB_TIME, vs[1]+" "+vs[2])
|
||||
aaa.HOSTNAME, m.Option(aaa.HOSTNAME), aaa.USERNAME, m.Option(aaa.USERNAME),
|
||||
kit.MDB_TEXT, strings.Join(vs[3:], " "), PWD, m.Option(PWD), kit.MDB_TIME, vs[1]+" "+vs[2])
|
||||
|
||||
default:
|
||||
m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) {
|
||||
kit.Value(value, kit.Keys("sync", arg[0]), kit.Dict(
|
||||
"time", m.Time(), "text", m.Option("sub"),
|
||||
"pwd", m.Option("pwd"), "cmd", arg[1:],
|
||||
))
|
||||
})
|
||||
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0],
|
||||
kit.MDB_TEXT, m.Option(SUB), PWD, m.Option(PWD))
|
||||
}
|
||||
}},
|
||||
},
|
||||
|
33
misc/zsh/trash.go
Normal file
33
misc/zsh/trash.go
Normal file
@ -0,0 +1,33 @@
|
||||
package zsh
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Commands: map[string]*ice.Command{
|
||||
"/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")
|
||||
}},
|
||||
|
||||
"/ish": {Name: "/ish", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if sub, e := url.QueryUnescape(m.Option("sub")); m.Assert(e) {
|
||||
m.Cmdy(kit.Split(sub))
|
||||
if len(m.Resultv()) == 0 {
|
||||
m.Table()
|
||||
}
|
||||
}
|
||||
}},
|
||||
},
|
||||
}, nil)
|
||||
}
|
@ -2,33 +2,23 @@ package zsh
|
||||
|
||||
import (
|
||||
ice "github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/icebergs/base/cli"
|
||||
"github.com/shylinux/icebergs/base/web"
|
||||
"github.com/shylinux/icebergs/core/code"
|
||||
kit "github.com/shylinux/toolkits"
|
||||
|
||||
"net/url"
|
||||
"path"
|
||||
)
|
||||
|
||||
const (
|
||||
ZSH = "zsh"
|
||||
)
|
||||
const ZSH = "zsh"
|
||||
|
||||
var Index = &ice.Context{Name: ZSH, Help: "命令行",
|
||||
Configs: map[string]*ice.Config{
|
||||
ZSH: {Name: ZSH, Help: "命令行", Value: kit.Data(
|
||||
"source", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz",
|
||||
|
||||
"proxy", "tmux", "history", "zsh.history", "script", []interface{}{
|
||||
".vim/syntax/sh.vim", "etc/conf/sh.vim",
|
||||
".bashrc", "etc/conf/bashrc",
|
||||
".zshrc", "etc/conf/zshrc",
|
||||
},
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ZSH: {Name: "zsh port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{
|
||||
ZSH: {Name: "zsh port path auto 启动 构建 下载", Help: "命令行", Action: map[string]*ice.Action{
|
||||
"download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(code.INSTALL, "download", m.Conf(ZSH, kit.META_SOURCE))
|
||||
}},
|
||||
@ -36,55 +26,14 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行",
|
||||
m.Cmdy(code.INSTALL, "build", m.Conf(ZSH, kit.META_SOURCE))
|
||||
}},
|
||||
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Optionv("prepare", func(p string) []string {
|
||||
m.Option(cli.CMD_DIR, p)
|
||||
return []string{}
|
||||
})
|
||||
m.Cmdy(code.INSTALL, "start", m.Conf(ZSH, kit.META_SOURCE), "bin/zsh")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(code.INSTALL, path.Base(m.Conf(ZSH, kit.META_SOURCE)), arg)
|
||||
}},
|
||||
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Save()
|
||||
}},
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Load()
|
||||
// m.Cmd("web.spide_rewrite", "create", "from", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz", "to", "http://localhost:9020/publish/zsh-5.8.tar.gz")
|
||||
|
||||
m.Conf(web.FAVOR, "meta.render.shell", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
value, _ := m.Optionv(kit.MDB_VALUE).(map[string]interface{})
|
||||
m.Option("cmd_dir", kit.Value(value, "extra.pwd"))
|
||||
m.Cmdy(cli.SYSTEM, kit.Select(kit.Format(value["text"]), arg, 2))
|
||||
}}))
|
||||
m.Conf(web.FAVOR, "meta.render.cmd", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
value, _ := m.Optionv(kit.MDB_VALUE).(map[string]interface{})
|
||||
m.Cmdy(kit.Split(kit.Format(kit.Select(kit.Format(value["text"], arg, 2)))))
|
||||
}}))
|
||||
m.Conf(web.FAVOR, "meta.render.bin", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(cli.SYSTEM, "file", arg[2])
|
||||
}}))
|
||||
}},
|
||||
|
||||
"/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")
|
||||
}},
|
||||
|
||||
"/ish": {Name: "/ish", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if sub, e := url.QueryUnescape(m.Option("sub")); m.Assert(e) {
|
||||
m.Cmdy(kit.Split(sub))
|
||||
if len(m.Resultv()) == 0 {
|
||||
m.Table()
|
||||
}
|
||||
}
|
||||
}},
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }},
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -5,22 +5,22 @@ refer `
|
||||
文档 http://zsh.sourceforge.net/Doc/Release/zsh_toc.html
|
||||
`
|
||||
|
||||
field "安装" web.code.zsh.zsh
|
||||
field "源码" web.code.inner args `[ usr/install/zsh-5.8/ Src/main.c 91 ]`
|
||||
chapter "源码"
|
||||
field zsh web.code.zsh.zsh
|
||||
field zsh web.code.inner args `[ usr/install/zsh-5.8/ Src/main.c 91 ]`
|
||||
|
||||
chapter "安装"
|
||||
section "编译安装"
|
||||
section "构建"
|
||||
spark shell `
|
||||
wget https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz
|
||||
tar xvf zsh-5.8.tar.gz && cd zsh-5.8
|
||||
./configure --prefix=$PWD/install
|
||||
|
||||
./configure --prefix=$PWD/_install
|
||||
make -j4 && make install
|
||||
`
|
||||
|
||||
section "使用体验"
|
||||
section "启动"
|
||||
spark shell `
|
||||
cd ./install
|
||||
cd ./_install
|
||||
./bin/zsh
|
||||
`
|
||||
|
||||
|
||||
|
88
type.go
88
type.go
@ -35,7 +35,7 @@ type Action struct {
|
||||
Hand func(m *Message, arg ...string)
|
||||
}
|
||||
type Command struct {
|
||||
Name interface{} // string []string
|
||||
Name string
|
||||
Help interface{} // string []string
|
||||
List []interface{}
|
||||
Meta map[string]interface{}
|
||||
@ -143,6 +143,50 @@ func (c *Context) Register(s *Context, x Server, name ...string) *Context {
|
||||
s.server = x
|
||||
return s
|
||||
}
|
||||
|
||||
func (c *Context) _split(name string) []interface{} {
|
||||
button, list := false, []interface{}{}
|
||||
for _, v := range kit.Split(kit.Select("key", name), " ", " ")[1:] {
|
||||
if v == "auto" {
|
||||
list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "查看", "value", "auto")...)
|
||||
list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "返回")...)
|
||||
button = true
|
||||
continue
|
||||
}
|
||||
|
||||
ls, value := kit.Split(v, " ", ":=@"), ""
|
||||
item := kit.Dict(kit.MDB_INPUT, kit.Select("text", "button", button))
|
||||
if kit.Value(item, kit.MDB_NAME, ls[0]); item[kit.MDB_INPUT] == "text" {
|
||||
kit.Value(item, kit.MDB_VALUE, kit.Select("@key", "auto", strings.Contains(name, "auto")))
|
||||
}
|
||||
|
||||
for i := 1; i < len(ls); i += 2 {
|
||||
switch ls[i] {
|
||||
case ":":
|
||||
switch kit.Value(item, kit.MDB_INPUT, ls[i+1]); ls[i+1] {
|
||||
case "textarea":
|
||||
kit.Value(item, "style.width", "300")
|
||||
kit.Value(item, "style.height", "150")
|
||||
case "button":
|
||||
button = true
|
||||
}
|
||||
case "=":
|
||||
if value = kit.Select("", ls, i+1); len(ls) > i+1 && strings.Contains(ls[i+1], ",") {
|
||||
kit.Value(item, kit.MDB_INPUT, "select")
|
||||
kit.Value(item, "values", strings.Split(ls[i+1], ","))
|
||||
} else {
|
||||
kit.Value(item, kit.MDB_VALUE, value)
|
||||
}
|
||||
case "@":
|
||||
if len(ls) > i+1 {
|
||||
kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"="+value)
|
||||
}
|
||||
}
|
||||
}
|
||||
list = append(list, item)
|
||||
}
|
||||
return list
|
||||
}
|
||||
func (c *Context) Merge(s *Context, x Server) *Context {
|
||||
if c.Commands == nil {
|
||||
c.Commands = map[string]*Command{}
|
||||
@ -155,48 +199,18 @@ func (c *Context) Merge(s *Context, x Server) *Context {
|
||||
}
|
||||
for k, v := range s.Commands {
|
||||
c.Commands[k] = v
|
||||
if v.List == nil {
|
||||
v.List = c._split(v.Name)
|
||||
}
|
||||
if v.Meta == nil {
|
||||
v.Meta = kit.Dict()
|
||||
}
|
||||
|
||||
for k, a := range v.Action {
|
||||
if a.List == nil {
|
||||
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, value := kit.Split(v, " ", ":=@"), ""
|
||||
kit.Value(item, kit.MDB_NAME, ls[0])
|
||||
for i := 1; i < len(ls); i += 2 {
|
||||
switch ls[i] {
|
||||
case ":":
|
||||
kit.Value(item, kit.MDB_INPUT, ls[i+1])
|
||||
switch ls[i+1] {
|
||||
case "textarea":
|
||||
kit.Value(item, "style.width", "300")
|
||||
kit.Value(item, "style.height", "150")
|
||||
|
||||
}
|
||||
case "=":
|
||||
if len(ls) <= i+1 {
|
||||
continue
|
||||
}
|
||||
if strings.Contains(ls[i+1], ",") {
|
||||
kit.Value(item, kit.MDB_INPUT, "select")
|
||||
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]+"="+value)
|
||||
}
|
||||
}
|
||||
list = append(list, item)
|
||||
}
|
||||
if len(list) > 0 {
|
||||
a.List = list
|
||||
}
|
||||
a.List = c._split(a.Name)
|
||||
}
|
||||
if a.List != nil {
|
||||
if len(a.List) > 0 {
|
||||
v.Meta[a.Help] = a.List
|
||||
v.Meta[k] = a.List
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user