luci-app-dockerman: initial checkin
[project/luci.git] / applications / luci-app-dockerman / luasrc / model / cbi / dockerman / overview.lua
1 --[[
2 LuCI - Lua Configuration Interface
3 Copyright 2019 lisaac <https://github.com/lisaac/luci-app-dockerman>
4 ]]--
5
6 require "luci.util"
7 local docker = require "luci.model.docker"
8 local uci = require "luci.model.uci"
9
10 function byte_format(byte)
11 local suff = {"B", "KB", "MB", "GB", "TB"}
12 for i=1, 5 do
13 if byte > 1024 and i < 5 then
14 byte = byte / 1024
15 else
16 return string.format("%.2f %s", byte, suff[i])
17 end
18 end
19 end
20
21 local map_dockerman = Map("dockerman", translate("Docker"), translate("DockerMan is a Simple Docker manager client for LuCI, If you have any issue please visit:") .. " ".. [[<a href="https://github.com/lisaac/luci-app-dockerman" target="_blank">]] ..translate("Github") .. [[</a>]])
22 local docker_info_table = {}
23 -- docker_info_table['0OperatingSystem'] = {_key=translate("Operating System"),_value='-'}
24 -- docker_info_table['1Architecture'] = {_key=translate("Architecture"),_value='-'}
25 -- docker_info_table['2KernelVersion'] = {_key=translate("Kernel Version"),_value='-'}
26 docker_info_table['3ServerVersion'] = {_key=translate("Docker Version"),_value='-'}
27 docker_info_table['4ApiVersion'] = {_key=translate("Api Version"),_value='-'}
28 docker_info_table['5NCPU'] = {_key=translate("CPUs"),_value='-'}
29 docker_info_table['6MemTotal'] = {_key=translate("Total Memory"),_value='-'}
30 docker_info_table['7DockerRootDir'] = {_key=translate("Docker Root Dir"),_value='-'}
31 docker_info_table['8IndexServerAddress'] = {_key=translate("Index Server Address"),_value='-'}
32 docker_info_table['9RegistryMirrors'] = {_key=translate("Registry Mirrors"),_value='-'}
33
34 local s = map_dockerman:section(Table, docker_info_table)
35 s:option(DummyValue, "_key", translate("Info"))
36 s:option(DummyValue, "_value")
37 s = map_dockerman:section(SimpleSection)
38 s.containers_running = '-'
39 s.images_used = '-'
40 s.containers_total = '-'
41 s.images_total = '-'
42 s.networks_total = '-'
43 s.volumes_total = '-'
44 local containers_list
45 -- local socket = luci.model.uci.cursor():get("dockerman", "local", "socket_path")
46 if (require "luci.model.docker").new():_ping().code == 200 then
47 local dk = docker.new()
48 containers_list = dk.containers:list({query = {all=true}}).body
49 local images_list = dk.images:list().body
50 local vol = dk.volumes:list()
51 local volumes_list = vol and vol.body and vol.body.Volumes or {}
52 local networks_list = dk.networks:list().body or {}
53 local docker_info = dk:info()
54 -- docker_info_table['0OperatingSystem']._value = docker_info.body.OperatingSystem
55 -- docker_info_table['1Architecture']._value = docker_info.body.Architecture
56 -- docker_info_table['2KernelVersion']._value = docker_info.body.KernelVersion
57 docker_info_table['3ServerVersion']._value = docker_info.body.ServerVersion
58 docker_info_table['4ApiVersion']._value = docker_info.headers["Api-Version"]
59 docker_info_table['5NCPU']._value = tostring(docker_info.body.NCPU)
60 docker_info_table['6MemTotal']._value = byte_format(docker_info.body.MemTotal)
61 if docker_info.body.DockerRootDir then
62 local statvfs = nixio.fs.statvfs(docker_info.body.DockerRootDir)
63 local size = statvfs and (statvfs.bavail * statvfs.bsize) or 0
64 docker_info_table['7DockerRootDir']._value = docker_info.body.DockerRootDir .. " (" .. tostring(byte_format(size)) .. " " .. translate("Available") .. ")"
65 end
66 docker_info_table['8IndexServerAddress']._value = docker_info.body.IndexServerAddress
67 for i, v in ipairs(docker_info.body.RegistryConfig.Mirrors) do
68 docker_info_table['9RegistryMirrors']._value = docker_info_table['9RegistryMirrors']._value == "-" and v or (docker_info_table['9RegistryMirrors']._value .. ", " .. v)
69 end
70
71 s.images_used = 0
72 for i, v in ipairs(images_list) do
73 for ci,cv in ipairs(containers_list) do
74 if v.Id == cv.ImageID then
75 s.images_used = s.images_used + 1
76 break
77 end
78 end
79 end
80 s.containers_running = tostring(docker_info.body.ContainersRunning)
81 s.images_used = tostring(s.images_used)
82 s.containers_total = tostring(docker_info.body.Containers)
83 s.images_total = tostring(#images_list)
84 s.networks_total = tostring(#networks_list)
85 s.volumes_total = tostring(#volumes_list)
86 end
87 s.template = "dockerman/overview"
88
89 local section_dockerman = map_dockerman:section(NamedSection, "local", "section", translate("Setting"))
90 section_dockerman:tab("daemon", translate("Docker Daemon"))
91 section_dockerman:tab("ac", translate("Access Control"))
92 section_dockerman:tab("dockerman", translate("DockerMan"))
93
94 local socket_path = section_dockerman:taboption("dockerman", Value, "socket_path", translate("Docker Socket Path"))
95 socket_path.default = "/var/run/docker.sock"
96 socket_path.placeholder = "/var/run/docker.sock"
97 socket_path.rmempty = false
98
99 local remote_endpoint = section_dockerman:taboption("dockerman", Flag, "remote_endpoint", translate("Remote Endpoint"), translate("Dockerman connect to remote endpoint"))
100 remote_endpoint.rmempty = false
101 remote_endpoint.enabled = "true"
102 remote_endpoint.disabled = "false"
103
104 local remote_host = section_dockerman:taboption("dockerman", Value, "remote_host", translate("Remote Host"))
105 remote_host.placeholder = "10.1.1.2"
106 -- remote_host:depends("remote_endpoint", "true")
107
108 local remote_port = section_dockerman:taboption("dockerman", Value, "remote_port", translate("Remote Port"))
109 remote_port.placeholder = "2375"
110 remote_port.default = "2375"
111 -- remote_port:depends("remote_endpoint", "true")
112
113 -- local status_path = section_dockerman:taboption("dockerman", Value, "status_path", translate("Action Status Tempfile Path"), translate("Where you want to save the docker status file"))
114 -- local debug = section_dockerman:taboption("dockerman", Flag, "debug", translate("Enable Debug"), translate("For debug, It shows all docker API actions of luci-app-dockerman in Debug Tempfile Path"))
115 -- debug.enabled="true"
116 -- debug.disabled="false"
117 -- local debug_path = section_dockerman:taboption("dockerman", Value, "debug_path", translate("Debug Tempfile Path"), translate("Where you want to save the debug tempfile"))
118
119 if nixio.fs.access("/usr/bin/dockerd") then
120 local allowed_interface = section_dockerman:taboption("ac", DynamicList, "ac_allowed_interface", translate("Allowed access interfaces"), translate("Which interface(s) can access containers under the bridge network, fill-in Interface Name"))
121 local interfaces = luci.sys and luci.sys.net and luci.sys.net.devices() or {}
122 for i, v in ipairs(interfaces) do
123 allowed_interface:value(v, v)
124 end
125 local allowed_container = section_dockerman:taboption("ac", DynamicList, "ac_allowed_container", translate("Containers allowed to be accessed"), translate("Which container(s) under bridge network can be accessed, even from interfaces that are not allowed, fill-in Container Id or Name"))
126 -- allowed_container.placeholder = "container name_or_id"
127 if containers_list then
128 for i, v in ipairs(containers_list) do
129 if v.State == "running" and v.NetworkSettings and v.NetworkSettings.Networks and v.NetworkSettings.Networks.bridge and v.NetworkSettings.Networks.bridge.IPAddress then
130 allowed_container:value(v.Id:sub(1,12), v.Names[1]:sub(2) .. " | " .. v.NetworkSettings.Networks.bridge.IPAddress)
131 end
132 end
133 end
134
135 local dockerd_enable = section_dockerman:taboption("daemon", Flag, "daemon_ea", translate("Enable"))
136 dockerd_enable.enabled = "true"
137 dockerd_enable.rmempty = true
138 local data_root = section_dockerman:taboption("daemon", Value, "daemon_data_root", translate("Docker Root Dir"))
139 data_root.placeholder = "/opt/docker/"
140 local registry_mirrors = section_dockerman:taboption("daemon", DynamicList, "daemon_registry_mirrors", translate("Registry Mirrors"))
141 registry_mirrors:value("https://hub-mirror.c.163.com", "https://hub-mirror.c.163.com")
142
143 local log_level = section_dockerman:taboption("daemon", ListValue, "daemon_log_level", translate("Log Level"), translate('Set the logging level'))
144 log_level:value("debug", "debug")
145 log_level:value("info", "info")
146 log_level:value("warn", "warn")
147 log_level:value("error", "error")
148 log_level:value("fatal", "fatal")
149 local hosts = section_dockerman:taboption("daemon", DynamicList, "daemon_hosts", translate("Server Host"), translate('Daemon unix socket (unix:///var/run/docker.sock) or TCP Remote Hosts (tcp://0.0.0.0:2375), default: unix:///var/run/docker.sock'))
150 hosts:value("unix:///var/run/docker.sock", "unix:///var/run/docker.sock")
151 hosts:value("tcp://0.0.0.0:2375", "tcp://0.0.0.0:2375")
152 hosts.rmempty = true
153 end
154 return map_dockerman