forked from x/icebergs
opt some
This commit is contained in:
parent
7eaead3ff4
commit
4cbce8e4c1
@ -1,10 +1,10 @@
|
|||||||
package gdb
|
package gdb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/shylinux/icebergs"
|
ice "github.com/shylinux/icebergs"
|
||||||
"github.com/shylinux/icebergs/base/cli"
|
"github.com/shylinux/icebergs/base/cli"
|
||||||
"github.com/shylinux/icebergs/base/nfs"
|
"github.com/shylinux/icebergs/base/nfs"
|
||||||
"github.com/shylinux/toolkits"
|
kit "github.com/shylinux/toolkits"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
@ -99,6 +99,7 @@ const (
|
|||||||
|
|
||||||
RESTART = "restart"
|
RESTART = "restart"
|
||||||
CHANGE = "change"
|
CHANGE = "change"
|
||||||
|
BUILD = "build"
|
||||||
PRUNE = "prune"
|
PRUNE = "prune"
|
||||||
CLEAR = "clear"
|
CLEAR = "clear"
|
||||||
)
|
)
|
||||||
|
1
meta.go
1
meta.go
@ -362,7 +362,6 @@ func (m *Message) Split(str string, field string, space string, enter string) *M
|
|||||||
indexs := []int{}
|
indexs := []int{}
|
||||||
fields := kit.Split(field, space, space, space)
|
fields := kit.Split(field, space, space, space)
|
||||||
for i, l := range kit.Split(str, enter, enter, enter) {
|
for i, l := range kit.Split(str, enter, enter, enter) {
|
||||||
m.Debug("----%v----", l)
|
|
||||||
if strings.TrimSpace(l) == "" {
|
if strings.TrimSpace(l) == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
13
misc.go
13
misc.go
@ -1,7 +1,7 @@
|
|||||||
package ice
|
package ice
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/shylinux/toolkits"
|
kit "github.com/shylinux/toolkits"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
@ -55,3 +55,14 @@ func (m *Message) AddCmd(cmd *Command) string {
|
|||||||
m.target.Commands[name] = cmd
|
m.target.Commands[name] = cmd
|
||||||
return kit.Keys(m.target.Cap(CTX_FOLLOW), name)
|
return kit.Keys(m.target.Cap(CTX_FOLLOW), name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Message) PushAction(list ...interface{}) {
|
||||||
|
m.Table(func(index int, value map[string]string, head []string) {
|
||||||
|
for _, k := range kit.Simple(list...) {
|
||||||
|
m.Push(k, m.Cmdx("render", "button", k))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func (m *Message) PushDetail(value interface{}, arg ...interface{}) *Message {
|
||||||
|
return m.Push("detail", value, arg...)
|
||||||
|
}
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
package docker
|
package docker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"path"
|
||||||
|
|
||||||
ice "github.com/shylinux/icebergs"
|
ice "github.com/shylinux/icebergs"
|
||||||
"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/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"
|
||||||
@ -11,69 +15,100 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
const DOCKER = "docker"
|
func MOD(str string) string { return str }
|
||||||
const (
|
func CMD(str string) string { return str }
|
||||||
IMAGE = "image"
|
func ARG(str string) string { return str }
|
||||||
CONTAINER = "container"
|
|
||||||
COMMAND = "command"
|
var DOCKER = MOD("docker")
|
||||||
|
var (
|
||||||
|
IMAGE = CMD("image")
|
||||||
|
CONTAINER = CMD("container")
|
||||||
|
COMMAND = CMD("command")
|
||||||
|
)
|
||||||
|
var (
|
||||||
|
ALPINE = ARG("alpine")
|
||||||
|
CENTOS = ARG("centos")
|
||||||
|
)
|
||||||
|
var (
|
||||||
|
_REPOSITORY = ARG("REPOSITORY")
|
||||||
|
_TAG = ARG("TAG")
|
||||||
|
|
||||||
|
_CONTAINER_ID = ARG("CONTAINER_ID")
|
||||||
|
_IMAGE_ID = ARG("IMAGE_ID")
|
||||||
)
|
)
|
||||||
|
|
||||||
var _docker = []string{cli.SYSTEM, DOCKER}
|
var _docker = []string{cli.SYSTEM, DOCKER}
|
||||||
var _image = []string{cli.SYSTEM, DOCKER, IMAGE}
|
var _image = []string{cli.SYSTEM, DOCKER, IMAGE}
|
||||||
var _container = []string{cli.SYSTEM, DOCKER, CONTAINER}
|
var _container = []string{cli.SYSTEM, DOCKER, CONTAINER}
|
||||||
|
|
||||||
var Index = &ice.Context{Name: "docker", Help: "虚拟机",
|
var Index = &ice.Context{Name: DOCKER, Help: "虚拟机",
|
||||||
Configs: map[string]*ice.Config{
|
Configs: map[string]*ice.Config{
|
||||||
DOCKER: {Name: "docker", Help: "虚拟机", Value: kit.Data(
|
DOCKER: {Name: DOCKER, Help: "虚拟机", Value: kit.Data(
|
||||||
"repos", "centos", "build", []interface{}{
|
"path", "usr/docker",
|
||||||
|
"repos", CENTOS, "build", []interface{}{
|
||||||
"home",
|
"home",
|
||||||
// "mount",
|
// "mount",
|
||||||
},
|
},
|
||||||
"alpine", []interface{}{
|
ALPINE, []interface{}{
|
||||||
`sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories`,
|
`sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories`,
|
||||||
`apk add curl`,
|
`apk add curl`,
|
||||||
},
|
},
|
||||||
"centos", []interface{}{
|
CENTOS, []interface{}{
|
||||||
`curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo`,
|
`curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo`,
|
||||||
`yum makecache`,
|
`yum makecache`,
|
||||||
},
|
},
|
||||||
)},
|
)},
|
||||||
|
IMAGE: {Name: IMAGE, Help: "镜像", Value: kit.Data(
|
||||||
|
"action", []interface{}{"build", "push", "pull", "start", "clear"},
|
||||||
|
)},
|
||||||
|
CONTAINER: {Name: CONTAINER, Help: "容器", Value: kit.Data(
|
||||||
|
"action", []interface{}{"open", "start", "stop", "restart", "clear"},
|
||||||
|
)},
|
||||||
},
|
},
|
||||||
Commands: map[string]*ice.Command{
|
Commands: map[string]*ice.Command{
|
||||||
IMAGE: {Name: "image IMAGE_ID=auto auto", Help: "镜像管理", Meta: kit.Dict(
|
IMAGE: {Name: "image IMAGE_ID=auto auto 清理:button", Help: "镜像管理", Meta: kit.Dict(
|
||||||
"detail", []string{"运行", "清理", "删除"},
|
"detail", []string{"运行", "清理", "删除"},
|
||||||
), Action: map[string]*ice.Action{
|
), Action: map[string]*ice.Action{
|
||||||
|
web.PULL: {Name: "pull", Help: "更新", Hand: func(m *ice.Message, arg ...string) {
|
||||||
|
m.Cmdy(_image, "pull", m.Option(_REPOSITORY))
|
||||||
|
}},
|
||||||
|
web.PUSH: {Name: "push", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
|
||||||
|
m.Cmdy(_image, "push", m.Option(_REPOSITORY))
|
||||||
|
}},
|
||||||
|
gdb.BUILD: {Name: "build", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
|
||||||
|
m.Cmd(cli.SYSTEM, "rm", "-r", "usr/docker/meta/demo/")
|
||||||
|
m.Cmd(cli.SYSTEM, "rm", "-r", "usr/docker/meta/volcanos/")
|
||||||
|
m.Cmd(cli.SYSTEM, "cp", "-r", "usr/demo/", "usr/docker/meta/demo/")
|
||||||
|
m.Cmd(cli.SYSTEM, "cp", "-r", "usr/volcanos/", "usr/docker/meta/volcanos/")
|
||||||
|
m.Cmdy(_docker, "build", m.Conf(DOCKER, "meta.path"), "-t", m.Option(_REPOSITORY),
|
||||||
|
"-f", path.Join(m.Conf(DOCKER, "meta.path"), m.Option(_REPOSITORY)),
|
||||||
|
)
|
||||||
|
}},
|
||||||
gdb.START: {Name: "start", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
|
gdb.START: {Name: "start", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_docker, "run", "-dt", m.Option("REPOSITORY")+":"+m.Option("TAG"))
|
m.Cmdy(_docker, "run", "-dt", "-p", m.Cmdx(tcp.PORT, "get")+":9020", m.Option(_REPOSITORY)+":"+m.Option(_TAG))
|
||||||
}},
|
}},
|
||||||
gdb.PRUNE: {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
gdb.PRUNE: {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_image, "prune", "-f")
|
m.Cmdy(_image, "prune", "-f")
|
||||||
}},
|
}},
|
||||||
gdb.CLEAR: {Name: "clear", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
gdb.CLEAR: {Name: "clear", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_image, "rm", m.Option("IMAGE_ID"))
|
m.Cmdy(_image, "rm", m.Option(_IMAGE_ID))
|
||||||
}},
|
|
||||||
web.PULL: {Name: "pull", Help: "更新", Hand: func(m *ice.Message, arg ...string) {
|
|
||||||
m.Cmdy(_image, "pull", m.Option("REPOSITORY"))
|
|
||||||
}},
|
}},
|
||||||
}, 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 {
|
||||||
// 容器详情
|
// 容器详情
|
||||||
res := m.Cmdx(_image, "inspect", arg[0])
|
res := m.Cmdx(_image, "inspect", arg[0])
|
||||||
m.Push("detail", kit.KeyValue(map[string]interface{}{}, "", kit.Parse(nil, "", kit.Split(res)...)))
|
m.PushDetail(kit.KeyValue(nil, "", kit.Parse(nil, "", kit.Split(res)...)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 镜像列表
|
// 镜像列表
|
||||||
m.Split(strings.Replace(m.Cmdx(_image, "ls"), "IMAGE ID", "IMAGE_ID", 1), "index", " ", "\n")
|
m.Split(strings.Replace(m.Cmdx(_image, "ls"), "IMAGE ID", _IMAGE_ID, 1), "index", " ", "\n")
|
||||||
m.Sort("REPOSITORY")
|
m.Sort(_REPOSITORY)
|
||||||
|
|
||||||
m.Table(func(index int, value map[string]string, head []string) {
|
// 镜像操作
|
||||||
for _, k := range []string{"pull", "start", "clear"} {
|
m.PushAction(m.Confv(IMAGE, "meta.action"))
|
||||||
m.Push(k, m.Cmdx("_render", web.RENDER.Button, k))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}},
|
}},
|
||||||
CONTAINER: {Name: "container CONTAINER_ID=auto auto", Help: "容器管理", Meta: kit.Dict(
|
CONTAINER: {Name: "container CONTAINER_ID=auto auto 清理:button", Help: "容器管理", Meta: kit.Dict(
|
||||||
"detail", []string{"进入", "启动", "停止", "重启", "清理", "编辑", "删除"},
|
"detail", []string{"进入", "启动", "停止", "重启", "清理", "编辑", "删除"},
|
||||||
), Action: map[string]*ice.Action{
|
), Action: map[string]*ice.Action{
|
||||||
gdb.OPEN: {Name: "open", Help: "进入", Hand: func(m *ice.Message, arg ...string) {
|
gdb.OPEN: {Name: "open", Help: "进入", Hand: func(m *ice.Message, arg ...string) {
|
||||||
@ -82,43 +117,50 @@ var Index = &ice.Context{Name: "docker", Help: "虚拟机",
|
|||||||
"-PF", "#{session_name}:#{window_name}.1", "docker exec -it "+m.Option("NAMES")+" sh")
|
"-PF", "#{session_name}:#{window_name}.1", "docker exec -it "+m.Option("NAMES")+" sh")
|
||||||
}},
|
}},
|
||||||
gdb.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
gdb.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_container, "start", m.Option("CONTAINER_ID"))
|
m.Cmdy(_container, "start", m.Option(_CONTAINER_ID))
|
||||||
}},
|
}},
|
||||||
gdb.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
|
gdb.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_container, "stop", m.Option("CONTAINER_ID"))
|
m.Cmdy(_container, "stop", m.Option(_CONTAINER_ID))
|
||||||
}},
|
}},
|
||||||
gdb.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
|
gdb.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_container, "restart", m.Option("CONTAINER_ID"))
|
m.Cmdy(_container, "restart", m.Option(_CONTAINER_ID))
|
||||||
}},
|
}},
|
||||||
gdb.CHANGE: {Name: "change", Help: "更改", Hand: func(m *ice.Message, arg ...string) {
|
gdb.CHANGE: {Name: "change", Help: "更改", Hand: func(m *ice.Message, arg ...string) {
|
||||||
switch arg[0] {
|
switch arg[0] {
|
||||||
case "NAMES":
|
case "NAMES":
|
||||||
m.Cmdy(_container, "rename", m.Option("CONTAINER_ID"), arg[1])
|
m.Cmdy(_container, "rename", m.Option(_CONTAINER_ID), arg[1])
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
gdb.PRUNE: {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
gdb.PRUNE: {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_container, "prune", "-f")
|
m.Cmdy(_container, "prune", "-f")
|
||||||
}},
|
}},
|
||||||
gdb.CLEAR: {Name: "clear", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
gdb.CLEAR: {Name: "clear", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||||
m.Cmdy(_container, "rm", m.Option("CONTAINER_ID"))
|
m.Cmdy(_container, "rm", m.Option(_CONTAINER_ID))
|
||||||
}},
|
}},
|
||||||
}, 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 {
|
||||||
// 容器详情
|
// 容器详情
|
||||||
res := m.Cmdx(_container, "inspect", arg[0])
|
res := m.Cmdx(_container, "inspect", arg[0])
|
||||||
m.Push("detail", kit.KeyValue(map[string]interface{}{}, "", kit.Parse(nil, "", kit.Split(res)...)))
|
m.PushDetail(kit.KeyValue(nil, "", kit.Parse(nil, "", kit.Split(res)...)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 容器列表
|
// 容器列表
|
||||||
m.Split(strings.Replace(m.Cmdx(_container, "ls", "-a"), "CONTAINER ID", "CONTAINER_ID", 1), "index", " ", "\n")
|
m.Split(strings.Replace(m.Cmdx(_container, "ls", "-a"), "CONTAINER ID", _CONTAINER_ID, 1), "index", " ", "\n")
|
||||||
m.Sort("NAMES")
|
m.Sort("NAMES")
|
||||||
|
|
||||||
m.Table(func(index int, value map[string]string, head []string) {
|
m.Table(func(index int, value map[string]string, head []string) {
|
||||||
for _, k := range []string{"open", "start", "stop", "restart", "clear"} {
|
if strings.TrimSpace(value["PORTS"]) == "" {
|
||||||
m.Push(k, m.Cmdx("_render", web.RENDER.Button, k))
|
return
|
||||||
}
|
}
|
||||||
|
ls := strings.Split(value["PORTS"], "->")
|
||||||
|
ls = strings.Split(ls[0], ":")
|
||||||
|
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||||
|
p := kit.Format("http://%s:%s", u.Hostname(), ls[1])
|
||||||
|
m.Echo("%s\n", m.Cmdx(mdb.RENDER, web.RENDER.A, p, p))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 容器操作
|
||||||
|
m.PushAction(m.Confv(CONTAINER, "meta.action"))
|
||||||
}},
|
}},
|
||||||
COMMAND: {Name: "command NAMES=auto cmd... auto", Help: "命令管理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
COMMAND: {Name: "command NAMES=auto cmd... auto", Help: "命令管理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
if len(arg) < 2 {
|
if len(arg) < 2 {
|
||||||
@ -132,9 +174,9 @@ var Index = &ice.Context{Name: "docker", Help: "虚拟机",
|
|||||||
m.Watch(web.DREAM_START)
|
m.Watch(web.DREAM_START)
|
||||||
}},
|
}},
|
||||||
gdb.AUTO: {Name: "auto", Help: "自动化", Action: map[string]*ice.Action{
|
gdb.AUTO: {Name: "auto", Help: "自动化", Action: map[string]*ice.Action{
|
||||||
web.DREAM_START: {Name: "dream.start", Hand: func(m *ice.Message, arg ...string) {
|
web.DREAM_START: {Hand: func(m *ice.Message, arg ...string) {
|
||||||
if m.Cmd(_container, "start", arg[0]).Append(cli.CMD_CODE) == "0" {
|
if m.Cmd(_container, "start", arg[0]).Append(cli.CMD_CODE) == "0" {
|
||||||
// 启动容器
|
// 重启容器
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
type.go
2
type.go
@ -87,7 +87,7 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess
|
|||||||
action, args = arg[1], arg[2:]
|
action, args = arg[1], arg[2:]
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.Hand = true; len(arg) > 1 && action != "" && cmd.Action != nil {
|
if m.Hand = true; action != "" && cmd.Action != nil {
|
||||||
if h, ok := cmd.Action[action]; ok {
|
if h, ok := cmd.Action[action]; ok {
|
||||||
m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3))
|
m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3))
|
||||||
h.Hand(m, args...)
|
h.Hand(m, args...)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user