diff options
56 files changed, 1094 insertions, 689 deletions
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua index 4bb404c25c..d0453f7d96 100644 --- a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua +++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua @@ -74,7 +74,7 @@ end o2 = s:option(ListValue, "adb_dns", translate("DNS Backend (DNS Directory)"), translate("List of supported DNS backends with their default list export directory.<br />") .. translate("To overwrite the default path use the 'DNS Directory' option in the extra section below.")) -o2:value("dnsmasq", "dnsmasq (/tmp/dnsmasq.d)") +o2:value("dnsmasq", "dnsmasq (/tmp)") o2:value("unbound", "unbound (/var/lib/unbound)") o2:value("named", "named (/var/lib/bind)") o2:value("kresd", "kresd (/etc/kresd)") @@ -98,10 +98,9 @@ o3.rmempty = false -- Runtime information -ds = s:option(DummyValue, "", translate("Runtime Information")) -ds.template = "cbi/nullsection" +ds = m:section(NamedSection, "global", "adblock", translate("Runtime Information")) -dv1 = s:option(DummyValue, "", translate("Adblock Status")) +dv1 = ds:option(DummyValue, "", translate("Adblock Status")) dv1.template = "adblock/runtime" if parse == nil then dv1.value = translate("n/a") @@ -117,7 +116,7 @@ else end end -dv2 = s:option(DummyValue, "", translate("Adblock Version")) +dv2 = ds:option(DummyValue, "", translate("Adblock Version")) dv2.template = "adblock/runtime" if parse == nil then dv2.value = translate("n/a") @@ -125,7 +124,7 @@ else dv2.value = version end -dv3 = s:option(DummyValue, "", translate("Download Utility (SSL Library)"), +dv3 = ds:option(DummyValue, "", translate("Download Utility (SSL Library)"), translate("For SSL protected blocklist sources you need a suitable SSL library, e.g. 'libustream-ssl' or the wget 'built-in'.")) dv3.template = "adblock/runtime" if parse == nil then @@ -134,7 +133,7 @@ else dv3.value = fetch end -dv4 = s:option(DummyValue, "", translate("DNS Backend (DNS Directory)")) +dv4 = ds:option(DummyValue, "", translate("DNS Backend (DNS Directory)")) dv4.template = "adblock/runtime" if parse == nil then dv4.value = translate("n/a") @@ -142,7 +141,7 @@ else dv4.value = backend end -dv5 = s:option(DummyValue, "", translate("Overall Domains")) +dv5 = ds:option(DummyValue, "", translate("Overall Domains")) dv5.template = "adblock/runtime" if parse == nil then dv5.value = translate("n/a") @@ -150,7 +149,7 @@ else dv5.value = domains end -dv6 = s:option(DummyValue, "", translate("Last Run")) +dv6 = ds:option(DummyValue, "", translate("Last Run")) dv6.template = "adblock/runtime" if parse == nil then dv6.value = translate("n/a") @@ -223,20 +222,37 @@ e7 = e:option(Flag, "adb_whitelist_mode", translate("Whitelist Mode"), e7.default = e7.disabled e7.rmempty = true -e8 = e:option(Value, "adb_dnsdir", translate("DNS Directory"), +e8 = e:option(Flag, "adb_dnsflush", translate("Flush DNS Cache"), + translate("Flush DNS Cache after adblock processing.")) +e8.default = e8.disabled +e8.rmempty = true + +e9 = e:option(Flag, "adb_notify", translate("Email Notification"), + translate("Send notification emails in case of a processing error or if domain count is ≤ 0.<br />") + .. translate("Please note: this needs additional 'mstmp' installation and setup (see readme).")) +e9.default = e9.disabled +e9.rmempty = true + +e10 = e:option(Value, "adb_notifycnt", translate("Email Notification Count"), +translate("Raise minimum domain count email notification trigger, to get emails if the overall count is ≤ the given limit (default 0).")) +e10.default = 0 +e10.datatype = "min(0)" +e10.optional = true + +e11 = e:option(Value, "adb_dnsdir", translate("DNS Directory"), translate("Target directory for the generated blocklist 'adb_list.overall'.")) -e8.datatype = "directory" -e8.optional = true +e11.datatype = "directory" +e11.optional = true -e9 = e:option(Value, "adb_whitelist", translate("Whitelist File"), +e12 = e:option(Value, "adb_whitelist", translate("Whitelist File"), translate("Full path to the whitelist file.")) -e9.datatype = "file" -e9.default = "/etc/adblock/adblock.whitelist" -e9.optional = true +e12.datatype = "file" +e12.default = "/etc/adblock/adblock.whitelist" +e12.optional = true -e10 = e:option(Value, "adb_triggerdelay", translate("Trigger Delay"), +e13 = e:option(Value, "adb_triggerdelay", translate("Trigger Delay"), translate("Additional trigger delay in seconds before adblock processing begins.")) -e10.datatype = "range(1,60)" -e10.optional = true +e13.datatype = "range(1,60)" +e13.optional = true return m diff --git a/applications/luci-app-advanced-reboot/Makefile b/applications/luci-app-advanced-reboot/Makefile index 3a886eb8de..5722b429e1 100644 --- a/applications/luci-app-advanced-reboot/Makefile +++ b/applications/luci-app-advanced-reboot/Makefile @@ -7,13 +7,13 @@ PKG_LICENSE:=GPL-3.0+ PKG_MAINTAINER:=Stan Grishin <stangri@melmac.net> LUCI_TITLE:=Advanced Linksys Reboot Web UI -LUCI_DESCRIPTION:=Provides Web UI (found under System/Advanced Reboot) to reboot supported Linksys routers to\ +LUCI_DESCRIPTION:=Provides Web UI (found under System/Advanced Reboot) to reboot supported Linksys and ZyXEL routers to\ an altnerative partition. Also provides Web UI to shut down (power off) your device. Supported dual-partition\ routers are listed at https://github.com/stangri/openwrt-luci/blob/luci-app-advanced-reboot/applications/luci-app-advanced-reboot/README.md LUCI_DEPENDS:=+luci LUCI_PKGARCH:=all -PKG_RELEASE:=23 +PKG_RELEASE:=25 include ../../luci.mk diff --git a/applications/luci-app-advanced-reboot/README.md b/applications/luci-app-advanced-reboot/README.md index ee87a00020..cfee188100 100644 --- a/applications/luci-app-advanced-reboot/README.md +++ b/applications/luci-app-advanced-reboot/README.md @@ -5,15 +5,16 @@ This package allows you to reboot to an alternative partition on supported (dual ## Supported Devices Currently supported dual-partition devices include: +- Linksys EA3500 +- Linksys E4200v2 +- Linksys EA4500 +- Linksys EA8500 - Linksys WRT1200AC - Linksys WRT1900AC - Linksys WRT1900ACv2 - Linksys WRT1900ACS - Linksys WRT3200ACM -- Linksys E4200v2 -- Linksys EA4500 -- Linksys EA8500 - +- ZyXEL NBG6817 If you're interested in having your device supported, please post in [LEDE Project Forum Support Thread](https://forum.lede-project.org/t/web-ui-to-reboot-to-another-partition-dual-partition-routers/3423). ## Screenshot (luci-app-advanced-reboot) @@ -28,8 +29,8 @@ opkg install luci-app-advanced-reboot ## Notes/Known Issues - When you reboot to a different partition, your current settings (WiFi SSID/password, etc.) will not apply to a different partition. Different partitions might have completely different settings and even firmware. -- If you reboot to a partition which doesn't allow you to switch boot partitions (like stock Linksys firmware), you might not be able to boot back to OpenWrt/LEDE Project unless you reflash it, loosing all the settings. +- If you reboot to a partition which doesn't allow you to switch boot partitions (like stock vendor firmware), you might not be able to boot back to OpenWrt/LEDE Project unless you reflash it, loosing all the settings. - Some devices allow you to trigger reboot to alternative partition by interrupting boot 3 times in a row (by resetting/switching off the device or pulling power). As these methods might be different for different devices, do your own homework. ## Thanks -I'd like to thank everyone who helped create, test and troubleshoot this package. Without contributions from [@hnyman](https://github.com/hnyman) and [@jpstyves](https://github.com/jpstyves) it wouldn't have been possible. +I'd like to thank everyone who helped create, test and troubleshoot this package. Without contributions from [@hnyman](https://github.com/hnyman), [@jpstyves](https://github.com/jpstyves) and [@slh](https://github.com/pkgadd) it wouldn't have been possible. diff --git a/applications/luci-app-advanced-reboot/luasrc/controller/advanced_reboot.lua b/applications/luci-app-advanced-reboot/luasrc/controller/advanced_reboot.lua index 2b55217b8e..13d1c73cce 100644 --- a/applications/luci-app-advanced-reboot/luasrc/controller/advanced_reboot.lua +++ b/applications/luci-app-advanced-reboot/luasrc/controller/advanced_reboot.lua @@ -5,15 +5,18 @@ module("luci.controller.advanced_reboot", package.seeall) -- device, board_name, part1, part2, offset, env_var_1, value_1_1, value_1_2, env_var_2, value_2_1, value_2_2 devices = { + {"Linksys EA3500", "linksys-audi", "mtd3", "mtd5", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, + {"Linksys E4200v2/EA4500", "linksys-viper", "mtd3", "mtd5", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, + {"Linksys EA8500", "ea8500", "mtd13", "mtd15", 32, "boot_part", 1, 2}, {"Linksys WRT1200AC", "armada-385-linksys-caiman", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, {"Linksys WRT1900AC", "armada-xp-linksys-mamba", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, {"Linksys WRT1900ACv2", "armada-385-linksys-cobra", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, {"Linksys WRT1900ACS", "armada-385-linksys-shelby", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, {"Linksys WRT3200ACM", "armada-385-linksys-rango", "mtd5", "mtd7", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, - {"Linksys E4200v2/EA4500", "linksys-viper", "mtd3", "mtd5", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"}, - {"Linksys EA8500", "ea8500", "mtd13", "mtd15", 32, "boot_part", 1, 2} + {"ZyXEL NBG6817","nbg6817","mmcblk0p4","mmcblk0p7",32,nil,255,1} } +errorMessage = "" board_name = luci.util.trim(luci.sys.exec("cat /tmp/sysinfo/board_name")) for i=1, #devices do if board_name and devices[i][2] == board_name then @@ -41,14 +44,29 @@ for i=1, #devices do if string.find(partition_two_label, "LEDE") then partition_two_os = "LEDE" end if string.find(partition_two_label, "OpenWrt") then partition_two_os = "OpenWrt" end if string.find(partition_two_label, "Linksys") then partition_two_os = "Linksys" end + if device_name and device_name == "ZyXEL NBG6817" then + if not partition_one_os then partition_one_os = "ZyXEL" end + if not partition_two_os then partition_two_os = "ZyXEL" end + end if not partition_one_os then partition_one_os = "Unknown" end if not partition_two_os then partition_two_os = "Unknown" end if partition_one_os and partition_one_version then partition_one_os = partition_one_os .. " (Linux " .. partition_one_version .. ")" end if partition_two_os and partition_two_version then partition_two_os = partition_two_os .. " (Linux " .. partition_two_version .. ")" end - if nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then - current_partition = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1))) - other_partition = current_partition == boot_envvar1_partition_one and boot_envvar1_partition_two or boot_envvar1_partition_one + + if device_name and device_name == "ZyXEL NBG6817" then + if not zyxelFlagPartition then zyxelFlagPartition = luci.util.trim(luci.sys.exec("source /lib/functions.sh; find_mtd_part 0:DUAL_FLAG")) end + if not zyxelFlagPartition then + errorMessage = errorMessage .. luci.i18n.translate("Unable to find Dual Boot Flag Partition." .. " ") + luci.util.perror(luci.i18n.translate("Unable to find Dual Boot Flag Partition.")) + else + current_partition = tonumber(luci.sys.exec("dd if=" .. zyxelFlagPartition .. " bs=1 count=1 2>/dev/null | hexdump -n 1 -e '1/1 \"%d\"'")) + end + else + if nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then + current_partition = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1))) + end end + other_partition = current_partition == boot_envvar1_partition_two and boot_envvar1_partition_one or boot_envvar1_partition_two end end @@ -70,8 +88,19 @@ function action_reboot() end function action_altreboot() + local zyxelFlagPartition, zyxelBootFlag, zyxelNewBootFlag, errorCode, curEnvSetting, newEnvSetting + errorMessage = "" + errorCode = 0 if luci.http.formvalue("cancel") then luci.http.redirect(luci.dispatcher.build_url('admin/system/advanced_reboot')) +-- luci.template.render("advanced_reboot/advanced_reboot",{ +-- device_name=device_name, +-- boot_envvar1_partition_one=boot_envvar1_partition_one, +-- partition_one_os=partition_one_os, +-- boot_envvar1_partition_two=boot_envvar1_partition_two, +-- partition_two_os=partition_two_os, +-- current_partition=current_partition, +-- errorMessage = luci.i18n.translate("Alternative reboot cancelled.")}) return end local step = tonumber(luci.http.formvalue("step") or 1) @@ -79,21 +108,72 @@ function action_altreboot() if device_name and nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then luci.template.render("advanced_reboot/alternative_reboot",{}) else - luci.template.render("advanced_reboot/advanced_reboot",{}) + luci.template.render("advanced_reboot/advanced_reboot",{errorMessage = luci.i18n.translate("No access to fw_printenv or fw_printenv!")}) end elseif step == 2 then - luci.template.render("admin_system/applyreboot", { - title = luci.i18n.translate("Rebooting..."), - msg = luci.i18n.translate("The system is rebooting to an alternative partition 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 = luci.ip.new(uci.cursor():get("network", "lan", "ipaddr")) or "192.168.1.1" - }) - if boot_envvar1 then env1 = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1))) end - if boot_envvar2 then env2 = luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar2)) end - if env1 and env1 == boot_envvar1_partition_one then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar1 .. " " .. boot_envvar1_partition_two) end - if env1 and env1 == boot_envvar1_partition_two then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar1 .. " " .. boot_envvar1_partition_one) end - if env2 and env2 == boot_envvar2_partition_one then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar2 .. " '" .. boot_envvar2_partition_two .. "'") end - if env2 and env2 == boot_envvar2_partition_two then luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar2 .. " '" .. boot_envvar2_partition_one .. "'") end - luci.sys.reboot() + if boot_envvar1 or boot_envvar2 then -- Linksys devices + if boot_envvar1 then + curEnvSetting = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1))) + if not curEnvSetting then + errorMessage = errorMessage .. luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar1 .. ". " + luci.util.perror(luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar1 .. ".") + else + newEnvSetting = curEnvSetting == boot_envvar1_partition_one and boot_envvar1_partition_two or boot_envvar1_partition_one + errorCode = luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar1 .. " " .. newEnvSetting) + if errorCode ~= 0 then + errorMessage = errorMessage .. luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar1 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ". " + luci.util.perror(luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar1 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ".") + end + end + end + if boot_envvar2 then + curEnvSetting = luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar2)) + if not curEnvSetting then + errorMessage = errorMessage .. luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar2 .. ". " + luci.util.perror(luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar2 .. ".") + else + newEnvSetting = curEnvSetting == boot_envvar2_partition_one and boot_envvar2_partition_two or boot_envvar2_partition_one + errorCode = luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar2 .. " '" .. newEnvSetting .. "'") + if errorCode ~= 0 then + errorMessage = errorMessage .. luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar2 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ". " + luci.util.perror(luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar2 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ".") + end + end + end + else -- NetGear device + if not zyxelFlagPartition then zyxelFlagPartition = luci.util.trim(luci.sys.exec("source /lib/functions.sh; find_mtd_part 0:DUAL_FLAG")) end + if not zyxelFlagPartition then + errorMessage = errorMessage .. luci.i18n.translate("Unable to find Dual Boot Flag Partition." .. " ") + luci.util.perror(luci.i18n.translate("Unable to find Dual Boot Flag Partition.")) + else + zyxelBootFlag = tonumber(luci.sys.exec("dd if=" .. zyxelFlagPartition .. " bs=1 count=1 2>/dev/null | hexdump -n 1 -e '1/1 \"%d\"'")) + zyxelNewBootFlag = zyxelBootFlag and zyxelBootFlag == 1 and "\\xff" or "\\x01" + if zyxelNewBootFlag then + errorCode = luci.sys.call("printf \"" .. zyxelNewBootFlag .. "\" >" .. zyxelFlagPartition ) + if errorCode ~= 0 then + errorMessage = errorMessage .. luci.i18n.translate("Unable to set Dual Boot Flag Partition entry for partition") .. ": " .. zyxelFlagPartition .. ". " + luci.util.perror(luci.i18n.translate("Unable to set Dual Boot Flag Partition entry for partition") .. ": " .. zyxelFlagPartition .. ".") + end + end + end + end + if errorMessage == "" then + luci.template.render("admin_system/applyreboot", { + title = luci.i18n.translate("Rebooting..."), + msg = luci.i18n.translate("The system is rebooting to an alternative partition 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 = luci.ip.new(uci.cursor():get("network", "lan", "ipaddr")) or "192.168.1.1" + }) + luci.sys.reboot() + else + luci.template.render("advanced_reboot/advanced_reboot",{ + device_name=device_name, + boot_envvar1_partition_one=boot_envvar1_partition_one, + partition_one_os=partition_one_os, + boot_envvar1_partition_two=boot_envvar1_partition_two, + partition_two_os=partition_two_os, + current_partition=current_partition, + errorMessage = errorMessage}) + end end end diff --git a/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm b/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm index 206d250543..0629c84b36 100644 --- a/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm +++ b/applications/luci-app-advanced-reboot/luasrc/view/advanced_reboot/advanced_reboot.htm @@ -14,6 +14,10 @@ <p class="alert-message warning"><%:Warning: There are unsaved changes that will get lost on reboot!%></p> <%- end -%> +<%- if errorMessage and errorMessage ~= "" then -%> + <p class="alert-message warning"><%:ERROR: %><%=errorMessage%></p> +<%- end -%> + <%- if device_name then -%> <fieldset class="cbi-section"> <legend><%=device_name%><%: Partitions%></legend> @@ -26,7 +30,7 @@ </tr> <tr class="cbi-section-table-row"> <td> - <%=boot_envvar1_partition_one%> + <%=string.format("%X", boot_envvar1_partition_one)%> </td> <td> <%- if boot_envvar1_partition_one == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%> @@ -50,7 +54,7 @@ </tr> <tr class="cbi-section-table-row"> <td> - <%=boot_envvar1_partition_two%> + <%=string.format("%X", boot_envvar1_partition_two)%> </td> <td> <%- if boot_envvar1_partition_two == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%> diff --git a/applications/luci-app-advanced-reboot/po/sv/luci-app-advanced-reboot.po b/applications/luci-app-advanced-reboot/po/sv/luci-app-advanced-reboot.po index 20d77cbcf7..e0e13cfda9 100644 --- a/applications/luci-app-advanced-reboot/po/sv/luci-app-advanced-reboot.po +++ b/applications/luci-app-advanced-reboot/po/sv/luci-app-advanced-reboot.po @@ -10,6 +10,9 @@ msgstr "Avancerad omstart" msgid "Alternative" msgstr "Alternativ" +msgid "Alternative reboot cancelled." +msgstr "" + msgid "Cancel" msgstr "Avbryt" @@ -19,9 +22,15 @@ msgstr "Bekräfta" msgid "Current" msgstr "Nuvarande" +msgid "ERROR:" +msgstr "" + msgid "Firmware/OS (Kernel)" msgstr "Inre mjukvara/OS (Kärna)" +msgid "No access to fw_printenv or fw_printenv!" +msgstr "" + msgid "Partition" msgstr "Partition" @@ -78,6 +87,18 @@ msgstr "" "inställningar så kan det vara nödvändigt att förnya din dators adress för " "att nå enheten igen." +msgid "Unable to find Dual Boot Flag Partition." +msgstr "" + +msgid "Unable to obtain firmware environment variable" +msgstr "" + +msgid "Unable to set Dual Boot Flag Partition entry for partition" +msgstr "" + +msgid "Unable to set firmware environment variable" +msgstr "" + msgid "" "WARNING: An alternative partition might have its own settings and completely " "different firmware.<br /><br /> As your network configuration and WiFi SSID/" @@ -107,3 +128,6 @@ msgstr "Varning: Det här systemet har inte två partitioner!" msgid "Warning: This system does not support powering off!" msgstr "Varning: Det här systemet har inte stöd för avstängning!" + +msgid "to" +msgstr "" diff --git a/applications/luci-app-advanced-reboot/po/templates/luci-app-advanced-reboot.pot b/applications/luci-app-advanced-reboot/po/templates/luci-app-advanced-reboot.pot index 9c810892c2..47a81e1dd0 100644 --- a/applications/luci-app-advanced-reboot/po/templates/luci-app-advanced-reboot.pot +++ b/applications/luci-app-advanced-reboot/po/templates/luci-app-advanced-reboot.pot @@ -10,6 +10,9 @@ msgstr "" msgid "Alternative" msgstr "" +msgid "Alternative reboot cancelled." +msgstr "" + msgid "Cancel" msgstr "" @@ -19,9 +22,15 @@ msgstr "" msgid "Current" msgstr "" +msgid "ERROR:" +msgstr "" + msgid "Firmware/OS (Kernel)" msgstr "" +msgid "No access to fw_printenv or fw_printenv!" +msgstr "" + msgid "Partition" msgstr "" @@ -75,6 +84,18 @@ msgid "" "again, depending on your settings." msgstr "" +msgid "Unable to find Dual Boot Flag Partition." +msgstr "" + +msgid "Unable to obtain firmware environment variable" +msgstr "" + +msgid "Unable to set Dual Boot Flag Partition entry for partition" +msgstr "" + +msgid "Unable to set firmware environment variable" +msgstr "" + msgid "" "WARNING: An alternative partition might have its own settings and completely " "different firmware.<br /><br /> As your network configuration and WiFi SSID/" @@ -100,3 +121,6 @@ msgstr "" msgid "Warning: This system does not support powering off!" msgstr "" + +msgid "to" +msgstr "" diff --git a/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm b/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm index 847ad5cfb3..0a8c65ebdd 100644 --- a/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm +++ b/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm @@ -71,15 +71,14 @@ end apply_acls("/usr/share/rpcd/acl.d/attendedsysupgrade.json", luci.dispatcher.context.authsession) - apply_acls("/usr/share/rpcd/acl.d/packagelist.json", luci.dispatcher.context.authsession) %> <%+header%> <h2 name="content"><%:Attended Sysupgrade%></h2> <div class="cbi-map-descr"> - Easily search and install new releases and package upgrades. Sysupgrade images are created on demand based on locally installed packages. + Easily search and install new releases and package upgrades. Sysupgrade firmware are created on demand based on locally installed packages. </div> -<div style="display: none" id="upgrade_info" class="alert-message info"></div> -<div style="display: none" id="upgrade_error" class="alert-message danger"></div> +<div style="display: none" id="info_box" class="alert-message info"></div> +<div style="display: none" id="error_box" class="alert-message danger"></div> <div style="display: none" id="packages" class="alert-message success"></div> <p> <textarea style="display: none; width: 100%;" id="edit_packages" rows="15"></textarea> @@ -89,7 +88,7 @@ <div class="cbi-selection-node"> <div class="cbi-value" id="keep_container" style="display: none"> <div class="cbi-section-descr"> - Check "Keep settings" to retain the current configuration (requires a compatible firmware image). + Check "Keep settings" to retain the current configuration (requires a compatible firmware). </div> <label class="cbi-value-title" for="keep">Keep settings:</label> <div class="cbi-value-field"> @@ -116,353 +115,10 @@ </form> </fieldset> <script type="text/javascript"> -data = {}; -origin = document.location.href.replace(location.pathname, "") -ubus_url = origin + "/ubus/" - -function set_server() { - data.url = document.getElementById("server").value; - ubus_call("uci", "set", { "config": "attendedsysupgrade", "section": "server", values: { "url": data.url } }) - ubus_call("uci", "commit", { "config": "attendedsysupgrade" }) - var server = document.getElementById("server") - server.type = 'button'; - server.className = 'cbi-button cbi-button-edit'; - server.parentElement.removeChild(document.getElementById("button_set")); - server.onclick = edit_server; -} - -function edit_server() { - document.getElementById("server").type = 'text'; - document.getElementById("server").onkeydown = function(event) { - if(event.key === 'Enter') { - set_server(); - return false; - } - } - document.getElementById("server").className = ''; - document.getElementById("server").onclick = null; - - button_set = document.createElement("input"); - button_set.type = "button"; - button_set.value = "Save"; - button_set.name = "button_set"; - button_set.id = "button_set"; - button_set.className = 'cbi-button cbi-button-edit'; - button_set.style = 'background-image: url("/luci-static/resources/cbi/save.gif");' - button_set.onclick = set_server - document.getElementById("server").parentElement.appendChild(button_set); -} - -function edit_packages() { - data.edit_packages = true - document.getElementById("edit_button").style.display = "none"; - document.getElementById("edit_packages").value = data.packages.join("\n"); - document.getElementById("edit_packages").style.display = "block"; -} - -// requests to the upgrade server -function server_request(request_dict, path, callback) { - request_dict.distro = data.release.distribution; - request_dict.target = data.release.target.split("\/")[0]; - request_dict.subtarget = data.release.target.split("\/")[1]; - var request = new XMLHttpRequest(); - request.open("POST", data.url + "/" + path, true); - request.setRequestHeader("Content-type", "application/json"); - request.send(JSON.stringify(request_dict)); - request.onerror = function(e) { - upgrade_error("upgrade server down") - document.getElementById("server_div").style.display = "block"; - } - request.addEventListener('load', function(event) { - callback(request) - }); -} - -// initial setup, get system information -function setup() { + data = {}; data["ubus_rpc_session"] = "<%=luci.dispatcher.context.authsession%>" - ubus_call("packagelist", "list", {}, "packagelist"); - ubus_call("system", "board", {}, "release"); - ubus_call("system", "board", {}, "board_name"); - ubus_call("system", "board", {}, "model"); - uci_call({ "config": "attendedsysupgrade", "section": "server", "option": "url" }) - uci_call({ "config": "attendedsysupgrade", "section": "client", "option": "upgrade_packages" }) - uci_call({ "config": "attendedsysupgrade", "section": "client", "option": "advanced_mode" }) - uci_call({ "config": "attendedsysupgrade", "section": "client", "option": "auto_search" }) - setup_ready(); -} - -function setup_ready() { - if(ubus_counter != ubus_closed) { - setTimeout(setup_ready, 300) - } else { - if(data.auto_search == 1) { - upgrade_check(); - } else { - document.getElementById("upgrade_button").style.display = "block"; - document.getElementById("server_div").style.display = "block"; - document.getElementById("server").value = data.url; - } - } -} - -function uci_call(option) { - ubus_call("uci", "get", option, option["option"]) -} - -ubus_counter = 0; -ubus_closed = 0; -function ubus_call(command, argument, params, variable) { - request_data = {}; - request_data.jsonrpc = "2.0"; - request_data.id = ubus_counter; - request_data.method = "call"; - request_data.params = [ data.ubus_rpc_session, command, argument, params ] - request_json = JSON.stringify(request_data) - ubus_counter++; - var request = new XMLHttpRequest(); - request.open("POST", ubus_url, true); - request.setRequestHeader("Content-type", "application/json"); - request.addEventListener('load', function(event) { - if(request.status === 200) { - response = JSON.parse(request.responseText).result - if(response[0] == 0) { - if(response.length == 2) { - if(command === "uci") { - data[variable] = response[1].value - } else { - data[variable] = response[1][variable] - } - } - } else { - upgrade_error("ubus call faild: " + request_json) - } - ubus_closed++; - } - }); - request.send(request_json); -} - -// shows notification if upgrade is available -function upgrade_info(info_output, loading) { - document.getElementById("upgrade_info").style.display = "block"; - if(loading) { - loading_image = '<img src="/luci-static/resources/icons/loading.gif" alt="Loading" style="vertical-align:middle">' - } else { - loading_image = '' - } - document.getElementById("upgrade_info").innerHTML = loading_image + info_output; -} - -function upgrade_error(error_output) { - document.getElementById("upgrade_error").style.display = "block"; - document.getElementById("upgrade_error").innerHTML = error_output; - document.getElementById("upgrade_info").style.display = "none"; -} - -// asks server for news upgrades, actually only based on relesae not packages -function upgrade_check() { - document.getElementById("upgrade_error").style.display = "none"; - document.getElementById("server_div").style.display = "none"; - upgrade_info("Searching for upgrades", true); - request_dict = {} - request_dict.version = data.release.version; - request_dict.packages = data.packagelist; - // not only search for new release, but for new package versions as well - request_dict.upgrade_packages = data.upgrade_packages - server_request(request_dict, "api/upgrade-check", upgrade_check_callback) -} - -// request the image, need merge with upgrade_request -function upgrade_request() { - console.log("upgrade_request") - document.getElementById("upgrade_button").disabled = true; - document.getElementById("edit_packages").style.display = "none"; - document.getElementById("edit_button").style.display = "none"; - document.getElementById("keep_container").style.display = "none"; - request_dict = {} - request_dict.version = data.latest_version; - request_dict.board = data.board_name - - if(data.edit_packages == true) { - request_dict.packages = document.getElementById("edit_packages").value.split("\n") - } else { - request_dict.packages = data.packages; - } - request_dict.model = data.model - server_request(request_dict, "api/upgrade-request", upgrade_request_callback) -} - -function upgrade_request_callback(response) { - if (response.status === 400) { - response_content = JSON.parse(response.responseText) - upgrade_error(response_content.error) - } else if (response.status === 500) { - response_content = JSON.parse(response.responseText) - upgrade_error(response_content.error) - if(response_content.log != undefined) { - data.log_url = response_content.log - } - } else if (response.status === 503) { - upgrade_error("please wait. server overloaded") - // handle overload - setTimeout(upgrade_request, 30000) - } else if (response.status === 201) { - response_content = JSON.parse(response.responseText) - if(response_content.queue != undefined) { - // in queue - upgrade_info("please wait. you are in queue position " + response_content.queue, true) - console.log("queued") - } else { - upgrade_info("imagebuilder not ready, please wait", true) - console.log("setting up imagebuilder") - } - setTimeout(upgrade_request, 5000) - } else if (response.status === 206) { - // building - console.log("building") - upgrade_info("building image", true) - setTimeout(upgrade_request, 5000) - } else if (response.status === 200) { - // ready to download - response_content = JSON.parse(response.responseText); - data.sysupgrade_url = response_content.sysupgrade; - - info_output = "Image created" - if(data.advanced_mode == 1) { - build_log = '</br><a target="_blank" href="' + data.sysupgrade_url + '.log">Build log</a>' - info_output += build_log - } - upgrade_info(info_output); - - document.getElementById("keep_container").style.display = "block"; - var upgrade_button = document.getElementById("upgrade_button") - upgrade_button.disabled = false; - upgrade_button.style.display = "block"; - upgrade_button.value = "Flash firmware"; - upgrade_button.onclick = download_image; - } -} - -// uploads received blob data to the server using cgi-io -function upload_image(blob) { - var upload_request = new XMLHttpRequest(); - var form_data = new FormData(); - - form_data.append("sessionid", data.ubus_rpc_session) - form_data.append("filename", "/tmp/firmware.bin") - form_data.append("filemode", 755) // insecure? - form_data.append("filedata", blob) - - upload_request.addEventListener('load', function(event) { - // this checksum should be parsed - upgrade_info("Flashing firmware", true) - ubus_call("rpc-sys", "upgrade_start", { "keep": document.getElementById("keep").checked }, 'message'); - setTimeout(ping_ubus, 5000) - console.log(data.message); - }); - - upload_request.addEventListener('error', function(event) { - upgrade_info("uploading failed, please retry") - }); - - upload_request.open('POST', origin + '/cgi-bin/cgi-upload'); - upload_request.send(form_data); -} - -function ping_ubus() { - var request = new XMLHttpRequest(); - request.open("GET", ubus_url, true); - request.addEventListener('error', function(event) { - upgrade_info("Rebooting", true); - setTimeout(ping_ubus, 1000) - }); - request.addEventListener('load', function(event) { - upgrade_info("Success! Please reload web interface"); - document.getElementById("upgrade_button").value = "reload page"; - document.getElementById("upgrade_button").style.display = "block"; - document.getElementById("upgrade_button").disabled = false; - document.getElementById("upgrade_button").onclick = function() { location.reload(); } - }); - request.send(); -} - -// download image from server once the url was received by upgrade_request -function download_image() { - console.log("download_image") - document.getElementById("keep_container").style.display = "none"; - document.getElementById("upgrade_button").style.display = "none"; - var download_request = new XMLHttpRequest(); - download_request.open("GET", data.sysupgrade_url); - download_request.responseType = "arraybuffer"; - - download_request.onload = function () { - if (this.status === 200) { - var blob = new Blob([download_request.response], {type: "application/octet-stream"}); - upload_image(blob) - } - }; - upgrade_info("downloading image", true); - download_request.send(); -} - -function upgrade_check_callback(response_object) { - if (response_object.status === 500) { - // python crashed - upgrade_error("internal server error, please try again later") - console.log("upgrade server issue") - } else if (response_object.status === 502) { - // python part offline - upgrade_error("internal server error, please try again later") - console.log("upgrade server issue") - } else if (response_object.status === 503) { - // handle overload - upgrade_error("server overloaded, retry in 5 minutes") - console.log("server overloaded") - setTimeout(upgrade_request, 300000) - } else if (response_object.status === 201) { - upgrade_info("Setting up ImageBuilder", true) - console.log("setting up imagebuilder") - setTimeout(upgrade_request, 5000) - } else if (response_object.status === 204) { - // no upgrades - upgrade_info("No upgrades available") - } else if (response_object.status === 400) { - // bad request - console.log(response_object.responseText) - response_object_content = JSON.parse(response_object.responseText) - upgrade_error(response_object_content.error) - } else if (response_object.status === 200) { - // new release/upgrades - response_content = JSON.parse(response_object.responseText) - - // create simple output to tell user whats going to be upgrade (release/packages) - info_output = "" - if(response_content.version != undefined) { - info_output += "<h3>new upgrade available</h3>" - info_output += data.release.version + " to " + response_content.version - data.latest_version = response_content.version; - } - if(response_content.upgrades != undefined) { - info_output += "<h3>package upgrades available</h3>" - for (upgrade in response_content.upgrades) { - info_output += "<b>" + upgrade + "</b>: " + response_content.upgrades[upgrade][1] + " to " + response_content.upgrades[upgrade][0] + "</br>" - } - } - data.packages = response_content.packages - upgrade_info(info_output) - - if(data.advanced_mode == 1) { - document.getElementById("edit_button").style.display = "block"; - } - var upgrade_button = document.getElementById("upgrade_button") - upgrade_button.value = "Request image"; - upgrade_button.style.display = "block"; - upgrade_button.disabled = false; - upgrade_button.onclick = upgrade_request; - } -} -document.onload = setup() + origin = document.location.href.replace(location.pathname, "") + ubus_url = origin + "/ubus/" </script> - +<script type="text/javascript" src="<%=resource%>/attendedsysupgrade.js"></script> <%+footer%> diff --git a/applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json b/applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json index 97aa814928..7549319260 100644 --- a/applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json +++ b/applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json @@ -4,10 +4,12 @@ "read": { "ubus": { "rpc-sys": [ - "upgrade_start" + "upgrade_start", + "packagelist" ], "system": [ - "board" + "board", + "info" ], "uci": [ "get", "set", "commit" diff --git a/applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js b/applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js new file mode 100644 index 0000000000..c2fe81d58a --- /dev/null +++ b/applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js @@ -0,0 +1,402 @@ +function $(s) { + return document.getElementById(s.substring(1)); +} + +function show(s) { + $(s).style.display = 'block'; +} + +function hide(s) { + $(s).style.display = 'none'; +} + +function set_server() { + hide("#error_box"); + data.url = $("#server").value; + ubus_call("uci", "set", { "config": "attendedsysupgrade", "section": "server", values: { "url": data.url } }) + ubus_call("uci", "commit", { "config": "attendedsysupgrade" }) + var server_button = $("#server") + server_button.type = 'button'; + server_button.className = 'cbi-button cbi-button-edit'; + server_button.parentElement.removeChild($("#button_set")); + server_button.onclick = edit_server; +} + +function edit_server() { + $("#server").type = 'text'; + $("#server").onkeydown = function(event) { + if(event.key === 'Enter') { + set_server(); + return false; + } + } + $("#server").className = ''; + $("#server").onclick = null; + + button_set = document.createElement("input"); + button_set.type = "button"; + button_set.value = "Save"; + button_set.name = "button_set"; + button_set.id = "button_set"; + button_set.className = 'cbi-button cbi-button-edit'; + button_set.style = 'background-image: url("/luci-static/resources/cbi/save.gif");' + button_set.onclick = set_server + $("#server").parentElement.appendChild(button_set); +} + +function edit_packages() { + data.edit_packages = true + hide("#edit_button"); + $("#edit_packages").value = data.packages.join("\n"); + show("#edit_packages"); +} + +// requests to the upgrade server +function server_request(request_dict, path, callback) { + request_dict.distro = data.release.distribution; + request_dict.target = data.release.target.split("\/")[0]; + request_dict.subtarget = data.release.target.split("\/")[1]; + var request = new XMLHttpRequest(); + request.open("POST", data.url + "/" + path, true); + request.setRequestHeader("Content-type", "application/json"); + request.send(JSON.stringify(request_dict)); + request.onerror = function(e) { + error_box("upgrade server down") + show("#server_div"); + } + request.addEventListener('load', function(event) { + callback(request) + }); +} + +// initial setup, get system information +function setup() { + ubus_call("rpc-sys", "packagelist", {}, "packages"); + ubus_call("system", "board", {}, "release"); + ubus_call("system", "board", {}, "board_name"); + ubus_call("system", "board", {}, "model"); + ubus_call("system", "info", {}, "memory"); + uci_get({ "config": "attendedsysupgrade", "section": "server", "option": "url" }) + uci_get({ "config": "attendedsysupgrade", "section": "client", "option": "upgrade_packages" }) + uci_get({ "config": "attendedsysupgrade", "section": "client", "option": "advanced_mode" }) + uci_get({ "config": "attendedsysupgrade", "section": "client", "option": "auto_search" }) + setup_ready(); +} + +function setup_ready() { + // checks if a async ubus calls have finished + if(ubus_counter != ubus_closed) { + setTimeout(setup_ready, 300) + } else { + if(data.auto_search == 1) { + upgrade_check(); + } else { + show("#upgrade_button"); + show("#server_div"); + $("#server").value = data.url; + } + } +} + +function uci_get(option) { + // simple wrapper to get a uci value store in data.<option> + ubus_call("uci", "get", option, option["option"]) +} + +ubus_counter = 0; +ubus_closed = 0; +function ubus_call(command, argument, params, variable) { + var request_data = {}; + request_data.jsonrpc = "2.0"; + request_data.id = ubus_counter; + request_data.method = "call"; + request_data.params = [ data.ubus_rpc_session, command, argument, params ] + request_json = JSON.stringify(request_data) + ubus_counter++; + var request = new XMLHttpRequest(); + request.open("POST", ubus_url, true); + request.setRequestHeader("Content-type", "application/json"); + request.onload = function(event) { + if(request.status === 200) { + var response = JSON.parse(request.responseText) + if(!("error" in response) && "result" in response) { + if(response.result.length === 2) { + if(command === "uci") { + data[variable] = response.result[1].value + } else { + data[variable] = response.result[1][variable] + } + } + } else { + error_box("<b>Ubus call faild:</b></br>Request: " + request_json + "</br>Response: " + JSON.stringify(response)) + } + ubus_closed++; + } + } + request.send(request_json); +} + +function info_box(info_output, loading) { + // Shows notification if upgrade is available + // If loading is true then an "processing" animation is added + show("#info_box"); + var loading_image = ''; + if(loading) { + loading_image = '<img src="/luci-static/resources/icons/loading.gif" alt="Loading" style="vertical-align:middle">'; + } + $("#info_box").innerHTML = loading_image + info_output; +} + +function error_box(error_output) { + // Shows erros in red box + show("#error_box"); + $("#error_box").innerHTML = error_output; + hide("#info_box"); +} + +function upgrade_check() { + // Asks server for new firmware + // If data.upgrade_packages is set to true search for new package versions as well + hide("#error_box"); + hide("#server_div"); + info_box("Searching for upgrades", true); + var request_dict = {} + request_dict.version = data.release.version; + request_dict.packages = data.packages; + request_dict.upgrade_packages = data.upgrade_packages + server_request(request_dict, "api/upgrade-check", upgrade_check_callback) +} + +function upgrade_check_callback(request_text) { + var request_json = JSON.parse(request_text) + + // create simple output to tell user whats going to be upgrade (release/packages) + var info_output = "" + if(request_json.version != undefined) { + info_output += "<h3>New firmware release available</h3>" + info_output += data.release.version + " to " + request_json.version + data.latest_version = request_json.version; + } + if(request_json.upgrades != undefined) { + info_output += "<h3>Package upgrades available</h3>" + for (upgrade in request_json.upgrades) { + info_output += "<b>" + upgrade + "</b>: " + request_json.upgrades[upgrade][1] + " to " + request_json.upgrades[upgrade][0] + "</br>" + } + } + data.packages = request_json.packages + info_box(info_output) + + if(data.advanced_mode == 1) { + show("#edit_button"); + } + var upgrade_button = $("#upgrade_button") + upgrade_button.value = "Request firmware"; + upgrade_button.style.display = "block"; + upgrade_button.disabled = false; + upgrade_button.onclick = upgrade_request; + +} + +function upgrade_request() { + // Request the image + // Needed values + // version/release + // board_name or model (server tries to find the corrent profile) + // packages + // The rest is added by server_request() + $("#upgrade_button").disabled = true; + hide("#edit_packages"); + hide("#edit_button"); + hide("#keep_container"); + + var request_dict = {} + request_dict.version = data.latest_version; + request_dict.board = data.board_name + request_dict.model = data.model + + if(data.edit_packages == true) { + request_dict.packages = $("#edit_packages").value.split("\n") + } else { + request_dict.packages = data.packages; + } + + server_request(request_dict, "api/upgrade-request", upgrade_request_callback) +} + +function upgrade_request_callback(request) { + // ready to download + var request_json = JSON.parse(request); + data.sysupgrade_url = request_json.sysupgrade; + + var filename_split = data.sysupgrade_url.split("/") + data.filename = filename_split[filename_split.length - 1] + + info_output = "Firmware created</br><b>" + data.filename + "</b>" + if(data.advanced_mode == 1) { + info_output += '</br><a target="_blank" href="' + data.sysupgrade_url + '.log">Build log</a>' + } + info_box(info_output); + + show("#keep_container"); + var upgrade_button = $("#upgrade_button") + upgrade_button.disabled = false; + upgrade_button.style.display = "block"; + upgrade_button.value = "Flash firmware"; + upgrade_button.onclick = download_image; +} + +function flash_image() { + // Flash image via rpc-sys upgrade_start + info_box("Flashing firmware. Don't unpower device", true) + ubus_call("rpc-sys", "upgrade_start", { "keep": $("#keep").checked }, 'message'); + ping_max = 3600; // in seconds + setTimeout(ping_ubus, 10000) +} + +function ping_ubus() { + // Tries to connect to ubus. If the connection fails the device is likely still rebooting. + // If more time than ping_max passes update may failed + if(ping_max > 0) { + ping_max--; + var request = new XMLHttpRequest(); + request.open("GET", ubus_url, true); + request.addEventListener('error', function(event) { + info_box("Rebooting device", true); + setTimeout(ping_ubus, 1000) + }); + request.addEventListener('load', function(event) { + info_box("Success! Please reload web interface"); + $("#upgrade_button").value = "Reload page"; + show("#upgrade_button"); + $("#upgrade_button").disabled = false; + $("#upgrade_button").onclick = function() { location.reload(); } + }); + request.send(); + } else { + error_box("Web interface could not reconnect to your device. Please reload web interface or check device manually") + } +} + +function upload_image(blob) { + // Uploads received blob data to the server using cgi-io + var request = new XMLHttpRequest(); + var form_data = new FormData(); + + form_data.append("sessionid", data.ubus_rpc_session) + form_data.append("filename", "/tmp/firmware.bin") + form_data.append("filemode", 755) // insecure? + form_data.append("filedata", blob) + + request.addEventListener('load', function(event) { + request_json = JSON.parse(request.responseText) + flash_image(); + }); + + request.addEventListener('error', function(event) { + info_box("Upload of firmware failed, please retry by reloading web interface") + }); + + request.open('POST', origin + '/cgi-bin/cgi-upload'); + request.send(form_data); +} + + +function download_image() { + // Download image from server once the url was received by upgrade_request + hide("#keep_container"); + hide("#upgrade_button"); + var download_request = new XMLHttpRequest(); + download_request.open("GET", data.sysupgrade_url); + download_request.responseType = "arraybuffer"; + + download_request.onload = function () { + if (this.status === 200) { + var blob = new Blob([download_request.response], {type: "application/octet-stream"}); + upload_image(blob) + } + }; + info_box("Downloading firmware", true); + download_request.send(); +} + +function server_request(request_dict, path, callback) { + request_dict.distro = data.release.distribution; + request_dict.target = data.release.target.split("\/")[0]; + request_dict.subtarget = data.release.target.split("\/")[1]; + var request = new XMLHttpRequest(); + request.open("POST", data.url + "/" + path, true); + request.setRequestHeader("Content-type", "application/json"); + request.send(JSON.stringify(request_dict)); + request.onerror = function(e) { + error_box("Upgrade server down or could not connect") + show("#server_div"); + } + request.addEventListener('load', function(event) { + request_text = request.responseText; + if (request.status === 200) { + callback(request_text) + + } else if (request.status === 202) { + var imagebuilder = request.getResponseHeader("X-Imagebuilder-Status"); + if(imagebuilder === "queue") { + // in queue + var queue = request.getResponseHeader("X-Build-Queue-Position"); + info_box("In build queue position " + queue, true) + console.log("queued"); + } else if(imagebuilder === "initialize") { + info_box("Setting up ImageBuilder", true) + console.log("Setting up imagebuilder"); + } else if(imagebuilder === "building") { + info_box("Building image", true); + console.log("building"); + } else { + // fallback if for some reasons the headers are missing e.g. browser blocks access + info_box("Processing request", true); + console.log(imagebuilder) + } + setTimeout(function() { server_request(request_dict, path, callback) }, 5000) + + } else if (request.status === 204) { + // no upgrades available + info_box("No upgrades available") + + } else if (request.status === 400) { + // bad request + request_json = JSON.parse(request_text) + error_box(request_json.error) + + } else if (request.status === 412) { + // this is a bit generic + error_box("Unsupported device, release, target, subtraget or board") + + } else if (request.status === 413) { + error_box("No firmware created due to image size. Try again with less packages selected.") + + } else if (request.status === 422) { + error_box("Unknown package in request") + + } else if (request.status === 500) { + request_json = JSON.parse(request_text) + + error_box_content = "<b>Internal server error</b></br>" + error_box_content += request_json.error + if(request_json.log != undefined) { + data.log_url = request_json.log + } + error_box(error_box_content) + + } else if (request.status === 501) { + error_box("No sysupgrade file produced, may not supported by modell.") + + } else if (request.status === 502) { + // python part offline + error_box("Server down for maintenance") + setTimeout(function() { server_request(request_dict, path, callback) }, 30000) + } else if (request.status === 503) { + error_box("Server overloaded") + setTimeout(function() { server_request(request_dict, path, callback) }, 30000) + } + }); +} +document.onload = setup() + diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/memberconfig.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/memberconfig.lua index eb6f417afe..dc2e0da447 100644 --- a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/memberconfig.lua +++ b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/memberconfig.lua @@ -27,8 +27,8 @@ interface = mwan_member:option(Value, "interface", translate("Interface")) cbi_add_interface(interface) metric = mwan_member:option(Value, "metric", translate("Metric"), - translate("Acceptable values: 1-1000. Defaults to 1 if not set")) - metric.datatype = "range(1, 1000)" + translate("Acceptable values: 1-256. Defaults to 1 if not set")) + metric.datatype = "range(1, 256)" weight = mwan_member:option(Value, "weight", translate("Weight"), translate("Acceptable values: 1-1000. Defaults to 1 if not set")) diff --git a/applications/luci-app-mwan3/po/ja/mwan3.po b/applications/luci-app-mwan3/po/ja/mwan3.po index 34a9f1f3b3..841a5e701f 100644 --- a/applications/luci-app-mwan3/po/ja/mwan3.po +++ b/applications/luci-app-mwan3/po/ja/mwan3.po @@ -37,6 +37,9 @@ msgstr "" msgid "Acceptable values: 1-1000. Defaults to 1 if not set" msgstr "利用可能な値: 1-1000。空欄の場合のデフォルトは1です。" +msgid "Acceptable values: 1-256. Defaults to 1 if not set" +msgstr "利用可能な値: 1-256。空欄の場合のデフォルトは1です。" + msgid "Advanced" msgstr "詳細設定" diff --git a/applications/luci-app-mwan3/po/templates/mwan3.pot b/applications/luci-app-mwan3/po/templates/mwan3.pot index ed9fdb131d..a993a81b63 100644 --- a/applications/luci-app-mwan3/po/templates/mwan3.pot +++ b/applications/luci-app-mwan3/po/templates/mwan3.pot @@ -24,6 +24,9 @@ msgstr "" msgid "Acceptable values: 1-1000. Defaults to 1 if not set" msgstr "" +msgid "Acceptable values: 1-256. Defaults to 1 if not set" +msgstr "" + msgid "Advanced" msgstr "" diff --git a/applications/luci-app-mwan3/po/zh-cn/mwan3.po b/applications/luci-app-mwan3/po/zh-cn/mwan3.po index d0b92a6df1..966f53c711 100644 --- a/applications/luci-app-mwan3/po/zh-cn/mwan3.po +++ b/applications/luci-app-mwan3/po/zh-cn/mwan3.po @@ -33,7 +33,10 @@ msgstr "" "取值范围:1-100。这个设置项指定了当多少个 IP 地址能够连通时接口会被认为在线" msgid "Acceptable values: 1-1000. Defaults to 1 if not set" -msgstr "取值范围:1-100。如果不填写,默认值为 1" +msgstr "取值范围:1-1000。如果不填写,默认值为 1" + +msgid "Acceptable values: 1-256. Defaults to 1 if not set" +msgstr "取值范围:1-256。如果不填写,默认值为 1" msgid "Advanced" msgstr "高级" diff --git a/applications/luci-app-mwan3/po/zh-tw/mwan3.po b/applications/luci-app-mwan3/po/zh-tw/mwan3.po index 04711ac3d7..d4a652a5dc 100644 --- a/applications/luci-app-mwan3/po/zh-tw/mwan3.po +++ b/applications/luci-app-mwan3/po/zh-tw/mwan3.po @@ -33,7 +33,10 @@ msgstr "" "取值範圍:1-100。這個設定項指定了當多少個 IP 位址能夠連通時介面會被認為線上" msgid "Acceptable values: 1-1000. Defaults to 1 if not set" -msgstr "取值範圍:1-100。如果不填寫,預設值為 1" +msgstr "取值範圍:1-1000。如果不填寫,預設值為 1" + +msgid "Acceptable values: 1-256. Defaults to 1 if not set" +msgstr "取值範圍:1-256。如果不填寫,預設值為 1" msgid "Advanced" msgstr "高階" diff --git a/applications/luci-app-travelmate/po/ja/travelmate.po b/applications/luci-app-travelmate/po/ja/travelmate.po index febdbd5833..1158966e0b 100644 --- a/applications/luci-app-travelmate/po/ja/travelmate.po +++ b/applications/luci-app-travelmate/po/ja/travelmate.po @@ -7,7 +7,7 @@ msgstr "" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.3\n" +"X-Generator: Poedit 2.0.5\n" "Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: ja\n" @@ -31,9 +31,21 @@ msgstr "Travelmate の処理が開始されるまでの、追加の遅延時間 msgid "Advanced" msgstr "詳細設定" +msgid "Authentication" +msgstr "認証" + +msgid "Automatic" +msgstr "自動" + +msgid "BSSID" +msgstr "BSSID" + msgid "Back to overview" msgstr "概要へ戻る" +msgid "Cipher" +msgstr "暗号化方式" + msgid "" "Configuration of the travelmate package to to enable travel router " "functionality." @@ -61,6 +73,9 @@ msgstr "このアップリンクを削除" msgid "Device" msgstr "デバイス" +msgid "EAP-Method" +msgstr "EAP メソッド" + msgid "Edit" msgstr "編集" @@ -107,6 +122,19 @@ msgstr "" "詳細な情報は <a href=\"%s\" target=\"_blank\">オンライン ドキュメント</a> を" "確認してください。" +msgid "Force CCMP (AES)" +msgstr "CCMP (AES)" + +msgid "Force TKIP" +msgstr "TKIP" + +msgid "Force TKIP and CCMP (AES)" +msgstr "TKIP と CCMP (AES)" + +msgid "Force a manual uplink rescan / reconnect in 'trigger' mode." +msgstr "" +"'trigger' モード時に、手動でアップリンクの再スキャンと再接続を行います。" + msgid "How long should travelmate wait for a successful wlan interface reload." msgstr "" "無線LAN インターフェースのリロードが成功するまでの、Travelmate の待機時間で" @@ -115,6 +143,9 @@ msgstr "" msgid "How many times should travelmate try to connect to an Uplink." msgstr "Travelmate がアップリンクへの接続を試行する回数です。" +msgid "Identity" +msgstr "ID" + msgid "Input file not found, please check your configuration." msgstr "入力ファイルが見つかりません。設定を確認してください。" @@ -143,12 +174,8 @@ msgstr "下へ" msgid "Move up" msgstr "上へ" -msgid "" -"Name of the uplink interface that triggers travelmate processing in 'manual' " -"mode." -msgstr "" -"'manual' モード時に Travelmate の処理のトリガーとなる、アップリンク インター" -"フェースの名前です。" +msgid "Name of the used uplink interface." +msgstr "使用されるアップリンク インターフェースの名前です。" msgid "Online Status" msgstr "オンライン ステータス" @@ -166,8 +193,23 @@ msgstr "実行間隔" msgid "Overview" msgstr "概要" -msgid "Passphrase (%s)" -msgstr "暗号フレーズ (%s)" +msgid "Passphrase" +msgstr "パスフレーズ" + +msgid "Password" +msgstr "パスワード" + +msgid "Password of Private Key" +msgstr "秘密鍵のパスワード" + +msgid "Path to CA-Certificate" +msgstr "CA 証明書へのパス" + +msgid "Path to Client-Certificate" +msgstr "クライアント証明書へのパス" + +msgid "Path to Private Key" +msgstr "秘密鍵へのパス" msgid "" "Provides an overview of all configured uplinks for the travelmate interface " @@ -191,7 +233,7 @@ msgstr "再スキャン" msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'." msgstr "Travelmate が指定された無線に接続するよう制御します。(例: 'radio0')" -msgid "Runtime information" +msgid "Runtime Information" msgstr "実行情報" msgid "SSID" @@ -209,8 +251,8 @@ msgstr "スキャン:" msgid "Signal strength" msgstr "信号強度" -msgid "Specify the secret encryption key here." -msgstr "暗号キーを設定します。" +msgid "Station ID (SSID/BSSID)" +msgstr "ステーション ID (SSID / BSSID)" msgid "Station Interface" msgstr "ステーション インターフェース" @@ -218,9 +260,6 @@ msgstr "ステーション インターフェース" msgid "Station Radio" msgstr "ステーション電波" -msgid "Station SSID" -msgstr "ステーション SSID" - msgid "" "This form allows you to modify the content of the main firewall " "configuration file (/etc/config/firewall)." @@ -281,6 +320,9 @@ msgstr "不明" msgid "Uplink / Trigger interface" msgstr "アップリンク / トリガー インターフェース" +msgid "Uplink BSSID" +msgstr "アップリンク BSSID" + msgid "Uplink SSID" msgstr "アップリンク SSID" @@ -293,14 +335,20 @@ msgstr "ログファイルの確認" msgid "WEP" msgstr "WEP" -msgid "WEP passphrase" -msgstr "WEP 暗号キー" +msgid "WEP-Passphrase" +msgstr "WEP パスフレーズ" + +msgid "WPA" +msgstr "WPA" + +msgid "WPA-Passphrase" +msgstr "WPA パスフレーズ" -msgid "WPA / WPA2" -msgstr "WPA / WPA2" +msgid "WPA/WPA2" +msgstr "WPA/WPA2" -msgid "WPA passphrase" -msgstr "WPA 暗号キー" +msgid "WPA2" +msgstr "WPA2" msgid "Wireless Scan" msgstr "無線スキャン" diff --git a/applications/luci-app-travelmate/po/pt-br/travelmate.po b/applications/luci-app-travelmate/po/pt-br/travelmate.po index 41fab70149..e36860eaa1 100644 --- a/applications/luci-app-travelmate/po/pt-br/travelmate.po +++ b/applications/luci-app-travelmate/po/pt-br/travelmate.po @@ -31,9 +31,21 @@ msgstr "" msgid "Advanced" msgstr "" +msgid "Authentication" +msgstr "" + +msgid "Automatic" +msgstr "" + +msgid "BSSID" +msgstr "" + msgid "Back to overview" msgstr "" +msgid "Cipher" +msgstr "" + msgid "" "Configuration of the travelmate package to to enable travel router " "functionality." @@ -58,6 +70,9 @@ msgstr "" msgid "Device" msgstr "" +msgid "EAP-Method" +msgstr "" + msgid "Edit" msgstr "" @@ -102,12 +117,27 @@ msgid "" "documentation</a>" msgstr "" +msgid "Force CCMP (AES)" +msgstr "" + +msgid "Force TKIP" +msgstr "" + +msgid "Force TKIP and CCMP (AES)" +msgstr "" + +msgid "Force a manual uplink rescan / reconnect in 'trigger' mode." +msgstr "" + msgid "How long should travelmate wait for a successful wlan interface reload." msgstr "" msgid "How many times should travelmate try to connect to an Uplink." msgstr "" +msgid "Identity" +msgstr "" + msgid "Input file not found, please check your configuration." msgstr "" @@ -134,9 +164,7 @@ msgstr "" msgid "Move up" msgstr "" -msgid "" -"Name of the uplink interface that triggers travelmate processing in 'manual' " -"mode." +msgid "Name of the used uplink interface." msgstr "" msgid "Online Status" @@ -155,7 +183,22 @@ msgstr "" msgid "Overview" msgstr "" -msgid "Passphrase (%s)" +msgid "Passphrase" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Password of Private Key" +msgstr "" + +msgid "Path to CA-Certificate" +msgstr "" + +msgid "Path to Client-Certificate" +msgstr "" + +msgid "Path to Private Key" msgstr "" msgid "" @@ -176,7 +219,7 @@ msgstr "" msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'." msgstr "" -msgid "Runtime information" +msgid "Runtime Information" msgstr "" msgid "SSID" @@ -194,7 +237,7 @@ msgstr "" msgid "Signal strength" msgstr "" -msgid "Specify the secret encryption key here." +msgid "Station ID (SSID/BSSID)" msgstr "" msgid "Station Interface" @@ -203,9 +246,6 @@ msgstr "" msgid "Station Radio" msgstr "" -msgid "Station SSID" -msgstr "" - msgid "" "This form allows you to modify the content of the main firewall " "configuration file (/etc/config/firewall)." @@ -255,6 +295,9 @@ msgstr "" msgid "Uplink / Trigger interface" msgstr "" +msgid "Uplink BSSID" +msgstr "" + msgid "Uplink SSID" msgstr "" @@ -267,13 +310,19 @@ msgstr "" msgid "WEP" msgstr "" -msgid "WEP passphrase" +msgid "WEP-Passphrase" +msgstr "" + +msgid "WPA" +msgstr "" + +msgid "WPA-Passphrase" msgstr "" -msgid "WPA / WPA2" +msgid "WPA/WPA2" msgstr "" -msgid "WPA passphrase" +msgid "WPA2" msgstr "" msgid "Wireless Scan" diff --git a/applications/luci-app-travelmate/po/templates/travelmate.pot b/applications/luci-app-travelmate/po/templates/travelmate.pot index a9ceafe237..d1047242fe 100644 --- a/applications/luci-app-travelmate/po/templates/travelmate.pot +++ b/applications/luci-app-travelmate/po/templates/travelmate.pot @@ -20,9 +20,21 @@ msgstr "" msgid "Advanced" msgstr "" +msgid "Authentication" +msgstr "" + +msgid "Automatic" +msgstr "" + +msgid "BSSID" +msgstr "" + msgid "Back to overview" msgstr "" +msgid "Cipher" +msgstr "" + msgid "" "Configuration of the travelmate package to to enable travel router " "functionality." @@ -47,6 +59,9 @@ msgstr "" msgid "Device" msgstr "" +msgid "EAP-Method" +msgstr "" + msgid "Edit" msgstr "" @@ -91,12 +106,27 @@ msgid "" "documentation</a>" msgstr "" +msgid "Force CCMP (AES)" +msgstr "" + +msgid "Force TKIP" +msgstr "" + +msgid "Force TKIP and CCMP (AES)" +msgstr "" + +msgid "Force a manual uplink rescan / reconnect in 'trigger' mode." +msgstr "" + msgid "How long should travelmate wait for a successful wlan interface reload." msgstr "" msgid "How many times should travelmate try to connect to an Uplink." msgstr "" +msgid "Identity" +msgstr "" + msgid "Input file not found, please check your configuration." msgstr "" @@ -123,9 +153,7 @@ msgstr "" msgid "Move up" msgstr "" -msgid "" -"Name of the uplink interface that triggers travelmate processing in 'manual' " -"mode." +msgid "Name of the used uplink interface." msgstr "" msgid "Online Status" @@ -144,7 +172,22 @@ msgstr "" msgid "Overview" msgstr "" -msgid "Passphrase (%s)" +msgid "Passphrase" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Password of Private Key" +msgstr "" + +msgid "Path to CA-Certificate" +msgstr "" + +msgid "Path to Client-Certificate" +msgstr "" + +msgid "Path to Private Key" msgstr "" msgid "" @@ -165,7 +208,7 @@ msgstr "" msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'." msgstr "" -msgid "Runtime information" +msgid "Runtime Information" msgstr "" msgid "SSID" @@ -183,7 +226,7 @@ msgstr "" msgid "Signal strength" msgstr "" -msgid "Specify the secret encryption key here." +msgid "Station ID (SSID/BSSID)" msgstr "" msgid "Station Interface" @@ -192,9 +235,6 @@ msgstr "" msgid "Station Radio" msgstr "" -msgid "Station SSID" -msgstr "" - msgid "" "This form allows you to modify the content of the main firewall " "configuration file (/etc/config/firewall)." @@ -244,6 +284,9 @@ msgstr "" msgid "Uplink / Trigger interface" msgstr "" +msgid "Uplink BSSID" +msgstr "" + msgid "Uplink SSID" msgstr "" @@ -256,13 +299,19 @@ msgstr "" msgid "WEP" msgstr "" -msgid "WEP passphrase" +msgid "WEP-Passphrase" +msgstr "" + +msgid "WPA" +msgstr "" + +msgid "WPA-Passphrase" msgstr "" -msgid "WPA / WPA2" +msgid "WPA/WPA2" msgstr "" -msgid "WPA passphrase" +msgid "WPA2" msgstr "" msgid "Wireless Scan" diff --git a/applications/luci-app-upnp/po/ja/upnp.po b/applications/luci-app-upnp/po/ja/upnp.po index b9dae4f8d6..fe2dd64566 100644 --- a/applications/luci-app-upnp/po/ja/upnp.po +++ b/applications/luci-app-upnp/po/ja/upnp.po @@ -17,8 +17,8 @@ msgid "" "ACLs specify which external ports may be redirected to which internal " "addresses and ports" msgstr "" -"アクセス制御リスト(ACL) は、どの外部ポートからどの内部アドレス及びポートへ" -"リダイレクトするかを設定します。" +"アクセス制御リスト(ACL) は、どの外部ポートからどの内部アドレス及びポートへリ" +"ダイレクトするかを設定します。" msgid "Action" msgstr "動作" @@ -132,8 +132,8 @@ msgid "" "UPnP allows clients in the local network to automatically configure the " "router." msgstr "" -"UPnPを使用することで、ローカルネットワーク内のクライアントが自動的にルータ" -"を構成することができます。" +"UPnPを使用することで、ローカルネットワーク内のクライアントが自動的にルータを" +"構成することができます。" msgid "UPnP lease file" msgstr "UPnP リースファイル" diff --git a/documentation/api/modules/nixio.fs.html b/documentation/api/modules/nixio.fs.html index 40d0a0636e..476e7fd31d 100644 --- a/documentation/api/modules/nixio.fs.html +++ b/documentation/api/modules/nixio.fs.html @@ -1274,7 +1274,7 @@ true <h3>Usage:</h3> -It is normally not possible to rename files across fileystems. +It is normally not possible to rename files across filesystems. diff --git a/libs/luci-lib-nixio/docsrc/nixio.fs.lua b/libs/luci-lib-nixio/docsrc/nixio.fs.lua index 5d08719e96..5bfd7a6b79 100644 --- a/libs/luci-lib-nixio/docsrc/nixio.fs.lua +++ b/libs/luci-lib-nixio/docsrc/nixio.fs.lua @@ -47,7 +47,7 @@ module "nixio.fs" -- @name nixio.fs.rename -- @param src Source path -- @param dest Destination path --- @usage It is normally not possible to rename files accross fileystems. +-- @usage It is normally not possible to rename files accross filesystems. -- @return true --- Remove an empty directory. @@ -96,6 +96,7 @@ define Package/$(PKG_NAME) SUBMENU:=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app)) TITLE:=$(if $(LUCI_TITLE),$(LUCI_TITLE),LuCI $(LUCI_NAME) $(LUCI_TYPE)) DEPENDS:=$(LUCI_DEPENDS) + $(if $(LUCI_EXTRA_DEPENDS),EXTRA_DEPENDS:=$(LUCI_EXTRA_DEPENDS)) $(if $(LUCI_PKGARCH),PKGARCH:=$(LUCI_PKGARCH)) endef diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile index 6393195e59..d3039ef41b 100644 --- a/modules/luci-base/Makefile +++ b/modules/luci-base/Makefile @@ -13,6 +13,7 @@ LUCI_BASENAME:=base LUCI_TITLE:=LuCI core libraries LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +LUCI_EXTRA_DEPENDS:=libuci-lua (>= 2018-01-01) PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2 PKG_SOURCE_URL:=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/luasrcdiet diff --git a/modules/luci-base/luasrc/model/network.lua b/modules/luci-base/luasrc/model/network.lua index d9ef4089c8..6f405a1314 100644 --- a/modules/luci-base/luasrc/model/network.lua +++ b/modules/luci-base/luasrc/model/network.lua @@ -6,14 +6,12 @@ local type, next, pairs, ipairs, loadfile, table, select local tonumber, tostring, math = tonumber, tostring, math -local require = require +local pcall, require, setmetatable = pcall, require, setmetatable local nxo = require "nixio" local nfs = require "nixio.fs" local ipc = require "luci.ip" -local sys = require "luci.sys" local utl = require "luci.util" -local dsp = require "luci.dispatcher" local uci = require "luci.model.uci" local lng = require "luci.i18n" local jsc = require "luci.jsonc" @@ -108,6 +106,58 @@ function _set(c, s, o, v) end end +local function _wifi_state() + if not next(_ubuswificache) then + _ubuswificache = utl.ubus("network.wireless", "status", {}) or {} + end + return _ubuswificache +end + +local function _wifi_state_by_sid(sid) + local t1, n1 = _uci:get("wireless", sid) + if t1 == "wifi-iface" and n1 ~= nil then + local radioname, radiostate + for radioname, radiostate in pairs(_wifi_state()) do + if type(radiostate) == "table" and + type(radiostate.interfaces) == "table" + then + local netidx, netstate + for netidx, netstate in ipairs(radiostate.interfaces) do + if type(netstate) == "table" and + type(netstate.section) == "string" + then + local t2, n2 = _uci:get("wireless", netstate.section) + if t1 == t2 and n1 == n2 then + return radioname, radiostate, netstate + end + end + end + end + end + end +end + +local function _wifi_state_by_ifname(ifname) + if type(ifname) == "string" then + local radioname, radiostate + for radioname, radiostate in pairs(_wifi_state()) do + if type(radiostate) == "table" and + type(radiostate.interfaces) == "table" + then + local netidx, netstate + for netidx, netstate in ipairs(radiostate.interfaces) do + if type(netstate) == "table" and + type(netstate.ifname) == "string" and + netstate.ifname == ifname + then + return radioname, radiostate, netstate + end + end + end + end + end +end + function _wifi_iface(x) local _, p for _, p in ipairs(IFACE_PATTERNS_WIRELESS) do @@ -118,61 +168,113 @@ function _wifi_iface(x) return false end -function _wifi_state(key, val, field) - local radio, radiostate, ifc, ifcstate - - if not next(_ubuswificache) then - _ubuswificache = utl.ubus("network.wireless", "status", {}) or {} +local function _wifi_iwinfo_by_ifname(ifname, force_phy_only) + local stat, iwinfo = pcall(require, "iwinfo") + local iwtype = stat and type(ifname) == "string" and iwinfo.type(ifname) + local is_nonphy_op = { + bitrate = true, + quality = true, + quality_max = true, + mode = true, + ssid = true, + bssid = true, + assoclist = true, + encryption = true + } - -- workaround extended section format - for radio, radiostate in pairs(_ubuswificache) do - for ifc, ifcstate in pairs(radiostate.interfaces) do - if ifcstate.section and ifcstate.section:sub(1, 1) == '@' then - local s = _uci:get_all('wireless.%s' % ifcstate.section) - if s then - ifcstate.section = s['.name'] - end + if iwtype then + -- if we got a type but no real netdev, we're referring to a phy + local phy_only = force_phy_only or (ipc.link(ifname).type ~= 1) + + return setmetatable({}, { + __index = function(t, k) + if k == "ifname" then + return ifname + elseif phy_only and is_nonphy_op[k] then + return nil + elseif iwinfo[iwtype][k] then + return iwinfo[iwtype][k](ifname) end end - end + }) end +end - for radio, radiostate in pairs(_ubuswificache) do - for ifc, ifcstate in pairs(radiostate.interfaces) do - if ifcstate[key] == val then - return ifcstate[field] - end +local function _wifi_sid_by_netid(netid) + if type(netid) == "string" then + local radioname, netidx = netid:match("^(%w+)%.network(%d+)$") + if radioname and netidx then + local i, n = 0, nil + + netidx = tonumber(netidx) + _uci:foreach("wireless", "wifi-iface", + function(s) + if s.device == radioname then + i = i + 1 + if i == netidx then + n = s[".name"] + return false + end + end + end) + + return n end end end -function _wifi_lookup(ifn) - -- got a radio#.network# pseudo iface, locate the corresponding section - local radio, ifnidx = ifn:match("^(%w+)%.network(%d+)$") - if radio and ifnidx then - local sid = nil - local num = 0 +function _wifi_sid_by_ifname(ifn) + local sid = _wifi_sid_by_netid(ifn) + if sid then + return sid + end - ifnidx = tonumber(ifnidx) - _uci:foreach("wireless", "wifi-iface", - function(s) - if s.device == radio then - num = num + 1 - if num == ifnidx then - sid = s['.name'] - return false - end - end - end) + local _, _, netstate = _wifi_state_by_ifname(ifn) + if netstate and type(netstate.section) == "string" then + return netstate.section + end +end - return sid +local function _wifi_netid_by_sid(sid) + local t, n = _uci:get("wireless", sid) + if t == "wifi-iface" and n ~= nil then + local radioname = _uci:get("wireless", n, "device") + if type(radioname) == "string" then + local i, netid = 0, nil + + _uci:foreach("wireless", "wifi-iface", + function(s) + if s.device == radioname then + i = i + 1 + if s[".name"] == n then + netid = "%s.network%d" %{ radioname, i } + return false + end + end + end) - -- looks like wifi, try to locate the section via ubus state - elseif _wifi_iface(ifn) then - return _wifi_state("ifname", ifn, "section") + return netid, radioname + end end end +local function _wifi_netid_by_netname(name) + local netid = nil + + _uci:foreach("wireless", "wifi-iface", + function(s) + local net + for net in utl.imatch(s.network) do + if net == name then + netid = _wifi_netid_by_sid(s[".name"]) + return false + end + end + end) + + return netid +end + function _iface_virtual(x) local _, p for _, p in ipairs(IFACE_PATTERNS_VIRTUAL) do @@ -524,20 +626,8 @@ function get_interface(self, i) if _interfaces[i] or _wifi_iface(i) then return interface(i) else - local ifc - local num = { } - _uci:foreach("wireless", "wifi-iface", - function(s) - if s.device then - num[s.device] = num[s.device] and num[s.device] + 1 or 1 - if s['.name'] == i then - ifc = interface( - "%s.network%d" %{s.device, num[s.device] }) - return false - end - end - end) - return ifc + local netid = _wifi_netid_by_netname(i) + return netid and interface(netid) end end @@ -644,7 +734,7 @@ function get_wifidevs(self) end function get_wifinet(self, net) - local wnet = _wifi_lookup(net) + local wnet = _wifi_sid_by_ifname(net) if wnet then return wifinet(wnet) end @@ -660,7 +750,7 @@ function add_wifinet(self, net, options) end function del_wifinet(self, net) - local wnet = _wifi_lookup(net) + local wnet = _wifi_sid_by_ifname(net) if wnet then _uci:delete("wireless", wnet) return true @@ -784,22 +874,7 @@ function protocol.ifname(self) ifname = self:_ubus("device") end if not ifname then - local num = { } - _uci:foreach("wireless", "wifi-iface", - function(s) - if s.device then - num[s.device] = num[s.device] - and num[s.device] + 1 or 1 - - local net - for net in utl.imatch(s.network) do - if net == self.sid then - ifname = "%s.network%d" %{ s.device, num[s.device] } - return false - end - end - end - end) + ifname = _wifi_netid_by_netname(self.sid) end return ifname end @@ -981,24 +1056,17 @@ function protocol.is_empty(self) if self:is_floating() then return false else - local rv = true + local empty = true if (self:_get("ifname") or ""):match("%S+") then - rv = false + empty = false end - _uci:foreach("wireless", "wifi-iface", - function(s) - local n - for n in utl.imatch(s.network) do - if n == self.sid then - rv = false - return false - end - end - end) + if empty and _wifi_netid_by_netname(self.sid) then + empty = false + end - return rv + return empty end end @@ -1006,7 +1074,7 @@ function protocol.add_interface(self, ifname) ifname = _M:ifnameof(ifname) if ifname and not self:is_floating() then -- if its a wifi interface, change its network option - local wif = _wifi_lookup(ifname) + local wif = _wifi_sid_by_ifname(ifname) if wif then _append("wireless", wif, "network", self.sid) @@ -1021,7 +1089,7 @@ function protocol.del_interface(self, ifname) ifname = _M:ifnameof(ifname) if ifname and not self:is_floating() then -- if its a wireless interface, clear its network option - local wif = _wifi_lookup(ifname) + local wif = _wifi_sid_by_ifname(ifname) if wif then _filter("wireless", wif, "network", self.sid) end -- remove the interface @@ -1043,21 +1111,7 @@ function protocol.get_interface(self) ifn = ifn:match("^[^:/]+") return ifn and interface(ifn, self) end - ifn = nil - _uci:foreach("wireless", "wifi-iface", - function(s) - if s.device then - num[s.device] = num[s.device] and num[s.device] + 1 or 1 - - local net - for net in utl.imatch(s.network) do - if net == self.sid then - ifn = "%s.network%d" %{ s.device, num[s.device] } - return false - end - end - end - end) + ifn = _wifi_netid_by_netname(self.sid) return ifn and interface(ifn, self) end end @@ -1077,18 +1131,17 @@ function protocol.get_interfaces(self) ifaces[#ifaces+1] = nfs[ifn] end - local num = { } local wfs = { } _uci:foreach("wireless", "wifi-iface", function(s) if s.device then - num[s.device] = num[s.device] and num[s.device] + 1 or 1 - local net for net in utl.imatch(s.network) do if net == self.sid then - ifn = "%s.network%d" %{ s.device, num[s.device] } - wfs[ifn] = interface(ifn, self) + ifn = _wifi_netid_by_sid(s[".name"]) + if ifn then + wfs[ifn] = interface(ifn, self) + end end end end @@ -1119,7 +1172,7 @@ function protocol.contains_interface(self, ifname) end end - local wif = _wifi_lookup(ifname) + local wif = _wifi_sid_by_ifname(ifname) if wif then local n for n in utl.imatch(_uci:get("wireless", wif, "network")) do @@ -1134,17 +1187,18 @@ function protocol.contains_interface(self, ifname) end function protocol.adminlink(self) - return dsp.build_url("admin", "network", "network", self.sid) + local stat, dsp = pcall(require, "luci.dispatcher") + return stat and dsp.build_url("admin", "network", "network", self.sid) end interface = utl.class() function interface.__init__(self, ifname, network) - local wif = _wifi_lookup(ifname) + local wif = _wifi_sid_by_ifname(ifname) if wif then self.wif = wifinet(wif) - self.ifname = _wifi_state("section", wif, "ifname") + self.ifname = self.wif:ifname() end self.ifname = self.ifname or ifname @@ -1332,9 +1386,14 @@ end wifidev = utl.class() -function wifidev.__init__(self, dev) - self.sid = dev - self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { } +function wifidev.__init__(self, name) + local t, n = _uci:get("wireless", name) + if t == "wifi-device" and n ~= nil then + self.sid = n + self.iwinfo = _wifi_iwinfo_by_ifname(self.sid, true) + end + self.sid = self.sid or name + self.iwinfo = self.iwinfo or { ifname = self.sid } end function wifidev.get(self, opt) @@ -1387,7 +1446,7 @@ function wifidev.get_wifinet(self, net) if _uci:get("wireless", net) == "wifi-iface" then return wifinet(net) else - local wnet = _wifi_lookup(net) + local wnet = _wifi_sid_by_ifname(net) if wnet then return wifinet(wnet) end @@ -1421,7 +1480,7 @@ function wifidev.del_wifinet(self, net) if utl.instanceof(net, wifinet) then net = net.sid elseif _uci:get("wireless", net) ~= "wifi-iface" then - net = _wifi_lookup(net) + net = _wifi_sid_by_ifname(net) end if net and _uci:get("wireless", net, "device") == self.sid then @@ -1435,49 +1494,50 @@ end wifinet = utl.class() -function wifinet.__init__(self, net, data) - self.sid = net - - local n = 0 - local num = { } - local netid, sid - _uci:foreach("wireless", "wifi-iface", - function(s) - n = n + 1 - if s.device then - num[s.device] = num[s.device] and num[s.device] + 1 or 1 - if s['.name'] == self.sid then - sid = "@wifi-iface[%d]" % n - netid = "%s.network%d" %{ s.device, num[s.device] } - return false - end - end - end) +function wifinet.__init__(self, name, data) + local sid, netid, radioname, radiostate, netstate + -- lookup state by radio#.network# notation + sid = _wifi_sid_by_netid(name) if sid then - local _, k, r, i - for k, r in pairs(_ubuswificache) do - if type(r) == "table" and - type(r.interfaces) == "table" - then - for _, i in ipairs(r.interfaces) do - if type(i) == "table" and i.section == sid then - self._ubusdata = { - radio = k, - dev = r, - net = i - } - end + netid = name + radioname, radiostate, netstate = _wifi_state_by_sid(sid) + else + -- lookup state by ifname (e.g. wlan0) + radioname, radiostate, netstate = _wifi_state_by_ifname(name) + if radioname and radiostate and netstate then + sid = netstate.section + netid = _wifi_netid_by_sid(sid) + else + -- lookup state by uci section id (e.g. cfg053579) + radioname, radiostate, netstate = _wifi_state_by_sid(name) + if radioname and radiostate and netstate then + sid = name + netid = _wifi_netid_by_sid(sid) + else + -- no state available, try to resolve from uci + netid, radioname = _wifi_netid_by_sid(name) + if netid and radioname then + sid = name end end end end - local dev = _wifi_state("section", self.sid, "ifname") or netid + local iwinfo = + (netstate and _wifi_iwinfo_by_ifname(netstate.ifname)) or + (radioname and _wifi_iwinfo_by_ifname(radioname)) or + { ifname = (netid or sid or name) } - self.netid = netid - self.wdev = dev - self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { } + self.sid = sid or name + self.wdev = iwinfo.ifname + self.iwinfo = iwinfo + self.netid = netid + self._ubusdata = { + radio = radioname, + dev = radiostate, + net = netstate + } end function wifinet.ubus(self, ...) @@ -1664,7 +1724,8 @@ function wifinet.get_i18n(self) end function wifinet.adminlink(self) - return dsp.build_url("admin", "network", "wireless", self.netid) + local stat, dsp = pcall(require, "luci.dispatcher") + return dsp and dsp.build_url("admin", "network", "wireless", self.netid) end function wifinet.get_network(self) diff --git a/modules/luci-base/luasrc/sys.lua b/modules/luci-base/luasrc/sys.lua index 115c54d54a..3fcfd4def7 100644 --- a/modules/luci-base/luasrc/sys.lua +++ b/modules/luci-base/luasrc/sys.lua @@ -7,6 +7,7 @@ local table = require "table" local nixio = require "nixio" local fs = require "nixio.fs" local uci = require "luci.model.uci" +local ntm = require "luci.model.network" local luci = {} luci.util = require "luci.util" @@ -451,37 +452,9 @@ end wifi = {} function wifi.getiwinfo(ifname) - local stat, iwinfo = pcall(require, "iwinfo") - - if ifname then - local d, n = ifname:match("^(%w+)%.network(%d+)") - local wstate = luci.util.ubus("network.wireless", "status") or { } - - d = d or ifname - n = n and tonumber(n) or 1 - - if type(wstate[d]) == "table" and - type(wstate[d].interfaces) == "table" and - type(wstate[d].interfaces[n]) == "table" and - type(wstate[d].interfaces[n].ifname) == "string" - then - ifname = wstate[d].interfaces[n].ifname - else - ifname = d - end - - local t = stat and iwinfo.type(ifname) - local x = t and iwinfo[t] or { } - return setmetatable({}, { - __index = function(t, k) - if k == "ifname" then - return ifname - elseif x[k] then - return x[k](ifname) - end - end - }) - end + ntm.init() + local wnet = ntm.wifinet(ifname) + return wnet.iwinfo or { ifname = ifname } end diff --git a/modules/luci-base/po/ca/base.po b/modules/luci-base/po/ca/base.po index e69534b3ba..ec3d1b0bd2 100644 --- a/modules/luci-base/po/ca/base.po +++ b/modules/luci-base/po/ca/base.po @@ -605,7 +605,7 @@ msgstr "Canal" msgid "Check" msgstr "Comprovació" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po index bff89c8845..2b93b35d3f 100644 --- a/modules/luci-base/po/cs/base.po +++ b/modules/luci-base/po/cs/base.po @@ -598,7 +598,7 @@ msgstr "Kanál" msgid "Check" msgstr "Kontrola" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/de/base.po b/modules/luci-base/po/de/base.po index eb9221f163..9e19bd1e7d 100644 --- a/modules/luci-base/po/de/base.po +++ b/modules/luci-base/po/de/base.po @@ -612,7 +612,7 @@ msgstr "Kanal" msgid "Check" msgstr "Prüfen" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "Dateisysteme prüfen" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/el/base.po b/modules/luci-base/po/el/base.po index ca8240f457..b742380fdd 100644 --- a/modules/luci-base/po/el/base.po +++ b/modules/luci-base/po/el/base.po @@ -607,7 +607,7 @@ msgstr "Κανάλι" msgid "Check" msgstr "Έλεγχος" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po index 6db22b6e66..2e70796b7a 100644 --- a/modules/luci-base/po/en/base.po +++ b/modules/luci-base/po/en/base.po @@ -596,7 +596,7 @@ msgstr "Channel" msgid "Check" msgstr "Check" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po index 088bdbd104..6aae853a08 100644 --- a/modules/luci-base/po/es/base.po +++ b/modules/luci-base/po/es/base.po @@ -603,7 +603,7 @@ msgstr "Canal" msgid "Check" msgstr "Comprobar" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/fr/base.po b/modules/luci-base/po/fr/base.po index a94ffb3a88..4f2cc96247 100644 --- a/modules/luci-base/po/fr/base.po +++ b/modules/luci-base/po/fr/base.po @@ -608,7 +608,7 @@ msgstr "Canal" msgid "Check" msgstr "Vérification" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/he/base.po b/modules/luci-base/po/he/base.po index 2997941335..aca653701d 100644 --- a/modules/luci-base/po/he/base.po +++ b/modules/luci-base/po/he/base.po @@ -598,7 +598,7 @@ msgstr "ערוץ" msgid "Check" msgstr "לבדוק" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po index 00b4d77d71..96ac3f2115 100644 --- a/modules/luci-base/po/hu/base.po +++ b/modules/luci-base/po/hu/base.po @@ -603,7 +603,7 @@ msgstr "Csatorna" msgid "Check" msgstr "Ellenőrzés" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po index b90ca79bf7..bc1e255b86 100644 --- a/modules/luci-base/po/it/base.po +++ b/modules/luci-base/po/it/base.po @@ -610,7 +610,7 @@ msgstr "Canale" msgid "Check" msgstr "Verifica" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "Controlla i filesystem prima di montare" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/ja/base.po b/modules/luci-base/po/ja/base.po index 1d321f9394..9254b1db5c 100644 --- a/modules/luci-base/po/ja/base.po +++ b/modules/luci-base/po/ja/base.po @@ -603,7 +603,7 @@ msgstr "チャネル" msgid "Check" msgstr "チェック" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "マウント前にファイルシステムをチェックする" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/ko/base.po b/modules/luci-base/po/ko/base.po index cde3c04c13..2e3ac4ec57 100644 --- a/modules/luci-base/po/ko/base.po +++ b/modules/luci-base/po/ko/base.po @@ -592,7 +592,7 @@ msgstr "" msgid "Check" msgstr "" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/ms/base.po b/modules/luci-base/po/ms/base.po index 74d3e19d7f..bb2331be6b 100644 --- a/modules/luci-base/po/ms/base.po +++ b/modules/luci-base/po/ms/base.po @@ -582,7 +582,7 @@ msgstr "Saluran" msgid "Check" msgstr "" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/no/base.po b/modules/luci-base/po/no/base.po index f1bfec4f59..151746363b 100644 --- a/modules/luci-base/po/no/base.po +++ b/modules/luci-base/po/no/base.po @@ -594,7 +594,7 @@ msgstr "Kanal" msgid "Check" msgstr "Kontroller" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/pl/base.po b/modules/luci-base/po/pl/base.po index 22902c4997..1a6538f2e5 100644 --- a/modules/luci-base/po/pl/base.po +++ b/modules/luci-base/po/pl/base.po @@ -611,7 +611,7 @@ msgstr "Kanał" msgid "Check" msgstr "Sprawdź" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po index eef8ebac38..4d9a753a59 100644 --- a/modules/luci-base/po/pt-br/base.po +++ b/modules/luci-base/po/pt-br/base.po @@ -643,7 +643,7 @@ msgstr "Canal" msgid "Check" msgstr "Verificar" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" "Execute a verificação do sistema de arquivos antes da montagem do dispositivo" diff --git a/modules/luci-base/po/pt/base.po b/modules/luci-base/po/pt/base.po index aadccccc39..18c70793d3 100644 --- a/modules/luci-base/po/pt/base.po +++ b/modules/luci-base/po/pt/base.po @@ -607,7 +607,7 @@ msgstr "Canal" msgid "Check" msgstr "Verificar" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/ro/base.po b/modules/luci-base/po/ro/base.po index 029b3958f9..25ada006d4 100644 --- a/modules/luci-base/po/ro/base.po +++ b/modules/luci-base/po/ro/base.po @@ -590,7 +590,7 @@ msgstr "Canal" msgid "Check" msgstr "Verificare" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po index 9a3cf434fc..54925e6f66 100644 --- a/modules/luci-base/po/ru/base.po +++ b/modules/luci-base/po/ru/base.po @@ -607,7 +607,7 @@ msgstr "Канал" msgid "Check" msgstr "Проверить" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/sk/base.po b/modules/luci-base/po/sk/base.po index 82fd38949b..4ce56eb3e9 100644 --- a/modules/luci-base/po/sk/base.po +++ b/modules/luci-base/po/sk/base.po @@ -576,7 +576,7 @@ msgstr "" msgid "Check" msgstr "" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/sv/base.po b/modules/luci-base/po/sv/base.po index 3360ccb230..fb3eb7b419 100644 --- a/modules/luci-base/po/sv/base.po +++ b/modules/luci-base/po/sv/base.po @@ -588,7 +588,7 @@ msgstr "Kanal" msgid "Check" msgstr "Kontrollera" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "Kontrollera filsystemen innan de monteras" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/templates/base.pot b/modules/luci-base/po/templates/base.pot index 1c21925fcd..4737604e3b 100644 --- a/modules/luci-base/po/templates/base.pot +++ b/modules/luci-base/po/templates/base.pot @@ -569,7 +569,7 @@ msgstr "" msgid "Check" msgstr "" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/tr/base.po b/modules/luci-base/po/tr/base.po index 334ef00536..d0c18f2743 100644 --- a/modules/luci-base/po/tr/base.po +++ b/modules/luci-base/po/tr/base.po @@ -589,7 +589,7 @@ msgstr "" msgid "Check" msgstr "" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po index de7259b5d4..d0157e12e6 100644 --- a/modules/luci-base/po/uk/base.po +++ b/modules/luci-base/po/uk/base.po @@ -616,7 +616,7 @@ msgstr "Канал" msgid "Check" msgstr "Перевірити" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/vi/base.po b/modules/luci-base/po/vi/base.po index 48f6b73e82..988938f554 100644 --- a/modules/luci-base/po/vi/base.po +++ b/modules/luci-base/po/vi/base.po @@ -583,7 +583,7 @@ msgstr "Kênh" msgid "Check" msgstr "" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po index f516d42942..42d1dd7741 100644 --- a/modules/luci-base/po/zh-cn/base.po +++ b/modules/luci-base/po/zh-cn/base.po @@ -585,7 +585,7 @@ msgstr "信道" msgid "Check" msgstr "检查" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "在挂载前检查文件系统" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-base/po/zh-tw/base.po b/modules/luci-base/po/zh-tw/base.po index c0abad2a76..924d8b4aa5 100644 --- a/modules/luci-base/po/zh-tw/base.po +++ b/modules/luci-base/po/zh-tw/base.po @@ -588,7 +588,7 @@ msgstr "頻道" msgid "Check" msgstr "檢查" -msgid "Check fileystems before mount" +msgid "Check filesystems before mount" msgstr "" msgid "Check this option to delete the existing networks from this radio." diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua index 83fdaadcbb..1cbd181919 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua @@ -57,8 +57,8 @@ if fs.access("/etc/init.d/dsl_control") then ds_snr = dsl:option(ListValue, "ds_snr_offset", translate("Downstream SNR offset")) ds_snr:depends("line_mode", "adsl") - for i = -50, 50, 5 do - ds_snr:value(i, translate("%.1f dB" %{ i / 10} )) + for i = -100, 100, 5 do + ds_snr:value(i, translatef("%.1f dB", i / 10)) end end diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua index fd466d5c26..3ce5351bf0 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua @@ -62,7 +62,7 @@ o = s:option(Flag, "auto_mount", translate("Automount Filesystem"), translate("A o.default = o.enabled o.rmempty = false -o = s:option(Flag, "check_fs", translate("Check fileystems before mount"), translate("Automatically check filesystem for errors before mounting")) +o = s:option(Flag, "check_fs", translate("Check filesystems before mount"), translate("Automatically check filesystem for errors before mounting")) o.default = o.disabled o.rmempty = false diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm b/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm index b4baedff28..ea6ee91c71 100644 --- a/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm +++ b/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm @@ -78,15 +78,16 @@ tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1); var host = hosts[duid2mac(st[1][i].duid)]; - if (host) - tr.insertCell(-1).innerHTML = String.format( - '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis">%s</div>', - ((host.name && (host.ipv4 || host.ipv6)) - ? '%h (%s)'.format(host.name, host.ipv4 || host.ipv6) - : '%h'.format(host.name || host.ipv4 || host.ipv6)).nobr() - ); + if (!st[1][i].hostname) + tr.insertCell(-1).innerHTML = + (host && (host.name || host.ipv4 || host.ipv6)) + ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">? (%h)</div>'.format(host.name || host.ipv4 || host.ipv6) + : '?'; else - tr.insertCell(-1).innerHTML = st[1][i].hostname ? st[1][i].hostname : '?'; + tr.insertCell(-1).innerHTML = + (host && host.name && st[1][i].hostname != host.name) + ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">%h (%h)</div>'.format(st[1][i].hostname, host.name) + : st[1][i].hostname; tr.insertCell(-1).innerHTML = st[1][i].ip6addr; tr.insertCell(-1).innerHTML = st[1][i].duid; diff --git a/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm b/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm index d29a894276..18f66c2a82 100644 --- a/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm +++ b/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm @@ -38,7 +38,7 @@ local wan6 = ntm:get_wan6net() local conn_count = tonumber( - fs.readfile("/proc/sys/net/netfilter/nf_conntrack_count")) or 0 + fs.readfile("/proc/sys/net/netfilter/nf_conntrack_count") or "") or 0 local conn_max = tonumber(( luci.sys.exec("sysctl net.nf_conntrack_max") or @@ -417,15 +417,16 @@ tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1); var host = hosts[duid2mac(info.leases6[i].duid)]; - if (host) - tr.insertCell(-1).innerHTML = String.format( - '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis">%s</div>', - ((host.name && (host.ipv4 || host.ipv6)) - ? '%h (%s)'.format(host.name, host.ipv4 || host.ipv6) - : '%h'.format(host.name || host.ipv4 || host.ipv6)).nobr() - ); + if (!info.leases6[i].hostname) + tr.insertCell(-1).innerHTML = + (host && (host.name || host.ipv4 || host.ipv6)) + ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">? (%h)</div>'.format(host.name || host.ipv4 || host.ipv6) + : '?'; else - tr.insertCell(-1).innerHTML = info.leases6[i].hostname ? info.leases6[i].hostname : '?'; + tr.insertCell(-1).innerHTML = + (host && host.name && info.leases6[i].hostname != host.name) + ? '<div style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space: nowrap">%h (%h)</div>'.format(info.leases6[i].hostname, host.name) + : info.leases6[i].hostname; tr.insertCell(-1).innerHTML = info.leases6[i].ip6addr; tr.insertCell(-1).innerHTML = info.leases6[i].duid; |