1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 09:34:05 +08:00

add code.install

This commit is contained in:
shaoying 2020-08-13 22:55:07 +08:00
parent b851b0c31b
commit 345a8f28c6
31 changed files with 301 additions and 99 deletions

View File

@ -92,7 +92,7 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
}}))
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save(RUNTIME, SYSTEM)
m.Save(RUNTIME, SYSTEM, DAEMON)
}},
RUNTIME: {Name: "runtime name auto", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {

View File

@ -33,11 +33,9 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
}
h := m.Rich(DAEMON, nil, kit.Dict(
kit.MDB_TYPE, "shell", kit.MDB_NAME, cmd.Process.Pid, kit.MDB_TEXT, strings.Join(cmd.Args, " "),
kit.MDB_EXTRA, kit.Dict(
kit.MDB_STATUS, StatusStart,
CMD_STDOUT, out, CMD_STDERR, err,
),
kit.MDB_TYPE, "shell", kit.MDB_NAME, strings.Join(cmd.Args, " "),
kit.MDB_DIR, cmd.Dir, kit.MDB_PID, cmd.Process.Pid, kit.MDB_STATUS, StatusStart,
kit.MDB_EXTRA, kit.Dict(CMD_STDOUT, out, CMD_STDERR, err),
))
m.Log_EXPORT(kit.MDB_META, DAEMON, kit.MDB_KEY, h, kit.MDB_PID, cmd.Process.Pid)
m.Echo("%d", cmd.Process.Pid)
@ -46,13 +44,13 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
if e := cmd.Wait(); e != nil {
m.Warn(e != nil, "%v wait: %s", cmd.Args, e)
m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) {
kit.Value(value, kit.Keys(kit.MDB_EXTRA, kit.MDB_STATUS), StatusError)
kit.Value(value, kit.MDB_STATUS, StatusError)
kit.Value(value, kit.Keys(kit.MDB_EXTRA, kit.MDB_ERROR), e)
})
} else {
m.Cost("%v exit: %v", cmd.Args, cmd.ProcessState.ExitCode())
m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) {
kit.Value(value, kit.Keys(kit.MDB_EXTRA, kit.MDB_STATUS), StatusClose)
kit.Value(value, kit.MDB_STATUS, StatusClose)
})
}
})
@ -66,7 +64,28 @@ func init() {
DAEMON: {Name: "daemon", Help: "守护进程", Value: kit.Data()},
},
Commands: map[string]*ice.Command{
DAEMON: {Name: "daemon cmd arg...", Help: "守护进程", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
DAEMON: {Name: "daemon hash 查看:button=auto 清理:button", Help: "守护进程", Action: map[string]*ice.Action{
"delete": {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("mdb.delete", DAEMON, "", "hash", "hash", m.Option("hash"))
}},
"prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
m.Richs(DAEMON, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
if strings.Count(m.Cmdx(SYSTEM, "ps", value["pid"]), "\n") > 1 {
value["status"] = "start"
return
}
m.Conf(DAEMON, kit.Keys("hash", key), "")
})
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
m.Option("fields", "time,hash,status,pid,name,dir")
m.Cmdy("mdb.select", DAEMON, "", "hash")
m.Sort("time", "time_r")
return
}
m.Option(CMD_TYPE, DAEMON)
m.Cmdy(SYSTEM, arg)
}},

View File

