1
0
mirror of https://shylinux.com/x/icebergs synced 2025-06-26 02:17:30 +08:00
This commit is contained in:
shaoying 2020-09-12 18:12:21 +08:00
parent 395b78ac26
commit 27938bc30d
29 changed files with 633 additions and 544 deletions

1
.gitignore vendored
View File

@ -12,6 +12,7 @@ pack/
# Output of the go coverage tool, specifically when used with LiteIDE # Output of the go coverage tool, specifically when used with LiteIDE
*.out *.out
*.log
# Dependency directories (remove the comment below to include it) # Dependency directories (remove the comment below to include it)
# vendor/ # vendor/

View File

@ -20,9 +20,6 @@ func _command_list(m *ice.Message, all bool, name string) {
m.Push("name", kit.Format(cmd.Name)) m.Push("name", kit.Format(cmd.Name))
m.Push("help", kit.Simple(cmd.Help)[0]) m.Push("help", kit.Simple(cmd.Help)[0])
m.Push("meta", kit.Format(cmd.Meta)) m.Push("meta", kit.Format(cmd.Meta))
if len(cmd.List) == 0 {
_command_make(m, cmd)
}
m.Push("list", kit.Format(cmd.List)) m.Push("list", kit.Format(cmd.List))
}) })
return return
@ -45,51 +42,6 @@ func _command_list(m *ice.Message, all bool, name string) {
m.Push("help", kit.Simple(v.Help)[0]) 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" const COMMAND = "command"

View File

@ -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)), ",") 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{}) { 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 { if field != "" && field != kit.MDB_HASH && value != val[field] && value != kit.MDB_FOREACH {
return return
} }
@ -149,6 +152,9 @@ func _list_select(m *ice.Message, prefix, key, field, value string) {
} }
m.Push("", val, fields, val[kit.MDB_META]) 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) { 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{}) { m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) {

View File

@ -218,6 +218,9 @@ func _file_copy(m *ice.Message, name string, from ...string) {
} }
} }
func _file_link(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.MkdirAll(path.Dir(name), 0760)
os.Remove(name) os.Remove(name)
os.Link(from, name) os.Link(from, name)

View File

@ -47,7 +47,7 @@ func init() {
ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)}, ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)},
}, },
Commands: map[string]*ice.Command{ 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) { "invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.code.install", "contexts", "base") m.Cmdy("web.code.install", "contexts", "base")
}}, }},

View File

@ -14,6 +14,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
"path"
"strings" "strings"
) )
@ -177,6 +178,11 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
m.Info(" ") 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") { if strings.HasPrefix(r.URL.Path, "/debug") {
@ -243,11 +249,15 @@ func init() {
"publish", true, "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/"), "static", kit.Dict("/", "usr/volcanos/"),
"volcanos", kit.Dict("path", "usr/volcanos", "branch", "master", "volcanos", kit.Dict("refresh", "5",
"repos", "https://github.com/shylinux/volcanos", "path", "usr/volcanos", "require", ".ish/pluged",
"require", ".ish/pluged", "repos", "https://github.com/shylinux/volcanos", "branch", "master",
"refresh", "5",
), "page", kit.Dict( ), "page", kit.Dict(
"index", "usr/volcanos/page/index.html", "index", "usr/volcanos/page/index.html",
"share", "usr/volcanos/page/share.html", "share", "usr/volcanos/page/share.html",

View File

@ -2,6 +2,7 @@ package web
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -203,6 +204,10 @@ func init() {
// 请求地址 // 请求地址
uri, arg := arg[0], arg[1:] 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 { // if n := m.Cmd("spide_rewrite", uri).Append("to"); n != "" && n != uri {
// m.Logs("rewrite", "from", uri, "to", n) // m.Logs("rewrite", "from", uri, "to", n)
// uri = n // uri = n

View File

@ -1,210 +1,27 @@
package code package code
import ( import (
"net/http"
ice "github.com/shylinux/icebergs" 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" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
"net/url"
"os"
"path"
"runtime"
"strings"
) )
const ( const CODE = "code"
VEDIO = "vedio"
QRCODE = "qrcode"
)
const ( // CODE var Index = &ice.Context{Name: CODE, Help: "编程中心",
// INSTALL = "_install" Configs: map[string]*ice.Config{},
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()},
},
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load() m.Load()
m.Cmd(mdb.ENGINE, mdb.CREATE, BENCH) m.Conf(PUBLISH, "meta.contexts", _contexts)
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()
}
}}, }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }},
}, },
} }
func init() { func init() {
web.Index.Register(Index, &web.Frame{}, web.Index.Register(Index, &web.Frame{},
INSTALL, INSTALL, COMPILE, PUBLISH, UPGRADE,
COMPILE, INNER, VIMER, BENCH, PPROF,
UPGRADE, C, SH, GO, SHY, JS,
PUBLISH,
BENCH,
PPROF,
) )
} }

