diff --git a/base/tcp/tcp.go b/base/tcp/tcp.go index c972569e..a29d3691 100644 --- a/base/tcp/tcp.go +++ b/base/tcp/tcp.go @@ -12,6 +12,25 @@ import ( "strings" ) +func _port_list(m *ice.Message) string { + return "" +} +func _port_get(m *ice.Message) string { + current := kit.Int(m.Conf(PORT, "meta.current")) + end := kit.Int(m.Conf(PORT, "meta.end")) + if current >= end { + current = kit.Int(m.Conf(PORT, "meta.begin")) + } + for i := current; i < end; i++ { + if m.Cmd(cli.SYSTEM, "lsof", "-i", kit.Format(":%d", i)).Append(cli.CMD_CODE) != "0" { + m.Conf(PORT, "meta.current", i) + m.Log_CREATE(PORT, i) + return kit.Format("%d", i) + } + } + return "" +} + func _ip_list(m *ice.Message, ifname string) { if ifs, e := net.Interfaces(); m.Assert(e) { for _, v := range ifs { @@ -43,34 +62,8 @@ func _ip_islocal(m *ice.Message, ip string) (ok bool) { return true } - msg := m.Spawn() - _ip_list(msg, "") - msg.Table(func(index int, value map[string]string, head []string) { - if value["ip"] == ip { - ok = true - } - }) - return ok + return m.Richs(IP, kit.Keys("meta.white"), ip, nil) != nil } -func _port_list(m *ice.Message) string { - return "" -} -func _port_get(m *ice.Message) string { - current := kit.Int(m.Conf(PORT, "meta.current")) - end := kit.Int(m.Conf(PORT, "meta.end")) - if current >= end { - current = kit.Int(m.Conf(PORT, "meta.begin")) - } - for i := current; i < end; i++ { - if m.Cmd(cli.SYSTEM, "lsof", "-i", kit.Format(":%d", i)).Append(cli.CMD_CODE) != "0" { - m.Conf(PORT, "meta.current", i) - m.Log_CREATE(PORT, i) - return kit.Format("%d", i) - } - } - return "" -} - func IPIsLocal(m *ice.Message, ip string) bool { return _ip_islocal(m, ip) } @@ -82,15 +75,26 @@ const ( var Index = &ice.Context{Name: "tcp", Help: "通信模块", Configs: map[string]*ice.Config{ - PORT: &ice.Config{Name: "port", Help: "端口", Value: kit.Data( + PORT: {Name: "port", Help: "端口", Value: kit.Data( "begin", 10000, "current", 10000, "end", 20000, )}, + IP: {Name: "ip", Help: "地址", Value: kit.Data( + "black", kit.Dict(), + "white", kit.Data(kit.MDB_SHORT, kit.MDB_TEXT), + )}, }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save(PORT) }}, - IP: {Name: "ip", Help: "地址", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + IP: {Name: "ip", Help: "地址", Action: map[string]*ice.Action{ + "white": {Name: "show ip", Help: "白名单", Hand: func(m *ice.Message, arg ...string) { + m.Rich(IP, kit.Keys("meta.white"), kit.Dict( + kit.MDB_NAME, "", + kit.MDB_TEXT, arg[0], + )) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _ip_list(m, "") }}, PORT: {Name: "port", Help: "端口", Action: map[string]*ice.Action{ diff --git a/misc/docker/docker.go b/misc/docker/docker.go index 4a65aede..8d6137e8 100644 --- a/misc/docker/docker.go +++ b/misc/docker/docker.go @@ -4,6 +4,7 @@ import ( 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/web" "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" @@ -12,20 +13,86 @@ import ( ) const DOCKER = "docker" +const ( + IMAGE = "image" + CONTAINER = "container" +) var Index = &ice.Context{Name: "docker", Help: "虚拟机", Caches: map[string]*ice.Cache{}, Configs: map[string]*ice.Config{ - INSTALL: {Name: "install", Help: "安装", Value: kit.Data("path", "usr/install", - "linux", "https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz", - "darwin", "https://dl.google.com/go/go1.14.2.darwin-amd64.pkg", - "windows", "https://dl.google.com/go/go1.14.2.windows-amd64.msi", - "source", "https://dl.google.com/go/go1.14.2.src.tar.gz", - "target", "usr/local", - )}, - DOCKER: {Name: "docker", Help: "虚拟机", Value: kit.Data(kit.MDB_SHORT, "name", "build", []interface{}{})}, + DOCKER: {Name: "docker", Help: "虚拟机", Value: kit.Data( + kit.MDB_SHORT, "name", "build", []interface{}{}), + }, }, Commands: map[string]*ice.Command{ + IMAGE: {Name: "image", Help: "镜像管理", Meta: kit.Dict("detail", []string{"运行", "清理", "删除"}), List: ListLook("IMAGE_ID"), Action: map[string]*ice.Action{ + "run": {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(cli.SYSTEM, DOCKER, "run", "-dt", m.Option("REPOSITORY")+":"+m.Option("TAG")) + }}, + "prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(cli.SYSTEM, DOCKER, "prune", "-f") + }}, + mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(cli.SYSTEM, DOCKER, "rm", m.Option("IMAGE_ID")) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + prefix := []string{cli.SYSTEM, DOCKER, IMAGE} + if len(arg) > 0 { + // 容器详情 + res := m.Cmdx(prefix, "inspect", arg[0]) + m.Push("detail", kit.KeyValue(map[string]interface{}{}, "", kit.Parse(nil, "", kit.Split(res)...))) + return + } + + // 镜像列表 + m.Split(strings.Replace(m.Cmdx(prefix, "ls"), "IMAGE ID", "IMAGE_ID", 1), "index", " ", "\n") + m.Sort("REPOSITORY") + }}, + CONTAINER: {Name: "container", Help: "容器管理", List: ListLook("CONTAINER_ID"), Meta: kit.Dict("detail", []string{"进入", "启动", "停止", "重启", "清理", "编辑", "删除"}), Action: map[string]*ice.Action{ + "prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(cli.SYSTEM, DOCKER, "prune", "-f") + m.Cmdy(prefix, "prune", "-f") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + prefix := []string{cli.SYSTEM, DOCKER, CONTAINER} + if len(arg) > 1 && arg[0] == "action" { + switch arg[1] { + case "进入": + m.Cmdy(cli.SYSTEM, "tmux", "new-window", "-t", m.Option("NAMES"), "-n", m.Option("NAMES"), + "-PF", "#{session_name}:#{window_name}.1", "docker exec -it "+m.Option("NAMES")+" bash").Set("append") + return + case "停止": + m.Cmdy(prefix, "stop", m.Option("CONTAINER_ID")) + case "启动": + m.Cmdy(prefix, "start", m.Option("CONTAINER_ID")) + case "重启": + m.Cmdy(prefix, "restart", m.Option("CONTAINER_ID")) + case "清理": + m.Cmdy(prefix, "prune", "-f") + case "modify": + switch arg[2] { + case "NAMES": + m.Cmdy(prefix, "rename", arg[4], arg[3]) + } + case "delete": + m.Cmdy(prefix, "rm", m.Option("CONTAINER_ID")).Set("append") + } + return + } + + if len(arg) > 0 { + // 容器详情 + res := m.Cmdx(prefix, "inspect", arg[0]) + m.Push("detail", kit.KeyValue(map[string]interface{}{}, "", kit.Parse(nil, "", kit.Split(res)...))) + return + } + + // 容器列表 + m.Split(strings.Replace(m.Cmdx(prefix, "ls", "-a"), "CONTAINER ID", "CONTAINER_ID", 1), "index", " ", "\n") + m.Sort("NAMES") + }}, + "init": {Name: "init", Help: "初始化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Watch(gdb.DREAM_START, m.Prefix("auto")) @@ -65,77 +132,6 @@ var Index = &ice.Context{Name: "docker", Help: "虚拟机", }) }}, - "image": {Name: "image", Help: "镜像管理", Meta: kit.Dict("detail", []string{"运行", "清理", "删除"}), List: ListLook("IMAGE_ID"), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - prefix := []string{cli.SYSTEM, "docker", "image"} - if len(arg) > 1 && arg[0] == "action" { - switch arg[1] { - case "运行": - m.Cmdy(prefix[:2], "run", "-dt", m.Option("REPOSITORY")+":"+m.Option("TAG")).Set("append") - return - case "清理": - m.Cmdy(prefix, "prune", "-f").Set("append") - return - case "delete": - m.Cmdy(prefix, "rm", m.Option("IMAGE_ID")).Set("append") - return - } - } - - if len(arg) > 0 { - // 容器详情 - res := m.Cmdx(prefix, "inspect", arg[0]) - m.Push("detail", kit.KeyValue(map[string]interface{}{}, "", kit.Parse(nil, "", kit.Split(res)...))) - return - } - - if len(arg) > 0 { - // 下载镜像 - m.Cmdy(prefix, "pull", arg[0]+":"+kit.Select("latest", arg, 1)).Set("append") - return - } - - // 镜像列表 - m.Split(strings.Replace(m.Cmdx(prefix, "ls"), "IMAGE ID", "IMAGE_ID", 1), "index", " ", "\n") - m.Sort("REPOSITORY") - }}, - "container": {Name: "container", Help: "容器管理", List: ListLook("CONTAINER_ID"), Meta: kit.Dict("detail", []string{"进入", "启动", "停止", "重启", "清理", "编辑", "删除"}), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - prefix := []string{cli.SYSTEM, "docker", "container"} - if len(arg) > 1 && arg[0] == "action" { - switch arg[1] { - case "进入": - m.Cmdy(cli.SYSTEM, "tmux", "new-window", "-t", m.Option("NAMES"), "-n", m.Option("NAMES"), - "-PF", "#{session_name}:#{window_name}.1", "docker exec -it "+m.Option("NAMES")+" bash").Set("append") - return - case "停止": - m.Cmdy(prefix, "stop", m.Option("CONTAINER_ID")) - case "启动": - m.Cmdy(prefix, "start", m.Option("CONTAINER_ID")) - case "重启": - m.Cmdy(prefix, "restart", m.Option("CONTAINER_ID")) - case "清理": - m.Cmdy(prefix, "prune", "-f") - case "modify": - switch arg[2] { - case "NAMES": - m.Cmdy(prefix, "rename", arg[4], arg[3]) - } - case "delete": - m.Cmdy(prefix, "rm", m.Option("CONTAINER_ID")).Set("append") - } - return - } - - if len(arg) > 0 { - // 容器详情 - res := m.Cmdx(prefix, "inspect", arg[0]) - m.Push("detail", kit.KeyValue(map[string]interface{}{}, "", kit.Parse(nil, "", kit.Split(res)...))) - return - } - - // 容器列表 - m.Split(strings.Replace(m.Cmdx(prefix, "ls", "-a"), "CONTAINER ID", "CONTAINER_ID", 1), "index", " ", "\n") - m.Sort("NAMES") - }}, "command": {Name: "command", Help: "命令", List: kit.List( kit.MDB_INPUT, "text", "name", "CONTAINER_ID", kit.MDB_INPUT, "text", "name", "cmd", "className", "args cmd", diff --git a/misc/totp/totp.go b/misc/totp/totp.go index 5e0a4b5a..7ebd1432 100644 --- a/misc/totp/totp.go +++ b/misc/totp/totp.go @@ -78,7 +78,7 @@ var Index = &ice.Context{Name: "totp", Help: "动态码", if len(arg) == 1 { // 创建密钥 - arg = append(arg, gen(30)) + arg = append(arg, _totp_gen(30)) } // 添加密钥 @@ -94,7 +94,7 @@ var Index = &ice.Context{Name: "totp", Help: "动态码", m.Push("time", m.Time()) m.Push("rest", per-time.Now().Unix()%per) m.Push("name", value["name"]) - m.Push("code", get(kit.Format(value["text"]), kit.Int(kit.Select("6", value["number"])), per)) + m.Push("code", _totp_get(kit.Format(value["text"]), kit.Int(kit.Select("6", value["number"])), per)) }) return @@ -102,7 +102,7 @@ var Index = &ice.Context{Name: "totp", Help: "动态码", m.Richs("totp", nil, arg[0], func(key string, value map[string]interface{}) { // 获取密码 - m.Echo(get(kit.Format(value["text"]), kit.Int(kit.Select("6", arg, 1)), kit.Int64(kit.Select("30", arg, 2)))) + m.Echo(_totp_get(kit.Format(value["text"]), kit.Int(kit.Select("6", arg, 1)), kit.Int64(kit.Select("30", arg, 2)))) }) }}, },