forked from x/icebergs
opt code.install
This commit is contained in:
parent
68762a99f5
commit
84e5eb0e13
@ -73,7 +73,7 @@ func init() {
|
|||||||
}},
|
}},
|
||||||
"prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
"prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Richs(DAEMON, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
|
m.Richs(DAEMON, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
|
||||||
if strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.MDB_PID]), "\n") == 1 {
|
if value["status"] == "error" || strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.MDB_PID]), "\n") == 1 {
|
||||||
m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "")
|
m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "")
|
||||||
m.Log_DELETE(DAEMON, kit.Format(value))
|
m.Log_DELETE(DAEMON, kit.Format(value))
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ func _port_get(m *ice.Message, begin string) string {
|
|||||||
for i := current; i < end; i++ {
|
for i := current; i < end; i++ {
|
||||||
if m.Cmd(cli.SYSTEM, "lsof", "-i", kit.Format(":%d", i)).Append(cli.CMD_CODE) != "0" {
|
if m.Cmd(cli.SYSTEM, "lsof", "-i", kit.Format(":%d", i)).Append(cli.CMD_CODE) != "0" {
|
||||||
m.Conf(PORT, "meta.current", i)
|
m.Conf(PORT, "meta.current", i)
|
||||||
m.Log_CREATE(PORT, i)
|
m.Log_SELECT(PORT, i)
|
||||||
return kit.Format("%d", i)
|
return kit.Format("%d", i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ var Index = &ice.Context{Name: "tcp", Help: "通信模块",
|
|||||||
}},
|
}},
|
||||||
"select": {Name: "select [begin]", Help: "分配端口", Hand: func(m *ice.Message, arg ...string) {
|
"select": {Name: "select [begin]", Help: "分配端口", Hand: func(m *ice.Message, arg ...string) {
|
||||||
port, p := kit.Select("", arg, 0), ""
|
port, p := kit.Select("", arg, 0), ""
|
||||||
for {
|
for i := 0; i < 10; i++ {
|
||||||
port = _port_get(m, port)
|
port = _port_get(m, port)
|
||||||
p = path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
|
p = path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
|
||||||
if _, e := os.Stat(p); e != nil && os.IsNotExist(e) {
|
if _, e := os.Stat(p); e != nil && os.IsNotExist(e) {
|
||||||
|
@ -19,20 +19,20 @@ const INSTALL = "install"
|
|||||||
func init() {
|
func init() {
|
||||||
Index.Merge(&ice.Context{
|
Index.Merge(&ice.Context{
|
||||||
Configs: map[string]*ice.Config{
|
Configs: map[string]*ice.Config{
|
||||||
INSTALL: {Name: "install", Help: "安装", Value: kit.Data(
|
INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data(
|
||||||
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install",
|
kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install",
|
||||||
)},
|
)},
|
||||||
},
|
},
|
||||||
Commands: map[string]*ice.Command{
|
Commands: map[string]*ice.Command{
|
||||||
INSTALL: {Name: "install name=auto auto", Help: "安装", Action: map[string]*ice.Action{
|
INSTALL: {Name: "install name=auto port=auto path=auto auto", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{
|
||||||
"download": {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
"download": {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
||||||
name := path.Base(arg[0])
|
name := path.Base(arg[0])
|
||||||
if m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) {
|
if m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) {
|
||||||
if _, e := os.Stat(path.Join(m.Conf(INSTALL, kit.META_PATH), kit.Format(value["name"]))); e == nil {
|
if _, e := os.Stat(path.Join(m.Conf(INSTALL, kit.META_PATH), kit.Format(value[kit.MDB_NAME]))); e == nil {
|
||||||
m.Push(key, value, []string{"time", "progress", "size", "name", "link"})
|
m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_STEP, kit.MDB_SIZE, kit.MDB_NAME, kit.MDB_LINK})
|
||||||
}
|
}
|
||||||
}) != nil && len(m.Appendv("name")) > 0 {
|
}) != nil && len(m.Appendv(kit.MDB_NAME)) > 0 {
|
||||||
// 查询
|
// 已经下载
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,51 +40,95 @@ func init() {
|
|||||||
m.Cmd(mdb.INSERT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, name, kit.MDB_LINK, arg[0])
|
m.Cmd(mdb.INSERT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, name, kit.MDB_LINK, arg[0])
|
||||||
m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) {
|
m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) {
|
||||||
m.Optionv("progress", func(size int, total int) {
|
m.Optionv("progress", func(size int, total int) {
|
||||||
p := size * 100 / total
|
s := size * 100 / total
|
||||||
if p != kit.Int(value["progress"]) && p%10 == 0 {
|
if s != kit.Int(value[kit.MDB_STEP]) && s%10 == 0 {
|
||||||
m.Log_IMPORT(kit.MDB_FILE, name, "per", size*100/total, kit.MDB_SIZE, kit.FmtSize(int64(size)), "total", kit.FmtSize(int64(total)))
|
m.Log_IMPORT(kit.MDB_FILE, name, kit.MDB_STEP, s, kit.MDB_SIZE, kit.FmtSize(int64(size)), kit.MDB_TOTAL, kit.FmtSize(int64(total)))
|
||||||
}
|
}
|
||||||
value["progress"], value["size"], value["total"] = p, size, total
|
value[kit.MDB_STEP], value[kit.MDB_SIZE], value[kit.MDB_TOTAL] = s, size, total
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 占位
|
||||||
|
p := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
|
||||||
|
m.Cmd(cli.SYSTEM, "touch", p)
|
||||||
|
|
||||||
// 下载
|
// 下载
|
||||||
m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH))
|
m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH))
|
||||||
if strings.HasPrefix(arg[0], "ftp") {
|
if strings.HasPrefix(arg[0], "ftp") {
|
||||||
m.Cmdy(cli.SYSTEM, "wget", arg[0])
|
m.Cmdy(cli.SYSTEM, "wget", arg[0])
|
||||||
} else {
|
} else {
|
||||||
msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0])
|
msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0])
|
||||||
p := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
|
m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE))
|
||||||
m.Cmdy(nfs.LINK, p, msg.Append("file"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解压
|
// 解压
|
||||||
m.Cmd(cli.SYSTEM, "tar", "xvf", name)
|
m.Cmd(cli.SYSTEM, "tar", "xvf", name)
|
||||||
}},
|
}},
|
||||||
"start": {Name: "start source binary", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
"build": {Name: "build link", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
|
||||||
port := m.Cmdx(tcp.PORT, "get")
|
p := m.Option(cli.CMD_DIR, path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(arg[0])))
|
||||||
p := path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
|
switch cb := m.Optionv("prepare").(type) {
|
||||||
os.MkdirAll(p, ice.MOD_DIR)
|
case func(string):
|
||||||
|
cb(p)
|
||||||
|
default:
|
||||||
|
m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, INSTALL)), arg[1:])
|
||||||
|
}
|
||||||
|
|
||||||
// 复制
|
m.Cmdy(cli.SYSTEM, "make", "-j8")
|
||||||
m.Cmd(nfs.DIR, path.Join(m.Conf(INSTALL, kit.META_PATH), arg[0])).Table(func(index int, value map[string]string, head []string) {
|
m.Cmdy(cli.SYSTEM, "make", "PREFIX="+kit.Path(path.Join(p, INSTALL)), "install")
|
||||||
m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[kit.MDB_PATH], "/"), p)
|
}},
|
||||||
|
"spawn": {Name: "spawn link", Help: "新建", Hand: func(m *ice.Message, arg ...string) {
|
||||||
|
port := m.Cmdx(tcp.PORT, "select")
|
||||||
|
target := path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
|
||||||
|
source := path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(arg[0]))
|
||||||
|
|
||||||
|
m.Cmd(nfs.DIR, path.Join(source, INSTALL)).Table(func(index int, value map[string]string, head []string) {
|
||||||
|
m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[kit.MDB_PATH], "/"), target)
|
||||||
})
|
})
|
||||||
|
m.Echo(target)
|
||||||
|
}},
|
||||||
|
"start": {Name: "start link cmd...", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||||
|
p := m.Option(cli.CMD_DIR, m.Cmdx(INSTALL, "spawn", arg[0]))
|
||||||
|
|
||||||
// 启动
|
args := []string{}
|
||||||
m.Option(cli.CMD_DIR, p)
|
switch cb := m.Optionv("prepare").(type) {
|
||||||
m.Cmdy(cli.DAEMON, arg[1])
|
case func(string) []string:
|
||||||
|
args = append(args, cb(p)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Cmdy(cli.DAEMON, arg[1:], args)
|
||||||
|
}},
|
||||||
|
"bench": {Name: "bench port cmd...", Help: "压测", Hand: func(m *ice.Message, arg ...string) {
|
||||||
}},
|
}},
|
||||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if len(arg) > 0 {
|
if len(arg) == 0 {
|
||||||
// 详情
|
// 源码列表
|
||||||
m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, arg[0])
|
m.Option(mdb.FIELDS, "time,step,size,total,name,link")
|
||||||
|
m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH)
|
||||||
|
m.Sort(kit.MDB_TIME, "time_r")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列表
|
arg[0] = path.Base(arg[0])
|
||||||
m.Option("fields", "time,progress,size,total,name,link")
|
if key := strings.Split(strings.Split(arg[0], "-")[0], ".")[0]; len(arg) == 1 {
|
||||||
m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH)
|
// 服务列表
|
||||||
|
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||||
|
m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) {
|
||||||
|
if strings.Contains(value[kit.MDB_NAME], key) {
|
||||||
|
m.Push(kit.MDB_TIME, value[kit.MDB_TIME])
|
||||||
|
m.Push(kit.MDB_PORT, path.Base(value[kit.MDB_DIR]))
|
||||||
|
m.Push(kit.MDB_STATUS, value[kit.MDB_STATUS])
|
||||||
|
m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
|
||||||
|
m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, web.RENDER.A,
|
||||||
|
kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR]))))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
m.Sort(kit.MDB_TIME, "time_r")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 目录列表
|
||||||
|
m.Option(nfs.DIR_ROOT, path.Join(m.Conf(cli.DAEMON, kit.META_PATH), arg[1]))
|
||||||
|
m.Cmdy(nfs.DIR, kit.Select("./", arg, 2))
|
||||||
m.Sort(kit.MDB_TIME, "time_r")
|
m.Sort(kit.MDB_TIME, "time_r")
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
|
@ -5,7 +5,6 @@ import (
|
|||||||
"github.com/shylinux/icebergs/base/cli"
|
"github.com/shylinux/icebergs/base/cli"
|
||||||
"github.com/shylinux/icebergs/base/gdb"
|
"github.com/shylinux/icebergs/base/gdb"
|
||||||
"github.com/shylinux/icebergs/base/mdb"
|
"github.com/shylinux/icebergs/base/mdb"
|
||||||
"github.com/shylinux/icebergs/base/tcp"
|
|
||||||
"github.com/shylinux/icebergs/base/web"
|
"github.com/shylinux/icebergs/base/web"
|
||||||
"github.com/shylinux/icebergs/core/code"
|
"github.com/shylinux/icebergs/core/code"
|
||||||
kit "github.com/shylinux/toolkits"
|
kit "github.com/shylinux/toolkits"
|
||||||
@ -61,57 +60,14 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台",
|
|||||||
Commands: map[string]*ice.Command{
|
Commands: map[string]*ice.Command{
|
||||||
TMUX: {Name: "tmux 启动:button 编译:button 下载:button", Help: "终端", Action: map[string]*ice.Action{
|
TMUX: {Name: "tmux 启动:button 编译:button 下载:button", Help: "终端", Action: map[string]*ice.Action{
|
||||||
"download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
"download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(code.INSTALL, "download", m.Conf(TMUX, "meta.source"))
|
m.Cmdy(code.INSTALL, "download", m.Conf(TMUX, kit.META_SOURCE))
|
||||||
}},
|
}},
|
||||||
"compile": {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) {
|
"build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
|
||||||
name := path.Base(strings.TrimSuffix(strings.TrimSuffix(m.Conf(TMUX, "meta.source"), ".tar.gz"), "zip"))
|
m.Cmdy(code.INSTALL, "build", m.Conf(TMUX, kit.META_SOURCE))
|
||||||
p := m.Option(cli.CMD_DIR, path.Join(m.Conf(code.INSTALL, kit.META_PATH), name))
|
|
||||||
m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, "install")))
|
|
||||||
m.Cmdy(cli.SYSTEM, "make", "-j8")
|
|
||||||
}},
|
|
||||||
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
|
||||||
// 分配
|
|
||||||
port, p := "", ""
|
|
||||||
for {
|
|
||||||
port = m.Cmdx(tcp.PORT, "select", port)
|
|
||||||
p = path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port)
|
|
||||||
if _, e := os.Stat(p); e != nil && os.IsNotExist(e) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
port = kit.Format(kit.Int(port) + 1)
|
|
||||||
}
|
|
||||||
os.MkdirAll(path.Join(p, "logs"), ice.MOD_DIR)
|
|
||||||
os.MkdirAll(path.Join(p, "bin"), ice.MOD_DIR)
|
|
||||||
os.MkdirAll(p, ice.MOD_DIR)
|
|
||||||
|
|
||||||
// 复制
|
|
||||||
name := path.Base(strings.TrimSuffix(strings.TrimSuffix(m.Conf(TMUX, "meta.source"), ".tar.gz"), "zip"))
|
|
||||||
m.Cmd(cli.SYSTEM, "cp", "-r", path.Join(m.Conf(code.INSTALL, kit.META_PATH), name, "src/redis-cli"), path.Join(p, "bin"))
|
|
||||||
m.Cmd(cli.SYSTEM, "cp", "-r", path.Join(m.Conf(code.INSTALL, kit.META_PATH), name, "src/redis-server"), path.Join(p, "bin"))
|
|
||||||
m.Cmd(cli.SYSTEM, "cp", "-r", path.Join(m.Conf(code.INSTALL, kit.META_PATH), name, "src/redis-benchmark"), path.Join(p, "bin"))
|
|
||||||
|
|
||||||
// 启动
|
|
||||||
m.Option(cli.CMD_DIR, p)
|
|
||||||
m.Cmdy(cli.DAEMON, "bin/redis-server", "--port", port)
|
|
||||||
}},
|
}},
|
||||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if len(arg) > 0 && arg[0] != "" {
|
|
||||||
m.Cmdy(cli.SYSTEM, "bin/redis-cli", "-p", arg[0], kit.Split(kit.Select("info", arg, 1)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) {
|
|
||||||
if strings.HasPrefix(value[kit.MDB_NAME], "bin/redis") {
|
|
||||||
m.Push(kit.MDB_TIME, value[kit.MDB_TIME])
|
|
||||||
m.Push(kit.MDB_PORT, path.Base(value[kit.MDB_DIR]))
|
|
||||||
m.Push(kit.MDB_DIR, value[kit.MDB_DIR])
|
|
||||||
m.Push(kit.MDB_STATUS, value[kit.MDB_STATUS])
|
|
||||||
m.Push(kit.MDB_PID, value[kit.MDB_PID])
|
|
||||||
m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
m.Sort("time", "time_r")
|
|
||||||
}},
|
}},
|
||||||
|
|
||||||
TEXT: {Name: "text 保存:button 清空:button text:textarea", Help: "文本", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
TEXT: {Name: "text 保存:button 清空:button text:textarea", Help: "文本", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if len(arg) > 0 && arg[0] != "" {
|
if len(arg) > 0 && arg[0] != "" {
|
||||||
m.Cmd(_tmux, "set-buffer", arg[0])
|
m.Cmd(_tmux, "set-buffer", arg[0])
|
||||||
|
@ -7,7 +7,7 @@ refer "官网" `
|
|||||||
premenu
|
premenu
|
||||||
|
|
||||||
field tmux web.code.tmux.tmux
|
field tmux web.code.tmux.tmux
|
||||||
field tmux web.code.inner args `[ usr/install/tmux-3.1b input.c ]`
|
field tmux web.code.inner args `[ usr/install/tmux-3.1b cmd-bind-key.c ]`
|
||||||
|
|
||||||
chapter "安装"
|
chapter "安装"
|
||||||
section "libevent"
|
section "libevent"
|
||||||
@ -18,14 +18,23 @@ tar xvf libevent-2.1.12-stable.tar.gz && cd libevent-2.1.12-stable
|
|||||||
make -j8
|
make -j8
|
||||||
make install
|
make install
|
||||||
`
|
`
|
||||||
section "ncureses"
|
section "ncurses"
|
||||||
spark shell `
|
spark shell `
|
||||||
wget https://invisible-island.net/datafiles/release/ncurses.tar.gz
|
wget https://invisible-island.net/datafiles/release/ncurses.tar.gz
|
||||||
tar xvf ncurese.tar.gz && cd ncurese-6.2
|
tar xvf ncurses.tar.gz && cd ncurses-6.2
|
||||||
./configure
|
./configure
|
||||||
make -j8
|
make -j8
|
||||||
make install
|
make install
|
||||||
`
|
`
|
||||||
|
section "tmux"
|
||||||
|
spark shell `
|
||||||
|
wget https://github.com/tmux/tmux/releases/download/3.1b/tmux-3.1b.tar.gz
|
||||||
|
tar xvf tmux-3.1b.tar.gz && cd tmux-3.1b
|
||||||
|
./configure
|
||||||
|
make -j8
|
||||||
|
make install
|
||||||
|
`
|
||||||
|
|
||||||
chapter "应用"
|
chapter "应用"
|
||||||
field text web.code.tmux.text
|
field text web.code.tmux.text
|
||||||
field buffer web.code.tmux.buffer args 0
|
field buffer web.code.tmux.buffer args 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user