1
0
forked from x/icebergs
This commit is contained in:
shaoying 2021-01-30 17:50:14 +08:00
parent 9650802789
commit 03a7527f4b
23 changed files with 233 additions and 426 deletions

View File

@ -13,13 +13,10 @@ import (
"encoding/base64" "encoding/base64"
"errors" "errors"
"fmt" "fmt"
"io"
"net" "net"
"os" "os"
"path" "path"
"strings" "strings"
"github.com/kr/pty"
) )
func _ssh_meta(conn ssh.ConnMetadata) map[string]string { func _ssh_meta(conn ssh.ConnMetadata) map[string]string {
@ -93,59 +90,6 @@ func _ssh_accept(m *ice.Message, h string, c net.Conn) {
}(channel, requests) }(channel, requests)
} }
} }
func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh.Channel, requests <-chan *ssh.Request) {
m.Logs(CHANNEL, tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
defer m.Logs("dischan", tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
shell := kit.Select("bash", os.Getenv("SHELL"))
list := []string{"PATH=" + os.Getenv("PATH")}
pty, tty, err := pty.Open()
if m.Warn(err != nil, err) {
return
}
defer tty.Close()
h := m.Rich(CHANNEL, "", kit.Data(kit.MDB_STATUS, tcp.OPEN, TTY, tty.Name(), meta))
meta[CHANNEL] = h
for request := range requests {
m.Logs("request", tcp.HOSTPORT, c.RemoteAddr(), kit.MDB_TYPE, request.Type)
switch request.Type {
case "pty-req":
termLen := request.Payload[3]
termEnv := string(request.Payload[4 : termLen+4])
_ssh_size(pty.Fd(), request.Payload[termLen+4:])
list = append(list, "TERM="+termEnv)
case "window-change":
_ssh_size(pty.Fd(), request.Payload)
case "env":
var env struct{ Name, Value string }
if err := ssh.Unmarshal(request.Payload, &env); err != nil {
continue
}
list = append(list, env.Name+"="+env.Value)
case "exec":
_ssh_exec(m, shell, []string{"-c", string(request.Payload[4 : request.Payload[3]+4])}, list, channel, func() {
channel.Close()
})
case "shell":
m.Go(func() { io.Copy(channel, pty) })
_ssh_exec(m, shell, nil, list, tty, func() {
defer m.Cmd(mdb.MODIFY, CHANNEL, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, tcp.CLOSE)
_ssh_close(m, c, channel)
})
_ssh_watch(m, meta, h, channel, pty, channel)
}
request.Reply(true, nil)
}
}
const SERVICE = "service" const SERVICE = "service"

View File

@ -1,7 +1,11 @@
package ssh package ssh
import ( import (
ice "github.com/shylinux/icebergs"
"golang.org/x/crypto/ssh"
"encoding/binary" "encoding/binary"
"net"
"syscall" "syscall"
"unsafe" "unsafe"
) )
@ -13,3 +17,5 @@ func _ssh_size(fd uintptr, b []byte) {
ws := &Winsize{Width: uint16(w), Height: uint16(h)} ws := &Winsize{Width: uint16(w), Height: uint16(h)}
syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws))) syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws)))
} }
func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh.Channel, requests <-chan *ssh.Request) {
}

View File