@ -104,14 +104,19 @@ func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size stri
func _cache_download(m *ice.Message, r *http.Response) (file, size string) {
defer r.Body.Close()
progress, _ := m.Optionv("progress").(func(int, int))
total := kit.Int(kit.Select("1", r.Header.Get("Content-Length")))
if f, p, e := kit.Create(path.Join("var/tmp", kit.Hashs("uniq"))); m.Assert(e) {
size, buf := 0, make([]byte, 1024)
for {
if n, _ := r.Body.Read(buf); n > 0 {
f.Write(buf[0:n])
size += n
m.Log_IMPORT(kit.MDB_FILE, p, "per", size*100/total, kit.MDB_SIZE, kit.FmtSize(int64(size)), "total", kit.FmtSize(int64(total)))
if size += n; progress != nil {
progress(size, total)
} else {
m.Log_IMPORT(kit.MDB_FILE, p, "per", size*100/total, kit.MDB_SIZE, kit.FmtSize(int64(size)), "total", kit.FmtSize(int64(total)))
}
} else {
f.Close()
break

View File

@ -179,7 +179,7 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
r.URL.Path = strings.Replace(r.URL.Path, "/debug", "/code", -1)
}
if r.URL.Path == "/" && m.Conf(SERVE, "meta.init") != "true" {
if r.URL.Path == "/" && m.Conf(SERVE, "meta.init") != "true" && len(ice.BinPack) == 0 {
if _, e := os.Stat(m.Conf(SERVE, "meta.volcanos.path")); e == nil {
// 初始化成功
m.Conf(SERVE, "meta.init", "true")

View File

@ -299,6 +299,10 @@ func init() {
_share_repos(m, path.Join(strings.Split(cmd, "/")[2:5]...), arg[6:]...)
}},
"/publish/": {Name: "/publish/", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if arg[0] == "order.js" && len(ice.BinPack) > 0 {
m.Render(ice.RENDER_RESULT, "{}")
return
}
if p := m.Option("pod"); p != "" {
m.Option("pod", "")
_share_remote(m, p, arg...)

View File

@ -145,10 +145,14 @@ func init() {
// 请求方法
method := kit.Select("POST", client["method"])
switch arg = arg[1:]; arg[0] {
case "POST":
method, arg = "POST", arg[1:]
case "GET":
method, arg = "GET", arg[1:]
case "PUT":
method, arg = "PUT", arg[1:]
case "POST":
method, arg = "POST", arg[1:]
case "DELETE":
method, arg = "DELETE", arg[1:]
}
// 请求地址
@ -240,9 +244,7 @@ func init() {
if web.Client == nil {
web.Client = &http.Client{Timeout: kit.Duration(kit.Format(client["timeout"]))}
}
if method == "POST" {
m.Info("%s: %s", req.Header.Get("Content-Length"), req.Header.Get("Content-Type"))
}
m.Info("%s: %s", req.Header.Get("Content-Length"), req.Header.Get("Content-Type"))
// 发送请求
res, e := web.Client.Do(req)
@ -251,8 +253,10 @@ func init() {
}
// 检查结果
if m.Cost("%s %s: %s", res.Status, res.Header.Get("Content-Length"), res.Header.Get("Content-Type")); m.Warn(res.StatusCode != http.StatusOK, "%s", res.Status) {
return
m.Cost("%s %s: %s", res.Status, res.Header.Get("Content-Length"), res.Header.Get("Content-Type"))
if m.Warn(res.StatusCode != http.StatusOK, "%s", res.Status) {
m.Set(ice.MSG_RESULT)
// return
}
// 缓存变量

View File

@ -52,20 +52,20 @@ func init() {
"pack": {Name: "pack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.code.webpack", "pack")
if f, _, e := kit.Create("usr/volcanos/pack/" + m.Option("name") + ".js"); m.Assert(e) {
if f, _, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".js"); m.Assert(e) {
defer f.Close()
data := kit.UnMarshal(m.Option("content"))
f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(data))
f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(kit.UnMarshal(m.Option("content"))))
}
if f, p, e := kit.Create("usr/volcanos/pack/" + m.Option("name") + ".html"); m.Assert(e) {
if f, p, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".html"); m.Assert(e) {
f.WriteString(fmt.Sprintf(_pack,
m.Cmdx(nfs.CAT, "usr/volcanos/cache.css"),
m.Cmdx(nfs.CAT, "usr/volcanos/index.css"),
m.Cmdx(nfs.CAT, "usr/volcanos/proto.js"),
m.Cmdx(nfs.CAT, "usr/volcanos/cache.js"),
m.Cmdx(nfs.CAT, "usr/volcanos/pack/"+m.Option("name")+".js"),
m.Cmdx(nfs.CAT, "usr/publish/webpack/"+m.Option("name")+".js"),
m.Cmdx(nfs.CAT, "usr/volcanos/index.js"),
))
m.Echo(p)

View File

@ -5,6 +5,7 @@ import (
"github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
)
@ -247,7 +248,7 @@ func init() {
m.Cmdy("/storm", arg[1:])
return
}
if m.Option("_source") == "" && m.Option(ice.MSG_SESSID) == "" {
if m.Option("_source") == "" && m.Option(ice.MSG_SESSID) == "" && !tcp.IPIsLocal(m, m.Option(ice.MSG_USERIP)) {
m.Render("status", "401")
return
}

View File

@ -23,14 +23,14 @@ const (
)
const ( // CODE
INSTALL = "_install"
// 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(
"_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",
@ -52,21 +52,21 @@ var Index = &ice.Context{Name: "code", Help: "编程中心",
m.Cmd(mdb.ENGINE, mdb.CREATE, BENCH)
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save("login")
m.Save("login", 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))
"_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))
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")))
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{}
@ -78,7 +78,7 @@ var Index = &ice.Context{Name: "code", Help: "编程中心",
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, " ")))
`, 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) {
}},

View File

@ -4,7 +4,6 @@ import (
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"
"os"
@ -39,7 +38,15 @@ func init() {
main := kit.Select("src/main.go", arg, 2)
arch := kit.Select(m.Conf(cli.RUNTIME, "host.GOARCH"), arg, 1)
goos := kit.Select(m.Conf(cli.RUNTIME, "host.GOOS"), arg, 0)
file := path.Join(m.Conf(cmd, "meta.path"), kit.Keys("ice", goos, arch))
file := ""
if m.Option(cli.CMD_DIR) == "" {
file = path.Join(m.Conf(cmd, "meta.path"), kit.Keys(kit.Select("ice", m.Option("name")), goos, arch))
} else {
file = kit.Keys(kit.Select("ice", m.Option("name")), goos, arch)
}
if goos == "windows" {
file += ".exe"
}
// 编译参数
m.Optionv(cli.CMD_ENV, kit.Simple(m.Confv(COMPILE, "meta.env"), "GOARCH", arch, "GOOS", goos))
@ -49,7 +56,7 @@ func init() {
}
// 编译记录
m.Cmdy(web.STORY, web.CATCH, "bin", file)
// m.Cmdy(web.STORY, web.CATCH, "bin", file)
m.Log_EXPORT("source", main, "target", file)
}},
},

60
core/code/install.go Normal file
View File

@ -0,0 +1,60 @@
package code
import (
"net/http"
"path"
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"
)
const INSTALL = "install"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
INSTALL: {Name: "install", Help: "安装", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_NAME, "path", "usr/install",
)},
},
Commands: map[string]*ice.Command{
INSTALL: {Name: "install name=auto auto", Help: "安装", 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{}) {
m.Push(key, value, []string{"time", "progress", "size", "name", "link"})
}) != nil {
return
}
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.Optionv("progress", func(size int, total int) {
value["progress"], value["size"], value["total"] = size*100/total, size, total
})
})
msg := m.Cmd(web.SPIDE, "dev", "cache", http.MethodGet, arg[0])
p := path.Join(m.Conf(INSTALL, "meta.path"), name)
m.Cmdy(nfs.LINK, p, msg.Append("file"))
m.Option(cli.CMD_DIR, m.Conf(INSTALL, "meta.path"))
m.Cmd(cli.SYSTEM, "tar", "xvf", name)
m.Echo(p)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option("fields", "time,progress,size,total,name,link")
if len(arg) > 0 {
m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, arg[0])
return
}
m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH)
m.Sort(kit.MDB_TIME, "time_r")
}},
},
}, nil)
}

View File

@ -5,6 +5,7 @@ import (
"bytes"
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"
@ -116,6 +117,26 @@ func _pack_intshell(m *ice.Message, pack *os.File) {
pack.WriteString(fmt.Sprintf(` "%s": []byte{%v},`+"\n", "usr/intshell/"+value["path"], what[1:len(what)-1]))
})
}
func _pack_contexts(m *ice.Message, pack *os.File) {
m.Option(nfs.DIR_ROOT, "src")
m.Option(nfs.DIR_DEEP, "true")
m.Option(nfs.DIR_TYPE, nfs.FILE)
what := ""
for _, file := range []string{"src/main.go", "src/main.shy", "src/main.svg"} {
if f, e := os.Open(file); e == nil {
defer f.Close()
if b, e := ioutil.ReadAll(f); e == nil {
what = fmt.Sprintf("%v", b)
}
}
if len(what) > 0 {
what = strings.ReplaceAll(what, " ", ",")
pack.WriteString(fmt.Sprintf(` "%s": []byte{%v},`+"\n", file, what[1:len(what)-1]))
}
}
pack.WriteString("\n")
}
const (
WEBPACK = "webpack"
@ -129,13 +150,12 @@ func init() {
WEBPACK: {Name: "webpack", Help: "打包", Action: map[string]*ice.Action{
"pack": {Name: "pack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_ROOT, "usr/volcanos")
m.Option(nfs.DIR_DEEP, "true")
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Option(nfs.DIR_DEEP, "true")
js, p, e := kit.Create("usr/volcanos/cache.js")
js, _, e := kit.Create("usr/volcanos/cache.js")
m.Assert(e)
defer js.Close()
m.Echo(p)
css, _, e := kit.Create("usr/volcanos/cache.css")
m.Assert(e)
@ -153,47 +173,56 @@ func init() {
}
})
}
for _, k := range []string{"frame.js"} {
js.WriteString(`_can_name = "` + path.Join("/", k) + "\"\n")
js.WriteString(m.Cmdx(nfs.CAT, "usr/volcanos/"+k))
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(nfs.DIR_ROOT, "usr/volcanos")
m.Option(nfs.DIR_ROOT, "usr/publish")
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Option(nfs.DIR_DEEP, "true")
m.Cmdy(nfs.DIR, "pack")
m.Table(func(index int, value map[string]string, head []string) {
m.Push("link", m.Cmdx(mdb.RENDER, web.RENDER.Download, "/"+value["path"]))
m.Cmdy(nfs.DIR, "webpack").Table(func(index int, value map[string]string, head []string) {
m.Push("link", m.Cmdx(mdb.RENDER, web.RENDER.Download, "/publish/"+value["path"]))
})
}},
BINPACK: {Name: "binpack", Help: "打包", Action: map[string]*ice.Action{
"pack": {Name: "pack", Help: "pack", Hand: func(m *ice.Message, arg ...string) {
pack, p, e := kit.Create("usr/icebergs/pack/binpack.go")
m.Assert(e)
defer pack.Close()
BINPACK: {Name: "binpack path 查看:button 返回:button 打包:button", Help: "打包", Action: map[string]*ice.Action{
"pack": {Name: "pack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Option("name", "demo")
if pack, p, e := kit.Create("usr/publish/binpack/" + m.Option("name") + ".go"); m.Assert(e) {
defer pack.Close()
pack.WriteString(`package pack` + "\n\n")
pack.WriteString(`import "github.com/shylinux/icebergs"` + "\n\n")
pack.WriteString(`func init() {` + "\n")
pack.WriteString(` ice.BinPack = map[string][]byte{` + "\n")
pack.WriteString(m.Cmdx(nfs.CAT, "src/main.go"))
_pack_volcanos(m, pack)
_pack_learning(m, pack)
_pack_icebergs(m, pack)
_pack_intshell(m, pack)
pack.WriteString("\n")
pack.WriteString(`func init() {` + "\n")
pack.WriteString(` ice.BinPack = map[string][]byte{` + "\n")
pack.WriteString(` }` + "\n")
pack.WriteString(`}` + "\n")
m.Echo(p)
_pack_volcanos(m, pack)
_pack_learning(m, pack)
_pack_icebergs(m, pack)
_pack_intshell(m, pack)
_pack_contexts(m, pack)
pack.WriteString(` }` + "\n")
pack.WriteString(`}` + "\n")
m.Echo(p)
}
m.Option(cli.CMD_DIR, "usr/publish/binpack")
m.Cmd("compile", "linux", "amd64", m.Option("name")+".go")
m.Cmd("compile", "darwin", "amd64", m.Option("name")+".go")
m.Cmd("compile", "windows", "amd64", m.Option("name")+".go")
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(nfs.DIR_ROOT, "usr/icebergs")
m.Option(nfs.DIR_ROOT, "usr/publish")
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Option(nfs.DIR_DEEP, "true")
m.Cmdy(nfs.DIR, "pack")
m.Table(func(index int, value map[string]string, head []string) {
m.Push("link", m.Cmdx(mdb.RENDER, web.RENDER.Download, value["path"], "/share/local/usr/icebergs/"+value["path"]))
m.Cmdy(nfs.DIR, "binpack").Table(func(index int, value map[string]string, head []string) {
m.Push("link", m.Cmdx(mdb.RENDER, web.RENDER.Download, "/publish/"+value["path"]))
})
}},
MODPACK: {Name: "modpack path=auto 查看:button 返回:button 创建:button", Help: "打包", Meta: kit.Dict(

View File

@ -156,7 +156,8 @@ func Run(arg ...string) string {
arg = os.Args[1:]
}
if len(arg) == 0 {
arg = append(arg, "web.space", "connect", "self")
// arg = append(arg, "web.space", "connect", "self")
arg = append(arg, "web.serve", "dev")
}
frame := &Frame{}

View File

@ -43,6 +43,9 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message {
default:
suffix += " " + kit.FileLine(3, 2)
}
if len(BinPack) > 0 {
prefix, suffix = "", ""
}
// 输出日志
log.Info(fmt.Sprintf("%02d %9s %s%s %s%s", m.code, fmt.Sprintf("%4s->%-4s", m.source.Name, m.target.Name),

View File

@ -1,17 +1,17 @@
package es
import (
"net/http"
"path"
"runtime"
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/nfs"
"github.com/shylinux/icebergs/base/web"
"github.com/shylinux/icebergs/core/code"
"os"
"path"
"runtime"
"strings"
)
const ES = "es"
@ -28,15 +28,74 @@ var Index = &ice.Context{Name: ES, Help: "搜索",
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
ES: {Name: "es 安装:button", Help: "搜索", Action: map[string]*ice.Action{
ES: {Name: "es hash=auto auto 启动:button 安装:button", Help: "搜索", Action: map[string]*ice.Action{
"install": {Name: "install", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
name := path.Base(m.Conf(ES, kit.Keys("meta", runtime.GOOS)))
msg := m.Cmd(web.SPIDE, "dev", "cache", http.MethodGet, m.Conf(ES, kit.Keys("meta", runtime.GOOS)))
m.Cmdy(nfs.LINK, path.Join("usr/install/", name), msg.Append("file"))
m.Option(cli.CMD_DIR, "usr/install")
m.Cmd(cli.SYSTEM, "tar", "xvf", name)
m.Cmdy("web.code.install", "download", m.Conf(ES, kit.Keys(kit.MDB_META, runtime.GOOS)))
}},
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
name := path.Base(m.Conf(ES, kit.Keys(kit.MDB_META, runtime.GOOS)))
name = strings.Join(strings.Split(name, "-")[:2], "-")
port := m.Cmdx(tcp.PORT, "get")
p := "var/daemon/" + port
os.MkdirAll(p, ice.MOD_DIR)
for _, dir := range []string{"bin", "jdk", "lib", "logs", "config", "modules", "plugins"} {
m.Cmd(cli.SYSTEM, "cp", "-r", "usr/install/"+name+"/"+dir, p)
}
m.Option(cli.CMD_DIR, p)
m.Cmdy(cli.DAEMON, "bin/elasticsearch")
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
m.Cmdy(cli.DAEMON)
return
}
if len(arg) == 1 {
m.Richs(cli.DAEMON, "", arg[0], func(key string, value map[string]interface{}) {
m.Cmdy("web.spide", "dev", "raw", "GET", "http://localhost:9200")
})
}
if len(arg) == 2 {
m.Richs(cli.DAEMON, "", arg[0], func(key string, value map[string]interface{}) {
m.Cmdy("web.spide", "dev", "raw", "GET", "http://localhost:9200")
})
}
}},
"index": {Name: "table index 创建:button", Help: "索引", Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
m.Cmdy(cli.DAEMON)
return
}
m.Option("header", "Content-Type", "application/json")
m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx("web.spide", "dev", "raw", "PUT", "http://localhost:9200/"+arg[0]))))
}},
"mapping": {Name: "mapping index mapping 创建:button text:textarea", Help: "映射", Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
m.Cmdy(cli.DAEMON)
return
}
m.Option("header", "Content-Type", "application/json")
m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx("web.spide", "dev", "raw", "PUT", "http://localhost:9200/"+arg[0]+"/_mapping/"+arg[1], "data", arg[2]))))
}},
"document": {Name: "table index=index_test mapping=mapping_test id=1 查看:button 添加:button data:textarea", Help: "文档", Action: map[string]*ice.Action{
mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 3 {
m.Option("header", "Content-Type", "application/json")
m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx("web.spide", "dev", "raw", "PUT", "http://localhost:9200/"+arg[0]+"/"+arg[1]+"/"+arg[2], "data", arg[3]))))
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option("header", "Content-Type", "application/json")
m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx("web.spide", "dev", "raw", "GET", "http://localhost:9200/"+arg[0]+"/"+arg[1]+"/"+arg[2]))))
}},
},
}

View File

@ -4,9 +4,9 @@ refer `
源码 https://github.com/elastic/elasticsearch
文档 https://www.elastic.co/guide/index.html
安装 https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
简介 https://www.jianshu.com/p/403c9d5b1463
入门 https://www.cnblogs.com/sunsky303/p/9438737.html
`
section 下载
refer `
windows https://elasticsearch.thans.cn/downloads/elasticsearch/elasticsearch-7.3.2-windows-x86_64.zip
@ -21,8 +21,12 @@ $ cd elasticsearch-7.3.2
$ ./bin/elasticsearch
`
section 创建索引
section 体验
spark shell `
$ curl http://localhost:9200
$ curl -XPUT "localhost:9200/index_test"
`
field document web.code.es.document
field es web.code.es.es
field install web.code.install

View File

@ -333,7 +333,7 @@ var Index = &ice.Context{Name: GIT, Help: "代码库",
})
}},
code.INSTALL: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
"_install": {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option("cmd_dir", m.Conf("install", "meta.path"))
m.Cmd(cli.SYSTEM, "git", "clone", m.Conf("git", "meta.source"))

View File

@ -217,7 +217,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
})
}}))
}},
code.INSTALL: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
"_install": {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option("cmd_dir", m.Conf("install", "meta.path"))
m.Cmd(cli.SYSTEM, "git", "clone", "https://github.com/tmux/tmux")
}},

