diff options
author | Daniel F. Dickinson <cshored@thecshore.com> | 2018-08-03 12:36:51 -0400 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2018-09-19 20:08:19 +0200 |
commit | 58d97b5e271bc0d7507eab5b9bd2902181864e02 (patch) | |
tree | 80e250346ad33c79b3f821daf7b7d9be90d99240 /modules/luci-mod-admin-full/luasrc/controller/admin | |
parent | 6ec0353201435e0d0d7d32820d8ba600b4ca7b5b (diff) |
modules: Split luci-mod-full
Move some common elements to luci-base, and otherwise make three
packages out of status, system, and network. They were mostly
separated already, but there were some shared elements between
status and network that are now in luci-base.
Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
Diffstat (limited to 'modules/luci-mod-admin-full/luasrc/controller/admin')
3 files changed, 0 insertions, 1064 deletions
diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua deleted file mode 100644 index c4e1c3aa16..0000000000 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua +++ /dev/null @@ -1,442 +0,0 @@ --- Copyright 2008 Steven Barth <steven@midlink.org> --- Copyright 2011-2018 Jo-Philipp Wich <jo@mein.io> --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.admin.network", package.seeall) - -function index() - local uci = require("luci.model.uci").cursor() - local page - --- if page.inreq then - local has_switch = false - - uci:foreach("network", "switch", - function(s) - has_switch = true - return false - end) - - if has_switch then - page = node("admin", "network", "vlan") - page.target = cbi("admin_network/vlan") - page.title = _("Switch") - page.order = 20 - - page = entry({"admin", "network", "switch_status"}, call("switch_status"), nil) - page.leaf = true - end - - - local has_wifi = false - - uci:foreach("wireless", "wifi-device", - function(s) - has_wifi = true - return false - end) - - if has_wifi then - page = entry({"admin", "network", "wireless_assoclist"}, call("wifi_assoclist"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless_join"}, post("wifi_join"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless_add"}, post("wifi_add"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless_reconnect"}, post("wifi_reconnect"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless_scan_trigger"}, post("wifi_scan_trigger"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless_scan_results"}, call("wifi_scan_results"), nil) - page.leaf = true - - page = entry({"admin", "network", "wireless"}, arcombine(cbi("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wireless"), 15) - page.leaf = true - page.subindex = true - - if page.inreq then - local wdev - local net = require "luci.model.network".init(uci) - for _, wdev in ipairs(net:get_wifidevs()) do - local wnet - for _, wnet in ipairs(wdev:get_wifinets()) do - entry( - {"admin", "network", "wireless", wnet:id()}, - alias("admin", "network", "wireless"), - wdev:name() .. ": " .. wnet:shortname() - ) - end - end - end - end - - - page = entry({"admin", "network", "iface_add"}, form("admin_network/iface_add"), nil) - page.leaf = true - - page = entry({"admin", "network", "iface_status"}, call("iface_status"), nil) - page.leaf = true - - page = entry({"admin", "network", "iface_reconnect"}, post("iface_reconnect"), nil) - page.leaf = true - - page = entry({"admin", "network", "network"}, arcombine(cbi("admin_network/network"), cbi("admin_network/ifaces")), _("Interfaces"), 10) - page.leaf = true - page.subindex = true - - if page.inreq then - uci:foreach("network", "interface", - function (section) - local ifc = section[".name"] - if ifc ~= "loopback" then - entry({"admin", "network", "network", ifc}, - true, ifc:upper()) - end - end) - end - - - if nixio.fs.access("/etc/config/dhcp") then - page = node("admin", "network", "dhcp") - page.target = cbi("admin_network/dhcp") - page.title = _("DHCP and DNS") - page.order = 30 - - page = entry({"admin", "network", "dhcplease_status"}, call("lease_status"), nil) - page.leaf = true - - page = node("admin", "network", "hosts") - page.target = cbi("admin_network/hosts") - page.title = _("Hostnames") - page.order = 40 - end - - page = node("admin", "network", "routes") - page.target = cbi("admin_network/routes") - page.title = _("Static Routes") - page.order = 50 - - page = node("admin", "network", "diagnostics") - page.target = template("admin_network/diagnostics") - page.title = _("Diagnostics") - page.order = 60 - - page = entry({"admin", "network", "diag_ping"}, post("diag_ping"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_nslookup"}, post("diag_nslookup"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_traceroute"}, post("diag_traceroute"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_ping6"}, post("diag_ping6"), nil) - page.leaf = true - - page = entry({"admin", "network", "diag_traceroute6"}, post("diag_traceroute6"), nil) - page.leaf = true --- end -end - -function wifi_join() - local tpl = require "luci.template" - local http = require "luci.http" - local dev = http.formvalue("device") - local ssid = http.formvalue("join") - - if dev and ssid then - local cancel = (http.formvalue("cancel") or http.formvalue("cbi.cancel")) - if not cancel then - local cbi = require "luci.cbi" - local map = luci.cbi.load("admin_network/wifi_add")[1] - - if map:parse() ~= cbi.FORM_DONE then - tpl.render("header") - map:render() - tpl.render("footer") - end - - return - end - end - - tpl.render("admin_network/wifi_join") -end - -function wifi_add() - local dev = luci.http.formvalue("device") - local ntm = require "luci.model.network".init() - - dev = dev and ntm:get_wifidev(dev) - - if dev then - local net = dev:add_wifinet({ - mode = "ap", - ssid = "OpenWrt", - encryption = "none" - }) - - ntm:save("wireless") - luci.http.redirect(net:adminlink()) - end -end - -function iface_status(ifaces) - local netm = require "luci.model.network".init() - local rv = { } - - local iface - for iface in ifaces:gmatch("[%w%.%-_]+") do - local net = netm:get_network(iface) - local device = net and net:get_interface() - if device then - local data = { - id = iface, - desc = net:get_i18n(), - proto = net:proto(), - uptime = net:uptime(), - gwaddr = net:gwaddr(), - ipaddrs = net:ipaddrs(), - ip6addrs = net:ip6addrs(), - dnsaddrs = net:dnsaddrs(), - ip6prefix = net:ip6prefix(), - errors = net:errors(), - name = device:shortname(), - type = device:type(), - typename = device:get_type_i18n(), - ifname = device:name(), - macaddr = device:mac(), - is_up = net:is_up() and device:is_up(), - is_alias = net:is_alias(), - is_dynamic = net:is_dynamic(), - rx_bytes = device:rx_bytes(), - tx_bytes = device:tx_bytes(), - rx_packets = device:rx_packets(), - tx_packets = device:tx_packets(), - - subdevices = { } - } - - for _, device in ipairs(net:get_interfaces() or {}) do - data.subdevices[#data.subdevices+1] = { - name = device:shortname(), - type = device:type(), - typename = device:get_type_i18n(), - ifname = device:name(), - macaddr = device:mac(), - is_up = device:is_up(), - rx_bytes = device:rx_bytes(), - tx_bytes = device:tx_bytes(), - rx_packets = device:rx_packets(), - tx_packets = device:tx_packets(), - } - end - - rv[#rv+1] = data - else - rv[#rv+1] = { - id = iface, - name = iface, - type = "ethernet" - } - end - end - - if #rv > 0 then - luci.http.prepare_content("application/json") - luci.http.write_json(rv) - return - end - - luci.http.status(404, "No such device") -end - -function iface_reconnect(iface) - local netmd = require "luci.model.network".init() - local net = netmd:get_network(iface) - if net then - luci.sys.call("env -i /sbin/ifup %s >/dev/null 2>/dev/null" - % luci.util.shellquote(iface)) - luci.http.status(200, "Reconnected") - return - end - - luci.http.status(404, "No such interface") -end - -function wifi_status(devs) - local s = require "luci.tools.status" - local rv = { } - - if type(devs) == "string" then - local dev - for dev in devs:gmatch("[%w%.%-]+") do - rv[#rv+1] = s.wifi_network(dev) - end - end - - if #rv > 0 then - luci.http.prepare_content("application/json") - luci.http.write_json(rv) - return - end - - luci.http.status(404, "No such device") -end - -function wifi_reconnect(radio) - local rc = luci.sys.call("env -i /sbin/wifi up %s" % luci.util.shellquote(radio)) - - if rc == 0 then - luci.http.status(200, "Reconnected") - else - luci.http.status(500, "Error") - end -end - -function wifi_assoclist() - local s = require "luci.tools.status" - - luci.http.prepare_content("application/json") - luci.http.write_json(s.wifi_assoclist()) -end - - -local function _wifi_get_scan_results(cache_key) - local results = luci.util.ubus("session", "get", { - ubus_rpc_session = luci.model.uci:get_session_id(), - keys = { cache_key } - }) - - if type(results) == "table" and - type(results.values) == "table" and - type(results.values[cache_key]) == "table" - then - return results.values[cache_key] - end - - return { } -end - -function wifi_scan_trigger(radio, update) - local iw = radio and luci.sys.wifi.getiwinfo(radio) - - if not iw then - luci.http.status(404, "No such radio device") - return - end - - luci.http.status(200, "Scan scheduled") - - if nixio.fork() == 0 then - io.stderr:close() - io.stdout:close() - - local _, bss - local data, bssids = { }, { } - local cache_key = "scan_%s" % radio - - luci.util.ubus("session", "set", { - ubus_rpc_session = luci.model.uci:get_session_id(), - values = { [cache_key] = nil } - }) - - for _, bss in ipairs(iw.scanlist or { }) do - data[_] = bss - bssids[bss.bssid] = bss - end - - if update then - for _, bss in ipairs(_wifi_get_scan_results(cache_key)) do - if not bssids[bss.bssid] then - bss.stale = true - data[#data + 1] = bss - end - end - end - - luci.util.ubus("session", "set", { - ubus_rpc_session = luci.model.uci:get_session_id(), - values = { [cache_key] = data } - }) - end -end - -function wifi_scan_results(radio) - local results = radio and _wifi_get_scan_results("scan_%s" % radio) - - if results and #results > 0 then - luci.http.prepare_content("application/json") - luci.http.write_json(results) - else - luci.http.status(404, "No wireless scan results") - end -end - -function lease_status() - local s = require "luci.tools.status" - - luci.http.prepare_content("application/json") - luci.http.write('[') - luci.http.write_json(s.dhcp_leases()) - luci.http.write(',') - luci.http.write_json(s.dhcp6_leases()) - luci.http.write(']') -end - -function switch_status(switches) - local s = require "luci.tools.status" - - luci.http.prepare_content("application/json") - luci.http.write_json(s.switch_status(switches)) -end - -function diag_command(cmd, addr) - if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then - luci.http.prepare_content("text/plain") - - local util = io.popen(cmd % luci.util.shellquote(addr)) - if util then - while true do - local ln = util:read("*l") - if not ln then break end - luci.http.write(ln) - luci.http.write("\n") - end - - util:close() - end - - return - end - - luci.http.status(500, "Bad address") -end - -function diag_ping(addr) - diag_command("ping -c 5 -W 1 %s 2>&1", addr) -end - -function diag_traceroute(addr) - diag_command("traceroute -q 1 -w 1 -n %s 2>&1", addr) -end - -function diag_nslookup(addr) - diag_command("nslookup %s 2>&1", addr) -end - -function diag_ping6(addr) - diag_command("ping6 -c 5 %s 2>&1", addr) -end - -function diag_traceroute6(addr) - diag_command("traceroute6 -q 1 -w 2 -n %s 2>&1", addr) -end diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua deleted file mode 100644 index 4f04cce545..0000000000 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua +++ /dev/null @@ -1,153 +0,0 @@ --- Copyright 2008 Steven Barth <steven@midlink.org> --- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org> --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.admin.status", package.seeall) - -function index() - entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1) - - entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true - entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true - - entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3) - entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4) - entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5) - entry({"admin", "status", "processes"}, form("admin_status/processes"), _("Processes"), 6) - - entry({"admin", "status", "realtime"}, alias("admin", "status", "realtime", "load"), _("Realtime Graphs"), 7) - - entry({"admin", "status", "realtime", "load"}, template("admin_status/load"), _("Load"), 1).leaf = true - entry({"admin", "status", "realtime", "load_status"}, call("action_load")).leaf = true - - entry({"admin", "status", "realtime", "bandwidth"}, template("admin_status/bandwidth"), _("Traffic"), 2).leaf = true - entry({"admin", "status", "realtime", "bandwidth_status"}, call("action_bandwidth")).leaf = true - - if nixio.fs.access("/etc/config/wireless") then - entry({"admin", "status", "realtime", "wireless"}, template("admin_status/wireless"), _("Wireless"), 3).leaf = true - entry({"admin", "status", "realtime", "wireless_status"}, call("action_wireless")).leaf = true - end - - entry({"admin", "status", "realtime", "connections"}, template("admin_status/connections"), _("Connections"), 4).leaf = true - entry({"admin", "status", "realtime", "connections_status"}, call("action_connections")).leaf = true - - entry({"admin", "status", "nameinfo"}, call("action_nameinfo")).leaf = true -end - -function action_syslog() - local syslog = luci.sys.syslog() - luci.template.render("admin_status/syslog", {syslog=syslog}) -end - -function action_dmesg() - local dmesg = luci.sys.dmesg() - luci.template.render("admin_status/dmesg", {dmesg=dmesg}) -end - -function action_iptables() - if luci.http.formvalue("zero") then - if luci.http.formvalue("family") == "6" then - luci.util.exec("/usr/sbin/ip6tables -Z") - else - luci.util.exec("/usr/sbin/iptables -Z") - end - elseif luci.http.formvalue("restart") then - luci.util.exec("/etc/init.d/firewall restart") - end - - luci.http.redirect(luci.dispatcher.build_url("admin/status/iptables")) -end - -function action_bandwidth(iface) - luci.http.prepare_content("application/json") - - local bwc = io.popen("luci-bwc -i %s 2>/dev/null" - % luci.util.shellquote(iface)) - - if bwc then - luci.http.write("[") - - while true do - local ln = bwc:read("*l") - if not ln then break end - luci.http.write(ln) - end - - luci.http.write("]") - bwc:close() - end -end - -function action_wireless(iface) - luci.http.prepare_content("application/json") - - local bwc = io.popen("luci-bwc -r %s 2>/dev/null" - % luci.util.shellquote(iface)) - - if bwc then - luci.http.write("[") - - while true do - local ln = bwc:read("*l") - if not ln then break end - luci.http.write(ln) - end - - luci.http.write("]") - bwc:close() - end -end - -function action_load() - luci.http.prepare_content("application/json") - - local bwc = io.popen("luci-bwc -l 2>/dev/null") - if bwc then - luci.http.write("[") - - while true do - local ln = bwc:read("*l") - if not ln then break end - luci.http.write(ln) - end - - luci.http.write("]") - bwc:close() - end -end - -function action_connections() - local sys = require "luci.sys" - - luci.http.prepare_content("application/json") - - luci.http.write('{ "connections": ') - luci.http.write_json(sys.net.conntrack()) - - local bwc = io.popen("luci-bwc -c 2>/dev/null") - if bwc then - luci.http.write(', "statistics": [') - - while true do - local ln = bwc:read("*l") - if not ln then break end - luci.http.write(ln) - end - - luci.http.write("]") - bwc:close() - end - - luci.http.write(" }") -end - -function action_nameinfo(...) - local util = require "luci.util" - - luci.http.prepare_content("application/json") - luci.http.write_json(util.ubus("network.rrdns", "lookup", { - addrs = { ... }, - timeout = 5000, - limit = 1000 - }) or { }) -end diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua deleted file mode 100644 index 4e83769ee0..0000000000 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua +++ /dev/null @@ -1,469 +0,0 @@ --- Copyright 2008 Steven Barth <steven@midlink.org> --- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org> --- Licensed to the public under the Apache License 2.0. - -module("luci.controller.admin.system", package.seeall) - -function index() - local fs = require "nixio.fs" - - entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1) - entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status")) - - entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2) - - if fs.access("/bin/opkg") then - entry({"admin", "system", "packages"}, post_on({ exec = "1" }, "action_packages"), _("Software"), 10) - entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg")) - end - - entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45) - entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46) - - if fs.access("/sbin/block") and fs.access("/etc/config/fstab") then - entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50) - entry({"admin", "system", "fstab", "mount"}, cbi("admin_system/fstab/mount"), nil).leaf = true - entry({"admin", "system", "fstab", "swap"}, cbi("admin_system/fstab/swap"), nil).leaf = true - end - - local nodes, number = fs.glob("/sys/class/leds/*") - if number > 0 then - entry({"admin", "system", "leds"}, cbi("admin_system/leds"), _("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), 60) - end - - entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70) - entry({"admin", "system", "flashops", "reset"}, post("action_reset")) - entry({"admin", "system", "flashops", "backup"}, post("action_backup")) - entry({"admin", "system", "flashops", "backupmtdblock"}, post("action_backupmtdblock")) - entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles")) - - -- call() instead of post() due to upload handling! - entry({"admin", "system", "flashops", "restore"}, call("action_restore")) - entry({"admin", "system", "flashops", "sysupgrade"}, call("action_sysupgrade")) - - entry({"admin", "system", "reboot"}, template("admin_system/reboot"), _("Reboot"), 90) - entry({"admin", "system", "reboot", "call"}, post("action_reboot")) -end - -function action_clock_status() - local set = tonumber(luci.http.formvalue("set")) - if set ~= nil and set > 0 then - local date = os.date("*t", set) - if date then - luci.sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d'" %{ - date.year, date.month, date.day, date.hour, date.min, date.sec - }) - luci.sys.call("/etc/init.d/sysfixtime restart") - end - end - - luci.http.prepare_content("application/json") - luci.http.write_json({ timestring = os.date("%c") }) -end - -function action_packages() - local fs = require "nixio.fs" - local ipkg = require "luci.model.ipkg" - local submit = (luci.http.formvalue("exec") == "1") - local update, upgrade - local changes = false - local install = { } - local remove = { } - local stdout = { "" } - local stderr = { "" } - local out, err - - -- Display - local display = luci.http.formvalue("display") or "available" - - -- Letter - local letter = string.byte(luci.http.formvalue("letter") or "A", 1) - letter = (letter == 35 or (letter >= 65 and letter <= 90)) and letter or 65 - - -- Search query - local query = luci.http.formvalue("query") - query = (query ~= '') and query or nil - - - -- Modifying actions - if submit then - -- Packets to be installed - local ninst = luci.http.formvalue("install") - local uinst = nil - - -- Install from URL - local url = luci.http.formvalue("url") - if url and url ~= '' then - uinst = url - end - - -- Do install - if ninst then - install[ninst], out, err = ipkg.install(ninst) - stdout[#stdout+1] = out - stderr[#stderr+1] = err - changes = true - end - - if uinst then - local pkg - for pkg in luci.util.imatch(uinst) do - install[uinst], out, err = ipkg.install(pkg) - stdout[#stdout+1] = out - stderr[#stderr+1] = err - changes = true - end - end - - -- Remove packets - local rem = luci.http.formvalue("remove") - if rem then - remove[rem], out, err = ipkg.remove(rem) - stdout[#stdout+1] = out - stderr[#stderr+1] = err - changes = true - end - - - -- Update all packets - update = luci.http.formvalue("update") - if update then - update, out, err = ipkg.update() - stdout[#stdout+1] = out - stderr[#stderr+1] = err - end - - - -- Upgrade all packets - upgrade = luci.http.formvalue("upgrade") - if upgrade then - upgrade, out, err = ipkg.upgrade() - stdout[#stdout+1] = out - stderr[#stderr+1] = err - end - end - - - -- List state - local no_lists = true - local old_lists = false - if fs.access("/var/opkg-lists/") then - local list - for list in fs.dir("/var/opkg-lists/") do - no_lists = false - if (fs.stat("/var/opkg-lists/"..list, "mtime") or 0) < (os.time() - (24 * 60 * 60)) then - old_lists = true - break - end - end - end - - - luci.template.render("admin_system/packages", { - display = display, - letter = letter, - query = query, - install = install, - remove = remove, - update = update, - upgrade = upgrade, - no_lists = no_lists, - old_lists = old_lists, - stdout = table.concat(stdout, ""), - stderr = table.concat(stderr, "") - }) - - -- Remove index cache - if changes then - fs.unlink("/tmp/luci-indexcache") - end -end - -local function image_supported(image) - return (os.execute("sysupgrade -T %q >/dev/null" % image) == 0) -end - -local function image_checksum(image) - return (luci.sys.exec("md5sum %q" % image):match("^([^%s]+)")) -end - -local function image_sha256_checksum(image) - return (luci.sys.exec("sha256sum %q" % image):match("^([^%s]+)")) -end - -local function supports_sysupgrade() - return nixio.fs.access("/lib/upgrade/platform.sh") -end - -local function supports_reset() - return (os.execute([[grep -sq "^overlayfs:/overlay / overlay " /proc/mounts]]) == 0) -end - -local function storage_size() - local size = 0 - if nixio.fs.access("/proc/mtd") then - for l in io.lines("/proc/mtd") do - local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"') - if n == "linux" or n == "firmware" then - size = tonumber(s, 16) - break - end - end - elseif nixio.fs.access("/proc/partitions") then - for l in io.lines("/proc/partitions") do - local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)') - if b and n and not n:match('[0-9]') then - size = tonumber(b) * 1024 - break - end - end - end - return size -end - - -function action_flashops() - -- - -- Overview - -- - luci.template.render("admin_system/flashops", { - reset_avail = supports_reset(), - upgrade_avail = supports_sysupgrade() - }) -end - -function action_sysupgrade() - local fs = require "nixio.fs" - local http = require "luci.http" - local image_tmp = "/tmp/firmware.img" - - local fp - http.setfilehandler( - function(meta, chunk, eof) - if not fp and meta and meta.name == "image" then - fp = io.open(image_tmp, "w") - end - if fp and chunk then - fp:write(chunk) - end - if fp and eof then - fp:close() - end - end - ) - - if not luci.dispatcher.test_post_security() then - fs.unlink(image_tmp) - return - end - - -- - -- Cancel firmware flash - -- - if http.formvalue("cancel") then - fs.unlink(image_tmp) - http.redirect(luci.dispatcher.build_url('admin/system/flashops')) - return - end - - -- - -- Initiate firmware flash - -- - local step = tonumber(http.formvalue("step")) or 1 - if step == 1 then - local force = http.formvalue("force") - if image_supported(image_tmp) or force then - luci.template.render("admin_system/upgrade", { - checksum = image_checksum(image_tmp), - sha256ch = image_sha256_checksum(image_tmp), - storage = storage_size(), - size = (fs.stat(image_tmp, "size") or 0), - keep = (not not http.formvalue("keep")), - force = (not not http.formvalue("force")) - }) - else - fs.unlink(image_tmp) - luci.template.render("admin_system/flashops", { - reset_avail = supports_reset(), - upgrade_avail = supports_sysupgrade(), - image_invalid = true - }) - end - - -- - -- Start sysupgrade flash - -- - elseif step == 2 then - local keep = (http.formvalue("keep") == "1") and "" or "-n" - local force = (http.formvalue("force") == "1") and "-F" or "" - luci.template.render("admin_system/applyreboot", { - title = luci.i18n.translate("Flashing..."), - msg = luci.i18n.translate("The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."), - addr = (#keep > 0) and (#force > 0) and "192.168.1.1" or nil - }) - fork_exec("sleep 1; killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %s %q" %{ keep, force, image_tmp }) - end -end - -function action_backup() - local reader = ltn12_popen("sysupgrade --create-backup - 2>/dev/null") - - luci.http.header( - 'Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' %{ - luci.sys.hostname(), - os.date("%Y-%m-%d") - }) - - luci.http.prepare_content("application/x-targz") - luci.ltn12.pump.all(reader, luci.http.write) -end - -function action_backupmtdblock() - local http = require "luci.http" - local mv = http.formvalue("mtdblockname") - local m, s, n = mv:match('^([^%s]+)/([^%s]+)/([^%s]+)') - - local reader = ltn12_popen("dd if=/dev/mtd%s conv=fsync,notrunc 2>/dev/null" % n) - - luci.http.header( - 'Content-Disposition', 'attachment; filename="backup-%s-%s-%s.bin"' %{ - luci.sys.hostname(), m, - os.date("%Y-%m-%d") - }) - - luci.http.prepare_content("application/octet-stream") - luci.ltn12.pump.all(reader, luci.http.write) -end - -function action_restore() - local fs = require "nixio.fs" - local http = require "luci.http" - local archive_tmp = "/tmp/restore.tar.gz" - - local fp - http.setfilehandler( - function(meta, chunk, eof) - if not fp and meta and meta.name == "archive" then - fp = io.open(archive_tmp, "w") - end - if fp and chunk then - fp:write(chunk) - end - if fp and eof then - fp:close() - end - end - ) - - if not luci.dispatcher.test_post_security() then - fs.unlink(archive_tmp) - return - end - - local upload = http.formvalue("archive") - if upload and #upload > 0 then - if os.execute("gunzip -t %q >/dev/null 2>&1" % archive_tmp) == 0 then - luci.template.render("admin_system/applyreboot") - os.execute("tar -C / -xzf %q >/dev/null 2>&1" % archive_tmp) - luci.sys.reboot() - else - luci.template.render("admin_system/flashops", { - reset_avail = supports_reset(), - upgrade_avail = supports_sysupgrade(), - backup_invalid = true - }) - end - return - end - - http.redirect(luci.dispatcher.build_url('admin/system/flashops')) -end - -function action_reset() - if supports_reset() then - luci.template.render("admin_system/applyreboot", { - title = luci.i18n.translate("Erasing..."), - msg = luci.i18n.translate("The system is erasing the configuration partition now and will reboot itself when finished."), - addr = "192.168.1.1" - }) - - fork_exec("sleep 1; killall dropbear uhttpd; sleep 1; jffs2reset -y && reboot") - return - end - - http.redirect(luci.dispatcher.build_url('admin/system/flashops')) -end - -function action_passwd() - local p1 = luci.http.formvalue("pwd1") - local p2 = luci.http.formvalue("pwd2") - local stat = nil - - if p1 or p2 then - if p1 == p2 then - stat = luci.sys.user.setpasswd("root", p1) - else - stat = 10 - end - end - - luci.template.render("admin_system/passwd", {stat=stat}) -end - -function action_reboot() - luci.sys.reboot() -end - -function fork_exec(command) - local pid = nixio.fork() - if pid > 0 then - return - elseif pid == 0 then - -- change to root dir - nixio.chdir("/") - - -- patch stdin, out, err to /dev/null - local null = nixio.open("/dev/null", "w+") - if null then - nixio.dup(null, nixio.stderr) - nixio.dup(null, nixio.stdout) - nixio.dup(null, nixio.stdin) - if null:fileno() > 2 then - null:close() - end - end - - -- replace with target command - nixio.exec("/bin/sh", "-c", command) - end -end - -function ltn12_popen(command) - - local fdi, fdo = nixio.pipe() - local pid = nixio.fork() - - if pid > 0 then - fdo:close() - local close - return function() - local buffer = fdi:read(2048) - local wpid, stat = nixio.waitpid(pid, "nohang") - if not close and wpid and stat == "exited" then - close = true - end - - if buffer and #buffer > 0 then - return buffer - elseif close then - fdi:close() - return nil - end - end - elseif pid == 0 then - nixio.dup(fdo, nixio.stdout) - fdi:close() - fdo:close() - nixio.exec("/bin/sh", "-c", command) - end -end |