@ -1,7 +1,17 @@
package ssh package ssh
import ( import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
kit "github.com/shylinux/toolkits"
"golang.org/x/crypto/ssh"
"encoding/binary" "encoding/binary"
"github.com/kr/pty"
"io"
"net"
"os"
"syscall" "syscall"
"unsafe" "unsafe"
) )
@ -13,3 +23,56 @@ func _ssh_size(fd uintptr, b []byte) {
ws := &Winsize{Width: uint16(w), Height: uint16(h)} ws := &Winsize{Width: uint16(w), Height: uint16(h)}
syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws))) syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws)))
} }
func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh.Channel, requests <-chan *ssh.Request) {
m.Logs(CHANNEL, tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
defer m.Logs("dischan", tcp.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
shell := kit.Select("bash", os.Getenv("SHELL"))
list := []string{"PATH=" + os.Getenv("PATH")}
pty, tty, err := pty.Open()
if m.Warn(err != nil, err) {
return
}
defer tty.Close()
h := m.Rich(CHANNEL, "", kit.Data(kit.MDB_STATUS, tcp.OPEN, TTY, tty.Name(), meta))
meta[CHANNEL] = h
for request := range requests {
m.Logs("request", tcp.HOSTPORT, c.RemoteAddr(), kit.MDB_TYPE, request.Type)
switch request.Type {
case "pty-req":
termLen := request.Payload[3]
termEnv := string(request.Payload[4 : termLen+4])
_ssh_size(pty.Fd(), request.Payload[termLen+4:])
list = append(list, "TERM="+termEnv)
case "window-change":
_ssh_size(pty.Fd(), request.Payload)
case "env":
var env struct{ Name, Value string }
if err := ssh.Unmarshal(request.Payload, &env); err != nil {
continue
}
list = append(list, env.Name+"="+env.Value)
case "exec":
_ssh_exec(m, shell, []string{"-c", string(request.Payload[4 : request.Payload[3]+4])}, list, channel, func() {
channel.Close()
})
case "shell":
m.Go(func() { io.Copy(channel, pty) })
_ssh_exec(m, shell, nil, list, tty, func() {
defer m.Cmd(mdb.MODIFY, CHANNEL, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, tcp.CLOSE)
_ssh_close(m, c, channel)
})
_ssh_watch(m, meta, h, channel, pty, channel)
}
request.Reply(true, nil)
}
}

View File

@ -1,4 +1,12 @@
package ssh package ssh
import (
ice "github.com/shylinux/icebergs"
"golang.org/x/crypto/ssh"
"net"
)
func _ssh_size(fd uintptr, b []byte) { func _ssh_size(fd uintptr, b []byte) {
} }
func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh.Channel, requests <-chan *ssh.Request) {
}

View File

@ -52,7 +52,7 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
// 调试接口 // 调试接口
if strings.HasPrefix(r.URL.Path, "/debug") { if strings.HasPrefix(r.URL.Path, "/debug") {
r.URL.Path = strings.Replace(r.URL.Path, "/debug", "/code", -1) r.URL.Path = strings.Replace(r.URL.Path, "/debug", "/code", -1)
return false return true
} }
// 主页接口 // 主页接口
@ -61,6 +61,9 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
if msg.W, msg.R = w, r; strings.Contains(r.Header.Get("User-Agent"), "curl") { if msg.W, msg.R = w, r; strings.Contains(r.Header.Get("User-Agent"), "curl") {
Render(msg, ice.RENDER_DOWNLOAD, kit.Path(m.Conf(SERVE, "meta.intshell.path"), m.Conf(SERVE, "meta.intshell.index"))) Render(msg, ice.RENDER_DOWNLOAD, kit.Path(m.Conf(SERVE, "meta.intshell.path"), m.Conf(SERVE, "meta.intshell.index")))
} else { } else {
if ice.DumpBinPack(w, r.URL.Path, func(name string) { RenderType(w, name, "") }) {
return false
}
Render(msg, ice.RENDER_DOWNLOAD, kit.Path(m.Conf(SERVE, "meta.volcanos.path"), m.Conf(SERVE, "meta.volcanos.index"))) Render(msg, ice.RENDER_DOWNLOAD, kit.Path(m.Conf(SERVE, "meta.volcanos.path"), m.Conf(SERVE, "meta.volcanos.index")))
} }
return false return false

View File

@ -62,6 +62,7 @@ const ( // RENDER
RENDER_TEMPLATE = "_template" RENDER_TEMPLATE = "_template"
) )
const ( // PROCESS const ( // PROCESS
PROCESS_PROGRESS = "_progress"
PROCESS_REFRESH = "_refresh" PROCESS_REFRESH = "_refresh"
PROCESS_FOLLOW = "_follow" PROCESS_FOLLOW = "_follow"
PROCESS_INNER = "_inner" PROCESS_INNER = "_inner"

View File

@ -70,14 +70,6 @@ const AUTOGEN = "autogen"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
AUTOGEN: {Name: AUTOGEN, Help: "生成", Value: kit.Data(
kit.MDB_FIELD, "time,id,name,from", "shy", `
chapter "{{.Option "name"}}"
field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}}
`,
)},
},
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
AUTOGEN: {Name: "autogen path auto create", Help: "生成", Action: map[string]*ice.Action{ AUTOGEN: {Name: "autogen path auto create", Help: "生成", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
@ -97,13 +89,14 @@ field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}}
case "main": case "main":
m.Option(nfs.DIR_REG, ".*.go") m.Option(nfs.DIR_REG, ".*.go")
m.Cmdy(nfs.DIR, "src", "path,size,time") m.Cmdy(nfs.DIR, "src", "path,size,time")
m.Sort(kit.MDB_PATH) m.RenameAppend("path", arg[0])
case "from": case "from":
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_REG, ".*.go") m.Option(nfs.DIR_REG, ".*.go")
m.Cmdy(nfs.DIR, "usr/icebergs/misc/", "path,size,time")
m.Cmdy(nfs.DIR, "src/", "path,size,time") m.Cmdy(nfs.DIR, "src/", "path,size,time")
m.SortTimeR(kit.MDB_PATH) m.Cmdy(nfs.DIR, "usr/icebergs/misc/", "path,size,time")
m.RenameAppend("path", arg[0])
} }
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -114,5 +107,13 @@ field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}}
} }
}}, }},
}, },
Configs: map[string]*ice.Config{
AUTOGEN: {Name: AUTOGEN, Help: "生成", Value: kit.Data(
"shy", `
chapter "{{.Option "name"}}"
field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}}
`,
)},
},
}) })
} }

View File

