luci-app-dockerman: cbi/newcontainer update coding style
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
This commit is contained in:
parent
630a66163a
commit
cb65bb3d8e
1 changed files with 509 additions and 437 deletions
|
@ -5,28 +5,48 @@ Copyright 2019 lisaac <https://github.com/lisaac/luci-app-dockerman>
|
||||||
|
|
||||||
require "luci.util"
|
require "luci.util"
|
||||||
local uci = luci.model.uci.cursor()
|
local uci = luci.model.uci.cursor()
|
||||||
|
|
||||||
local docker = require "luci.model.docker"
|
local docker = require "luci.model.docker"
|
||||||
|
|
||||||
local dk = docker.new()
|
local dk = docker.new()
|
||||||
|
|
||||||
local cmd_line = table.concat(arg, '/')
|
local cmd_line = table.concat(arg, '/')
|
||||||
local create_body = {}
|
local create_body = {}
|
||||||
|
|
||||||
local images = dk.images:list().body
|
local images = dk.images:list().body
|
||||||
local networks = dk.networks:list().body
|
local networks = dk.networks:list().body
|
||||||
local containers = dk.containers:list({query = {all=true}}).body
|
local containers = dk.containers:list({
|
||||||
|
query = {
|
||||||
|
all=true
|
||||||
|
}
|
||||||
|
}).body
|
||||||
|
|
||||||
local is_quot_complete = function(str)
|
local is_quot_complete = function(str)
|
||||||
|
local num = 0, w
|
||||||
require "math"
|
require "math"
|
||||||
if not str then return true end
|
|
||||||
|
if not str then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local num = 0, w
|
local num = 0, w
|
||||||
for w in str:gmatch("\"") do
|
for w in str:gmatch("\"") do
|
||||||
num = num + 1
|
num = num + 1
|
||||||
end
|
end
|
||||||
if math.fmod(num, 2) ~= 0 then return false end
|
|
||||||
|
if math.fmod(num, 2) ~= 0 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
num = 0
|
num = 0
|
||||||
for w in str:gmatch("\'") do
|
for w in str:gmatch("\'") do
|
||||||
num = num + 1
|
num = num + 1
|
||||||
end
|
end
|
||||||
if math.fmod(num, 2) ~= 0 then return false end
|
|
||||||
|
if math.fmod(num, 2) ~= 0 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -251,7 +271,9 @@ local resolve_cli = function(cmd_line)
|
||||||
config[key_abb["P"]] = true
|
config[key_abb["P"]] = true
|
||||||
key:gsub("P", "")
|
key:gsub("P", "")
|
||||||
end
|
end
|
||||||
if key == "" then key = nil end
|
if key == "" then
|
||||||
|
key = nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -283,18 +305,19 @@ local resolve_cli = function(cmd_line)
|
||||||
local source = (_type ~= "tmpfs") and (w:match("source=([^,]+),") or w:match("src=([^,]+),")) or ""
|
local source = (_type ~= "tmpfs") and (w:match("source=([^,]+),") or w:match("src=([^,]+),")) or ""
|
||||||
local target = w:match(",target=([^,]+)") or w:match(",dst=([^,]+)") or w:match(",destination=([^,]+)") or ""
|
local target = w:match(",target=([^,]+)") or w:match(",dst=([^,]+)") or w:match(",destination=([^,]+)") or ""
|
||||||
local ro = w:match(",readonly") and "ro" or nil
|
local ro = w:match(",readonly") and "ro" or nil
|
||||||
|
|
||||||
if source and target then
|
if source and target then
|
||||||
if _type ~= "tmpfs" then
|
if _type ~= "tmpfs" then
|
||||||
-- bind or volume
|
|
||||||
local bind_propagation = (_type == "bind") and w:match(",bind%-propagation=([^,]+)") or nil
|
local bind_propagation = (_type == "bind") and w:match(",bind%-propagation=([^,]+)") or nil
|
||||||
val = source..":"..target .. ((ro or bind_propagation) and (":" .. (ro and ro or "") .. (((ro and bind_propagation) and "," or "") .. (bind_propagation and bind_propagation or ""))or ""))
|
val = source..":"..target .. ((ro or bind_propagation) and (":" .. (ro and ro or "") .. (((ro and bind_propagation) and "," or "") .. (bind_propagation and bind_propagation or ""))or ""))
|
||||||
else
|
else
|
||||||
-- tmpfs
|
|
||||||
local tmpfs_mode = w:match(",tmpfs%-mode=([^,]+)") or nil
|
local tmpfs_mode = w:match(",tmpfs%-mode=([^,]+)") or nil
|
||||||
local tmpfs_size = w:match(",tmpfs%-size=([^,]+)") or nil
|
local tmpfs_size = w:match(",tmpfs%-size=([^,]+)") or nil
|
||||||
key = "tmpfs"
|
key = "tmpfs"
|
||||||
val = target .. ((tmpfs_mode or tmpfs_size) and (":" .. (tmpfs_mode and ("mode=" .. tmpfs_mode) or "") .. ((tmpfs_mode and tmpfs_size) and "," or "") .. (tmpfs_size and ("size=".. tmpfs_size) or "")) or "")
|
val = target .. ((tmpfs_mode or tmpfs_size) and (":" .. (tmpfs_mode and ("mode=" .. tmpfs_mode) or "") .. ((tmpfs_mode and tmpfs_size) and "," or "") .. (tmpfs_size and ("size=".. tmpfs_size) or "")) or "")
|
||||||
if not config[key] then config[key] = {} end
|
if not config[key] then
|
||||||
|
config[key] = {}
|
||||||
|
end
|
||||||
table.insert( config[key], val )
|
table.insert( config[key], val )
|
||||||
key = nil
|
key = nil
|
||||||
val = nil
|
val = nil
|
||||||
|
@ -309,14 +332,15 @@ local resolve_cli = function(cmd_line)
|
||||||
if (key or _key) and val then
|
if (key or _key) and val then
|
||||||
key = _key or key
|
key = _key or key
|
||||||
if contains(key_with_list, key) then
|
if contains(key_with_list, key) then
|
||||||
if not config[key] then config[key] = {} end
|
if not config[key] then
|
||||||
|
config[key] = {}
|
||||||
|
end
|
||||||
if _key then
|
if _key then
|
||||||
config[key][#config[key]] = config[key][#config[key]] .. " " .. w
|
config[key][#config[key]] = config[key][#config[key]] .. " " .. w
|
||||||
else
|
else
|
||||||
table.insert( config[key], val )
|
table.insert( config[key], val )
|
||||||
end
|
end
|
||||||
if is_quot_complete(config[key][#config[key]]) then
|
if is_quot_complete(config[key][#config[key]]) then
|
||||||
-- clear quotation marks
|
|
||||||
config[key][#config[key]] = config[key][#config[key]]:gsub("[\"\']", "")
|
config[key][#config[key]] = config[key][#config[key]]:gsub("[\"\']", "")
|
||||||
_key = nil
|
_key = nil
|
||||||
else
|
else
|
||||||
|
@ -325,7 +349,6 @@ local resolve_cli = function(cmd_line)
|
||||||
else
|
else
|
||||||
config[key] = (config[key] and (config[key] .. " ") or "") .. val
|
config[key] = (config[key] and (config[key] .. " ") or "") .. val
|
||||||
if is_quot_complete(config[key]) then
|
if is_quot_complete(config[key]) then
|
||||||
-- clear quotation marks
|
|
||||||
config[key] = config[key]:gsub("[\"\']", "")
|
config[key] = config[key]:gsub("[\"\']", "")
|
||||||
_key = nil
|
_key = nil
|
||||||
else
|
else
|
||||||
|
@ -336,16 +359,22 @@ local resolve_cli = function(cmd_line)
|
||||||
val = nil
|
val = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return config
|
return config
|
||||||
end
|
end
|
||||||
-- reslvo default config
|
|
||||||
local default_config = {}
|
local default_config = {}
|
||||||
|
|
||||||
if cmd_line and cmd_line:match("^DOCKERCLI.+") then
|
if cmd_line and cmd_line:match("^DOCKERCLI.+") then
|
||||||
default_config = resolve_cli(cmd_line)
|
default_config = resolve_cli(cmd_line)
|
||||||
elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then
|
elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then
|
||||||
local container_id = cmd_line:match("^duplicate/(.+)")
|
local container_id = cmd_line:match("^duplicate/(.+)")
|
||||||
create_body = dk:containers_duplicate_config({id = container_id}) or {}
|
create_body = dk:containers_duplicate_config({id = container_id}) or {}
|
||||||
if not create_body.HostConfig then create_body.HostConfig = {} end
|
|
||||||
|
if not create_body.HostConfig then
|
||||||
|
create_body.HostConfig = {}
|
||||||
|
end
|
||||||
|
|
||||||
if next(create_body) ~= nil then
|
if next(create_body) ~= nil then
|
||||||
default_config.name = nil
|
default_config.name = nil
|
||||||
default_config.image = create_body.Image
|
default_config.image = create_body.Image
|
||||||
|
@ -354,8 +383,6 @@ elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then
|
||||||
default_config.interactive = create_body.OpenStdin and true or false
|
default_config.interactive = create_body.OpenStdin and true or false
|
||||||
default_config.privileged = create_body.HostConfig.Privileged and true or false
|
default_config.privileged = create_body.HostConfig.Privileged and true or false
|
||||||
default_config.restart = create_body.HostConfig.RestartPolicy and create_body.HostConfig.RestartPolicy.name or nil
|
default_config.restart = create_body.HostConfig.RestartPolicy and create_body.HostConfig.RestartPolicy.name or nil
|
||||||
-- default_config.network = create_body.HostConfig.NetworkMode == "default" and "bridge" or create_body.HostConfig.NetworkMode
|
|
||||||
-- if container has leave original network, and add new network, .HostConfig.NetworkMode is INcorrect, so using first child of .NetworkingConfig.EndpointsConfig
|
|
||||||
default_config.network = create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and next(create_body.NetworkingConfig.EndpointsConfig) or nil
|
default_config.network = create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and next(create_body.NetworkingConfig.EndpointsConfig) or nil
|
||||||
default_config.ip = default_config.network and default_config.network ~= "bridge" and default_config.network ~= "host" and default_config.network ~= "null" and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig.IPv4Address or nil
|
default_config.ip = default_config.network and default_config.network ~= "bridge" and default_config.network ~= "host" and default_config.network ~= "null" and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig.IPv4Address or nil
|
||||||
default_config.link = create_body.HostConfig.Links
|
default_config.link = create_body.HostConfig.Links
|
||||||
|
@ -400,6 +427,7 @@ elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then
|
||||||
table.insert( default_config.device, v.PathOnHost..":"..v.PathInContainer..(v.CgroupPermissions ~= "" and (":" .. v.CgroupPermissions) or "") )
|
table.insert( default_config.device, v.PathOnHost..":"..v.PathInContainer..(v.CgroupPermissions ~= "" and (":" .. v.CgroupPermissions) or "") )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if create_body.HostConfig.Tmpfs and type(create_body.HostConfig.Tmpfs) == "table" then
|
if create_body.HostConfig.Tmpfs and type(create_body.HostConfig.Tmpfs) == "table" then
|
||||||
default_config.tmpfs = {}
|
default_config.tmpfs = {}
|
||||||
for k, v in pairs(create_body.HostConfig.Tmpfs) do
|
for k, v in pairs(create_body.HostConfig.Tmpfs) do
|
||||||
|
@ -411,15 +439,14 @@ end
|
||||||
|
|
||||||
local m = SimpleForm("docker", translate("Docker"))
|
local m = SimpleForm("docker", translate("Docker"))
|
||||||
m.redirect = luci.dispatcher.build_url("admin", "docker", "containers")
|
m.redirect = luci.dispatcher.build_url("admin", "docker", "containers")
|
||||||
-- m.reset = false
|
|
||||||
-- m.submit = false
|
|
||||||
-- new Container
|
|
||||||
|
|
||||||
docker_status = m:section(SimpleSection)
|
docker_status = m:section(SimpleSection)
|
||||||
docker_status.template = "dockerman/apply_widget"
|
docker_status.template = "dockerman/apply_widget"
|
||||||
docker_status.err=docker:read_status()
|
docker_status.err=docker:read_status()
|
||||||
docker_status.err=docker_status.err and docker_status.err:gsub("\n","<br>"):gsub(" "," ")
|
docker_status.err=docker_status.err and docker_status.err:gsub("\n","<br>"):gsub(" "," ")
|
||||||
if docker_status.err then docker:clear_status() end
|
if docker_status.err then
|
||||||
|
docker:clear_status()
|
||||||
|
end
|
||||||
|
|
||||||
local s = m:section(SimpleSection, translate("New Container"))
|
local s = m:section(SimpleSection, translate("New Container"))
|
||||||
s.addremove = true
|
s.addremove = true
|
||||||
|
@ -495,22 +522,30 @@ d.placeholder = "8.8.8.8"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d.default = default_config.dns or nil
|
d.default = default_config.dns or nil
|
||||||
|
|
||||||
d = s:option(Value, "user", translate("User(-u)"), translate("The user that commands are run as inside the container.(format: name|uid[:group|gid])"))
|
d = s:option(Value, "user",
|
||||||
|
translate("User(-u)"),
|
||||||
|
translate("The user that commands are run as inside the container.(format: name|uid[:group|gid])"))
|
||||||
d.placeholder = "1000:1000"
|
d.placeholder = "1000:1000"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d.default = default_config.user or nil
|
d.default = default_config.user or nil
|
||||||
|
|
||||||
d = s:option(DynamicList, "env", translate("Environmental Variable(-e)"), translate("Set environment variables to inside the container"))
|
d = s:option(DynamicList, "env",
|
||||||
|
translate("Environmental Variable(-e)"),
|
||||||
|
translate("Set environment variables to inside the container"))
|
||||||
d.placeholder = "TZ=Asia/Shanghai"
|
d.placeholder = "TZ=Asia/Shanghai"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d.default = default_config.env or nil
|
d.default = default_config.env or nil
|
||||||
|
|
||||||
d = s:option(DynamicList, "volume", translate("Bind Mount(-v)"), translate("Bind mount a volume"))
|
d = s:option(DynamicList, "volume",
|
||||||
|
translate("Bind Mount(-v)"),
|
||||||
|
translate("Bind mount a volume"))
|
||||||
d.placeholder = "/media:/media:slave"
|
d.placeholder = "/media:/media:slave"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d.default = default_config.volume or nil
|
d.default = default_config.volume or nil
|
||||||
|
|
||||||
local d_publish = s:option(DynamicList, "publish", translate("Exposed Ports(-p)"), translate("Publish container's port(s) to the host"))
|
local d_publish = s:option(DynamicList, "publish",
|
||||||
|
translate("Exposed Ports(-p)"),
|
||||||
|
translate("Publish container's port(s) to the host"))
|
||||||
d_publish.placeholder = "2200:22/tcp"
|
d_publish.placeholder = "2200:22/tcp"
|
||||||
d_publish.rmempty = true
|
d_publish.rmempty = true
|
||||||
d_publish.default = default_config.publish or nil
|
d_publish.default = default_config.publish or nil
|
||||||
|
@ -526,70 +561,92 @@ d.disabled = 0
|
||||||
d.enabled = 1
|
d.enabled = 1
|
||||||
d.default = default_config.advance or 0
|
d.default = default_config.advance or 0
|
||||||
|
|
||||||
d = s:option(Value, "hostname", translate("Host Name"), translate("The hostname to use for the container"))
|
d = s:option(Value, "hostname",
|
||||||
|
translate("Host Name"),
|
||||||
|
translate("The hostname to use for the container"))
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d.default = default_config.hostname or nil
|
d.default = default_config.hostname or nil
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
|
|
||||||
d = s:option(Flag, "publish_all", translate("Exposed All Ports(-P)"), translate("Allocates an ephemeral host port for all of a container's exposed ports"))
|
d = s:option(Flag, "publish_all",
|
||||||
|
translate("Exposed All Ports(-P)"),
|
||||||
|
translate("Allocates an ephemeral host port for all of a container's exposed ports"))
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d.disabled = 0
|
d.disabled = 0
|
||||||
d.enabled = 1
|
d.enabled = 1
|
||||||
d.default = default_config.publish_all and 1 or 0
|
d.default = default_config.publish_all and 1 or 0
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
|
|
||||||
d = s:option(DynamicList, "device", translate("Device(--device)"), translate("Add host device to the container"))
|
d = s:option(DynamicList, "device",
|
||||||
|
translate("Device(--device)"),
|
||||||
|
translate("Add host device to the container"))
|
||||||
d.placeholder = "/dev/sda:/dev/xvdc:rwm"
|
d.placeholder = "/dev/sda:/dev/xvdc:rwm"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.default = default_config.device or nil
|
d.default = default_config.device or nil
|
||||||
|
|
||||||
d = s:option(DynamicList, "tmpfs", translate("Tmpfs(--tmpfs)"), translate("Mount tmpfs directory"))
|
d = s:option(DynamicList, "tmpfs",
|
||||||
|
translate("Tmpfs(--tmpfs)"),
|
||||||
|
translate("Mount tmpfs directory"))
|
||||||
d.placeholder = "/run:rw,noexec,nosuid,size=65536k"
|
d.placeholder = "/run:rw,noexec,nosuid,size=65536k"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.default = default_config.tmpfs or nil
|
d.default = default_config.tmpfs or nil
|
||||||
|
|
||||||
d = s:option(DynamicList, "sysctl", translate("Sysctl(--sysctl)"), translate("Sysctls (kernel parameters) options"))
|
d = s:option(DynamicList, "sysctl",
|
||||||
|
translate("Sysctl(--sysctl)"),
|
||||||
|
translate("Sysctls (kernel parameters) options"))
|
||||||
d.placeholder = "net.ipv4.ip_forward=1"
|
d.placeholder = "net.ipv4.ip_forward=1"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.default = default_config.sysctl or nil
|
d.default = default_config.sysctl or nil
|
||||||
|
|
||||||
d = s:option(DynamicList, "cap_add", translate("CAP-ADD(--cap-add)"), translate("A list of kernel capabilities to add to the container"))
|
d = s:option(DynamicList, "cap_add",
|
||||||
|
translate("CAP-ADD(--cap-add)"),
|
||||||
|
translate("A list of kernel capabilities to add to the container"))
|
||||||
d.placeholder = "NET_ADMIN"
|
d.placeholder = "NET_ADMIN"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.default = default_config.cap_add or nil
|
d.default = default_config.cap_add or nil
|
||||||
|
|
||||||
d = s:option(Value, "cpus", translate("CPUs"), translate("Number of CPUs. Number is a fractional number. 0.000 means no limit"))
|
d = s:option(Value, "cpus",
|
||||||
|
translate("CPUs"),
|
||||||
|
translate("Number of CPUs. Number is a fractional number. 0.000 means no limit"))
|
||||||
d.placeholder = "1.5"
|
d.placeholder = "1.5"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.datatype="ufloat"
|
d.datatype="ufloat"
|
||||||
d.default = default_config.cpus or nil
|
d.default = default_config.cpus or nil
|
||||||
|
|
||||||
d = s:option(Value, "cpu_shares", translate("CPU Shares Weight"), translate("CPU shares relative weight, if 0 is set, the system will ignore the value and use the default of 1024"))
|
d = s:option(Value, "cpu_shares",
|
||||||
|
translate("CPU Shares Weight"),
|
||||||
|
translate("CPU shares relative weight, if 0 is set, the system will ignore the value and use the default of 1024"))
|
||||||
d.placeholder = "1024"
|
d.placeholder = "1024"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.datatype="uinteger"
|
d.datatype="uinteger"
|
||||||
d.default = default_config.cpu_shares or nil
|
d.default = default_config.cpu_shares or nil
|
||||||
|
|
||||||
d = s:option(Value, "memory", translate("Memory"), translate("Memory limit (format: <number>[<unit>]). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M"))
|
d = s:option(Value, "memory",
|
||||||
|
translate("Memory"),
|
||||||
|
translate("Memory limit (format: <number>[<unit>]). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M"))
|
||||||
d.placeholder = "128m"
|
d.placeholder = "128m"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.default = default_config.memory or nil
|
d.default = default_config.memory or nil
|
||||||
|
|
||||||
d = s:option(Value, "blkio_weight", translate("Block IO Weight"), translate("Block IO weight (relative weight) accepts a weight value between 10 and 1000"))
|
d = s:option(Value, "blkio_weight",
|
||||||
|
translate("Block IO Weight"),
|
||||||
|
translate("Block IO weight (relative weight) accepts a weight value between 10 and 1000"))
|
||||||
d.placeholder = "500"
|
d.placeholder = "500"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
d.datatype="uinteger"
|
d.datatype="uinteger"
|
||||||
d.default = default_config.blkio_weight or nil
|
d.default = default_config.blkio_weight or nil
|
||||||
|
|
||||||
d = s:option(DynamicList, "log_opt", translate("Log driver options"), translate("The logging configuration for this container"))
|
d = s:option(DynamicList, "log_opt",
|
||||||
|
translate("Log driver options"),
|
||||||
|
translate("The logging configuration for this container"))
|
||||||
d.placeholder = "max-size=1m"
|
d.placeholder = "max-size=1m"
|
||||||
d.rmempty = true
|
d.rmempty = true
|
||||||
d:depends("advance", 1)
|
d:depends("advance", 1)
|
||||||
|
@ -614,7 +671,10 @@ for _, v in ipairs (networks) do
|
||||||
end
|
end
|
||||||
|
|
||||||
m.handle = function(self, state, data)
|
m.handle = function(self, state, data)
|
||||||
if state ~= FORM_VALID then return end
|
if state ~= FORM_VALID then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local tmp
|
local tmp
|
||||||
local name = data.name or ("luci_" .. os.date("%Y%m%d%H%M%S"))
|
local name = data.name or ("luci_" .. os.date("%Y%m%d%H%M%S"))
|
||||||
local hostname = data.hostname
|
local hostname = data.hostname
|
||||||
|
@ -623,15 +683,18 @@ m.handle = function(self, state, data)
|
||||||
local interactive = type(data.interactive) == "number" and (data.interactive == 1 and true or false) or default_config.interactive or false
|
local interactive = type(data.interactive) == "number" and (data.interactive == 1 and true or false) or default_config.interactive or false
|
||||||
local image = data.image
|
local image = data.image
|
||||||
local user = data.user
|
local user = data.user
|
||||||
|
|
||||||
if image and not image:match(".-:.+") then
|
if image and not image:match(".-:.+") then
|
||||||
image = image .. ":latest"
|
image = image .. ":latest"
|
||||||
end
|
end
|
||||||
|
|
||||||
local privileged = type(data.privileged) == "number" and (data.privileged == 1 and true or false) or default_config.privileged or false
|
local privileged = type(data.privileged) == "number" and (data.privileged == 1 and true or false) or default_config.privileged or false
|
||||||
local restart = data.restart
|
local restart = data.restart
|
||||||
local env = data.env
|
local env = data.env
|
||||||
local dns = data.dns
|
local dns = data.dns
|
||||||
local cap_add = data.cap_add
|
local cap_add = data.cap_add
|
||||||
local sysctl = {}
|
local sysctl = {}
|
||||||
|
|
||||||
tmp = data.sysctl
|
tmp = data.sysctl
|
||||||
if type(tmp) == "table" then
|
if type(tmp) == "table" then
|
||||||
for i, v in ipairs(tmp) do
|
for i, v in ipairs(tmp) do
|
||||||
|
@ -641,6 +704,7 @@ m.handle = function(self, state, data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local log_opt = {}
|
local log_opt = {}
|
||||||
tmp = data.log_opt
|
tmp = data.log_opt
|
||||||
if type(tmp) == "table" then
|
if type(tmp) == "table" then
|
||||||
|
@ -651,6 +715,7 @@ m.handle = function(self, state, data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local network = data.network
|
local network = data.network
|
||||||
local ip = (network ~= "bridge" and network ~= "host" and network ~= "none") and data.ip or nil
|
local ip = (network ~= "bridge" and network ~= "host" and network ~= "none") and data.ip or nil
|
||||||
local volume = data.volume
|
local volume = data.volume
|
||||||
|
@ -661,6 +726,7 @@ m.handle = function(self, state, data)
|
||||||
|
|
||||||
local portbindings = {}
|
local portbindings = {}
|
||||||
local exposedports = {}
|
local exposedports = {}
|
||||||
|
|
||||||
local tmpfs = {}
|
local tmpfs = {}
|
||||||
tmp = data.tmpfs
|
tmp = data.tmpfs
|
||||||
if type(tmp) == "table" then
|
if type(tmp) == "table" then
|
||||||
|
@ -695,6 +761,7 @@ m.handle = function(self, state, data)
|
||||||
t['CgroupPermissions'] = "rwm"
|
t['CgroupPermissions'] = "rwm"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if next(t) ~= nil then
|
if next(t) ~= nil then
|
||||||
table.insert( device, t )
|
table.insert( device, t )
|
||||||
end
|
end
|
||||||
|
@ -721,6 +788,7 @@ m.handle = function(self, state, data)
|
||||||
command[#command+1] = v
|
command[#command+1] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if memory ~= 0 then
|
if memory ~= 0 then
|
||||||
_,_,n,unit = memory:find("([%d%.]+)([%l%u]+)")
|
_,_,n,unit = memory:find("([%d%.]+)([%l%u]+)")
|
||||||
if n then
|
if n then
|
||||||
|
@ -756,14 +824,15 @@ m.handle = function(self, state, data)
|
||||||
create_body.HostConfig.NanoCPUs = tonumber(cpus) * 10 ^ 9
|
create_body.HostConfig.NanoCPUs = tonumber(cpus) * 10 ^ 9
|
||||||
create_body.HostConfig.BlkioWeight = tonumber(blkio_weight)
|
create_body.HostConfig.BlkioWeight = tonumber(blkio_weight)
|
||||||
create_body.HostConfig.PublishAllPorts = publish_all
|
create_body.HostConfig.PublishAllPorts = publish_all
|
||||||
|
|
||||||
if create_body.HostConfig.NetworkMode ~= network then
|
if create_body.HostConfig.NetworkMode ~= network then
|
||||||
-- network mode changed, need to clear duplicate config
|
|
||||||
create_body.NetworkingConfig = nil
|
create_body.NetworkingConfig = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
create_body.HostConfig.NetworkMode = network
|
create_body.HostConfig.NetworkMode = network
|
||||||
|
|
||||||
if ip then
|
if ip then
|
||||||
if create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and type(create_body.NetworkingConfig.EndpointsConfig) == "table" then
|
if create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and type(create_body.NetworkingConfig.EndpointsConfig) == "table" then
|
||||||
-- ip + duplicate config
|
|
||||||
for k, v in pairs (create_body.NetworkingConfig.EndpointsConfig) do
|
for k, v in pairs (create_body.NetworkingConfig.EndpointsConfig) do
|
||||||
if k == network and v.IPAMConfig and v.IPAMConfig.IPv4Address then
|
if k == network and v.IPAMConfig and v.IPAMConfig.IPv4Address then
|
||||||
v.IPAMConfig.IPv4Address = ip
|
v.IPAMConfig.IPv4Address = ip
|
||||||
|
@ -773,13 +842,12 @@ m.handle = function(self, state, data)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- ip + no duplicate config
|
|
||||||
create_body.NetworkingConfig = { EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } }
|
create_body.NetworkingConfig = { EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } }
|
||||||
end
|
end
|
||||||
elseif not create_body.NetworkingConfig then
|
elseif not create_body.NetworkingConfig then
|
||||||
-- no ip + no duplicate config
|
|
||||||
create_body.NetworkingConfig = nil
|
create_body.NetworkingConfig = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
create_body["HostConfig"]["Tmpfs"] = tmpfs
|
create_body["HostConfig"]["Tmpfs"] = tmpfs
|
||||||
create_body["HostConfig"]["Devices"] = device
|
create_body["HostConfig"]["Devices"] = device
|
||||||
create_body["HostConfig"]["Sysctls"] = sysctl
|
create_body["HostConfig"]["Sysctls"] = sysctl
|
||||||
|
@ -789,6 +857,7 @@ m.handle = function(self, state, data)
|
||||||
if network == "bridge" then
|
if network == "bridge" then
|
||||||
create_body["HostConfig"]["Links"] = link
|
create_body["HostConfig"]["Links"] = link
|
||||||
end
|
end
|
||||||
|
|
||||||
local pull_image = function(image)
|
local pull_image = function(image)
|
||||||
local json_stringify = luci.jsonc and luci.jsonc.stringify
|
local json_stringify = luci.jsonc and luci.jsonc.stringify
|
||||||
docker:append_status("Images: " .. "pulling" .. " " .. image .. "...\n")
|
docker:append_status("Images: " .. "pulling" .. " " .. image .. "...\n")
|
||||||
|
@ -801,8 +870,10 @@ m.handle = function(self, state, data)
|
||||||
luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer"))
|
luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
docker:clear_status()
|
docker:clear_status()
|
||||||
local exist_image = false
|
local exist_image = false
|
||||||
|
|
||||||
if image then
|
if image then
|
||||||
for _, v in ipairs (images) do
|
for _, v in ipairs (images) do
|
||||||
if v.RepoTags and v.RepoTags[1] == image then
|
if v.RepoTags and v.RepoTags[1] == image then
|
||||||
|
@ -818,6 +889,7 @@ m.handle = function(self, state, data)
|
||||||
end
|
end
|
||||||
|
|
||||||
create_body = docker.clear_empty_tables(create_body)
|
create_body = docker.clear_empty_tables(create_body)
|
||||||
|
|
||||||
docker:append_status("Container: " .. "create" .. " " .. name .. "...")
|
docker:append_status("Container: " .. "create" .. " " .. name .. "...")
|
||||||
local res = dk.containers:create({name = name, body = create_body})
|
local res = dk.containers:create({name = name, body = create_body})
|
||||||
if res and res.code == 201 then
|
if res and res.code == 201 then
|
||||||
|
|
Loading…
Reference in a new issue