View File

@ -46,10 +46,7 @@ func _vimer_save(m *ice.Message, ext, file, dir string, text string) {
} }
} }
const ( const INNER = "inner"
INNER = "inner"
VIMER = "vimer"
)
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
@ -84,23 +81,6 @@ func init() {
} }
_inner_list(m, _inner_ext(arg[1]), arg[1], arg[0]) _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{ Configs: map[string]*ice.Config{
INNER: {Name: "inner", Help: "阅读器", Value: kit.Data( INNER: {Name: "inner", Help: "阅读器", Value: kit.Data(

View File

@ -9,37 +9,11 @@ import (
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"fmt"
"os" "os"
"path" "path"
"strings" "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" const INSTALL = "install"
func init() { func init() {
@ -47,39 +21,32 @@ func init() {
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data( INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install", 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{ Commands: map[string]*ice.Command{
INSTALL: {Name: "install name=auto port=auto path=auto auto", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{ INSTALL: {Name: "install name port path 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))
}
}},
"download": {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) { "download": {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
name := path.Base(arg[0]) name := path.Base(arg[0])
if m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) { p := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
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")
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 { }); len(m.Appendv(kit.MDB_NAME)) > 0 {
// 已经下载 return // 已经下载
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.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{}) { 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) { m.Optionv("progress", func(size int, total int) {
s := size * 100 / total s := size * 100 / total
if s != kit.Int(value[kit.MDB_STEP]) && s%10 == 0 { 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.Gos(m, func(m *ice.Message) {
// 下载 // 下载
m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH)) m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH))
if strings.HasPrefix(arg[0], "ftp") { msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0])
m.Cmdy(cli.SYSTEM, "wget", arg[0]) m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE))
} 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))
}
// 解压 // 解压
m.Cmd(cli.SYSTEM, "tar", "xvf", name) m.Cmd(cli.SYSTEM, "tar", "xvf", name)
@ -117,7 +72,7 @@ func init() {
case func(string): case func(string):
cb(p) cb(p)
default: 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 return
} }
} }
@ -125,16 +80,16 @@ func init() {
if m.Cmdy(cli.SYSTEM, "make", "-j8"); m.Append(cli.CMD_CODE) != "0" { if m.Cmdy(cli.SYSTEM, "make", "-j8"); m.Append(cli.CMD_CODE) != "0" {
return 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) { "spawn": {Name: "spawn link", Help: "新建", Hand: func(m *ice.Message, arg ...string) {
port := m.Cmdx(tcp.PORT, "select") port := m.Cmdx(tcp.PORT, "select")
target := path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port) target := path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
source := path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(arg[0])) 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.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[kit.MDB_PATH], "/"), target)
}) })
m.Echo(target) m.Echo(target)
@ -155,34 +110,30 @@ func init() {
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 { 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.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH)
m.Sort(kit.MDB_TIME, "time_r")
return return
} }
arg[0] = path.Base(arg[0]) arg[0] = path.Base(arg[0])
if key := strings.Split(strings.Split(arg[0], "-")[0], ".")[0]; len(arg) == 1 { if key := strings.Split(strings.Split(arg[0], "-")[0], ".")[0]; len(arg) == 1 {
// 服务列表
u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) { m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) {
// 服务列表
if strings.Contains(value[kit.MDB_NAME], key) { if strings.Contains(value[kit.MDB_NAME], key) {
m.Push(kit.MDB_TIME, value[kit.MDB_TIME]) m.Push(kit.MDB_TIME, value[kit.MDB_TIME])
m.Push(kit.MDB_PORT, path.Base(value[kit.MDB_DIR])) m.Push(kit.MDB_PORT, path.Base(value[kit.MDB_DIR]))
m.Push(kit.MDB_STATUS, value[kit.MDB_STATUS]) m.Push(kit.MDB_STATUS, value[kit.MDB_STATUS])
m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, web.RENDER.A, m.PushRender(kit.MDB_LINK, "a", kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR])))
kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR]))))
} }
}) })
m.Sort(kit.MDB_TIME, "time_r")
return return
} }
// 目录列表 // 目录列表
m.Option(nfs.DIR_ROOT, path.Join(m.Conf(cli.DAEMON, kit.META_PATH), arg[1])) 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.Cmdy(nfs.DIR, kit.Select("./", arg, 2))
m.Sort(kit.MDB_TIME, "time_r")
}}, }},
}, },
}, nil) }, nil)

