openwrt-packages/luci-app-quickstart/luasrc/controller/quickstart.lua
2024-02-19 23:29:07 +08:00

153 lines
5.1 KiB
Lua

local http = require "luci.http"
module("luci.controller.quickstart", package.seeall)
function index()
if luci.sys.call("pgrep quickstart >/dev/null") == 0 then
entry({"admin", "quickstart"}, template("quickstart/home"), _("QuickStart"), 1).leaf = true
entry({"admin", "network_guide"}, call("networkguide_index"), _("NetworkGuide"), 2)
entry({"admin", "network_guide", "pages"}, call("quickstart_index", {index={"admin", "network_guide", "pages"}})).leaf = true
if nixio.fs.access("/usr/lib/lua/luci/view/quickstart/main_dev.htm") then
entry({"admin", "quickstart_dev"}, call("quickstart_dev", {index={"admin", "quickstart_dev"}})).leaf = true
end
entry({"admin", "nas", "raid"}, call("quickstart_index", {index={"admin", "nas"}}), _("RAID"), 10).leaf = true
entry({"admin", "nas", "smart"}, call("quickstart_index", {index={"admin", "nas"}}), _("S.M.A.R.T."), 11).leaf = true
entry({"admin", "network", "interfaceconfig"}, call("quickstart_index", {index={"admin", "network"}}), _("NetworkPort"), 11).leaf = true
entry({"admin", "nas", "quickstart"}).dependent = false
entry({"admin", "nas", "quickstart", "auto_setup"}, post("auto_setup"))
entry({"admin", "nas", "quickstart", "setup_result"}, call("setup_result"))
else
entry({"admin", "quickstart"}, call("redirect_fallback")).leaf = true
end
end
function networkguide_index()
luci.http.redirect(luci.dispatcher.build_url("admin", "network_guide", "pages", "network"))
end
function redirect_fallback()
luci.http.redirect(luci.dispatcher.build_url("admin", "status"))
end
function quickstart_index(param)
luci.template.render("quickstart/main", {prefix=luci.dispatcher.build_url(unpack(param.index))})
end
function quickstart_dev(param)
luci.template.render("quickstart/main_dev", {prefix=luci.dispatcher.build_url(unpack(param.index))})
end
function auto_setup()
local os = require "os"
local fs = require "nixio.fs"
local rshift = nixio.bit.rshift
-- json style
-- local jsonc = require "luci.jsonc"
-- local json_parse = jsonc.parse
-- local req = json_parse(luci.http.content())
-- local pkgs = ""
-- for k, v in pairs(req.packages) do
-- pkgs = pkgs .. " " .. luci.util.shellquote(v)
-- end
-- form style
local packages = luci.http.formvalue("packages")
local pkgs = ""
if type(packages) == "table" then
if #packages > 0 then
for k, v in pairs(packages) do
pkgs = pkgs .. " " .. luci.util.shellquote(v)
end
end
else
if packages ~= nil and packages ~= "" then
pkgs = luci.util.shellquote(packages)
end
end
local ret
if pkgs == "" then
ret = {
success = 1,
scope = "params",
error = "Parameter 'packages' undefined!",
}
else
local cmd = "/usr/libexec/quickstart/auto_setup.sh " .. pkgs
cmd = "/etc/init.d/tasks task_add auto_setup " .. luci.util.shellquote(cmd)
local r = os.execute(cmd .. " >/var/log/auto_setup.stdout 2>/var/log/auto_setup.stderr")
local e = fs.readfile("/var/log/auto_setup.stderr")
local o = fs.readfile("/var/log/auto_setup.stdout")
fs.unlink("/var/log/auto_setup.stderr")
fs.unlink("/var/log/auto_setup.stdout")
e = e or ""
if r == 256 and e == "" then
e = "os.execute exit code 1"
end
r = rshift(r,8)
ret = {
success = r,
scope = "taskd",
error = e,
detail = o,
}
end
luci.http.prepare_content("application/json")
luci.http.write_json(ret)
end
function setup_result()
local fs = require "nixio.fs"
local taskd = require "luci.model.tasks"
local packages = nil
local success = nil
local failed = nil
local status = taskd.status("auto_setup")
local ret = {
}
if status.running or status.exit_code ~= 404 then
local item
local po = fs.readfile("/var/log/auto_setup.input") or ""
for item in po:gmatch("[^\n]+") do
if packages then
packages[#packages+1] = item
else
packages = {item}
end
end
local so = fs.readfile("/var/log/auto_setup.success") or ""
for item in so:gmatch("[^\n]+") do
if success then
success[#success+1] = item
else
success = {item}
end
end
local fo = fs.readfile("/var/log/auto_setup.failed") or ""
for item in fo:gmatch("[^\n]+") do
if failed then
failed[#failed+1] = item
else
failed = {item}
end
end
ret.success = 0
ret.result = {
ongoing = status.running,
packages = packages,
success = success,
failed = failed,
}
else
ret.success = 404
ret.scope = "taskd"
ret.error = "task not found"
end
luci.http.prepare_content("application/json")
luci.http.write_json(ret)
end