@ -50,7 +50,7 @@ func _bench_http(m *ice.Message, name, target string, arg ...string) {
m.Echo(s.Show()) m.Echo(s.Show())
m.Echo("body: %d\n", body) m.Echo("body: %d\n", body)
m.Option(ice.MSG_PROCESS, "_inner") m.Option(ice.MSG_PROCESS, ice.PROCESS_INNER)
} }
func _bench_redis(m *ice.Message, name, target string, arg ...string) { func _bench_redis(m *ice.Message, name, target string, arg ...string) {
} }
@ -68,6 +68,38 @@ func init() {
BENCH: {Name: BENCH, Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)}, BENCH: {Name: BENCH, Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, arg)
}},
mdb.INSERT: {Name: "insert zone type=http,redis name text nconn=3 nreqs=10", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, kit.MDB_ZONE, arg[1])
m.Cmdy(mdb.INSERT, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, BENCH, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE))
}},
cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(kit.MDB_TYPE) {
case "http":
_bench_http(m, m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT))
case "redis":
_bench_redis(m, m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT))
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select("time,count,zone", kit.Select("time,id,type,name,text,nconn,nreqs", mdb.DETAIL, len(arg) > 1), len(arg) > 0))
m.Cmdy(mdb.SELECT, BENCH, "", mdb.ZONE, arg)
m.PushAction(kit.Select(mdb.REMOVE, cli.RUN, len(arg) > 0))
}},
"/bench": {Name: "/bench cmd...", Help: "性能压测", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(m.Optionv("cmd"))
}},
"test": {Name: "test path func auto run case", Help: "测试用例", Action: map[string]*ice.Action{ "test": {Name: "test path func auto run case", Help: "测试用例", Action: map[string]*ice.Action{
"run": {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { "run": {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
cli.Follow(m, "run", func() { cli.Follow(m, "run", func() {
@ -115,38 +147,6 @@ func init() {
m.Option(cli.CMD_DIR, kit.Select(path.Dir(arg[0]), arg[0], strings.HasSuffix(arg[0], "/"))) m.Option(cli.CMD_DIR, kit.Select(path.Dir(arg[0]), arg[0], strings.HasSuffix(arg[0], "/")))
m.Cmdy(cli.SYSTEM, "go", "test", "./", "-v", "-run="+arg[1]) m.Cmdy(cli.SYSTEM, "go", "test", "./", "-v", "-run="+arg[1])
}}, }},
BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, arg)
}},
mdb.INSERT: {Name: "insert zone type=http,redis name text nconn=3 nreqs=10", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, kit.MDB_ZONE, arg[1])
m.Cmdy(mdb.INSERT, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, BENCH, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE))
}},
cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(kit.MDB_TYPE) {
case "http":
_bench_http(m, m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT))
case "redis":
_bench_redis(m, m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT))
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select("time,count,zone", kit.Select("time,id,type,name,text,nconn,nreqs", mdb.DETAIL, len(arg) > 1), len(arg) > 0))
m.Cmdy(mdb.SELECT, BENCH, "", mdb.ZONE, arg)
m.PushAction(kit.Select(mdb.REMOVE, cli.RUN, len(arg) > 0))
}},
"/bench": {Name: "/bench cmd...", Help: "性能压测", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(m.Optionv("cmd"))
}},
}, },
}) })
} }

View File

