diff options
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 |