View File

@ -10,6 +10,7 @@ import (
"os" "os"
"path" "path"
"runtime" "runtime"
"strings"
) )
const PUBLISH = "publish" const PUBLISH = "publish"
@ -37,10 +38,24 @@ func init() {
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data( PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/publish", kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/publish",
"contexts", _contexts,
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
PUBLISH: {Name: "publish path=auto auto 火山架 冰山架 神农架", Help: "发布", Action: map[string]*ice.Action{ 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) { "ish": {Name: "ish", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
_publish_file(m, "etc/conf/tmux.conf") _publish_file(m, "etc/conf/tmux.conf")
m.Option(nfs.DIR_REG, ".*\\.(sh|vim|conf)") m.Option(nfs.DIR_REG, ".*\\.(sh|vim|conf)")
@ -64,3 +79,28 @@ func init() {
}, },
}, nil) }, 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
View 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
View 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)
}

View File

@ -1,4 +1,4 @@
package code package wiki
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
@ -6,6 +6,8 @@ import (
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
const QRCODE = "qrcode"
func init() { func init() {
Index.Register(&ice.Context{Name: QRCODE, Help: "二维码", Index.Register(&ice.Context{Name: QRCODE, Help: "二维码",
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{

View File

@ -1,4 +1,4 @@
package code package wiki
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
@ -15,7 +15,7 @@ func init() {
Index.Register(&ice.Context{Name: "m4v", Help: "视频", Index.Register(&ice.Context{Name: "m4v", Help: "视频",
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
VEDIO: {Name: "vedio", Help: "视频", Value: kit.Data()}, VIDEO: {Name: "video", Help: "视频", Value: kit.Data()},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
"list": {Name: "list name", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "list": {Name: "list name", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {

View File

@ -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")) m.Render(ice.RENDER_TEMPLATE, m.Conf(REFER, "meta.template"))
} }
func _spark_show(m *ice.Message, name, text string, arg ...string) { 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)) m.Option("style", kit.Select("", name))
text = strings.TrimSpace(text)
m.Optionv("list", kit.Split(text, "\n")) m.Optionv("list", kit.Split(text, "\n"))
_option(m, SPARK, name, text, arg...) _option(m, SPARK, name, text, arg...)
@ -373,7 +387,7 @@ func init() {
} }
_refer_show(m, arg[0], arg[1], arg[2:]...) _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 { if len(arg) == 0 {
m.Echo(`<br class="story" data-type="spark">`) m.Echo(`<br class="story" data-type="spark">`)
return return
@ -381,21 +395,6 @@ func init() {
if len(arg) == 1 { if len(arg) == 1 {
arg = []string{"", arg[0]} 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:]...) _spark_show(m, arg[0], kit.Select(arg[0], arg[1]), arg[2:]...)
}}, }},

View File

@ -75,13 +75,6 @@ var Index = &ice.Context{Name: GIT, Help: "代码库",
m.Cmdy(code.INSTALL, "download", m.Conf(GIT, kit.META_SOURCE)) m.Cmdy(code.INSTALL, "download", m.Conf(GIT, kit.META_SOURCE))
}}, }},
"build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { "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)) m.Cmdy(code.INSTALL, "build", m.Conf(GIT, kit.META_SOURCE))
}}, }},
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {

View File

@ -22,7 +22,7 @@ func init() {
mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) 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.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) m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg)
}) })