@ -61,6 +61,7 @@ func init() {
m.Cmd(mdb.PLUGIN, mdb.CREATE, C, m.Prefix(C)) m.Cmd(mdb.PLUGIN, mdb.CREATE, C, m.Prefix(C))
m.Cmd(mdb.RENDER, mdb.CREATE, C, m.Prefix(C)) m.Cmd(mdb.RENDER, mdb.CREATE, C, m.Prefix(C))
m.Cmd(mdb.ENGINE, mdb.CREATE, C, m.Prefix(C))
m.Cmd(mdb.SEARCH, mdb.CREATE, C, m.Prefix(C)) m.Cmd(mdb.SEARCH, mdb.CREATE, C, m.Prefix(C))
m.Cmd(mdb.PLUGIN, mdb.CREATE, H, m.Prefix(C)) m.Cmd(mdb.PLUGIN, mdb.CREATE, H, m.Prefix(C))
@ -80,6 +81,12 @@ func init() {
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
}}, }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, arg[2])
name := strings.TrimSuffix(arg[1], path.Ext(arg[1])) + ".bin"
m.Cmd(cli.SYSTEM, "gcc", arg[1], "-o", name)
m.Cmdy(cli.SYSTEM, "./"+name)
}},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == kit.MDB_FOREACH { if arg[0] == kit.MDB_FOREACH {
return return

View File

@ -20,8 +20,9 @@ var Index = &ice.Context{Name: CODE, Help: "编程中心",
func init() { func init() {
web.Index.Register(Index, &web.Frame{}, web.Index.Register(Index, &web.Frame{},
INSTALL, AUTOGEN, COMPILE, PUBLISH, UPGRADE, INSTALL, COMPILE, BINPACK, WEBPACK,
VIMER, INNER, FAVOR, BENCH, PPROF, VIMER, INNER, FAVOR, BENCH, PPROF,
AUTOGEN, PUBLISH, UPGRADE,
C, SH, SHY, GO, JS, C, SH, SHY, GO, JS,
) )
} }

View File

@ -22,27 +22,28 @@ field "后端" web.code.go
field "前端" web.code.js field "前端" web.code.js
return return
inner.go
vimer.go vimer.go
inner.go
favor.go favor.go
bench.go bench.go
pprof.go pprof.go
install.go
compile.go
autogen.go
publish.go
upgrade.go
c.go c.go
sh.go sh.go
shy.go shy.go
go.go go.go
js.go js.go
install.go
compile.go
binpack.go
webpack.go
publish.go
upgrade.go
autogen.go
code.go code.go
code.shy code.shy
csdn.go csdn.go
github.go github.go
pack.go

View File

@ -7,7 +7,6 @@ import (
"github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/nfs"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"fmt"
"os" "os"
"path" "path"
"strings" "strings"
@ -27,7 +26,7 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
COMPILE: {Name: "compile os=linux,darwin,windows arch=amd64,386,arm src=src/main.go@key 执行:button", Help: "编译", Action: map[string]*ice.Action{ COMPILE: {Name: "compile arch=amd64,386,arm os=linux,darwin,windows src=src/main.go@key 执行:button", Help: "编译", Action: map[string]*ice.Action{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, "src", "path,size,time") m.Cmdy(nfs.DIR, "src", "path,size,time")
m.Sort(kit.MDB_PATH) m.Sort(kit.MDB_PATH)
@ -53,26 +52,19 @@ func init() {
} }
// 编译目标 // 编译目标
file := path.Join(kit.Select("", m.Conf(cmd, kit.META_PATH), m.Option(cli.CMD_DIR) == ""), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch)) file := path.Join(kit.Select("", m.Conf(cmd, kit.META_PATH), m.Option(cli.CMD_DIR) == ""), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch))
args := []string{"-ldflags"}
list := []string{
fmt.Sprintf(`-X main.Time="%s"`, m.Time()),
fmt.Sprintf(`-X main.Version="%s"`, m.Cmdx(cli.SYSTEM, "git", "describe", "--tags")),
fmt.Sprintf(`-X main.HostName="%s"`, m.Conf(cli.RUNTIME, "boot.hostname")),
fmt.Sprintf(`-X main.UserName="%s"`, m.Conf(cli.RUNTIME, "boot.username")),
}
// 编译参数 // 编译参数
m.Optionv(cli.CMD_ENV, kit.Simple(m.Confv(COMPILE, "meta.env"), "GOARCH", arch, "GOOS", goos)) m.Optionv(cli.CMD_ENV, kit.Simple(m.Confv(COMPILE, "meta.env"), "GOARCH", arch, "GOOS", goos))
if msg := m.Cmd(cli.SYSTEM, m.Confv(COMPILE, "meta.go"), args, "'"+strings.Join(list, " ")+"'", "-o", file, main); msg.Append(cli.CMD_CODE) != "0" { if msg := m.Cmd(cli.SYSTEM, m.Confv(COMPILE, "meta.go"), "-o", file, main); msg.Append(cli.CMD_CODE) != "0" {
m.Copy(msg) m.Copy(msg)
} else { return
}
m.Log_EXPORT("source", main, "target", file) m.Log_EXPORT("source", main, "target", file)
m.Push(kit.MDB_TIME, m.Time()) m.Push(kit.MDB_TIME, m.Time())
m.PushDownload(kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/publish/"+path.Base(file))) m.PushDownload(file)
m.Echo(file) m.Echo(file)
}
}}, }},
}, },
}) })

View File

@ -53,7 +53,7 @@ func init() {
return return
} }
m.ShowPlugin("", INNER, mdb.RENDER) m.ShowPlugin("", m.Prefix(), INNER, INNER, mdb.RENDER)
m.Push(kit.SSH_ARG, kit.Format([]string{m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE), m.Option(kit.MDB_LINE)})) m.Push(kit.SSH_ARG, kit.Format([]string{m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE), m.Option(kit.MDB_LINE)}))
}}, }},
}, 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

