-- acf model for packages (apk) module (..., package.seeall) require("getopts") local configfile = "/etc/apk/apk.conf" get_all_packages = function() -- read in all of the packages local cmd = "/sbin/apk_fetch -l 2>/dev/null" local f = io.popen( cmd ) local all = {} for line in f:lines() do all[#all + 1] = line end f:close() return cfe({ type="list", value=all, label="All Packages"}) end get_loaded_packages = function() -- read in the loaded packages local cmd = "/sbin/apk_info 2>/dev/null" local f = io.popen( cmd ) local loaded = {} for line in f:lines() do local temp = {} temp.name = string.match(line, "(.-)-%d+.*") temp.version, temp.description = string.match(line, "([^ ]+) %- (.+)") loaded[#loaded+1] = temp end return cfe({ type="list", value=loaded, label="Loaded Packages"}) end get_available_packages = function(_loaded_cfe, _all_cfe) -- available are all except loaded local loaded_cfe = _loaded_cfe or get_loaded_packages() local all_cfe = _all_cfe or get_all_packages() local loaded = loaded_cfe.value local all = all_cfe.value local available = {} local reverseloaded = {} for i,packagetable in ipairs(loaded) do reverseloaded[packagetable.name] = i end for i,package in ipairs(all) do if (reverseloaded[package]==nil) then available[#available + 1] = package end end return cfe({ type="list", value=available, label="Available Packages" }) end get_packages = function() local loaded = get_loaded_packages() local available = get_available_packages(loaded) return cfe({ type="group", value={loaded=loaded, available=available} }) end delete_package = function(package, sessiondata) local cmdresult = "Delete failed - Invalid package" local loaded = get_loaded_packages() for i,pack in pairs(loaded.value) do if pack.name == package then local cmd = "/sbin/apk_delete " .. package .. " 2>&1" local f = io.popen( cmd ) cmdresult = f:read("*a") or "" f:close() -- Destroy menu and permissions info in session so recalculated if sessiondata then sessiondata.menu = nil end if sessiondata then sessiondata.permissions = nil end end end return cfe({ value=cmdresult, label="Result of Delete" }) end install_package = function(package,sessiondata) local cmdresult = "Install failed - Invalid package" local available = get_available_packages() for i,pack in pairs(available.value) do if pack == package then local cmd = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin apk_get install " .. package .. " 2>&1" local f = io.popen( cmd ) cmdresult = f:read("*a") f:close() -- Destroy menu and permissions info in session so recalculated if sessiondata then sessiondata.menu = nil end if sessiondata then sessiondata.permissions = nil end end end return cfe({ value=cmdresult, label="Result of Install" }) end get_config = function() local config = getopts.getoptsfromfile(configfile, "") local source = cfe({ value=config.APK_PATH or "", label="APK Source" }) return cfe({ type="group", value={source=source}, label="APK Config" }) end set_config = function(newconfig) -- FIXME - don't know how to validate if not getopts.setoptsinfile(configfile, "", "APK_PATH", newconfig.value.source.value) then newconfig.errtxt = "Failed to update config" end return newconfig end