View File

@ -1,12 +1,11 @@
package zsh package zsh
import ( import (
"path"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/core/code" "github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"path"
) )
const BASH = "bash" const BASH = "bash"
@ -19,7 +18,7 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ 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) { "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, "download", m.Conf(BASH, kit.META_SOURCE)) 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)) m.Cmdy(code.INSTALL, "build", m.Conf(BASH, kit.META_SOURCE))
}}, }},
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { "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") 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) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {

View File

@ -1,9 +1,10 @@
title "bash" title "bash"
refer ` refer `
官网 https://www.gnu.org/software/bash/ 官网 https://www.gnu.org/software/bash/
源码 http://ftp.gnu.org/gnu/bash/
文档 https://www.gnu.org/software/bash/manual/bash.html 文档 https://www.gnu.org/software/bash/manual/bash.html
源码 http://ftp.gnu.org/gnu/bash/
` `
chapter "源码" chapter "源码"
field "bash" web.code.zsh.bash field "bash" web.code.zsh.bash
field "bash" web.code.inner args `[ usr/install/bash-4.2.53/ input.c 625 ]` 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 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 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 make -j4 && make install
` `
section "使用体验" section "启动"
spark shell ` spark shell `
cd ./install cd ./_install
./bin/bash ./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.code.zsh.sync
field "同步流" web.favor

View File

@ -2,38 +2,76 @@ package zsh
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
const FAVOR = "favor"
func init() { func init() {
Index.Merge(&ice.Context{ 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{ Commands: map[string]*ice.Command{
"/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { FAVOR: {Name: "favor topic id auto 创建 导出 导入", Help: "收藏夹", Action: map[string]*ice.Action{
if len(arg) > 0 && arg[0] != "sh" { mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
// 添加收藏 m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg)
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]) mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello file=hi.c line=1", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
return 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:])
})
if m.Option("tab") == "" { }},
// 收藏列表 mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.FAVOR).Table() m.Richs(m.Prefix(FAVOR), "", m.Option(kit.MDB_TOPIC), func(key string, value map[string]interface{}) {
return m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
} })
}},
m.Echo("#/bin/sh\n\n") mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.PROXY, m.Option("you"), web.FAVOR, m.Option("tab")).Table(func(index int, value map[string]string, head []string) { m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.HASH, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC))
switch value["type"] { }},
case web.TYPE_SHELL: mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
// 查看收藏 m.Cmdy(mdb.EXPORT, m.Prefix(FAVOR), "", mdb.HASH)
if m.Option("note") == "" || m.Option("note") == value["name"] { }},
m.Echo("# %v\n%v\n\n", value["name"], value["text"]) 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) }, nil)

View File

@ -1,17 +1,21 @@
package zsh package zsh
import ( import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
kit "github.com/shylinux/toolkits"
"strings" "strings"
"unicode" "unicode"
ice "github.com/shylinux/icebergs"
kit "github.com/shylinux/toolkits"
) )
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{}, Configs: map[string]*ice.Config{},
Commands: map[string]*ice.Command{ 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) { "/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")) list := kit.Split(m.Option("line"), m.Option("break"))
word := list[kit.Int(m.Option("index"))] word := list[kit.Int(m.Option("index"))]

79
misc/zsh/sess.go Normal file
View 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)
}

View File

