antosdk-apps/Dockman/api.lua
2021-04-01 13:01:33 +02:00

150 lines
3.8 KiB
Lua

local args=...
local handle = {}
local result = function(data)
return { error = false, result = data }
end
local error = function(msg)
return {error = msg, result = false}
end
local exec = function(host, rcmd, decode)
local user = SESSION.user
if not user then return nil end
local cmd = "ssh -tt "..user.."@"..host.." "..rcmd
if decode then
cmd = cmd.." --format \\'{{json .}}\\'"
end
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if decode then
s = s:gsub('[\n\r]+', ',')
return JSON.decodeString("["..s.."null]")
else
return s
end
end
handle.list_image = function(data)
local res = exec(data.host, "docker image ls", true)
if not res then
return error("Unable to fetch image list")
end
-- inspect images
for i,v in ipairs(res) do
v.Detail = exec(data.host, "docker image inspect "..v.ID, true)[1]
v.text = v.Detail.RepoTags[1]
if not v.text or v.text == "" then
v.text = v.ID
end
end
return result(res)
end
handle.list_container = function(data)
local res = exec(data.host, "docker ps -a -f ancestor="..data.image, true)
if not res then
return error("Unable to fetch container list")
end
for i,v in ipairs(res) do
v.Detail = exec(data.host, "docker container inspect "..v.ID, true)[1]
v.text = v.Names
if v.Detail.State.Running then
v.iconclass = "fa fa-circle running"
else
v.iconclass = "fa fa-circle stop"
end
end
return result(res)
end
handle.run_container = function(data)
local res = exec(data.host, "docker start "..data.id, false)
res = res:gsub('[\n\r]+', '')
if res == data.id then
return result("OK")
else
return error(res)
end
end
handle.pull_image = function(data)
local res = exec(data.host, "docker pull "..data.image, false)
return result(std.b64encode(res))
end
handle.rm_image = function(data)
local res = exec(data.host, "docker rmi "..data.id.."; sleep 2", false)
return result(res)
end
handle.create_container = function(data)
local cmd = "docker run "
for k,v in pairs(data.parameters) do
k = k:gsub(" ", "")
if k:len() == 1 then
cmd = cmd.." -"..k.." \""..v.."\" "
else
if k:match("^e_.*") then
cmd = cmd.." -e \""..k:gsub("e_","").."="..v.."\" "
else
cmd = cmd.." --"..k
if v ~= "" then
cmd = cmd.."=\""..v.."\" "
end
end
end
end
cmd = cmd.."--detach=true "..data.image
local res = exec(data.host, cmd, false)
return result(res)
end
handle.stop_container = function(data)
local res = exec(data.host, "docker stop "..data.id, false)
res = res:gsub('[\n\r]+', '')
if res == data.id then
return result("OK")
else
return error(res)
end
end
handle.restart_container = function(data)
local res = exec(data.host, "docker restart "..data.id, false)
res = res:gsub('[\n\r]+', '')
if res == data.id then
return result("OK")
else
return error(res)
end
end
handle.rm_container = function(data)
local res = exec(data.host, "docker stop "..data.id, false)
res = res:gsub('[\n\r]+', '')
if res == data.id then
local res = exec(data.host, "docker rm "..data.id, false)
res = res:gsub('[\n\r]+', '')
if res == data.id then
return result("OK")
else
error(res)
end
else
return error(res)
end
end
if args.action and handle[args.action] then
return handle[args.action](args.args)
else
return error("Invalid action parameter")
end