@ -11,34 +11,22 @@ import (
"os" "os"
"path" "path"
"strings" "strings"
"time"
) )
func _go_find(m *ice.Message, key string) { func _go_find(m *ice.Message, key string) {
fields := kit.Split(m.Option(mdb.FIELDS))
for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, "find", ".", "-name", key), "\n") { for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, "find", ".", "-name", key), "\n") {
if p == "" { if p == "" {
continue continue
} }
for _, k := range fields { m.PushSearch(kit.SSH_CMD, "find", kit.MDB_FILE, strings.TrimPrefix(p, "./"), kit.MDB_LINE, 1, kit.MDB_TEXT, "")
switch k {
case kit.MDB_FILE:
m.Push(k, strings.TrimPrefix(p, "./"))
case kit.MDB_LINE:
m.Push(k, 1)
case kit.MDB_TEXT:
m.Push(k, "")
default:
m.Push(k, "")
}
}
} }
} }
func _go_tags(m *ice.Message, key string) { func _go_tags(m *ice.Message, key string) {
if _, e := os.Stat(path.Join(m.Option(cli.CMD_DIR), ".tags")); e != nil { if s, e := os.Stat(path.Join(m.Option(cli.CMD_DIR), ".tags")); os.IsNotExist(e) || s.ModTime().Before(time.Now().Add(kit.Duration("-72h"))) {
m.Cmd(cli.SYSTEM, "gotags", "-R", "-f", ".tags", "./") m.Cmd(cli.SYSTEM, "gotags", "-R", "-f", ".tags", "./")
} }
fields := kit.Split(m.Option(mdb.FIELDS))
ls := strings.Split(key, ".") ls := strings.Split(key, ".")
key = ls[len(ls)-1] key = ls[len(ls)-1]
@ -61,54 +49,22 @@ func _go_tags(m *ice.Message, key string) {
bio := bufio.NewScanner(f) bio := bufio.NewScanner(f)
for i := 1; bio.Scan(); i++ { for i := 1; bio.Scan(); i++ {
if i == line || bio.Text() == text { if i == line || bio.Text() == text {
for _, k := range fields { m.PushSearch(kit.SSH_CMD, "tags", kit.MDB_FILE, strings.TrimPrefix(file, "./"), kit.MDB_LINE, kit.Format(i), kit.MDB_TEXT, bio.Text())
switch k {
case kit.MDB_FILE:
m.Push(k, strings.TrimPrefix(file, "./"))
case kit.MDB_LINE:
m.Push(k, i)
case kit.MDB_TEXT:
m.Push(k, bio.Text())
default:
m.Push(k, "")
}
}
} }
} }
} }
} }
func _go_grep(m *ice.Message, key string) { func _go_grep(m *ice.Message, key string) {
fields := kit.Split(m.Option(mdb.FIELDS))
msg := m.Spawn() msg := m.Spawn()
msg.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n") msg.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n")
msg.Table(func(index int, value map[string]string, head []string) { msg.Table(func(index int, value map[string]string, head []string) { m.PushSearch(kit.SSH_CMD, "grep", value) })
m.Push("", value, fields)
})
} }
func _go_help(m *ice.Message, key string) { func _go_help(m *ice.Message, key string) {
p := m.Cmd(cli.SYSTEM, "go", "doc", key).Append(cli.CMD_OUT) p := m.Cmd(cli.SYSTEM, "go", "doc", key).Append(cli.CMD_OUT)
if p == "" { if p == "" {
return return
} }
ls := strings.Split(p, "\n") m.PushSearch(kit.SSH_CMD, "help", kit.MDB_FILE, key+".godoc", kit.MDB_LINE, 1, kit.MDB_TEXT, p)
if len(ls) > 10 {
ls = ls[:10]
}
res := strings.Join(ls, "\n")
for _, k := range kit.Split(m.Option(mdb.FIELDS)) {
switch k {
case kit.MDB_FILE:
m.Push(k, key+".godoc")
case kit.MDB_LINE:
m.Push(k, 1)
case kit.MDB_TEXT:
m.Push(k, string(res))
default:
m.Push(k, "")
}
}
} }
const GO = "go" const GO = "go"
@ -134,7 +90,6 @@ func init() {
m.Cmd(mdb.PLUGIN, mdb.CREATE, SUM, m.Prefix(SUM)) m.Cmd(mdb.PLUGIN, mdb.CREATE, SUM, m.Prefix(SUM))
m.Cmd(mdb.RENDER, mdb.CREATE, SUM, m.Prefix(SUM)) m.Cmd(mdb.RENDER, mdb.CREATE, SUM, m.Prefix(SUM))
}}, }},
SUM: {Name: SUM, Help: "版本", Action: map[string]*ice.Action{ SUM: {Name: SUM, Help: "版本", Action: map[string]*ice.Action{
mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) {

View File

@ -72,23 +72,19 @@ func init() {
_inner_show(m, arg[0], arg[1], arg[2]) _inner_show(m, arg[0], arg[1], arg[2])
}}, }},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if strings.Contains(arg[1], ";") {
ls := strings.Split(arg[1], ";")
arg[0] = ls[0]
arg[1] = ls[1]
}
m.Option(cli.CMD_DIR, arg[2]) m.Option(cli.CMD_DIR, arg[2])
m.Option(nfs.DIR_ROOT, arg[2]) m.Option(nfs.DIR_ROOT, arg[2])
m.Cmdy(mdb.SEARCH, arg[:2], "file,line,text") m.Cmdy(mdb.SEARCH, arg[:2], "cmd,file,line,text")
}}, }},
mdb.INPUTS: {Name: "favor inputs", Help: "补全"},
FAVOR: {Name: "favor", Help: "收藏"}, FAVOR: {Name: "favor", Help: "收藏"},
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Name: "command", Help: "命令"},
if arg[0] == "run" {
if arg = kit.Split(strings.Join(arg[1:], " ")); !m.Warn(!m.Right(arg)) {
if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 {
m.Cmdy(cli.SYSTEM, arg)
}
}
return
}
m.Cmdy(ctx.COMMAND, arg[0])
}},
}, 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) < 2 { if len(arg) < 2 {
m.Cmdy(nfs.DIR, kit.Select("./", arg, 0)) m.Cmdy(nfs.DIR, kit.Select("./", arg, 0))

View File

@ -34,7 +34,7 @@ func init() {
name := path.Base(link) name := path.Base(link)
p := path.Join(m.Conf(INSTALL, kit.META_PATH), name) p := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
m.Option(ice.MSG_PROCESS, "_progress") m.Option(ice.MSG_PROCESS, ice.PROCESS_PROGRESS)
m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD)) m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD))
if m.Cmd(mdb.SELECT, INSTALL, "", mdb.HASH, kit.MDB_NAME, name).Table(func(index int, value map[string]string, head []string) { if m.Cmd(mdb.SELECT, INSTALL, "", mdb.HASH, kit.MDB_NAME, name).Table(func(index int, value map[string]string, head []string) {
if _, e := os.Stat(p); e == nil { if _, e := os.Stat(p); e == nil {

View File

@ -22,6 +22,7 @@ func init() {
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.Cmd(mdb.PLUGIN, mdb.CREATE, JS, m.Prefix(JS)) m.Cmd(mdb.PLUGIN, mdb.CREATE, JS, m.Prefix(JS))
m.Cmd(mdb.RENDER, mdb.CREATE, JS, m.Prefix(JS)) m.Cmd(mdb.RENDER, mdb.CREATE, JS, m.Prefix(JS))
m.Cmd(mdb.ENGINE, mdb.CREATE, JS, m.Prefix(JS))
m.Cmd(mdb.SEARCH, mdb.CREATE, JS, m.Prefix(JS)) m.Cmd(mdb.SEARCH, mdb.CREATE, JS, m.Prefix(JS))
}}, }},
JS: {Name: JS, Help: "前端", Action: map[string]*ice.Action{ JS: {Name: JS, Help: "前端", Action: map[string]*ice.Action{
@ -31,11 +32,15 @@ func init() {
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
}}, }},
mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, arg[2])
m.Cmdy(cli.SYSTEM, NODE, arg[1])
m.Set(ice.MSG_APPEND)
}},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == kit.MDB_FOREACH { if arg[0] == kit.MDB_FOREACH {
return return
} }
m.Option(cli.CMD_DIR, kit.Select("src", arg, 2))
_go_find(m, kit.Select("main", arg, 1)) _go_find(m, kit.Select("main", arg, 1))
_go_grep(m, kit.Select("main", arg, 1)) _go_grep(m, kit.Select("main", arg, 1))
}}, }},

