From 345a8f28c6cd98eecb49fb49a0fd31d044805676 Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 13 Aug 2020 22:55:07 +0800 Subject: [PATCH] add code.install --- base/cli/cli.go | 2 +- base/cli/daemon.go | 35 +++++++++--- base/web/cache.go | 9 ++- base/web/serve.go | 2 +- base/web/share.go | 4 ++ base/web/spide.go | 18 +++--- core/chat/header.go | 10 ++-- core/chat/river.go | 3 +- core/code/code.go | 18 +++--- core/code/compile.go | 13 ++++- core/code/install.go | 60 ++++++++++++++++++++ core/code/pack.go | 83 ++++++++++++++++++--------- init.go | 3 +- logs.go | 3 + misc/es/es.go | 87 ++++++++++++++++++++++++----- misc/es/es.shy | 10 +++- misc/git/git.go | 2 +- misc/tmux/tmux.go | 2 +- misc/totp/totp.go | 34 ++++++----- misc/vim/vim.go | 2 +- {misc => trash}/fyne/fyne.go | 0 {misc => trash}/idc/idc.go | 0 {misc => trash}/idc/idc.js | 0 {misc => trash}/idc/idc.shy | 0 {misc => trash}/md/md.go | 0 {misc => trash}/md/md.js | 0 {misc => trash}/md/md.shy | 0 {misc => trash}/pi/pi.go | 0 {misc => trash}/railway/railway.go | 0 {misc => trash}/railway/railway.js | 0 {misc => trash}/railway/railway.shy | 0 31 files changed, 301 insertions(+), 99 deletions(-) create mode 100644 core/code/install.go rename {misc => trash}/fyne/fyne.go (100%) rename {misc => trash}/idc/idc.go (100%) rename {misc => trash}/idc/idc.js (100%) rename {misc => trash}/idc/idc.shy (100%) rename {misc => trash}/md/md.go (100%) rename {misc => trash}/md/md.js (100%) rename {misc => trash}/md/md.shy (100%) rename {misc => trash}/pi/pi.go (100%) rename {misc => trash}/railway/railway.go (100%) rename {misc => trash}/railway/railway.js (100%) rename {misc => trash}/railway/railway.shy (100%) diff --git a/base/cli/cli.go b/base/cli/cli.go index e7ed351e..48e9f74b 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -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) { diff --git a/base/cli/daemon.go b/base/cli/daemon.go index a7066a05..8bf2eaab 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -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) }}, diff --git a/base/web/cache.go b/base/web/cache.go index efd3bb9a..ea1023e5 100644 --- a/base/web/cache.go +++ b/base/web/cache.go @@ -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 diff --git a/base/web/serve.go b/base/web/serve.go index 34051d23..ced2ddf2 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -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") diff --git a/base/web/share.go b/base/web/share.go index 7a066a38..eab8e2cb 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -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...) diff --git a/base/web/spide.go b/base/web/spide.go index a6ec4f8e..d17c50f6 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -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 } // 缓存变量 diff --git a/core/chat/header.go b/core/chat/header.go index 2aa59422..594642d8 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -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) diff --git a/core/chat/river.go b/core/chat/river.go index a950c679..ab1de7fc 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -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 } diff --git a/core/code/code.go b/core/code/code.go index 765dd248..4ee8b5bc 100644 --- a/core/code/code.go +++ b/core/code/code.go @@ -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) { }}, diff --git a/core/code/compile.go b/core/code/compile.go index e1e91572..17f8678b 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -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) }}, }, diff --git a/core/code/install.go b/core/code/install.go new file mode 100644 index 00000000..473852ac --- /dev/null +++ b/core/code/install.go @@ -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) +} diff --git a/core/code/pack.go b/core/code/pack.go index 8efa41ef..9896b563 100644 --- a/core/code/pack.go +++ b/core/code/pack.go @@ -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( diff --git a/init.go b/init.go index 58fbeb95..bc76f091 100644 --- a/init.go +++ b/init.go @@ -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{} diff --git a/logs.go b/logs.go index a1387518..1417f1f2 100644 --- a/logs.go +++ b/logs.go @@ -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), diff --git a/misc/es/es.go b/misc/es/es.go index 7ad1de33..7330ba47 100644 --- a/misc/es/es.go +++ b/misc/es/es.go @@ -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])))) }}, }, } diff --git a/misc/es/es.shy b/misc/es/es.shy index c8b8d108..d690920d 100644 --- a/misc/es/es.shy +++ b/misc/es/es.shy @@ -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 + diff --git a/misc/git/git.go b/misc/git/git.go index 699ff37d..e323bab6 100644 --- a/misc/git/git.go +++ b/misc/git/git.go @@ -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")) diff --git a/misc/tmux/tmux.go b/misc/tmux/tmux.go index f4f05d31..d4fb22ba 100644 --- a/misc/tmux/tmux.go +++ b/misc/tmux/tmux.go @@ -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") }}, diff --git a/misc/totp/totp.go b/misc/totp/totp.go index 7ebd1432..bb6adee3 100644 --- a/misc/totp/totp.go +++ b/misc/totp/totp.go @@ -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)))) }) }}, }, diff --git a/misc/vim/vim.go b/misc/vim/vim.go index 18467302..9f45c8d5 100644 --- a/misc/vim/vim.go +++ b/misc/vim/vim.go @@ -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 { // 下载源码 diff --git a/misc/fyne/fyne.go b/trash/fyne/fyne.go similarity index 100% rename from misc/fyne/fyne.go rename to trash/fyne/fyne.go diff --git a/misc/idc/idc.go b/trash/idc/idc.go similarity index 100% rename from misc/idc/idc.go rename to trash/idc/idc.go diff --git a/misc/idc/idc.js b/trash/idc/idc.js similarity index 100% rename from misc/idc/idc.js rename to trash/idc/idc.js diff --git a/misc/idc/idc.shy b/trash/idc/idc.shy similarity index 100% rename from misc/idc/idc.shy rename to trash/idc/idc.shy diff --git a/misc/md/md.go b/trash/md/md.go similarity index 100% rename from misc/md/md.go rename to trash/md/md.go diff --git a/misc/md/md.js b/trash/md/md.js similarity index 100% rename from misc/md/md.js rename to trash/md/md.js diff --git a/misc/md/md.shy b/trash/md/md.shy similarity index 100% rename from misc/md/md.shy rename to trash/md/md.shy diff --git a/misc/pi/pi.go b/trash/pi/pi.go similarity index 100% rename from misc/pi/pi.go rename to trash/pi/pi.go diff --git a/misc/railway/railway.go b/trash/railway/railway.go similarity index 100% rename from misc/railway/railway.go rename to trash/railway/railway.go diff --git a/misc/railway/railway.js b/trash/railway/railway.js similarity index 100% rename from misc/railway/railway.js rename to trash/railway/railway.js diff --git a/misc/railway/railway.shy b/trash/railway/railway.shy similarity index 100% rename from misc/railway/railway.shy rename to trash/railway/railway.shy