diff --git a/base/web/spide.go b/base/web/spide.go index 738a2891..f828ca39 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -142,6 +142,7 @@ func _spide_body(m *ice.Message, method string, arg ...string) (io.Reader, map[s data = append(data, url.QueryEscape(arg[i])+"="+url.QueryEscape(arg[i+1])) } body = bytes.NewBufferString(strings.Join(data, "&")) + m.Debug("what %v", strings.Join(data, "&")) head[ContentType] = ContentFORM case SPIDE_PART: diff --git a/core/code/install.go b/core/code/install.go index c5cade4c..7df4624d 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -14,10 +14,13 @@ import ( kit "shylinux.com/x/toolkits" ) +func _install_path(m *ice.Message, link string) string { + return path.Join(ice.USR_INSTALL, kit.TrimExt(kit.Select(m.Option(mdb.LINK), link))) +} func _install_download(m *ice.Message) { link := m.Option(mdb.LINK) name := path.Base(strings.Split(link, "?")[0]) - file := path.Join(kit.Select(m.Config(nfs.PATH), m.Option(nfs.PATH)), name) + file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name) defer m.Cmdy(nfs.DIR, file) if kit.FileExists(file) { @@ -32,13 +35,10 @@ func _install_download(m *ice.Message) { // 下载进度 m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) { - prev, value := 0, kit.GetMeta(value) + value = kit.GetMeta(value) m.OptionCB(web.SPIDE, func(count int, total int, step int) { - if step >= prev { - value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step - toast(name, count, total) - prev = step - } + value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step + toast(name, count, total) }) }) @@ -48,7 +48,7 @@ func _install_download(m *ice.Message) { }) } func _install_build(m *ice.Message, arg ...string) string { - p := m.Option(cli.CMD_DIR, path.Join(m.Config(nfs.PATH), kit.TrimExt(m.Option(mdb.LINK)))) + p := m.Option(cli.CMD_DIR, _install_path(m, "")) pp := kit.Path(path.Join(p, "_install")) // 推流 @@ -77,7 +77,7 @@ func _install_build(m *ice.Message, arg ...string) string { return "" } func _install_order(m *ice.Message, arg ...string) { - p := path.Join(m.Config(nfs.PATH), kit.TrimExt(m.Option(mdb.LINK)), m.Option(nfs.PATH)+ice.NL) + p := path.Join(_install_path(m, ""), m.Option(nfs.PATH)+ice.NL) if !strings.Contains(m.Cmdx(nfs.CAT, ice.ETC_PATH), p) { m.Cmd(nfs.PUSH, ice.ETC_PATH, p) } @@ -85,7 +85,7 @@ func _install_order(m *ice.Message, arg ...string) { } func _install_spawn(m *ice.Message, arg ...string) { if kit.Int(m.Option(tcp.PORT)) >= 10000 { - if p := path.Join(m.Conf(cli.DAEMON, kit.Keym(nfs.PATH)), m.Option(tcp.PORT)); kit.FileExists(p) { + if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); kit.FileExists(p) { m.Echo(p) return } @@ -93,8 +93,8 @@ func _install_spawn(m *ice.Message, arg ...string) { m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT)) } - target := path.Join(m.Conf(cli.DAEMON, kit.Keym(nfs.PATH)), m.Option(tcp.PORT)) - source := path.Join(m.Config(nfs.PATH), kit.TrimExt(m.Option(mdb.LINK))) + target := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)) + source := _install_path(m, "") nfs.MkdirAll(m, target) defer m.Echo(target) @@ -114,7 +114,17 @@ func _install_start(m *ice.Message, arg ...string) { args = append(args, cb(p)...) } - m.Cmdy(cli.DAEMON, arg[1:], args) + if m.Cmdy(cli.DAEMON, arg[1:], args); cli.IsSuccess(m) { + m.SetAppend() + } +} +func _install_stop(m *ice.Message, arg ...string) { + m.Cmd(cli.DAEMON).Tables(func(value map[string]string) { + if value[cli.PID] == m.Option(cli.PID) { + m.Cmd(cli.DAEMON, cli.STOP, kit.Dict(mdb.HASH, value[mdb.HASH])) + } + }) + m.Cmd(cli.SYSTEM, cli.KILL, m.Option(cli.PID)) } func _install_service(m *ice.Message, arg ...string) { arg = kit.Split(path.Base(arg[0]), "-.")[:1] @@ -125,14 +135,7 @@ func _install_service(m *ice.Message, arg ...string) { } }) m.Set(tcp.PORT).Tables(func(value map[string]string) { m.Push(tcp.PORT, path.Base(value[nfs.DIR])) }) -} -func _install_stop(m *ice.Message, arg ...string) { - m.Cmd(cli.DAEMON).Tables(func(value map[string]string) { - if value[cli.PID] == m.Option(cli.PID) { - m.Cmd(cli.DAEMON, cli.STOP, kit.Dict(mdb.HASH, value[mdb.HASH])) - } - }) - m.Cmd(cli.SYSTEM, cli.KILL, m.Option(cli.PID)) + m.StatusTimeCount() } const ( @@ -151,7 +154,9 @@ func init() { _install_download(m) }}, nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) { - m.Option(nfs.DIR_ROOT, path.Join(m.Config(nfs.PATH), kit.TrimExt(m.Option(mdb.LINK)), "_install")) + if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), "_install")); !kit.FileExists(m.Option(nfs.DIR_ROOT)) { + m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""))) + } defer m.StatusTime(nfs.PATH, m.Option(nfs.DIR_ROOT)) m.Cmdy(nfs.DIR, m.Option(nfs.PATH)) }}, @@ -184,26 +189,13 @@ func init() { _install_service(m, arg...) default: // 目录列表 - m.Option(nfs.DIR_ROOT, path.Join(m.Conf(cli.DAEMON, kit.Keym(nfs.PATH)), arg[1])) + m.Option(nfs.DIR_ROOT, path.Join(ice.USR_LOCAL_DAEMON, arg[1])) m.Cmdy(nfs.CAT, kit.Select(nfs.PWD, arg, 2)) } }}, }}) } -func InstallSoftware(m *ice.Message, bin string, list interface{}) (ok bool) { - if cli.SystemFind(m, bin) != "" { - return true - } - kit.Fetch(list, func(index int, value map[string]interface{}) { - if strings.Contains(m.Cmdx(cli.RUNTIME, kit.Keys(tcp.HOST, cli.OSID)), kit.Format(value[cli.OSID])) { - cli.PushStream(m) - m.Cmd(cli.SYSTEM, value[ice.CMD]) - ok = true - } - }) - return ok -} func InstallAction(args ...interface{}) map[string]*ice.Action { return ice.SelectAction(map[string]*ice.Action{ice.CTX_INIT: mdb.AutoConfig(args...), web.DOWNLOAD: {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { @@ -220,3 +212,16 @@ func InstallAction(args ...interface{}) map[string]*ice.Action { }}, }) } +func InstallSoftware(m *ice.Message, bin string, list interface{}) (ok bool) { + if cli.SystemFind(m, bin) != "" { + return true + } + kit.Fetch(list, func(index int, value map[string]interface{}) { + if strings.Contains(m.Cmdx(cli.RUNTIME, kit.Keys(tcp.HOST, cli.OSID)), kit.Format(value[cli.OSID])) { + cli.PushStream(m) + m.Cmd(cli.SYSTEM, value[ice.CMD]) + ok = true + } + }) + return ok +} diff --git a/misc/chrome/chrome.go b/misc/chrome/chrome.go index 73a1ccbc..9a5749c7 100644 --- a/misc/chrome/chrome.go +++ b/misc/chrome/chrome.go @@ -2,7 +2,6 @@ package chrome import ( "shylinux.com/x/ice" - "shylinux.com/x/icebergs/base/nfs" ) type chrome struct { @@ -13,7 +12,7 @@ type chrome struct { } func (c chrome) List(m *ice.Message, arg ...string) { - c.Code.Source(m, m.Config(nfs.SOURCE), arg...) + c.Code.Source(m, "", arg...) } func init() { ice.CodeCtxCmd(chrome{}) } diff --git a/misc/coder/coder.shy b/misc/coder/coder.shy index fb13e938..7932b0c9 100644 --- a/misc/coder/coder.shy +++ b/misc/coder/coder.shy @@ -4,6 +4,7 @@ https://coder.com/ https://github.com/coder/code-server/ https://github.com/microsoft/vscode https://code.visualstudio.com/ +https://geek-docs.com/vscode/vscode-tutorials/what-is-vscode.html ` spark shell ` diff --git a/misc/coder/server.go b/misc/coder/server.go index fa914564..b461f4b4 100644 --- a/misc/coder/server.go +++ b/misc/coder/server.go @@ -6,6 +6,7 @@ import ( "shylinux.com/x/ice" "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" @@ -22,16 +23,24 @@ type server struct { list string `name:"list port path auto start install" help:"编辑器"` } +func (s server) Search(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + s.List(m.Spawn(kit.Dict(ice.MSG_FIELDS, "time,port,status,pid,cmd,dir"))).Tables(func(value map[string]string) { + m.PushSearch(mdb.TYPE, value[cli.STATUS], mdb.NAME, value[nfs.PATH], mdb.TEXT, value[mdb.LINK]) + }) + } +} func (s server) Start(m *ice.Message, arg ...string) { - s.Code.Start(m, "", "./bin/code-server", func(p string) []string { - return []string{kit.Format("--config=%s", m.Cmdx(nfs.SAVE, kit.Path(p, "config"), kit.Format(` + s.Code.Start(m, "", "bin/code-server", func(p string) []string { + m.Cmd(nfs.SAVE, kit.Path(p, "config"), kit.Format(` user-data-dir: %s bind-addr: %s:%s password: %s -`, "./data", kit.Select("0.0.0.0", m.Option(tcp.HOST)), path.Base(p), kit.Select(m.Config(aaa.PASSWORD), m.Option(aaa.PASSWORD))))), kit.Path(nfs.PWD)} +`, "./data", kit.Select("0.0.0.0", m.Option(tcp.HOST)), path.Base(p), kit.Select(m.Config(aaa.PASSWORD), m.Option(aaa.PASSWORD)))) + return []string{"--config=config", kit.Path(nfs.PWD)} }) } -func (s server) List(m *ice.Message, arg ...string) { +func (s server) List(m *ice.Message, arg ...string) *ice.Message { if s.Code.List(m, "", arg...); len(arg) == 0 { s.PushLink(m).Tables(func(value map[string]string) { switch value[cli.STATUS] { @@ -42,6 +51,7 @@ func (s server) List(m *ice.Message, arg ...string) { } }) } + return m } func init() { ice.CodeCtxCmd(server{}) } diff --git a/misc/java/maven.go b/misc/java/maven.go new file mode 100644 index 00000000..5f17865c --- /dev/null +++ b/misc/java/maven.go @@ -0,0 +1,17 @@ +package java + +import "shylinux.com/x/ice" + +type maven struct { + ice.Code + linux string `data:"https://mirrors.tencent.com/macports/distfiles/maven3/apache-maven-3.8.5-bin.tar.gz"` + list string `name:"list path auto order install" help:"打包构建"` +} + +func (s maven) Order(m *ice.Message) { + s.Code.Order(m, s.PathOther(m, s.Link(m, "")), ice.BIN) +} +func (s maven) List(m *ice.Message, arg ...string) { + s.Code.Source(m, s.PathOther(m, s.Link(m, "")), arg...) +} +func init() { ice.CodeCtxCmd(maven{}) } diff --git a/misc/java/server.go b/misc/java/server.go new file mode 100644 index 00000000..8e15518d --- /dev/null +++ b/misc/java/server.go @@ -0,0 +1,36 @@ +package java + +import ( + "strings" + + "shylinux.com/x/ice" + "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/nfs" + kit "shylinux.com/x/toolkits" +) + +const ( + JAVA = "java" + JAVAC = "javac" +) + +type server struct { + ice.Code + regexp string `data:".*.java"` + linux string `data:"https://mirrors.tencent.com/repository/generic/konajdk/8/0/10/linux-x86_64/b1/TencentKona8.0.10.b1_jdk_linux-x86_64_8u332.tar.gz"` + list string `name:"list path auto listScript order install" help:"编译执行"` +} + +func (s server) Order(m *ice.Message) { + s.Code.Order(m, s.PathOther(m, s.Link(m, "")), ice.BIN) +} +func (s server) List(m *ice.Message, arg ...string) { + s.Code.Source(m, s.PathOther(m, s.Link(m, "")), arg...) +} +func (s server) RunScript(m *ice.Message) { + if s.Code.System(m, nfs.PWD, JAVAC, "-d", ice.BIN, m.Option(nfs.PATH)); cli.IsSuccess(m.Message) { + s.Code.System(m, nfs.PWD, JAVA, "-cp", kit.Path(ice.BIN), strings.TrimPrefix(strings.TrimSuffix(m.Option(nfs.PATH), ".java"), "src/")) + } +} + +func init() { ice.CodeCtxCmd(server{}) } diff --git a/misc/java/spring.go b/misc/java/spring.go new file mode 100644 index 00000000..4f09ef00 --- /dev/null +++ b/misc/java/spring.go @@ -0,0 +1,56 @@ +package java + +import ( + "path" + "strings" + + "shylinux.com/x/ice" + "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/mdb" + kit "shylinux.com/x/toolkits" +) + +type spring struct { + ice.Code + linux string `data:"https://mirrors.tencent.com/macports/distfiles/spring-boot-cli/spring-boot-cli-2.7.0-bin.tar.gz"` + + ice.Hash + short string `data:"name"` + field string `data:"time,name,text"` + + create string `name:"create name text" help:"创建"` + start string `name:"start server.port" help:"启动"` + + list string `name:"list name auto create order install" help:"服务框架"` +} + +func (s spring) Order(m *ice.Message) { + s.Code.Order(m, s.PathOther(m, s.Link(m, "")), ice.BIN) +} +func (s spring) Create(m *ice.Message, arg ...string) { + s.Hash.Create(m, arg...) +} +func (s spring) Build(m *ice.Message) { + s.Code.Stream(m, path.Join(ice.USR, m.Option(mdb.NAME)), "mvn", "package") +} +func (s spring) Start(m *ice.Message, arg ...string) { + args := []string{} + for i := 0; i < len(arg)-1; i += 2 { + args = append(args, "-D"+arg[i]+"="+arg[i+1]) + } + s.Code.Daemon(m, path.Join(ice.USR, m.Option(mdb.NAME)), kit.Simple("java", args, "-jar", kit.Format("target/%s-0.0.1-SNAPSHOT.jar", m.Option(mdb.NAME)))...) +} +func (s spring) List(m *ice.Message, arg ...string) { + if len(arg) == 0 { // 项目列表 + s.Hash.List(m, arg...).PushAction(s.Start, s.Build) + + } else { // 服务列表 + m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) { + if strings.Contains(value[ice.CMD], "target/"+arg[0]+"-0.0.1-SNAPSHOT.jar") { + m.PushRecord(value, head...) + } + }) + } +} + +func init() { ice.CodeCtxCmd(spring{}) } diff --git a/misc/java/spring.shy b/misc/java/spring.shy new file mode 100644 index 00000000..9a7fe7c8 --- /dev/null +++ b/misc/java/spring.shy @@ -0,0 +1,9 @@ +section "spring" +refer ` +官网 https://spring.io/projects/spring-boot +入门 https://spring.io/quickstart +向导 https://start.spring.io/ +参数 https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html +接口 https://spring.io/guides/gs/rest-service/ +数据 https://spring.io/guides/gs/accessing-data-mysql/ +` \ No newline at end of file diff --git a/misc/node/npm.go b/misc/node/npm.go new file mode 100644 index 00000000..640f148c --- /dev/null +++ b/misc/node/npm.go @@ -0,0 +1,14 @@ +package node + +import "shylinux.com/x/ice" + +type npm struct { + ice.Code + list string `name:"list auto" help:"打包构建"` +} + +func (s npm) List(m *ice.Message) { + +} + +func init() { ice.CodeCtxCmd(npm{}) } diff --git a/misc/node/server.go b/misc/node/server.go new file mode 100644 index 00000000..e466787c --- /dev/null +++ b/misc/node/server.go @@ -0,0 +1,22 @@ +package node + +import ( + "shylinux.com/x/ice" +) + +type server struct { + ice.Code + command string `data:"node"` + regexp string `data:".*.js"` + linux string `data:"https://mirrors.tencent.com/nodejs-release/v16.15.1/node-v16.15.1-linux-x64.tar.xz"` + list string `name:"list path auto listScript order install" help:"编译执行"` +} + +func (s server) Order(m *ice.Message) { + s.Code.Order(m, "", ice.BIN) +} +func (s server) List(m *ice.Message, arg ...string) { + s.Code.Source(m, "", arg...) +} + +func init() { ice.CodeCtxCmd(server{}) } diff --git a/misc/node/vue.go b/misc/node/vue.go new file mode 100644 index 00000000..7485dd53 --- /dev/null +++ b/misc/node/vue.go @@ -0,0 +1,14 @@ +package node + +import "shylinux.com/x/ice" + +type vue struct { + ice.Code + list string `name:"list auto" help:"服务框架"` +} + +func (s vue) List(m *ice.Message) { + +} + +func init() { ice.CodeCtxCmd(vue{}) } diff --git a/misc/node/vue.shy b/misc/node/vue.shy new file mode 100644 index 00000000..1b5a816c --- /dev/null +++ b/misc/node/vue.shy @@ -0,0 +1,5 @@ +section "vue" +refer ` +官网 https://vuejs.org/ +入门 https://vuejs.org/guide/quick-start.html +` \ No newline at end of file