View File

@ -44,31 +44,34 @@ func _totp_get(key string, num int, per int64) string {
}
const TOTP = "totp"
const (
NEW = "new"
GET = "get"
)
var Index = &ice.Context{Name: "totp", Help: "动态码",
Caches: map[string]*ice.Cache{},
var Index = &ice.Context{Name: TOTP, Help: "动态码",
Configs: map[string]*ice.Config{
TOTP: {Name: "totp", Help: "动态码", Value: kit.Data(
kit.MDB_SHORT, "name", "share", "otpauth://totp/%s?secret=%s",
TOTP: {Name: TOTP, Help: "动态码", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_LINK, "otpauth://totp/%s?secret=%s",
)},
},
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
"new": {Name: "new user [secret]", Help: "创建密钥", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
NEW: {Name: "new user [secret]", Help: "创建密钥", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
// 密钥列表
m.Richs("totp", nil, "*", func(key string, value map[string]interface{}) {
m.Push(key, value, []string{"time", "name"})
m.Richs(TOTP, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_NAME})
})
return
}
if m.Richs("totp", nil, arg[0], func(key string, value map[string]interface{}) {
if m.Richs(TOTP, nil, arg[0], func(key string, value map[string]interface{}) {
// 密钥详情
if len(arg) > 1 {
m.Render(ice.RENDER_QRCODE, kit.Format(m.Conf("totp", "meta.share"), value["name"], value["text"]))
m.Render(ice.RENDER_QRCODE, kit.Format(m.Conf(TOTP, "meta.link"), value[kit.MDB_NAME], value[kit.MDB_TEXT]))
} else {
m.Push("detail", value)
}
@ -82,14 +85,16 @@ var Index = &ice.Context{Name: "totp", Help: "动态码",
}
// 添加密钥
m.Log(ice.LOG_CREATE, "%s: %s", arg[0], m.Rich("totp", nil, kit.Dict(
m.Log(ice.LOG_CREATE, "%s: %s", arg[0], m.Rich(TOTP, nil, kit.Dict(
kit.MDB_NAME, arg[0], kit.MDB_TEXT, arg[1], kit.MDB_EXTRA, kit.Dict(arg[2:]),
)))
}},
"get": {Name: "get [name [number [period]]] auto", Help: "获取密码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
GET: {Name: "get [name [number [period]]] auto", Help: "获取密码", Meta: kit.Dict(
"_refresh", "1000",
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
// 密码列表
m.Richs("totp", nil, "*", func(key string, value map[string]interface{}) {
m.Richs(TOTP, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
per := kit.Int64(kit.Select("30", value["period"]))
m.Push("time", m.Time())
m.Push("rest", per-time.Now().Unix()%per)
@ -97,12 +102,13 @@ var Index = &ice.Context{Name: "totp", Help: "动态码",
m.Push("code", _totp_get(kit.Format(value["text"]), kit.Int(kit.Select("6", value["number"])), per))
})
m.Sort(kit.MDB_NAME)
return
}
m.Richs("totp", nil, arg[0], func(key string, value map[string]interface{}) {
m.Richs(TOTP, nil, arg[0], func(key string, value map[string]interface{}) {
// 获取密码
m.Echo(_totp_get(kit.Format(value["text"]), kit.Int(kit.Select("6", arg, 1)), kit.Int64(kit.Select("30", arg, 2))))
m.Echo(_totp_get(kit.Format(value[kit.MDB_TEXT]), kit.Int(kit.Select("6", arg, 1)), kit.Int64(kit.Select("30", arg, 2))))
})
}},
},

View File

@ -118,7 +118,7 @@ var Index = &ice.Context{Name: "vim", Help: "编辑器",
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
}},
}},
code.INSTALL: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
"_install": {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
p := path.Join(m.Conf("install", "meta.path"), m.Conf("vim", "meta.version"))
if _, e := os.Stat(p); e != nil {
// 下载源码