@ -2,14 +2,18 @@ package zsh
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"io/ioutil"
"strings" "strings"
) )
const (
ARG = "arg"
SUB = "sub"
PWD = "pwd"
)
const SYNC = "sync" const SYNC = "sync"
const SHELL = "shell" const SHELL = "shell"
@ -17,58 +21,43 @@ func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data( 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{ Commands: map[string]*ice.Command{
web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { SYNC: {Name: "sync id auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{
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{
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST) m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST)
}}, }},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST) 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) { }, 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.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.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) { "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[0] { switch arg[0] {
case "history": case "history":
vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 4) 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:], " ")}
}
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, vs[0], 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: default:
m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0],
kit.Value(value, kit.Keys("sync", arg[0]), kit.Dict( kit.MDB_TEXT, m.Option(SUB), PWD, m.Option(PWD))
"time", m.Time(), "text", m.Option("sub"),
"pwd", m.Option("pwd"), "cmd", arg[1:],
))
})
} }
}}, }},
}, },

33
misc/zsh/trash.go Normal file
View 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)
}

View File

@ -2,33 +2,23 @@ package zsh
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
"github.com/shylinux/icebergs/core/code" "github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"net/url"
"path" "path"
) )
const ( const ZSH = "zsh"
ZSH = "zsh"
)
var Index = &ice.Context{Name: ZSH, Help: "命令行", var Index = &ice.Context{Name: ZSH, Help: "命令行",
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
ZSH: {Name: ZSH, Help: "命令行", Value: kit.Data( ZSH: {Name: ZSH, Help: "命令行", Value: kit.Data(
"source", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz", "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{ 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) { "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, "download", m.Conf(ZSH, kit.META_SOURCE)) 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)) m.Cmdy(code.INSTALL, "build", m.Conf(ZSH, kit.META_SOURCE))
}}, }},
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { "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") 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) { }, 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) 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }},
m.Save() 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()
}
}
}},
}, },
} }

View File

@ -5,22 +5,22 @@ refer `
文档 http://zsh.sourceforge.net/Doc/Release/zsh_toc.html 文档 http://zsh.sourceforge.net/Doc/Release/zsh_toc.html
` `
field "安装" web.code.zsh.zsh chapter "源码"
field "源码" web.code.inner args `[ usr/install/zsh-5.8/ Src/main.c 91 ]` 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 ` spark shell `
wget https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz 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 tar xvf zsh-5.8.tar.gz && cd zsh-5.8
./configure --prefix=$PWD/install
./configure --prefix=$PWD/_install
make -j4 && make install make -j4 && make install
` `
section "使用体验" section "启动"
spark shell ` spark shell `
cd ./install cd ./_install
./bin/zsh ./bin/zsh
` `

88
type.go
View File

@ -35,7 +35,7 @@ type Action struct {
Hand func(m *Message, arg ...string) Hand func(m *Message, arg ...string)
} }
type Command struct { type Command struct {
Name interface{} // string []string Name string
Help interface{} // string []string Help interface{} // string []string
List []interface{} List []interface{}
Meta map[string]interface{} Meta map[string]interface{}
@ -143,6 +143,50 @@ func (c *Context) Register(s *Context, x Server, name ...string) *Context {
s.server = x s.server = x
return s 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 { func (c *Context) Merge(s *Context, x Server) *Context {
if c.Commands == nil { if c.Commands == nil {
c.Commands = map[string]*Command{} c.Commands = map[string]*Command{}
@ -155,48 +199,18 @@ func (c *Context) Merge(s *Context, x Server) *Context {
} }
for k, v := range s.Commands { for k, v := range s.Commands {
c.Commands[k] = v c.Commands[k] = v
if v.List == nil {
v.List = c._split(v.Name)
}
if v.Meta == nil { if v.Meta == nil {
v.Meta = kit.Dict() v.Meta = kit.Dict()
} }
for k, a := range v.Action { for k, a := range v.Action {
if a.List == nil { if a.List == nil {
list := []interface{}{} a.List = c._split(a.Name)
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
}
} }
if a.List != nil { if len(a.List) > 0 {
v.Meta[a.Help] = a.List v.Meta[a.Help] = a.List
v.Meta[k] = a.List v.Meta[k] = a.List
} }