View File

@ -1,209 +0,0 @@
package code
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/nfs"
kit "github.com/shylinux/toolkits"
"fmt"
"io/ioutil"
"os"
"path"
"strings"
)
func _pack_file(m *ice.Message, file string) string {
list := ""
if f, e := os.Open(file); e == nil {
defer f.Close()
if b, e := ioutil.ReadAll(f); e == nil {
list = fmt.Sprintf("%v", b)
}
}
if list = strings.ReplaceAll(list, " ", ","); len(list) > 0 {
return fmt.Sprintf(`[]byte{%v}`, list[1:len(list)-1])
}
return "[]byte{}"
}
func _pack_dir(m *ice.Message, pack *os.File, dir string) {
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, "true")
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Cmd(nfs.DIR, "./").Table(func(index int, value map[string]string, head []string) {
switch strings.Split(value[kit.MDB_PATH], "/")[0] {
case "pluged", "trash":
return
}
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n",
path.Join(dir, value[kit.MDB_PATH]), _pack_file(m, path.Join(dir, value[kit.MDB_PATH]))))
})
pack.WriteString("\n")
}
func _pack_volcanos(m *ice.Message, pack *os.File, dir string) {
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, "true")
m.Option(nfs.DIR_TYPE, nfs.FILE)
for _, k := range []string{"favicon.ico", "index.html", "index.css", "index.js", "proto.js", "frame.js", "cache.js", "cache.css"} {
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n",
kit.Select("", k, k != "index.html"), _pack_file(m, path.Join(dir, k))))
}
for _, k := range []string{"lib", "pane", "plugin"} {
m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) {
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n",
value[kit.MDB_PATH], _pack_file(m, path.Join(dir, value[kit.MDB_PATH]))))
})
}
pack.WriteString("\n")
}
func _pack_contexts(m *ice.Message, pack *os.File) {
for _, k := range []string{"src/main.go", "src/main.shy", "src/main.svg"} {
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n",
k, _pack_file(m, k)))
}
pack.WriteString("\n")
}
const WEBPACK = "webpack"
const BINPACK = "binpack"
func init() {
Index.Merge(&ice.Context{
Commands: map[string]*ice.Command{
BINPACK: {Name: "binpack path auto create", Help: "打包", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create name=demo from=src/main.go", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
name := kit.Keys(m.Option(kit.MDB_NAME), "go")
if pack, p, e := kit.Create(path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK, name)); m.Assert(e) {
defer pack.Close()
pack.WriteString(m.Cmdx(nfs.CAT, m.Option("from")))
pack.WriteString("\n")
pack.WriteString(`func init() {` + "\n")
pack.WriteString(` ice.BinPack = map[string][]byte{` + "\n")
_pack_volcanos(m, pack, "usr/volcanos")
_pack_dir(m, pack, "usr/learning")
_pack_dir(m, pack, "usr/icebergs")
_pack_dir(m, pack, "usr/toolkits")
_pack_dir(m, pack, "usr/intshell")
_pack_contexts(m, pack)
pack.WriteString(` }` + "\n")
pack.WriteString(`}` + "\n")
m.Echo(p)
}
m.Option(cli.CMD_DIR, path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK))
m.Cmd(COMPILE, "windows", "amd64", name)
m.Cmd(COMPILE, "darwin", "amd64", name)
m.Cmd(COMPILE, "linux", "amd64", name)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(nfs.DIR_ROOT, path.Join(m.Conf(PUBLISH, kit.META_PATH)))
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Cmdy(nfs.DIR, BINPACK).Table(func(index int, value map[string]string, head []string) {
m.PushDownload(value[kit.MDB_PATH])
})
}},
WEBPACK: {Name: "webpack path auto create", Help: "打包", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create name=demo", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
css, _, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "page/cache.css"))
m.Assert(e)
defer css.Close()
js, _, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "page/cache.js"))
m.Assert(e)
defer js.Close()
m.Option(nfs.DIR_ROOT, m.Conf(WEBPACK, kit.META_PATH))
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Option(nfs.DIR_DEEP, true)
for _, k := range []string{"lib", "pane", "plugin"} {
m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) {
if strings.HasSuffix(value[kit.MDB_PATH], ".css") {
js.WriteString(`Volcanos.meta.cache["` + path.Join("/", value[kit.MDB_PATH]) + "\"] = []\n")
css.WriteString(m.Cmdx(nfs.CAT, value[kit.MDB_PATH]))
}
})
}
for _, k := range []string{"lib", "pane", "plugin"} {
m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) {
if strings.HasSuffix(value[kit.MDB_PATH], ".js") {
js.WriteString(`_can_name = "` + path.Join("/", value[kit.MDB_PATH]) + "\";\n")
js.WriteString(m.Cmdx(nfs.CAT, value[kit.MDB_PATH]))
}
})
}
for _, k := range []string{"frame.js"} {
js.WriteString(`_can_name = "` + path.Join("/", k) + "\"\n")
js.WriteString(m.Cmdx(nfs.CAT, k))
}
if f, _, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".js"); m.Assert(e) {
defer f.Close()
f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option("content")))))
}
m.Option(nfs.DIR_ROOT, "")
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/page/cache.css"),
m.Cmdx(nfs.CAT, "usr/volcanos/page/index.css"),
m.Cmdx(nfs.CAT, "usr/volcanos/page/proto.js"),
m.Cmdx(nfs.CAT, "usr/volcanos/page/cache.js"),
m.Cmdx(nfs.CAT, "usr/publish/webpack/"+m.Option("name")+".js"),
m.Cmdx(nfs.CAT, "usr/volcanos/page/index.js"),
))
m.Echo(p)
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH))
m.Option(nfs.DIR_TYPE, nfs.FILE)
m.Option(nfs.DIR_DEEP, true)
m.Cmdy(nfs.DIR, WEBPACK).Table(func(index int, value map[string]string, head []string) {
m.PushDownload(path.Join(m.Option(nfs.DIR_ROOT), value[kit.MDB_PATH]))
})
}},
},
Configs: map[string]*ice.Config{
WEBPACK: {Name: WEBPACK, Help: "webpack", Value: kit.Data(kit.MDB_PATH, "usr/volcanos")},
BINPACK: {Name: BINPACK, Help: "binpack", Value: kit.Data()},
},
})
}
const _pack = `
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=0.7,user-scalable=no">
<title>volcanos</title>
<link rel="shortcut icon" type="image/ico" href="favicon.ico">
<style type="text/css">%s</style>
<style type="text/css">%s</style>
</head>
<body>
<script>%s</script>
<script>%s</script>
<script>%s</script>
<script>%s</script>
<script>Volcanos.meta.webpack = true</script>
</body>
`

