diff --git a/base/gdb/gdb.go b/base/gdb/gdb.go index f9893d37..2bdb2757 100644 --- a/base/gdb/gdb.go +++ b/base/gdb/gdb.go @@ -1,10 +1,10 @@ package gdb import ( - "github.com/shylinux/icebergs" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/nfs" - "github.com/shylinux/toolkits" + kit "github.com/shylinux/toolkits" "os" "os/signal" @@ -99,6 +99,7 @@ const ( RESTART = "restart" CHANGE = "change" + BUILD = "build" PRUNE = "prune" CLEAR = "clear" ) diff --git a/meta.go b/meta.go index 1d8e537d..b1134fd0 100644 --- a/meta.go +++ b/meta.go @@ -362,7 +362,6 @@ func (m *Message) Split(str string, field string, space string, enter string) *M indexs := []int{} fields := kit.Split(field, space, space, space) for i, l := range kit.Split(str, enter, enter, enter) { - m.Debug("----%v----", l) if strings.TrimSpace(l) == "" { continue } diff --git a/misc.go b/misc.go index 4b467837..04d45a1c 100644 --- a/misc.go +++ b/misc.go @@ -1,7 +1,7 @@ package ice import ( - "github.com/shylinux/toolkits" + kit "github.com/shylinux/toolkits" "fmt" "sync/atomic" @@ -55,3 +55,14 @@ func (m *Message) AddCmd(cmd *Command) string { m.target.Commands[name] = cmd 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...) +} diff --git a/misc/docker/docker.go b/misc/docker/docker.go index 9877c0e1..e619214a 100644 --- a/misc/docker/docker.go +++ b/misc/docker/docker.go @@ -1,9 +1,13 @@ package docker import ( + "path" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/cli" "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/core/code" kit "github.com/shylinux/toolkits" @@ -11,69 +15,100 @@ import ( "strings" ) -const DOCKER = "docker" -const ( - IMAGE = "image" - CONTAINER = "container" - COMMAND = "command" +func MOD(str string) string { return str } +func CMD(str string) string { return str } +func ARG(str string) string { return str } + +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 _image = []string{cli.SYSTEM, DOCKER, IMAGE} 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{ - DOCKER: {Name: "docker", Help: "虚拟机", Value: kit.Data( - "repos", "centos", "build", []interface{}{ + DOCKER: {Name: DOCKER, Help: "虚拟机", Value: kit.Data( + "path", "usr/docker", + "repos", CENTOS, "build", []interface{}{ "home", // "mount", }, - "alpine", []interface{}{ + ALPINE, []interface{}{ `sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories`, `apk add curl`, }, - "centos", []interface{}{ + CENTOS, []interface{}{ `curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo`, `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{ - 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{"运行", "清理", "删除"}, ), 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) { - 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) { m.Cmdy(_image, "prune", "-f") }}, gdb.CLEAR: {Name: "clear", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - 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")) + m.Cmdy(_image, "rm", m.Option(_IMAGE_ID)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(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 } // 镜像列表 - m.Split(strings.Replace(m.Cmdx(_image, "ls"), "IMAGE ID", "IMAGE_ID", 1), "index", " ", "\n") - m.Sort("REPOSITORY") + m.Split(strings.Replace(m.Cmdx(_image, "ls"), "IMAGE ID", _IMAGE_ID, 1), "index", " ", "\n") + m.Sort(_REPOSITORY) - m.Table(func(index int, value map[string]string, head []string) { - for _, k := range []string{"pull", "start", "clear"} { - m.Push(k, m.Cmdx("_render", web.RENDER.Button, k)) - } - }) + // 镜像操作 + m.PushAction(m.Confv(IMAGE, "meta.action")) }}, - 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{"进入", "启动", "停止", "重启", "清理", "编辑", "删除"}, ), Action: map[string]*ice.Action{ 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") }}, 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) { - 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) { - 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) { switch arg[0] { 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) { m.Cmdy(_container, "prune", "-f") }}, 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) { if len(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 } // 容器列表 - 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.Table(func(index int, value map[string]string, head []string) { - for _, k := range []string{"open", "start", "stop", "restart", "clear"} { - m.Push(k, m.Cmdx("_render", web.RENDER.Button, k)) + if strings.TrimSpace(value["PORTS"]) == "" { + 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) { if len(arg) < 2 { @@ -132,9 +174,9 @@ var Index = &ice.Context{Name: "docker", Help: "虚拟机", m.Watch(web.DREAM_START) }}, 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" { - // 启动容器 + // 重启容器 return } diff --git a/type.go b/type.go index b883ed09..03e9ffce 100644 --- a/type.go +++ b/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:] } - 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 { m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3)) h.Hand(m, args...)