From de0d16e4ac77be32b7ab3f9816b72aa053eb5854 Mon Sep 17 00:00:00 2001 From: Admin Localnet Date: Mon, 30 Oct 2017 21:12:25 +0100 Subject: [PATCH] luci-app-lxc: various changes 1) Modify dependencies Add dependencies required for to be able use containers created from "images.linuxcontainers.org". Several of them require "lxc-attach" for set password so to be able login. None of them has SSH preinstalled so "lxc-console" is required to be able login and install SSH, for example. Remove dependency "xz", it seems incompatible with LXC_BUSYBOX_OPTIONS when both are enabled happens a build crash. 2) Change container image repository The repository "virtualwrt.org/containers/" seems to not work, I have change it by the official LXC container image repository. 3) Translate the arch Translate the local uname architecture to a valid "images.linuxcontainers.org" arch. Only tested with the platform "mvebu" (armv7l -> armhf). 4) Other minor fixes Use same server to list images and download the image. Disable GPG check when listing images. Reported-by: "Admin Localnet " [Squashed commits, cleaned up whitespace, refactor arch mapping, escape url setting, use system wide ubus helper, use uci model library] Closes: #1422 Signed-off-by: Jo-Philipp Wich --- applications/luci-app-lxc/Makefile | 2 +- .../luci-app-lxc/luasrc/controller/lxc.lua | 83 +++++++++++-------- applications/luci-app-lxc/root/etc/config/lxc | 5 +- 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/applications/luci-app-lxc/Makefile b/applications/luci-app-lxc/Makefile index 9f313dfb11..85cae5c405 100644 --- a/applications/luci-app-lxc/Makefile +++ b/applications/luci-app-lxc/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LXC management Web UI -LUCI_DEPENDS:=+luci-mod-admin-full +lxc +lxc-create +liblxc +rpcd-mod-lxc +getopt +xz +LUCI_DEPENDS:=+luci-mod-admin-full +lxc +lxc-attach +lxc-console +lxc-create +liblxc +rpcd-mod-lxc +getopt LUCI_PKGARCH:=all PKG_MAINTAINER:=Petar Koretic diff --git a/applications/luci-app-lxc/luasrc/controller/lxc.lua b/applications/luci-app-lxc/luasrc/controller/lxc.lua index ea7adbafbb..1122d7e53b 100644 --- a/applications/luci-app-lxc/luasrc/controller/lxc.lua +++ b/applications/luci-app-lxc/luasrc/controller/lxc.lua @@ -14,14 +14,11 @@ Author: Petar Koretic ]]-- -module("luci.controller.lxc", package.seeall) - -require "ubus" -local conn = ubus.connect() -if not conn then - error("Failed to connect to ubus") -end +local uci = require "luci.model.uci" +local util = require "luci.util" +local nixio = require "nixio" +module("luci.controller.lxc", package.seeall) function fork_exec(command) local pid = nixio.fork() @@ -71,55 +68,52 @@ function index() end function lxc_get_downloadable() - luci.http.prepare_content("application/json") - - local f = io.popen('uname -m', 'r') - local target = f:read('*a') - f:close() - target = target:gsub("^%s*(.-)%s*$", "%1") - + local target = lxc_get_arch_target() local templates = {} - local f = io.popen('lxc-create -n just_want_to_list_available_lxc_templates -t download -- --list', 'r') + local f = io.popen('sh /usr/share/lxc/templates/lxc-download --list --no-validate --server %s' + % util.shellquote(uci.cursor():get("lxc", "lxc", "url")), 'r') + local line for line in f:lines() do - local dist,version = line:match("^(%S+)%s+(%S+)%s+" .. target .. "%s+default%s+%S+$") - if dist~=nil and version~=nil then templates[#templates + 1] = dist .. ":" .. version end + local dist, version, dist_target = line:match("^(%S+)%s+(%S+)%s+(%S+)%s+default%s+%S+$") + if dist and version and dist_target == target then + templates[#templates+1] = "%s:%s" %{ dist, version } + end end f:close() + + luci.http.prepare_content("application/json") luci.http.write_json(templates) end function lxc_create(lxc_name, lxc_template) luci.http.prepare_content("text/plain") - local uci = require("uci").cursor() - - local url = uci:get("lxc", "lxc", "url") - if not pcall(dofile, "/etc/openwrt_release") then return luci.http.write("1") end - local f = io.popen('uname -m', 'r') - local target = f:read('*a') - f:close() - target = target:gsub("^%s*(.-)%s*$", "%1") - - local lxc_dist = lxc_template:gsub("(.*):(.*)", '%1') - local lxc_release = lxc_template:gsub("(.*):(.*)", '%2') - - local data = conn:call("lxc", "create", { name = lxc_name, template = "download", args = { "--server", url, "--no-validate", "--dist", lxc_dist, "--release", lxc_release, "--arch", target } } ) - - luci.http.write(data) + local lxc_dist, lxc_release = lxc_template:match("^(.+):(.+)$") + + luci.http.write(util.ubus("lxc", "create", { + name = lxc_name, + template = "download", + args = { + "--server", uci.cursor():get("lxc", "lxc", "url"), + "--no-validate", + "--dist", lxc_dist, + "--release", lxc_release, + "--arch", lxc_get_arch_target() + } + })) end function lxc_action(lxc_action, lxc_name) - luci.http.prepare_content("application/json") - - local data, ec = conn:call("lxc", lxc_action, lxc_name and { name = lxc_name} or {} ) + local data, ec = util.ubus("lxc", lxc_action, lxc_name and { name = lxc_name } or {}) + luci.http.prepare_content("application/json") luci.http.write_json(ec and {} or data) end @@ -165,3 +159,22 @@ function lxc_configuration_set(lxc_name) luci.http.write("0") end +function lxc_get_arch_target() + local target = nixio.uname().machine + local target_map { + armv5 = "armel", + armv6 = "armel", + armv7 = "armhf", + armv8 = "arm64", + x86_64 = "amd64" + } + + local k, v + for k, v in pairs(target_map) do + if target:find(k) then + return v + end + end + + return target +end diff --git a/applications/luci-app-lxc/root/etc/config/lxc b/applications/luci-app-lxc/root/etc/config/lxc index 5572c735fa..3b35951e1b 100644 --- a/applications/luci-app-lxc/root/etc/config/lxc +++ b/applications/luci-app-lxc/root/etc/config/lxc @@ -1,6 +1,3 @@ -# -# lxc uci configuration -# config lxc 'lxc' - option url 'virtualwrt.org/containers/' + option url 'images.linuxcontainers.org' -- 2.30.2