View File

@ -5,6 +5,7 @@ import (
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/nfs"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -47,6 +48,19 @@ func init() {
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, PPROF, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE)) m.Cmdy(mdb.DELETE, PPROF, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE))
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case "binnary":
m.Cmd(nfs.DIR, "bin/", "path,size,time").Table(func(index int, value map[string]string, head []string) {
m.Push("binnary", value["path"])
m.Push("", value, []string{"size,time"})
})
case "service":
m.Cmd(web.SPIDE).Table(func(index int, value map[string]string, head []string) {
m.Push("service", kit.MergeURL2(value["client.url"], "/debug/pprof/profile"))
})
}
}},
cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, m.Option(SERVICE), SECONDS, m.Option(SECONDS)) msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, m.Option(SERVICE), SECONDS, m.Option(SECONDS))
@ -59,10 +73,10 @@ func init() {
m.Cmd(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_TEXT, strings.Join(res, "\n"), kit.MDB_FILE, msg.Append(kit.MDB_FILE)) m.Cmd(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_TEXT, strings.Join(res, "\n"), kit.MDB_FILE, msg.Append(kit.MDB_FILE))
m.Echo(strings.Join(res, "\n")) m.Echo(strings.Join(res, "\n"))
m.Option(ice.MSG_PROCESS, "_inner") m.Option(ice.MSG_PROCESS, ice.PROCESS_INNER)
}}, }},
web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) { web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.MSG_PROCESS, "_inner") m.Option(ice.MSG_PROCESS, ice.PROCESS_INNER)
u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.RIGHT) p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.RIGHT)

View File

@ -28,7 +28,6 @@ func _publish_file(m *ice.Message, file string, arg ...string) string {
m.Cmd(nfs.LINK, target, file) m.Cmd(nfs.LINK, target, file)
// 发布记录 // 发布记录
// m.Cmdy(web.STORY, web.CATCH, "bin", target)
m.Log_EXPORT(PUBLISH, target, "from", file) m.Log_EXPORT(PUBLISH, target, "from", file)
return target return target
} }
@ -41,7 +40,10 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
PUBLISH: {Name: "publish path auto ish ice can", Help: "发布", Action: map[string]*ice.Action{ PUBLISH: {Name: "publish path auto publish ish ice can", Help: "发布", Action: map[string]*ice.Action{
"publish": {Name: "publish file", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
_publish_file(m, m.Option(kit.MDB_FILE))
}},
"contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { "contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) 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("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)))
@ -55,16 +57,16 @@ func init() {
arg = append(arg, "base") arg = append(arg, "base")
} }
for _, k := range arg { for _, k := range arg {
if buf, err := kit.Render(m.Conf(PUBLISH, kit.Keys("meta.contexts", k)), m); m.Assert(err) { if buf, err := kit.Render(m.Conf(PUBLISH, kit.Keym("contexts", k)), m); m.Assert(err) {
m.Cmdy("web.wiki.spark", "shell", string(buf)) m.EchoScript(string(buf))
} }
} }
}}, }},
"ish": {Name: "ish", Help: "神农架", Hand: func(m *ice.Message, arg ...string) { "ish": {Name: "ish", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_REG, ".*\\.(sh|vim|conf)") m.Option(nfs.DIR_REG, ".*\\.(sh|vim|conf)$")
m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH)) m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH))
m.Cmdy(nfs.DIR, "./", "time size line path link") m.Cmdy(nfs.DIR, "./", "time,size,line,path,link")
m.Cmdy(PUBLISH, "contexts", "tmux") m.Cmdy(PUBLISH, "contexts", "tmux")
}}, }},
"ice": {Name: "ice", Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { "ice": {Name: "ice", Help: "冰山架", Hand: func(m *ice.Message, arg ...string) {
@ -85,9 +87,9 @@ func init() {
}}, }},
"can": {Name: "can", Help: "火山架", Hand: func(m *ice.Message, arg ...string) { "can": {Name: "can", Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_REG, ".*\\.(js|css|html)") m.Option(nfs.DIR_REG, ".*\\.(js|css|html)$")
m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH)) m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH))
m.Cmdy(nfs.DIR, "./", "time size line path link") m.Cmdy(nfs.DIR, "./", "time,size,line,path,link")
m.Cmdy(PUBLISH, "contexts", "miss") m.Cmdy(PUBLISH, "contexts", "miss")
}}, }},
}, 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

@ -2,7 +2,6 @@ package code
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/nfs" "github.com/shylinux/icebergs/base/nfs"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -16,10 +15,10 @@ func init() {
Index.Register(&ice.Context{Name: SHY, Help: "脚本", Index.Register(&ice.Context{Name: SHY, Help: "脚本",
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.Cmd(mdb.PLUGIN, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.PLUGIN, mdb.CREATE, SHY, m.Prefix(SHY))
m.Cmd(mdb.RENDER, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, SHY, m.Prefix(SHY))
m.Cmd(mdb.ENGINE, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.ENGINE, mdb.CREATE, SHY, m.Prefix(SHY))
m.Cmd(mdb.SEARCH, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.SEARCH, mdb.CREATE, SHY, m.Prefix(SHY))
}}, }},
SHY: {Name: SHY, Help: "脚本", Action: map[string]*ice.Action{ SHY: {Name: SHY, Help: "脚本", Action: map[string]*ice.Action{
mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) {
@ -35,7 +34,6 @@ func init() {
if arg[0] == kit.MDB_FOREACH { if arg[0] == kit.MDB_FOREACH {
return return
} }
m.Option(cli.CMD_DIR, kit.Select("src", arg, 2))
_go_find(m, kit.Select("main", arg, 1)) _go_find(m, kit.Select("main", arg, 1))
_go_grep(m, kit.Select("main", arg, 1)) _go_grep(m, kit.Select("main", arg, 1))
}}, }},

View File

@ -1,11 +1,14 @@
package code package code
import ( import (
"path"
"strings"
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/nfs"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"path"
) )
const VIMER = "vimer" const VIMER = "vimer"
@ -15,6 +18,13 @@ func init() {
VIMER: {Name: "vimer path=src/ file=main.go line=1 刷新:button=auto save", Help: "编辑器", Meta: kit.Dict( VIMER: {Name: "vimer path=src/ file=main.go line=1 刷新:button=auto save", Help: "编辑器", Meta: kit.Dict(
"display", "/plugin/local/code/vimer.js", "style", "editor", "display", "/plugin/local/code/vimer.js", "style", "editor",
), Action: map[string]*ice.Action{ ), Action: map[string]*ice.Action{
mdb.ENGINE: {Name: "engine", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
if arg = kit.Split(strings.Join(arg, " ")); !m.Warn(!m.Right(arg)) {
if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 {
m.Cmdy(cli.SYSTEM, arg)
}
}
}},
nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) { nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.SAVE, path.Join(m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE))) m.Cmdy(nfs.SAVE, path.Join(m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE)))
}}, }},

View File

@ -223,3 +223,12 @@ func (m *Message) SortTime(key string) { m.Sort(key, "time") }
func (m *Message) SortTimeR(key string) { m.Sort(key, "time_r") } func (m *Message) SortTimeR(key string) { m.Sort(key, "time_r") }
func (m *Message) FormatMeta() string { return m.Format("meta") } func (m *Message) FormatMeta() string { return m.Format("meta") }
func (m *Message) RenameAppend(from, to string) {
for i, v := range m.meta[MSG_APPEND] {
if v == from {
m.meta[MSG_APPEND][i] = to
m.meta[to] = m.meta[from]
delete(m.meta, from)
}
}
}