Merge pull request #2204 from dibdot/wg-qrfix
authorDirk Brenken <dev@brenken.org>
Fri, 12 Oct 2018 13:30:18 +0000 (15:30 +0200)
committerGitHub <noreply@github.com>
Fri, 12 Oct 2018 13:30:18 +0000 (15:30 +0200)
luci-app-wireguard: clean up QR Code generation

134 files changed:
applications/luci-app-asterisk/luasrc/asterisk.lua
applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
applications/luci-app-mwan3/po/de/mwan3.po
applications/luci-app-mwan3/po/ja/mwan3.po
applications/luci-app-mwan3/po/ru/mwan3.po
applications/luci-app-mwan3/po/templates/mwan3.pot
applications/luci-app-mwan3/po/zh-cn/mwan3.po
applications/luci-app-mwan3/po/zh-tw/mwan3.po
applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js
applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua
applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua
applications/luci-app-simple-adblock/po/zh-cn/simple-adblock.po
applications/luci-app-simple-adblock/po/zh-tw/simple-adblock.po
applications/luci-app-snmpd/luasrc/model/cbi/snmpd.lua
applications/luci-app-splash/Makefile
applications/luci-app-splash/luasrc/view/splash/splash.htm
applications/luci-app-splash/po/ca/splash.po
applications/luci-app-splash/po/cs/splash.po
applications/luci-app-splash/po/de/splash.po
applications/luci-app-splash/po/el/splash.po
applications/luci-app-splash/po/en/splash.po
applications/luci-app-splash/po/es/splash.po
applications/luci-app-splash/po/fr/splash.po
applications/luci-app-splash/po/he/splash.po
applications/luci-app-splash/po/hu/splash.po
applications/luci-app-splash/po/it/splash.po
applications/luci-app-splash/po/ja/splash.po
applications/luci-app-splash/po/ms/splash.po
applications/luci-app-splash/po/no/splash.po
applications/luci-app-splash/po/pl/splash.po
applications/luci-app-splash/po/pt-br/splash.po
applications/luci-app-splash/po/pt/splash.po
applications/luci-app-splash/po/ro/splash.po
applications/luci-app-splash/po/ru/splash.po
applications/luci-app-splash/po/sk/splash.po
applications/luci-app-splash/po/sv/splash.po
applications/luci-app-splash/po/templates/splash.pot
applications/luci-app-splash/po/tr/splash.po
applications/luci-app-splash/po/uk/splash.po
applications/luci-app-splash/po/vi/splash.po
applications/luci-app-splash/po/zh-cn/splash.po
applications/luci-app-splash/po/zh-tw/splash.po
applications/luci-app-splash/root/etc/init.d/luci_splash
applications/luci-app-statistics/Makefile
applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua
applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua
applications/luci-app-travelmate/po/ja/travelmate.po
applications/luci-app-travelmate/po/pt-br/travelmate.po
applications/luci-app-travelmate/po/ru/travelmate.po
applications/luci-app-travelmate/po/templates/travelmate.pot
applications/luci-app-travelmate/po/zh-cn/travelmate.po
applications/luci-app-travelmate/po/zh-tw/travelmate.po
applications/luci-app-unbound/luasrc/model/cbi/unbound/zones.lua
applications/luci-app-vpnbypass/po/pt-br/vpnbypass.po
applications/luci-app-wifischedule/README.md
applications/luci-app-wireguard/po/ja/wireguard.po
applications/luci-app-wireguard/po/pt-br/wireguard.po
applications/luci-app-wireguard/po/ru/wireguard.po
applications/luci-app-wireguard/po/sv/wireguard.po
applications/luci-app-wireguard/po/templates/wireguard.pot
applications/luci-app-wireguard/po/zh-cn/wireguard.po
applications/luci-app-wireguard/po/zh-tw/wireguard.po
build/check-controllers.sh
build/i18n-scan.pl
build/luadoc/luadoc/config.lua
contrib/package/community-profiles/files/etc/config/profile_berlin
contrib/package/community-profiles/files/etc/config/profile_cottbus
contrib/package/community-profiles/files/etc/config/profile_potsdam
contrib/package/community-profiles/files/etc/config/profile_tulumlibre
contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh
documentation/CBI.md
documentation/Templates.md
libs/luci-lib-httpprotoutils/luasrc/http/mime.luadoc
libs/luci-lib-ip/src/ip.luadoc
libs/luci-lib-iptparser/Makefile [new file with mode: 0644]
libs/luci-lib-iptparser/luasrc/sys/iptparser.lua [new file with mode: 0644]
libs/luci-lib-iptparser/luasrc/sys/iptparser.luadoc [new file with mode: 0644]
libs/luci-lib-nixio/docsrc/CHANGELOG.lua
libs/luci-lib-nixio/docsrc/README.lua
libs/luci-lib-nixio/docsrc/nixio.lua
libs/luci-lib-px5g/src/library/bignum.c
libs/luci-lib-px5g/src/library/x509write.c
libs/luci-lib-px5g/src/polarssl/bignum.h
libs/luci-lib-px5g/src/polarssl/x509.h
modules/luci-base/htdocs/luci-static/resources/cbi.js
modules/luci-base/luasrc/dispatcher.luadoc
modules/luci-base/luasrc/http.lua
modules/luci-base/luasrc/http.luadoc
modules/luci-base/luasrc/model/uci.lua
modules/luci-base/luasrc/model/uci.luadoc
modules/luci-base/luasrc/sys.luadoc
modules/luci-base/luasrc/sys/iptparser.lua [deleted file]
modules/luci-base/luasrc/sys/iptparser.luadoc [deleted file]
modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua
modules/luci-base/luasrc/util.lua
modules/luci-base/luasrc/util.luadoc
modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
modules/luci-base/po/ca/base.po
modules/luci-base/po/cs/base.po
modules/luci-base/po/de/base.po
modules/luci-base/po/el/base.po
modules/luci-base/po/en/base.po
modules/luci-base/po/es/base.po
modules/luci-base/po/fr/base.po
modules/luci-base/po/he/base.po
modules/luci-base/po/hu/base.po
modules/luci-base/po/it/base.po
modules/luci-base/po/ja/base.po
modules/luci-base/po/ko/base.po
modules/luci-base/po/ms/base.po
modules/luci-base/po/no/base.po
modules/luci-base/po/pl/base.po
modules/luci-base/po/pt-br/base.po
modules/luci-base/po/pt/base.po
modules/luci-base/po/ro/base.po
modules/luci-base/po/ru/base.po
modules/luci-base/po/sk/base.po
modules/luci-base/po/sv/base.po
modules/luci-base/po/templates/base.pot
modules/luci-base/po/tr/base.po
modules/luci-base/po/uk/base.po
modules/luci-base/po/vi/base.po
modules/luci-base/po/zh-cn/base.po
modules/luci-base/po/zh-tw/base.po
modules/luci-base/src/template_utils.c
modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua
modules/luci-mod-status/luasrc/controller/admin/status.lua
modules/luci-mod-status/luasrc/view/admin_status/iptables.htm
modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua
modules/luci-mod-system/luasrc/view/admin_system/packages.htm

index ceb738d112822b0d695e37bbc0a75e5d1355f4e3..da94c556f956487135bfd17df1934868e133dc50 100644 (file)
@@ -35,7 +35,7 @@ function io.exec(command)
        return buffer
 end
 
---- Execute command and invoke given callback for each readed line
+--- Execute command and invoke given callback for each read line
 -- @param command      String containing the command to execute
 -- @param callback     Function to call back for each line
 -- @return                     Always true
@@ -53,7 +53,7 @@ function io.execl(command, callback)
        return true
 end
 
---- Execute command and return an iterator that returns one line per invokation
+--- Execute command and return an iterator that returns one line per invocation
 -- @param command      String containing the command to execute
 -- @return                     Iterator function
 function io.execi(command)
@@ -71,7 +71,7 @@ end
 --- LuCI Asterisk - core status
 core = luci.util.class()
 
---- Retrive version string.
+--- Retrieve version string.
 -- @return     String containing the reported asterisk version
 function core.version(self)
        local version = io.exec("core show version")
@@ -141,7 +141,7 @@ function sip.peers(self)
        return peers
 end
 
---- Get informations of given SIP peer
+--- Get information of given SIP peer
 -- @param peer String containing the name of the SIP peer
 function sip.peer(peer)
        local info = { }
@@ -217,7 +217,7 @@ end
 --- Convert given list to a collection of hyperlinks
 -- @param list Table of tokens
 -- @param url  String pattern or callback function to construct urls (optional)
--- @param sep  String containing the seperator (optional, default is ", ")
+-- @param sep  String containing the separator (optional, default is ", ")
 -- @return             String containing the html fragment
 function tools.hyperlinks(list, url, sep)
        local html
index 66a06b20f74825d13753d39a264e9b863ed0bd9f..3cbc5002be4f74ca70d6dbd0b1b97df7dc448741 100644 (file)
                        <div class="cbi-section-create cbi-tblsection-create" style="padding: 3px">
                                <h3>Create a new dialzone</h3>
                                The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .<br />
-                               You can specifiy multiple number matches by separating them with spaces.<br />
+                               You can specify multiple number matches by separating them with spaces.<br />
 
                                <%- if create_error then %>
                                        <br /><span style="color:red">Invalid name given!</span><br />
index eb2159076ef230c1c34545e191f7a9dec8f5f848..ecabec4e22e6962ad20368196af8ad6cdf4457eb 100644 (file)
@@ -90,7 +90,7 @@ end
 -- will use dynamic_dns_lucihelper to check if
 -- local IP can be read
 local function _verify_ip_source()
-       -- section is globally defined here be calling agrument (see above)
+       -- section is globally defined here be calling argument (see above)
        local _arg
 
        local _ipv6   = usev6:formvalue(section)
@@ -173,7 +173,7 @@ end
 
 -- function to verify if option is valid
 local function _option_validate(self, value, optional)
-       -- section is globally defined here be calling agrument (see above)
+       -- section is globally defined here be calling argument (see above)
        local fusev6 = usev6:formvalue(section) or "0"
        local fsvc4  = svc4:formvalue(section) or "-"
        local fsvc6  = svc6:formvalue(section) or "-"
@@ -200,7 +200,7 @@ local function _option_validate(self, value, optional)
        if (#urlsh == 0) then return "" end
 
        used = _option_used(self.option, urlsh)
-       -- on error or not used return empty sting
+       -- on error or not used return empty string
        if used < 1 then return "" end
        -- needed but no data then return error
        if not value or (#value == 0) then
index 6f391e84d0e76a611093c98a791cb2b10514ef95..641733e5ac274b3c34de9b310c24f4b18516c7c2 100644 (file)
@@ -202,6 +202,9 @@ msgid ""
 "rules"
 msgstr ""
 
+msgid "Max TTL"
+msgstr ""
+
 msgid "Max packet latency [ms]"
 msgstr ""
 
index 8a1cad2f6baed7fd4cff6fc2502c9639194e5e81..40c71b00acafdeafc70146e244193eb3dcaea20a 100644 (file)
@@ -222,6 +222,9 @@ msgstr ""
 "スは使用できません。<br />インターフェースには、設定済みのメンバーやポリ"
 "シー、ルールと同じ名前を使用することはできません。"
 
+msgid "Max TTL"
+msgstr ""
+
 msgid "Max packet latency [ms]"
 msgstr "最大パケットレイテンシ [ms]"
 
index 4d52d7108c74eb8b3d35def126cfee01b3cd54e9..884848da4b4f96a29ee12403ad78272b139f1a1f 100644 (file)
@@ -222,6 +222,9 @@ msgstr ""
 "символы A-Z, a-z, 0-9, _ и пробелы.<br />Интерфейсы не могут иметь "
 "одинаковые имена с настроенными узлами, политиками или правилами."
 
+msgid "Max TTL"
+msgstr ""
+
 msgid "Max packet latency [ms]"
 msgstr ""
 
index e815afd1f0b648a51cf709e0b7e721d5464e0e11..8f43b3dd1069a2334a991a3f755adf0992acb638 100644 (file)
@@ -196,6 +196,9 @@ msgid ""
 "rules"
 msgstr ""
 
+msgid "Max TTL"
+msgstr ""
+
 msgid "Max packet latency [ms]"
 msgstr ""
 
index f481eadd7ad57bf257a8f1aeddc2e240dc0375f7..91475a61e071574f2aa942f99dace3f18246a0bf 100644 (file)
@@ -211,6 +211,9 @@ msgstr ""
 "的接口名称匹配。<br />名称允许包括 A-Z、a-z、0-9、_ 但是不能有空格。<br />接"
 "口不应该与成员、策略、规则中的任意一个设置项使用相同的名称"
 
+msgid "Max TTL"
+msgstr ""
+
 msgid "Max packet latency [ms]"
 msgstr "最大数据包延迟 [ms]"
 
index cdd2a66f47a9f207269a1899cc1ae34304b0e5aa..3aaf030cf2a0a7affe54ff38e3f39dbe41acdc2a 100644 (file)
@@ -207,9 +207,12 @@ msgid ""
 "rules"
 msgstr ""
 "MWAN 支援最多 252 個物理或邏輯介面。<br />MWAN 要求所有介面必須在 /etc/"
-"config/network 中設定唯一的閘道器躍點。<br />名稱必須與 /etc/config/network 中"
-"的介面名稱匹配。<br />名稱允許包括 A-Z、a-z、0-9、_ 但是不能有空格。<br />接"
-"口不應該與成員、策略、規則中的任意一個設定項使用相同的名稱"
+"config/network 中設定唯一的閘道器躍點。<br />名稱必須與 /etc/config/network "
+"中的介面名稱匹配。<br />名稱允許包括 A-Z、a-z、0-9、_ 但是不能有空格。<br />"
+"接口不應該與成員、策略、規則中的任意一個設定項使用相同的名稱"
+
+msgid "Max TTL"
+msgstr ""
 
 msgid "Max packet latency [ms]"
 msgstr "最大資料包延遲 [ms]"
@@ -238,9 +241,9 @@ msgid ""
 ">Names may contain characters A-Z, a-z, 0-9, _ and no spaces<br />Members "
 "may not share the same name as configured interfaces, policies or rules"
 msgstr ""
-"“成員”用來設定每一個 MWAN 介面的躍點數(即介面優先順序)和所佔比重。<br />名"
-"允許包括 A-Z、 a-、0-9、_ 但是不能有空格。<br />成員不應該與介面、策略、規則"
-"中的任意一個設定項使用相同的名稱"
+"“成員”用來設定每一個 MWAN 介面的躍點數(即介面優先順序)和所佔比重。<br />名"
+"稱允許包括 A-Z、 a-、0-9、_ 但是不能有空格。<br />成員不應該與介面、策略、規"
+"中的任意一個設定項使用相同的名稱"
 
 msgid "Members assigned"
 msgstr "分配的成員"
@@ -365,8 +368,8 @@ msgid ""
 "z, 0-9, _ and no spaces<br />Rules may not share the same name as configured "
 "interfaces, members or policies"
 msgstr ""
-"規則指定哪些流量將使用特定的 MWAN 策略<br />規則基於 IP 位址,埠或協議<br /"
-">規則從上到下匹配<br />匹配規則以下的規則被忽略<br />不符合任何規則的流量將使"
+"規則指定哪些流量將使用特定的 MWAN 策略<br />規則基於 IP 位址,埠或協議<br />"
+"規則從上到下匹配<br />匹配規則以下的規則被忽略<br />不符合任何規則的流量將使"
 "用主路由表進行路由<br />目的地為已知(非預設)網路的流量由主路由表處理<br />"
 "流量符合規則,但該策略的所有 WAN 介面關閉後都會被失效<br />名稱可包含字元 A-"
 "Z,a-z,0-9,_ 和空格<br />規則不能與配置的介面、成員或策略共享相同的名稱"
@@ -422,12 +425,12 @@ msgid ""
 "\"wwan0\")<br /><br />"
 msgstr ""
 "這裡允許您修改“/etc/mwan3.user”的內容。<br />該檔案在 sysupgrade 期間也會保"
-"留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼的第一行必"
-"須是 &#34;#!/bin/sh&#34;,不帶引號。<br />以 # 開頭的行是註釋,不會執行。"
+"留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼的第一"
+"行必須是 &#34;#!/bin/sh&#34;,不帶引號。<br />以 # 開頭的行是註釋,不會執行。"
 "<br />將您的自定義 mwan3 動作放在這裡,他們將<br />在啟用 mwan3 的介面上<br /"
 ">在 netifd hotplug 介面事件時執行。<br /><br />有三個主要的環境變數傳遞給這個"
-"指令碼。<br /><br />$ACTION “ifup”或“ifdown”<br />$INTERFACE 啟動或停止的介面"
-"(例如“wan”或“wwan”)<br />$DEVICE 啟動或停止介面的物理裝置名(例"
+"指令碼。<br /><br />$ACTION “ifup”或“ifdown”<br />$INTERFACE 啟動或停止的介面"
+"(例如“wan”或“wwan”)<br />$DEVICE 啟動或停止介面的物理裝置名(例"
 "如“eth0”或“wwan0”)<br /><br />"
 
 msgid "Tracking hostname or IP address"
@@ -540,13 +543,13 @@ msgstr "不可達(拒絕)"
 #~ "g. \"eth0\" or \"wwan0\")<br /><br />"
 #~ msgstr ""
 #~ "這裡允許您修改“/etc/mwan3.user”的內容。<br />該檔案在 sysupgrade 期間也會"
-#~ "保留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼的第"
-#~ "一行必須是&#34;#!/bin/sh&#34;,不帶引號。<br />以#開頭的行是註釋,不會執"
-#~ "行。<br />將您的自定義 mwan3 動作放在這裡,他們將<br />在啟用 mwan3 的介面"
-#~ "上<br />在 netifd hotplug 介面事件時執行。<br /><br />有三個主要的環境變數"
-#~ "傳遞給這個指令碼。<br /><br />$ACTION “ifup”或“ifdown”<br />$INTERFACE 啟動"
-#~ "或停止的介面名(例如“wan”或“wwan”)<br />$DEVICE 啟動或停止介面的物理裝置"
-#~ "名(例如“eth0”或“wwan0”)<br /><br />"
+#~ "保留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼"
+#~ "的第一行必須是&#34;#!/bin/sh&#34;,不帶引號。<br />以#開頭的行是註釋,不會"
+#~ "執行。<br />將您的自定義 mwan3 動作放在這裡,他們將<br />在啟用 mwan3 的介"
+#~ "面上<br />在 netifd hotplug 介面事件時執行。<br /><br />有三個主要的環境變"
+#~ "數傳遞給這個指令碼。<br /><br />$ACTION “ifup”或“ifdown”<br />$INTERFACE "
+#~ "啟動或停止的介面名(例如“wan”或“wwan”)<br />$DEVICE 啟動或停止介面的物理"
+#~ "裝置名(例如“eth0”或“wwan0”)<br /><br />"
 
 #~ msgid "Currently Configured Interfaces"
 #~ msgstr "當前配置的介面"
@@ -628,8 +631,8 @@ msgstr "不可達(拒絕)"
 #~ "no spaces<br />Rules may not share the same name as configured "
 #~ "interfaces, members or policies"
 #~ msgstr ""
-#~ "“規則”基於 IP 位址、協議、埠把流量劃分到指定的“策略”中。<br />規則按照從"
-#~ "到下的順序進行匹配。除了第一條能夠匹配一次通訊的規則以外,其它規則將被忽"
+#~ "“規則”基於 IP 位址、協議、埠把流量劃分到指定的“策略”中。<br />規則按照從"
+#~ "到下的順序進行匹配。除了第一條能夠匹配一次通訊的規則以外,其它規則將被忽"
 #~ "略。不匹配任何規則的通訊將會由系統預設路由表進行。<br />來自已知的網路的轉"
 #~ "發流量由系統預設路由表接手,然後 MWAN 從中匹配出相應的流量並轉移到 MWAN 自"
 #~ "己的路由表。但是所有被劃分到一個無法使用的策略的流量將會無法正常進行路由。"
@@ -783,8 +786,8 @@ msgstr "不可達(拒絕)"
 #~ "$DEVICE is the device name attached to the interface (eth0.1, eth1, etc.)"
 #~ msgstr ""
 #~ "這裡允許您修改 /etc/hotplug.d/iface/16-mwancustom 的內容<br />這可以在接"
-#~ "口 ifup 或 ifdown Hotplug 事件時執行系統指令或指令碼<br /><br />注意:<br />"
-#~ "指令碼的第一行必須是 &#34;#!/bin/sh&#34; 不含引號<br />以#開頭的行是註釋,"
-#~ "不會執行<br /><br />可用變數:<br />$ACTION 是 Hotplug 事件(ifup, ifdown)"
-#~ "<br />$INTERFACE 是介面名稱(wan1、wan2 等)<br />$DEVICE 是連線到介面的設"
-#~ "備名稱 (eth0.1、eth1 等)"
+#~ "口 ifup 或 ifdown Hotplug 事件時執行系統指令或指令碼<br /><br />注意:<br /"
+#~ ">指令碼的第一行必須是 &#34;#!/bin/sh&#34; 不含引號<br />以#開頭的行是註"
+#~ "釋,不會執行<br /><br />可用變數:<br />$ACTION 是 Hotplug 事件(ifup, "
+#~ "ifdown)<br />$INTERFACE 是介面名稱(wan1、wan2 等)<br />$DEVICE 是連線到"
+#~ "介面的設備名稱 (eth0.1、eth1 等)"
index 49435a4a33791cd54dea17b675902e53b9ec9b15..60a103adfba1173b96a097ad2b7a038cb959a80b 100644 (file)
@@ -329,7 +329,7 @@ function place_new_nodes() {
                        }
                }
                else {
-                       // beginn somewhere
+                       // begin somewhere
                        n.x = Math.random()*400;
                        n.y = Math.random()*400;
                }
index 90754c2bc1a7989d02f0b84a9174a71b239aae80..722af19e21f16808b8e746a71ae141899f971882 100644 (file)
@@ -544,7 +544,7 @@ function bl.validate(self, value)
        elseif v < 1 or v > 4096 then
                return nil, err_tab_access(self.title_base, translate("Value not between 1 and 4096") )
        elseif v == self.default then
-               return ""       -- dont need to save default
+               return ""       -- don't need to save default
        end
        return value
 end
@@ -721,7 +721,7 @@ function st.validate(self, value)
        elseif v < 1 then
                return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") )
        elseif v == self.default then
-               return ""       -- dont need to save default
+               return ""       -- don't need to save default
        end
        return value
 end
@@ -740,7 +740,7 @@ function mcc.validate(self, value)
        elseif v < 1 then
                return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") )
        elseif v == self.default then
-               return ""       -- dont need to save default
+               return ""       -- don't need to save default
        end
        return value
 end
index 0d738326a070acc25647745ddad0885bc475b663..413b3b481ff8fb38bc9dfcbe35d9f212b7868abc 100644 (file)
@@ -167,7 +167,7 @@ function mode.write(self, section, value)
        --      * wl0 gets an ipv6 address, in this case the fdca:ffee:babe::1:1/64
        --      * we do a ::ffff:ffff:0/96 route into siit0, so everything from 6mesh goes into translation.
        --      * an HNA6 of ::ffff:ffff:0:0/96 announces the mapped 0.0.0.0/0 ipv4 space.
-       --      * MTU on WAN, LAN down to 1400, ipv6 headers are slighly larger.
+       --      * MTU on WAN, LAN down to 1400, ipv6 headers are slightly larger.
 
        if value == "gateway" then
 
index b926fd08375bc61632e626a68e15d236d496ec23..11a2364ffebce0e1daff8257ee777aafb3e7255a 100644 (file)
@@ -104,6 +104,9 @@ msgstr "简单 AdBlock 设置"
 msgid "Some output"
 msgstr "一些输出"
 
+msgid "Start Simple Adblock service"
+msgstr ""
+
 msgid "Stop the download if it is stalled for set number of seconds"
 msgstr "如果下载停滞设定的秒数后,则停止下载"
 
index bbeda42c290e2a3038b2a0a663036b4360544419..c4c31aa07114a3fb0433c25c0e1575c6aa4a3420 100644 (file)
@@ -104,6 +104,9 @@ msgstr "簡單 AdBlock 設定"
 msgid "Some output"
 msgstr "一些輸出"
 
+msgid "Start Simple Adblock service"
+msgstr ""
+
 msgid "Stop the download if it is stalled for set number of seconds"
 msgstr "如果下載停滯設定的秒數後,則停止下載"
 
index b3c0f2660be5d553bf5950016d9b3c1ed40ef8f2..cc6951e171d9d17cc5a3a6344c6c144f4473102a 100644 (file)
@@ -26,11 +26,12 @@ s.anonymous = true
 p = s:option(Value, "agentaddress", "The address the agent should listen on",
        [[Eg: UDP:161, or UDP:10.5.4.3:161 to only listen on a given interface]])
 
-s = m:section(TypedSection, "agentx", "AgentX settings")
+s = m:section(TypedSection, "agentx", "AgentX settings", "Delete this section to disable agentx")
 s.anonymous = true
 p = s:option(Value, "agentxsocket", "The address the agent should allow agentX connections to",
     [[This is only necessary if you have subagents using the agentX socket protocol.
-    Note that agentX requires TCP transport]])
+    Eg: /var/run/agentx.sock]])
+s.addremove=true
 
 s = m:section(TypedSection, "com2sec", "com2sec security")
 p = s:option(Value, "secname", "secname")
index 5740aa5f7c4364923bbd18b2822bb15204838885..46537248710962768495fe91585823409740d3d0 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=Freifunk DHCP-Splash application
-LUCI_DEPENDS:=+luci-lib-nixio +tc +kmod-sched +iptables-mod-nat-extra +iptables-mod-ipopt
+LUCI_DEPENDS:=+luci-lib-nixio +luci-lib-iptparser +tc +kmod-sched +iptables-mod-nat-extra +iptables-mod-ipopt
 
 define Package/luci-app-splash/conffiles
 /etc/config/luci_splash
index 8d84463ef7f1aac32bae87f139c81cfc3965c76c..64c326ff3ad2dd4529000d3fc306ba4020d50c96 100644 (file)
@@ -81,7 +81,7 @@ if has_custom_splash then
        is limited and because of this we ask you not to do any of the following:%></p>
        <ul>
                <li><%:use filesharing applications on this network%></li>
-               <li><%:waste bandwidth with unneccesary downloads or streams%></li>
+               <li><%:waste bandwidth with unnecessary downloads or streams%></li>
                <li><%:perform any kind of illegal activities%></li>
        </ul>
        <br />
index 3afef1a7b3f22213d79dbfd469995d4047f25b58..b6786750c93b5d6d3432b2923563c726dd308983 100644 (file)
@@ -323,7 +323,7 @@ msgstr "desconegut"
 msgid "use filesharing applications on this network"
 msgstr "utilitza aplicacions de compartició de fitxers en aquesta xarxa"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "malgasta l'amplada de banda amb baixades o corrents innecessaris"
 
 msgid "whitelisted"
index 671afd79e267eb0c2ec02f7d896cebe36b8b08ce..faa8509473cbaafb28738f239a7216b374957770 100644 (file)
@@ -324,7 +324,7 @@ msgstr "neznámý"
 msgid "use filesharing applications on this network"
 msgstr "používat aplikace na sdílení souborů v této síti"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "plýtvat šířkou pásma nepotřebným stahováním nebo streamy"
 
 msgid "whitelisted"
index 8b1cd9a5ece92b5df75c53779a53a5f1fc20c618..4fc2cb6b03b326b017f262c57b72099cf249369d 100644 (file)
@@ -368,7 +368,7 @@ msgstr "Unbekannt"
 msgid "use filesharing applications on this network"
 msgstr "Filesharing betreiben"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "Bandbreite durch unnötige Downloads oder Streams zu verschwenden."
 
 msgid "whitelisted"
index df90478f71eaa3497abcb64f1a8c406f9d6a90db..5c5db96f3d256730d918ab962f50dcf3e877d6c1 100644 (file)
@@ -300,7 +300,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 615be16b23c3eb08bfd0079d4a75ca1829fc399d..496b58485c4a04c36365eb481f8f10cffe93dbcb 100644 (file)
@@ -285,7 +285,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 836352ea9b5343dbe414effd67480e655b5c45d9..12cb4041fb78a3957924f2d53a8c5165ed6f0f32 100644 (file)
@@ -350,7 +350,7 @@ msgstr "desconocido"
 msgid "use filesharing applications on this network"
 msgstr "usar aplicaciones de compartición de ficheros en esta red"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "malgastar ancho de banda con descargas innecesarias o multimedia"
 
 msgid "whitelisted"
index e525ab316cf8eda021c935e113bba5fa4007e787..c8894c47932f6790afae240e4682243eb7986ead 100644 (file)
@@ -308,7 +308,7 @@ msgstr "inconnu"
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index bf7e2f07453e61211c0b74a85f87656285ccc806..d3931f04e9b0c845a224536683f2869949d243da 100644 (file)
@@ -309,7 +309,7 @@ msgstr "לא ידוע"
 msgid "use filesharing applications on this network"
 msgstr "השתמש בתוכנות לשיתוף קבצים ברשת זו."
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "לבזבז רוחב פס עם הורדות או שידורים מיותרים"
 
 msgid "whitelisted"
index f2c7da14ab50941f3ae63dd0eb0a2bd1b893846e..c80dfc9d277a4364d8ce8a12528c19a08529f8c1 100644 (file)
@@ -296,7 +296,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 8964b6c3fb50d1aee88a7e5faa4328bbf506731a..2e9dd4db01a1f3f689b9b37cc7546ba8c2b03543 100644 (file)
@@ -333,7 +333,7 @@ msgstr "sconosciuto"
 msgid "use filesharing applications on this network"
 msgstr "utilizzare le applicazioni di filesharing su questa rete"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "sprecate banda con download o flussi inutili"
 
 msgid "whitelisted"
index 615be16b23c3eb08bfd0079d4a75ca1829fc399d..496b58485c4a04c36365eb481f8f10cffe93dbcb 100644 (file)
@@ -285,7 +285,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 615be16b23c3eb08bfd0079d4a75ca1829fc399d..496b58485c4a04c36365eb481f8f10cffe93dbcb 100644 (file)
@@ -285,7 +285,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 615be16b23c3eb08bfd0079d4a75ca1829fc399d..496b58485c4a04c36365eb481f8f10cffe93dbcb 100644 (file)
@@ -285,7 +285,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 68568848f047e13d79371f07f1d9989893564d05..3ce4e0571ce6c79665ecb992afe970697b702821 100644 (file)
@@ -359,7 +359,7 @@ msgid "use filesharing applications on this network"
 msgstr "używał programów do dzielenia się plikami w tej sieci"
 
 # j.w.
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "marnował transfer na niepotrzebne pobieranie plików i strumieni"
 
 msgid "whitelisted"
index cbdc8016c1b9fc6cac05db96b9a74cf33c398c15..32e70737274741918849012f3286f7e67da95a2d 100644 (file)
@@ -363,7 +363,7 @@ msgstr "desconhecido"
 msgid "use filesharing applications on this network"
 msgstr "usar aplicativos de compartilhamento de arquivos nesta rede"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "usar banda com fluxos ou arquivos baixados não necessários"
 
 msgid "whitelisted"
index 05bee4f323d421f7053a60827c4f17f02b46538f..f5ad6f51537b78d513170148e6101b016e84f1b9 100644 (file)
@@ -302,7 +302,7 @@ msgstr "desconhecido"
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 615be16b23c3eb08bfd0079d4a75ca1829fc399d..496b58485c4a04c36365eb481f8f10cffe93dbcb 100644 (file)
@@ -285,7 +285,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 24151654a608b5cd6b205d007d9d146321fce412..c5688c329710b12f84eb92ea2853b79f3f605dfb 100644 (file)
@@ -359,7 +359,7 @@ msgstr "неизвестно"
 msgid "use filesharing applications on this network"
 msgstr "использование файлообменных приложений в этой сети"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "тратить пропускную способность на ненужные загрузки или потоки"
 
 msgid "whitelisted"
index e9dd448ec5e34b334bb8e373798e3809a5869bb4..3e5e43abb9e488ad309330c036f703fdd7200b70 100644 (file)
@@ -296,7 +296,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index a5ebcb7efeb78c7bbeb28a571c44cb811b2fc10a..4a5c29a5bca2b401aa0c1c3828a1e0f7fcea276b 100644 (file)
@@ -313,7 +313,7 @@ msgstr "okänd"
 msgid "use filesharing applications on this network"
 msgstr "använd fildelningsapplikationer i det här nätverket"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "slösa bandbredd med onödiga nerladdningar eller strömmar"
 
 msgid "whitelisted"
index f29b73691504ae27de69115f56d250eed009fd5c..233e76d4fd01166bcc956f065a622f7dce108b1d 100644 (file)
@@ -288,7 +288,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 03fa7b3b744c2978fd8d861f3d8ae925e97e4539..f78e5422980a61abe584e3805615b7f3994eb49b 100644 (file)
@@ -296,7 +296,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 2364c63d41cde6d9ab3a303b912dbfb57640ce8f..1a5ce49ff4c12013ee7220bedf26226b975b721c 100644 (file)
@@ -297,7 +297,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index 615be16b23c3eb08bfd0079d4a75ca1829fc399d..496b58485c4a04c36365eb481f8f10cffe93dbcb 100644 (file)
@@ -285,7 +285,7 @@ msgstr ""
 msgid "use filesharing applications on this network"
 msgstr ""
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr ""
 
 msgid "whitelisted"
index fbb49af845793a63e52f338789904f9062f437ea..ff6831fa23c90268b2e9d7267196fdde42c3aa1b 100644 (file)
@@ -329,7 +329,7 @@ msgstr "未知"
 msgid "use filesharing applications on this network"
 msgstr "在此网络上使用文件共享应用程序"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "用不必要的下载或流媒体浪费带宽"
 
 msgid "whitelisted"
index 6238a666b41c0fe827693f94b719338e386ec609..395e12fa0709ee80346460f7eb7e31fe476b47d3 100644 (file)
@@ -329,7 +329,7 @@ msgstr "未知"
 msgid "use filesharing applications on this network"
 msgstr "在此網路上使用檔案共享應用程式"
 
-msgid "waste bandwidth with unneccesary downloads or streams"
+msgid "waste bandwidth with unnecessary downloads or streams"
 msgstr "用不必要的下載或流媒體浪費頻寬"
 
 msgid "whitelisted"
index feefabd81aaea87ea33e6c4d159a39c811eb5f87..01a606c32110617930807b21230f9560f6ede667 100755 (executable)
@@ -237,12 +237,12 @@ start() {
        [ -s $IPT_REPLAY ] && . $IPT_REPLAY
        echo -n > $IPT_REPLAY
 
-       ### Add interface independant prerouting rules
+       ### Add interface independent prerouting rules
        $IPT -t nat -A luci_splash_prerouting -j luci_splash_leases
        $IPT -t nat -A luci_splash_leases -p udp --dport 53 -j REDIRECT --to-ports 53
        $IPT -t nat -A luci_splash_leases -p tcp --dport 80 -j REDIRECT --to-ports 8082
 
-       ### Add interface independant forwarding rules
+       ### Add interface independent forwarding rules
        $IPT -t filter -A luci_splash_forwarding -j luci_splash_filter
        $IPT -t filter -A luci_splash_filter -p tcp -j REJECT --reject-with tcp-reset
        $IPT -t filter -A luci_splash_filter -j REJECT --reject-with icmp-net-prohibited
index 008792a5d018078525e53ea21dc62d0d22fd7e96..b552400fed90db1510361d5649764724ac3dbffb 100644 (file)
@@ -8,6 +8,7 @@ include $(TOPDIR)/rules.mk
 
 LUCI_TITLE:=LuCI Statistics Application
 LUCI_DEPENDS:= \
+       +luci-lib-iptparser \
        +collectd +rrdtool1 +collectd-mod-rrdtool +collectd-mod-iwinfo \
        +collectd-mod-cpu +collectd-mod-memory \
        +collectd-mod-interface +collectd-mod-load +collectd-mod-network
index ec26f02d0db9e46bfe882cb37e2ed8d7292fff63..de7bdbadfe9a12617fdb2fa70a0a599ac168f255 100644 (file)
@@ -10,7 +10,7 @@ function index()
        require("luci.util")
        require("luci.statistics.datatree")
 
-       -- override entry(): check for existance <plugin>.so where <plugin> is derived from the called path
+       -- override entry(): check for existence <plugin>.so where <plugin> is derived from the called path
        function _entry( path, ... )
                local file = path[5] or path[4]
                if nixio.fs.access( "/usr/lib/collectd/" .. file .. ".so" ) then
index 6f687d218ddb4e340726659421a328f058bae341..6ca65e539f0aa7f9faa272610135c66b9c1f9ece 100644 (file)
@@ -17,7 +17,7 @@ function rrdargs( graph, plugin, plugin_instance )
 
                -- diagram data description
                data = {
-                       -- defined sources for data types, if ommitted assume a single DS named "value" (optional)
+                       -- defined sources for data types, if omitted assume a single DS named "value" (optional)
                        sources = {
                                if_octets = { "tx", "rx" }
                        },
index 7b6acf36633262ef57a14d09eebcad49bc52790d..a612126ed0f5536c3ebd51f366ad91012e2a295d 100644 (file)
@@ -14,7 +14,7 @@ function rrdargs( graph, plugin, plugin_instance )
 
                -- diagram data description
                data = {
-                       -- defined sources for data types, if ommitted assume a single DS named "value" (optional)
+                       -- defined sources for data types, if omitted assume a single DS named "value" (optional)
                        sources = {
                                if_octets = { "tx", "rx" }
                        },
index f608a2aa9a66af827aa07b13130a9eb43713f401..ee081d62d29c63508949caf535ddd502cdf1674f 100644 (file)
@@ -12,6 +12,9 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Language: ja\n"
 
+msgid "AP on"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -59,12 +62,6 @@ msgid ""
 msgstr ""
 "トラベル ルーター機能を有効化するための、 Travelmate パッケージの設定です。"
 
-msgid ""
-"Connect your Android or iOS devices to your router's WiFi using the shown QR "
-"code."
-msgstr ""
-"Android や iOS デバイスを、表示される QR コードを使用して WiFi に接続します。"
-
 msgid "Connection Limit"
 msgstr "接続制限"
 
@@ -113,16 +110,16 @@ msgstr "無線アップリンク設定の編集"
 msgid "Edit this Uplink"
 msgstr "このアップリンクを編集"
 
-msgid "Enable travelmate"
+msgid "Enable Travelmate"
 msgstr "Travelmate の有効化"
 
-msgid "Enable verbose debug logging"
+msgid "Enable Verbose Debug Logging"
 msgstr "詳細なデバッグ ログの有効化"
 
 msgid "Encryption"
 msgstr "暗号化"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "拡張オプション"
 
 msgid "Faulty Stations"
@@ -131,6 +128,9 @@ msgstr ""
 msgid "Find and join network on"
 msgstr "ネットワークの検索と参加:"
 
+msgid "For QR-Code support please install package 'qrencode'!"
+msgstr ""
+
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">see online "
 "documentation</a>"
@@ -147,15 +147,6 @@ msgstr "TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "TKIP と CCMP (AES)"
 
-msgid ""
-"Here you'll find the QR codes from all of your configured Access Points. It "
-"allows you to connect your Android or iOS devices to your router's WiFi "
-"using the QR code shown below."
-msgstr ""
-"ここには、構成済みの全アクセスポイントの QR コードを表示しています。以下の "
-"QR コードを使用して、 Android または iOS デバイスをルータの WiFi に接続するこ"
-"とができます。"
-
 msgid ""
 "How long should travelmate wait for a successful wlan uplink connection."
 msgstr "Travelmate が無線アップリンクへの接続成功を待つ時間です。"
@@ -237,11 +228,8 @@ msgid ""
 "one. The currently used uplink is emphasized in blue, faulty stations in red."
 msgstr ""
 
-msgid "QR-Codes"
-msgstr "QR-コード"
-
-msgid "Radio selection"
-msgstr "無線の選択"
+msgid "Radio Selection / Order"
+msgstr ""
 
 msgid "Repeat scan"
 msgstr "再スキャン"
@@ -252,8 +240,10 @@ msgstr ""
 msgid "Restart Travelmate"
 msgstr ""
 
-msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
-msgstr "Travelmate が指定された無線に接続するよう制御します。(例: 'radio0')"
+msgid ""
+"Restrict travelmate to a single radio (e.g. 'radio1') or change the overall "
+"scanning order (e.g. 'radio1 radio2 radio0')."
+msgstr ""
 
 msgid "Retry limit to connect to an uplink."
 msgstr "アップリンクへの接続を試行する回数です。"
@@ -273,6 +263,9 @@ msgstr "保存"
 msgid "Scan"
 msgstr "スキャン:"
 
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
 msgid "Signal Quality Threshold"
 msgstr "シグナル品質閾値"
 
@@ -388,6 +381,35 @@ msgstr ""
 msgid "hidden"
 msgstr "(ステルス)"
 
+msgid "with SSID"
+msgstr ""
+
+#~ msgid ""
+#~ "Connect your Android or iOS devices to your router's WiFi using the shown "
+#~ "QR code."
+#~ msgstr ""
+#~ "Android や iOS デバイスを、表示される QR コードを使用して WiFi に接続しま"
+#~ "す。"
+
+#~ msgid ""
+#~ "Here you'll find the QR codes from all of your configured Access Points. "
+#~ "It allows you to connect your Android or iOS devices to your router's "
+#~ "WiFi using the QR code shown below."
+#~ msgstr ""
+#~ "ここには、構成済みの全アクセスポイントの QR コードを表示しています。以下"
+#~ "の QR コードを使用して、 Android または iOS デバイスをルータの WiFi に接続"
+#~ "することができます。"
+
+#~ msgid "QR-Codes"
+#~ msgstr "QR-コード"
+
+#~ msgid "Radio selection"
+#~ msgstr "無線の選択"
+
+#~ msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+#~ msgstr ""
+#~ "Travelmate が指定された無線に接続するよう制御します。(例: 'radio0')"
+
 #~ msgid "Last rundate"
 #~ msgstr "最終実行日時"
 
index 5079c5bc8b7baa21c90f01a2740ad43e4ea10c7a..4bc72fe25ae777baaf3bec9ccc00ae5bf1a474ae 100644 (file)
@@ -114,16 +114,16 @@ msgstr "Editar Configurações da Rede sem fio de saída"
 msgid "Edit this Uplink"
 msgstr "Editar Configurações da Rede de saída"
 
-msgid "Enable travelmate"
+msgid "Enable Travelmate"
 msgstr "Habilitar o Travelmate"
 
-msgid "Enable verbose debug logging"
+msgid "Enable Verbose Debug Logging"
 msgstr "Habilitar os registros de depuração detalhados"
 
 msgid "Encryption"
 msgstr "Cifragem"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "Opções adicionais"
 
 msgid "Faulty Stations"
index b97e76dd05d270d6fa84f896efae86c6d1dae70d..8d03cfebdaddf2d7a8c85eb9989f0f3bfa98a44e 100644 (file)
@@ -15,6 +15,9 @@ msgstr ""
 "Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
 "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
 
+msgid "AP on"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -59,11 +62,6 @@ msgid ""
 "functionality."
 msgstr "Настройка утилиты TravelMate - помощника путешественника. "
 
-msgid ""
-"Connect your Android or iOS devices to your router's WiFi using the shown QR "
-"code."
-msgstr ""
-
 msgid "Connection Limit"
 msgstr "Ограничение соединений"
 
@@ -112,16 +110,16 @@ msgstr "Редактировать настройки беспроводной 
 msgid "Edit this Uplink"
 msgstr "Редактировать настройки сети"
 
-msgid "Enable travelmate"
+msgid "Enable Travelmate"
 msgstr "Включить Travelmate"
 
-msgid "Enable verbose debug logging"
+msgid "Enable Verbose Debug Logging"
 msgstr "Включить подробное ведение журнала отладки"
 
 msgid "Encryption"
 msgstr "Шифрование"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "Дополнительные настройки"
 
 msgid "Faulty Stations"
@@ -130,6 +128,9 @@ msgstr ""
 msgid "Find and join network on"
 msgstr "Найти сеть для подключения используя"
 
+msgid "For QR-Code support please install package 'qrencode'!"
+msgstr ""
+
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">see online "
 "documentation</a>"
@@ -146,12 +147,6 @@ msgstr "Назначить TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "Назначить TKIP и CCMP (AES)"
 
-msgid ""
-"Here you'll find the QR codes from all of your configured Access Points. It "
-"allows you to connect your Android or iOS devices to your router's WiFi "
-"using the QR code shown below."
-msgstr ""
-
 msgid ""
 "How long should travelmate wait for a successful wlan uplink connection."
 msgstr ""
@@ -233,12 +228,9 @@ msgid ""
 "one. The currently used uplink is emphasized in blue, faulty stations in red."
 msgstr ""
 
-msgid "QR-Codes"
+msgid "Radio Selection / Order"
 msgstr ""
 
-msgid "Radio selection"
-msgstr "Выбор Wi-Fi устройства"
-
 msgid "Repeat scan"
 msgstr "Повторить поиск"
 
@@ -248,8 +240,10 @@ msgstr ""
 msgid "Restart Travelmate"
 msgstr ""
 
-msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
-msgstr "Выделить TravelMate-у конкретное Wi-Fi устройство, например 'radio0'."
+msgid ""
+"Restrict travelmate to a single radio (e.g. 'radio1') or change the overall "
+"scanning order (e.g. 'radio1 radio2 radio0')."
+msgstr ""
 
 msgid "Retry limit to connect to an uplink."
 msgstr ""
@@ -269,6 +263,9 @@ msgstr "Сохранить"
 msgid "Scan"
 msgstr "Поиск"
 
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
 msgid "Signal Quality Threshold"
 msgstr ""
 
@@ -382,6 +379,16 @@ msgstr ""
 msgid "hidden"
 msgstr "скрытый"
 
+msgid "with SSID"
+msgstr ""
+
+#~ msgid "Radio selection"
+#~ msgstr "Выбор Wi-Fi устройства"
+
+#~ msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+#~ msgstr ""
+#~ "Выделить TravelMate-у конкретное Wi-Fi устройство, например 'radio0'."
+
 #~ msgid "Last rundate"
 #~ msgstr "Дата последнего запуска"
 
index b8c235ff4880937990158591c7b21dcc4cbc36c9..c712c10658d0af361642e2eb4dfedd93da6149c1 100644 (file)
@@ -1,6 +1,9 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
+msgid "AP on"
+msgstr ""
+
 msgid "Action"
 msgstr ""
 
@@ -45,11 +48,6 @@ msgid ""
 "functionality."
 msgstr ""
 
-msgid ""
-"Connect your Android or iOS devices to your router's WiFi using the shown QR "
-"code."
-msgstr ""
-
 msgid "Connection Limit"
 msgstr ""
 
@@ -96,16 +94,16 @@ msgstr ""
 msgid "Edit this Uplink"
 msgstr ""
 
-msgid "Enable travelmate"
+msgid "Enable Travelmate"
 msgstr ""
 
-msgid "Enable verbose debug logging"
+msgid "Enable Verbose Debug Logging"
 msgstr ""
 
 msgid "Encryption"
 msgstr ""
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr ""
 
 msgid "Faulty Stations"
@@ -114,6 +112,9 @@ msgstr ""
 msgid "Find and join network on"
 msgstr ""
 
+msgid "For QR-Code support please install package 'qrencode'!"
+msgstr ""
+
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">see online "
 "documentation</a>"
@@ -128,12 +129,6 @@ msgstr ""
 msgid "Force TKIP and CCMP (AES)"
 msgstr ""
 
-msgid ""
-"Here you'll find the QR codes from all of your configured Access Points. It "
-"allows you to connect your Android or iOS devices to your router's WiFi "
-"using the QR code shown below."
-msgstr ""
-
 msgid ""
 "How long should travelmate wait for a successful wlan uplink connection."
 msgstr ""
@@ -213,10 +208,7 @@ msgid ""
 "one. The currently used uplink is emphasized in blue, faulty stations in red."
 msgstr ""
 
-msgid "QR-Codes"
-msgstr ""
-
-msgid "Radio selection"
+msgid "Radio Selection / Order"
 msgstr ""
 
 msgid "Repeat scan"
@@ -228,7 +220,9 @@ msgstr ""
 msgid "Restart Travelmate"
 msgstr ""
 
-msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+msgid ""
+"Restrict travelmate to a single radio (e.g. 'radio1') or change the overall "
+"scanning order (e.g. 'radio1 radio2 radio0')."
 msgstr ""
 
 msgid "Retry limit to connect to an uplink."
@@ -249,6 +243,9 @@ msgstr ""
 msgid "Scan"
 msgstr ""
 
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
 msgid "Signal Quality Threshold"
 msgstr ""
 
@@ -353,3 +350,6 @@ msgstr ""
 
 msgid "hidden"
 msgstr ""
+
+msgid "with SSID"
+msgstr ""
index e52d8e85466305174536b339b75cdbdc99b42798..6bfa3532f46e523faf8bc365e2e91f122cc49e3c 100644 (file)
@@ -11,6 +11,12 @@ msgstr ""
 "PO-Revision-Date: 2018-08-17 17:06+0800\n"
 "X-Generator: Gtranslator 2.91.7\n"
 
+msgid "AP on"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
 msgid "Add Uplink"
 msgstr "添加上行连接"
 
@@ -52,11 +58,6 @@ msgid ""
 "functionality."
 msgstr "配置 travelmate 包,以启用旅行路由器功能。"
 
-msgid ""
-"Connect your Android or iOS devices to your router's WiFi using the shown QR "
-"code."
-msgstr "使用显示的 QR 码,将您的 Android 或 iOS 设备连接到路由器 WiFi。"
-
 msgid "Connection Limit"
 msgstr "连接限制"
 
@@ -103,21 +104,27 @@ msgstr "编辑无线上行连接配置"
 msgid "Edit this Uplink"
 msgstr "编辑此上行连接"
 
-msgid "Enable travelmate"
+msgid "Enable Travelmate"
 msgstr "启用 travelmate"
 
-msgid "Enable verbose debug logging"
+msgid "Enable Verbose Debug Logging"
 msgstr "启用详细调试日志"
 
 msgid "Encryption"
 msgstr "加密"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "额外选项"
 
+msgid "Faulty Stations"
+msgstr ""
+
 msgid "Find and join network on"
 msgstr "查找并加入网络"
 
+msgid "For QR-Code support please install package 'qrencode'!"
+msgstr ""
+
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">see online "
 "documentation</a>"
@@ -132,14 +139,6 @@ msgstr "强制 TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "强制 TKIP 和 CCMP(AES)"
 
-msgid ""
-"Here you'll find the QR codes from all of your configured Access Points. It "
-"allows you to connect your Android or iOS devices to your router's WiFi "
-"using the QR code shown below."
-msgstr ""
-"在这里,您可以找到所有已配置的接入点的 QR 码。您可以使用下面显示的 QR 码,使 "
-"Android 或 iOS 设备连接到路由器 WiFi。"
-
 msgid ""
 "How long should travelmate wait for a successful wlan uplink connection."
 msgstr "travelmate 等待 wlan 上行连接成功最长时间。"
@@ -159,8 +158,11 @@ msgstr "接口超时"
 msgid "Interface Wizard"
 msgstr "接口向导"
 
-msgid "Last rundate"
-msgstr "最后运行时间"
+msgid "Last Run"
+msgstr ""
+
+msgid "Loading"
+msgstr ""
 
 msgid ""
 "Minimum signal quality threshold as percent for conditional uplink (dis-) "
@@ -213,22 +215,25 @@ msgstr "私钥路径"
 msgid ""
 "Provides an overview of all configured uplinks for the travelmate interface "
 "(%s). You can edit, delete or re-order existing uplinks or scan for a new "
-"one. The currently used uplink is emphasized in blue."
+"one. The currently used uplink is emphasized in blue, faulty stations in red."
 msgstr ""
-"此处显示 travelmate 接口(%s)所有已配置上行连接的概述。您可以编辑、删除或重"
-"新排序现有连接,或扫描新上行连接。当前使用的上行连接以蓝色突出显示。"
-
-msgid "QR-Codes"
-msgstr "QR 码"
 
-msgid "Radio selection"
-msgstr "无线选择"
+msgid "Radio Selection / Order"
+msgstr ""
 
 msgid "Repeat scan"
 msgstr "重新扫描"
 
-msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
-msgstr "将 travelmate 限制在专用无线电中,如“radio0”。"
+msgid "Restart"
+msgstr ""
+
+msgid "Restart Travelmate"
+msgstr ""
+
+msgid ""
+"Restrict travelmate to a single radio (e.g. 'radio1') or change the overall "
+"scanning order (e.g. 'radio1 radio2 radio0')."
+msgstr ""
 
 msgid "Retry limit to connect to an uplink."
 msgstr "连接到上行连接的重试限制。"
@@ -248,25 +253,28 @@ msgstr "保存"
 msgid "Scan"
 msgstr "扫描"
 
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
 msgid "Signal Quality Threshold"
 msgstr "信号质量阈值"
 
 msgid "Signal strength"
 msgstr "信号强度"
 
-msgid "Station ID (SSID/BSSID)"
-msgstr "站点 ID(SSID/BSSID)"
+msgid "Station ID (RADIO/SSID/BSSID)"
+msgstr ""
 
 msgid "Station Interface"
 msgstr "站点接口"
 
-msgid "Station Radio"
-msgstr "站点无线"
-
 msgid ""
 "The BSSID information '%s' is optional and only required for hidden networks"
 msgstr "BSSID 信息“%s”是可选的,仅对隐藏网络必需"
 
+msgid "The syslog output, pre-filtered for travelmate related messages only."
+msgstr ""
+
 msgid ""
 "This form allows you to modify the content of the main firewall "
 "configuration file (/etc/config/firewall)."
@@ -287,20 +295,12 @@ msgid ""
 "configuration file (/etc/config/wireless)."
 msgstr "此表单允许您修改主无线配置文件(/etc/config/wireless)的内容。"
 
-msgid ""
-"This form shows the syslog output, pre-filtered for travelmate related "
-"messages only."
-msgstr "此表单显示 syslog 输出,仅针对 travelmate 相关消息进行预过滤。"
-
 msgid "This step has only to be done once."
 msgstr "此步骤只需执行一次。"
 
 msgid "Travelmate"
 msgstr "Travelmate"
 
-msgid "Travelmate Logfile"
-msgstr "Travelmate 日志文件"
-
 msgid "Travelmate Status (Quality)"
 msgstr "Travelmate 状态(质量)"
 
@@ -355,11 +355,64 @@ msgstr "无线扫描"
 msgid "Wireless Stations"
 msgstr "无线站点"
 
-msgid "add it to the wan zone of the firewall.<br />"
-msgstr "将其添加到防火墙的 wan 区域。<br />"
+msgid "add it to the wan zone of the firewall."
+msgstr ""
 
 msgid "hidden"
 msgstr "隐藏"
 
-msgid "n/a"
-msgstr "n/a"
+msgid "with SSID"
+msgstr ""
+
+#~ msgid ""
+#~ "Connect your Android or iOS devices to your router's WiFi using the shown "
+#~ "QR code."
+#~ msgstr "使用显示的 QR 码,将您的 Android 或 iOS 设备连接到路由器 WiFi。"
+
+#~ msgid ""
+#~ "Here you'll find the QR codes from all of your configured Access Points. "
+#~ "It allows you to connect your Android or iOS devices to your router's "
+#~ "WiFi using the QR code shown below."
+#~ msgstr ""
+#~ "在这里,您可以找到所有已配置的接入点的 QR 码。您可以使用下面显示的 QR 码,"
+#~ "使 Android 或 iOS 设备连接到路由器 WiFi。"
+
+#~ msgid "Last rundate"
+#~ msgstr "最后运行时间"
+
+#~ msgid ""
+#~ "Provides an overview of all configured uplinks for the travelmate "
+#~ "interface (%s). You can edit, delete or re-order existing uplinks or scan "
+#~ "for a new one. The currently used uplink is emphasized in blue."
+#~ msgstr ""
+#~ "此处显示 travelmate 接口(%s)所有已配置上行连接的概述。您可以编辑、删除或"
+#~ "重新排序现有连接,或扫描新上行连接。当前使用的上行连接以蓝色突出显示。"
+
+#~ msgid "QR-Codes"
+#~ msgstr "QR 码"
+
+#~ msgid "Radio selection"
+#~ msgstr "无线选择"
+
+#~ msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+#~ msgstr "将 travelmate 限制在专用无线电中,如“radio0”。"
+
+#~ msgid "Station ID (SSID/BSSID)"
+#~ msgstr "站点 ID(SSID/BSSID)"
+
+#~ msgid "Station Radio"
+#~ msgstr "站点无线"
+
+#~ msgid ""
+#~ "This form shows the syslog output, pre-filtered for travelmate related "
+#~ "messages only."
+#~ msgstr "此表单显示 syslog 输出,仅针对 travelmate 相关消息进行预过滤。"
+
+#~ msgid "Travelmate Logfile"
+#~ msgstr "Travelmate 日志文件"
+
+#~ msgid "add it to the wan zone of the firewall.<br />"
+#~ msgstr "将其添加到防火墙的 wan 区域。<br />"
+
+#~ msgid "n/a"
+#~ msgstr "n/a"
index aa4612b6d0a212acf501ecd5af153f4aa5fee834..529bbbdb071f704ab34cb0f4b1b4194b94a80734 100644 (file)
@@ -11,6 +11,12 @@ msgstr ""
 "PO-Revision-Date: 2018-08-17 17:06+0800\n"
 "X-Generator: Gtranslator 2.91.7\n"
 
+msgid "AP on"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
 msgid "Add Uplink"
 msgstr "新增上行連線"
 
@@ -42,7 +48,8 @@ msgstr "強制門戶檢測"
 msgid ""
 "Check the internet availability, log captive portal redirections and keep "
 "the uplink connection 'alive'."
-msgstr "檢查網際網路可用性,記錄強制網路門戶重定向,並保持上行連線為“活動”狀態。"
+msgstr ""
+"檢查網際網路可用性,記錄強制網路門戶重定向,並保持上行連線為“活動”狀態。"
 
 msgid "Cipher"
 msgstr "密碼"
@@ -52,11 +59,6 @@ msgid ""
 "functionality."
 msgstr "配置 travelmate 包,以啟用旅行路由器功能。"
 
-msgid ""
-"Connect your Android or iOS devices to your router's WiFi using the shown QR "
-"code."
-msgstr "使用顯示的 QR 碼,將您的 Android 或 iOS 裝置連線到路由器 WiFi。"
-
 msgid "Connection Limit"
 msgstr "連線限制"
 
@@ -103,21 +105,27 @@ msgstr "編輯無線上行連線配置"
 msgid "Edit this Uplink"
 msgstr "編輯此上行連線"
 
-msgid "Enable travelmate"
+msgid "Enable Travelmate"
 msgstr "啟用 travelmate"
 
-msgid "Enable verbose debug logging"
+msgid "Enable Verbose Debug Logging"
 msgstr "啟用詳細除錯日誌"
 
 msgid "Encryption"
 msgstr "加密"
 
-msgid "Extra options"
+msgid "Extra Options"
 msgstr "額外選項"
 
+msgid "Faulty Stations"
+msgstr ""
+
 msgid "Find and join network on"
 msgstr "查詢並加入網路"
 
+msgid "For QR-Code support please install package 'qrencode'!"
+msgstr ""
+
 msgid ""
 "For further information <a href=\"%s\" target=\"_blank\">see online "
 "documentation</a>"
@@ -132,14 +140,6 @@ msgstr "強制 TKIP"
 msgid "Force TKIP and CCMP (AES)"
 msgstr "強制 TKIP 和 CCMP(AES)"
 
-msgid ""
-"Here you'll find the QR codes from all of your configured Access Points. It "
-"allows you to connect your Android or iOS devices to your router's WiFi "
-"using the QR code shown below."
-msgstr ""
-"在這裡,您可以找到所有已配置的接入點的 QR 碼。您可以使用下面顯示的 QR 碼,使 "
-"Android 或 iOS 裝置連線到路由器 WiFi。"
-
 msgid ""
 "How long should travelmate wait for a successful wlan uplink connection."
 msgstr "travelmate 等待 wlan 上行連線成功最長時間。"
@@ -159,8 +159,11 @@ msgstr "介面超時"
 msgid "Interface Wizard"
 msgstr "介面嚮導"
 
-msgid "Last rundate"
-msgstr "最後執行時間"
+msgid "Last Run"
+msgstr ""
+
+msgid "Loading"
+msgstr ""
 
 msgid ""
 "Minimum signal quality threshold as percent for conditional uplink (dis-) "
@@ -213,22 +216,25 @@ msgstr "私鑰路徑"
 msgid ""
 "Provides an overview of all configured uplinks for the travelmate interface "
 "(%s). You can edit, delete or re-order existing uplinks or scan for a new "
-"one. The currently used uplink is emphasized in blue."
+"one. The currently used uplink is emphasized in blue, faulty stations in red."
 msgstr ""
-"此處顯示 travelmate 介面(%s)所有已配置上行連線的概述。您可以編輯、刪除或重"
-"新排序現有連線,或掃描新上行連線。當前使用的上行連線以藍色突出顯示。"
-
-msgid "QR-Codes"
-msgstr "QR 碼"
 
-msgid "Radio selection"
-msgstr "無線選擇"
+msgid "Radio Selection / Order"
+msgstr ""
 
 msgid "Repeat scan"
 msgstr "重新掃描"
 
-msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
-msgstr "將 travelmate 限制在專用無線電中,如“radio0”。"
+msgid "Restart"
+msgstr ""
+
+msgid "Restart Travelmate"
+msgstr ""
+
+msgid ""
+"Restrict travelmate to a single radio (e.g. 'radio1') or change the overall "
+"scanning order (e.g. 'radio1 radio2 radio0')."
+msgstr ""
 
 msgid "Retry limit to connect to an uplink."
 msgstr "連線到上行連線的重試限制。"
@@ -248,25 +254,28 @@ msgstr "儲存"
 msgid "Scan"
 msgstr "掃描"
 
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
 msgid "Signal Quality Threshold"
 msgstr "訊號質量閾值"
 
 msgid "Signal strength"
 msgstr "訊號強度"
 
-msgid "Station ID (SSID/BSSID)"
-msgstr "站點 ID(SSID/BSSID)"
+msgid "Station ID (RADIO/SSID/BSSID)"
+msgstr ""
 
 msgid "Station Interface"
 msgstr "站點介面"
 
-msgid "Station Radio"
-msgstr "站點無線"
-
 msgid ""
 "The BSSID information '%s' is optional and only required for hidden networks"
 msgstr "BSSID 資訊“%s”是可選的,僅對隱藏網路必需"
 
+msgid "The syslog output, pre-filtered for travelmate related messages only."
+msgstr ""
+
 msgid ""
 "This form allows you to modify the content of the main firewall "
 "configuration file (/etc/config/firewall)."
@@ -287,20 +296,12 @@ msgid ""
 "configuration file (/etc/config/wireless)."
 msgstr "此表單允許您修改主無線配置檔案(/etc/config/wireless)的內容。"
 
-msgid ""
-"This form shows the syslog output, pre-filtered for travelmate related "
-"messages only."
-msgstr "此表單顯示 syslog 輸出,僅針對 travelmate 相關訊息進行預過濾。"
-
 msgid "This step has only to be done once."
 msgstr "此步驟只需執行一次。"
 
 msgid "Travelmate"
 msgstr "Travelmate"
 
-msgid "Travelmate Logfile"
-msgstr "Travelmate 日誌檔案"
-
 msgid "Travelmate Status (Quality)"
 msgstr "Travelmate 狀態(質量)"
 
@@ -355,11 +356,64 @@ msgstr "無線掃描"
 msgid "Wireless Stations"
 msgstr "無線站點"
 
-msgid "add it to the wan zone of the firewall.<br />"
-msgstr "將其新增到防火牆的 wan 區域。<br />"
+msgid "add it to the wan zone of the firewall."
+msgstr ""
 
 msgid "hidden"
 msgstr "隱藏"
 
-msgid "n/a"
-msgstr "n/a"
+msgid "with SSID"
+msgstr ""
+
+#~ msgid ""
+#~ "Connect your Android or iOS devices to your router's WiFi using the shown "
+#~ "QR code."
+#~ msgstr "使用顯示的 QR 碼,將您的 Android 或 iOS 裝置連線到路由器 WiFi。"
+
+#~ msgid ""
+#~ "Here you'll find the QR codes from all of your configured Access Points. "
+#~ "It allows you to connect your Android or iOS devices to your router's "
+#~ "WiFi using the QR code shown below."
+#~ msgstr ""
+#~ "在這裡,您可以找到所有已配置的接入點的 QR 碼。您可以使用下面顯示的 QR 碼,"
+#~ "使 Android 或 iOS 裝置連線到路由器 WiFi。"
+
+#~ msgid "Last rundate"
+#~ msgstr "最後執行時間"
+
+#~ msgid ""
+#~ "Provides an overview of all configured uplinks for the travelmate "
+#~ "interface (%s). You can edit, delete or re-order existing uplinks or scan "
+#~ "for a new one. The currently used uplink is emphasized in blue."
+#~ msgstr ""
+#~ "此處顯示 travelmate 介面(%s)所有已配置上行連線的概述。您可以編輯、刪除或"
+#~ "重新排序現有連線,或掃描新上行連線。當前使用的上行連線以藍色突出顯示。"
+
+#~ msgid "QR-Codes"
+#~ msgstr "QR 碼"
+
+#~ msgid "Radio selection"
+#~ msgstr "無線選擇"
+
+#~ msgid "Restrict travelmate to a dedicated radio, e.g. 'radio0'."
+#~ msgstr "將 travelmate 限制在專用無線電中,如“radio0”。"
+
+#~ msgid "Station ID (SSID/BSSID)"
+#~ msgstr "站點 ID(SSID/BSSID)"
+
+#~ msgid "Station Radio"
+#~ msgstr "站點無線"
+
+#~ msgid ""
+#~ "This form shows the syslog output, pre-filtered for travelmate related "
+#~ "messages only."
+#~ msgstr "此表單顯示 syslog 輸出,僅針對 travelmate 相關訊息進行預過濾。"
+
+#~ msgid "Travelmate Logfile"
+#~ msgstr "Travelmate 日誌檔案"
+
+#~ msgid "add it to the wan zone of the firewall.<br />"
+#~ msgstr "將其新增到防火牆的 wan 區域。<br />"
+
+#~ msgid "n/a"
+#~ msgstr "n/a"
index 798ca6a45cae9f1f5d9803cff343a7d9286ae935..3a13c23df9b733f2fc73441504a252f12daac563 100644 (file)
@@ -58,7 +58,7 @@ end
 
 
 function ztype.cfgvalue(self, s)
-    -- Format a meaninful tile for the Zone Type column
+    -- Format a meaningful tile for the Zone Type column
     local itxt = self.map:get(s, "zone_type")
     local itls = self.map:get(s, "tls_upstream")
 
@@ -84,7 +84,7 @@ end
 
 
 function zones.cfgvalue(self, s)
-    -- Format a meaninful sentence for the Zones viewed column
+    -- Format a meaningful sentence for the Zones viewed column
     local xtxt, otxt
     local itxt = self.map:get(s, "zone_name")
     local itype = self.map:get(s, "zone_type")
@@ -131,7 +131,7 @@ end
 
 
 function servers.cfgvalue(self, s)
-    -- Format a meaninful sentence for the Servers (and URL) column
+    -- Format a meaningful sentence for the Servers (and URL) column
     local xtxt, otxt, rtxt, found
     local itxt = self.map:get(s, "server")
     local iurl = self.map:get(s, "url_dir")
index 049b1a9244738898955dc8ce09e8df3c65a1c4b6..b6248e4bcc68177f48d60fd694e93bed689c0eed 100644 (file)
@@ -25,8 +25,7 @@ msgid ""
 "Local IP addresses or subnets with direct internet access (outside of the "
 "VPN tunnel)"
 msgstr ""
-"Endereço IP Local ou subrede com acesso direto à internet (fora do túnel "
-"VPN)"
+"Endereço IP Local ou subrede com acesso direto à internet (fora do túnel VPN)"
 
 msgid "Local Ports to Bypass"
 msgstr "Portas locais para evitar a VPN"
@@ -44,8 +43,8 @@ msgid ""
 "Remote IP addresses or subnets which will be accessed directly (outside of "
 "the VPN tunnel)"
 msgstr ""
-"Endereço IP Remoto ou subrede que serão acessados diretamente (fora do "
-"túnel VPN)"
+"Endereço IP Remoto ou subrede que serão acessados diretamente (fora do túnel "
+"VPN)"
 
 msgid "Remote Ports to Bypass"
 msgstr "Portas remotas para evitar a VPN"
index 591abb104939e0ff337908c1002702a11e7a5448..4a57b3f7b470b5bbfe079a1e060ca427d9dfce5f 100644 (file)
@@ -7,7 +7,7 @@ Turns WiFi on and off according to a schedule on an openwrt router
 
 
 ## Use cases
-You can create user-defined events when to enable or disable WiFi. 
+You can create user-defined events when to enable or disable WiFi.
 There are various use cases why you would like to do so:
 
 1. Reduce power consumption and therefore reduce CO2 emissions.
@@ -17,13 +17,13 @@ There are various use cases why you would like to do so:
 Regarding 1: Please note, that you need to unload the wireless driver modules in order to get the most effect of saving power.
 In my test scenario only disabling WiFi saves about ~0.4 Watt, unloading the modules removes another ~0.4 Watt.
 
-Regarding 2: Think of a wireless accesspoint e.g. in your bedrom, kids room where you want to remove the ammount of radiation emitted.
+Regarding 2: Think of a wireless accesspoint e.g. in your bedrom, kids room where you want to remove the amount of radiation emitted.
 
-Regarding 3: E.g. in a company, why would wireless need to be enabled weekends if no one is there working? 
+Regarding 3: E.g. in a company, why would wireless need to be enabled weekends if no one is there working?
 Or think of an accesspoint in your kids room when you want the youngsters to sleep after 10 pm instead of facebooking...
 
 ## Configuration
-You can create an arbitrary number of schedule events. Please note that there is on sanity check done wheather the start / stop times overlap or make sense.
+You can create an arbitrary number of schedule events. Please note that there is on sanity check done whether the start / stop times overlap or make sense.
 If start and stop time are equal, this leads to disabling the WiFi at the given time.
 
 Logging if enabled is done to the file `/var/log/wifi_schedule.log` and can be reviewed through the "View Logfile" tab.
@@ -71,7 +71,7 @@ Then call the script as follows in order to get the necessary cron jobs created:
 `wifi_schedule.sh cron`
 
 All commands:
+
 ```
 wifi_schedule.sh cron|start|stop|forcestop|recheck|getmodules|savemodules|help
 
index 5cd7a900377def286f8b1026658e9ca4c7dcd3ba..921ede12440848d42ee3912262c68683ad4004e0 100644 (file)
@@ -58,6 +58,9 @@ msgstr "永続的なキープアライブ"
 msgid "Public Key"
 msgstr "公開鍵"
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr "WireGuard ステータス"
 
index d3b5059d5fdeb54d94291f3ceea9a601644315ef..2874639b67dbcbcc4c885a8f9c7a3a0f0fbeccb7 100644 (file)
@@ -57,6 +57,9 @@ msgstr "Manter Conexões Abertas (Keepalive)"
 msgid "Public Key"
 msgstr "Chave Pública"
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr "Estado do WireGuard"
 
index 202a49eff4f85ace7fc24b90c0deb7f374c21bea..3781d89522d786da5bce319c324858f840ebb61e 100644 (file)
@@ -58,6 +58,9 @@ msgstr "Постоянные Проверки Активности"
 msgid "Public Key"
 msgstr "Публичный Ключ"
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr "Состояние WireGuard"
 
index 3422ae91e96a8ea19b65c260036a615a9c61d013..c0f7040c67bae4bd155ed8e5ff81ac9dc39fa631 100644 (file)
@@ -46,6 +46,9 @@ msgstr "Hålla vid liv ständigt"
 msgid "Public Key"
 msgstr "Publik nyckel"
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr "Status för WireGuard"
 
index 9ec5c60048d24f4825ca0d1bea57462798dd7b29..3cec473ecf56593279a659de312f582676c96706 100644 (file)
@@ -46,6 +46,9 @@ msgstr ""
 msgid "Public Key"
 msgstr ""
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr ""
 
index 38fd784b1247c7daa3159e2365f11495e3140397..1864048d5b8b05581b0b359926203298aa1993f4 100644 (file)
@@ -60,6 +60,9 @@ msgstr "Keepalive 间隔(秒)"
 msgid "Public Key"
 msgstr "公钥"
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr "WireGuard 状态"
 
index 66fd9649e6a623e49e5f46d96f26e674e773e70a..83da0c351a66a2138ec5143c6e16a7d9f6d91dc0 100644 (file)
@@ -60,6 +60,9 @@ msgstr "Keepalive 間隔(秒)"
 msgid "Public Key"
 msgstr "公鑰"
 
+msgid "Show/Hide QR-Code"
+msgstr ""
+
 msgid "WireGuard Status"
 msgstr "WireGuard 狀態"
 
index 573e6f8642342cd23a9a0532e1f7f24181b55f3a..47f66eac949a78ceff7289a11ace499909575ad0 100755 (executable)
@@ -14,7 +14,7 @@ find . -type f -name '*.lua' -path '*/controller/*' | while read controller; do
                package="${controller##*/controller/}"; package="${package%.lua}"; package="luci.controller.${package//\//.}"
 
                if ! grep -sqE '\bmodule[[:space:]]*\(?[[:space:]]*("|\047|\[=*\[)'"$package" "$controller"; then
-                       echo "'$controller' does not containt the expected\n\t'module(\"$package\", ...)' line.\n"
+                       echo "'$controller' does not contain the expected\n\t'module(\"$package\", ...)' line.\n"
                fi
 
                grep -sqE '\b(Form|SimpleForm)[[:space:]]*\(' "$model" && ! grep -sqE '\bMap[[:space:]]*\(' "$model" && is_form=1 || is_form=0
index 899d90d22c282ada2e203cc249a75a52aa51aa83..3f9ee896308c04e89e63dd8ff457725772e1826d 100755 (executable)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use Text::Balanced qw(extract_bracketed extract_delimited extract_tagged);
 
-@ARGV >= 1 || die "Usage: $0 <source direcory>\n";
+@ARGV >= 1 || die "Usage: $0 <source directory>\n";
 
 
 my %stringtable;
index 9e4b9de3c56532cc45cc5a0e447716033fa38cab..319e1cb03ea43c608f5900be440b54e307c4f4f7 100644 (file)
@@ -1,6 +1,6 @@
 -------------------------------------------------------------------------------
 -- LuaDoc configuration file. This file contains the default options for 
--- luadoc operation. These options can be overriden by the command line tool
+-- luadoc operation. These options can be overridden by the command line tool
 -- @see luadoc.print_help
 -- @release $Id: config.lua,v 1.6 2007/04/18 14:28:39 tomas Exp $
 -------------------------------------------------------------------------------
index 2307f1f3baa9f91c72a57387e745c91851f675db..e4388c76e3f954f4156f28b76f1a2e67376b4928 100644 (file)
@@ -33,7 +33,7 @@ config 'defaults' 'ssidscheme'
 
 config 'defaults' 'interface'
        option 'netmask' '255.255.255.255'
-       option 'dns' '85.214.20.141 194.150.168.168 2001:4ce8::53 2001:910:800::12'
+       option 'dns' '85.214.20.141 80.67.169.40 194.150.168.168 2001:4ce8::53 2001:910:800::12'
 
 config 'dhcp' 'dhcp'
        option leasetime '5m'
index 9b08acc25662d1b6691724f50b6b9f2657ab83ea..6c7f4b6966ba4f76afe2f6242b6b47aa062fbbaa 100644 (file)
@@ -31,7 +31,7 @@ config 'defaults' 'ssidscheme'
 
 config 'defaults' 'interface'
        option 'netmask' '255.255.255.255'
-       option 'dns' '85.214.20.141 194.150.168.168 2001:4ce8::53 2001:910:800::12'
+       option 'dns' '85.214.20.141 80.67.169.40 194.150.168.168 2001:4ce8::53 2001:910:800::12'
 
 config 'dhcp' 'dhcp'
        option 'leasetime' '5m'
index 84bbdfe528691459ab7b02502036d67f19e045f5..78db579a933f1605fb4a361ac6467b7e9e9302c7 100644 (file)
@@ -11,7 +11,7 @@ config 'community' 'profile'
 
 config 'defaults' 'interface'
        option 'netmask' '255.255.0.0'
-       option 'dns' '85.214.20.141 194.150.168.168'
+       option 'dns' '85.214.20.141 80.67.169.40 194.150.168.168'
        option 'delegate' '0'
 
 config 'defaults' 'wifi_device'
index c028a666144e949952f4afdf3bc31484241825d4..ceaff2a743187a27470721d63e01ca25bae10d11 100644 (file)
@@ -7,4 +7,4 @@ config 'community' 'profile'
        option 'splash_prefix' '28'
 
 config 'defaults' 'interface'
-       option 'dns' '216.87.84.211'
+       option 'dns' '80.67.169.40 216.87.84.211'
index b0f6cb291ea6b844f52f8bc0dfe5085ae787e5f5..0b99530a57561af92efa0fe65aa8294bd5e78a9a 100644 (file)
@@ -46,7 +46,7 @@ set_defaults() {
                b="${b//_/ }"
                string_contains "$a" "_LENGTH" && continue
                string_contains "$a" "_ITEM" && {
-                   # special threatment for lists. use add_list and remove the
+                   # special treatment for lists. use add_list and remove the
                    # item index (_ITEMx).
                    uci add_list $2.${a//_ITEM[0-9]*/}="$b"
                } || {
index e937fe6048a84cb7a75442e0e1203f9302e0bebd..d4bc4c34e53e8d51f29d32ae56d01d7402315706 100644 (file)
@@ -131,7 +131,7 @@ If you call this function several times the dependencies will be linked with **"
 Adds an entry to the selection list
 
 #### property .widget = "select"
-**"select"** shows a selction list, **"radio"** shows a list of radio buttons inside form
+**"select"** shows a selection list, **"radio"** shows a list of radio buttons inside form
 
 #### property .default = nil
 The default value
@@ -194,7 +194,7 @@ If you call this function several times the dependencies will be linked with **"
 Adds an entry to the list
 
 #### property .widget = "checkbox"
-**"select"** shows a selction list, **"checkbox"** shows a list of checkboxes inside form
+**"select"** shows a selection list, **"checkbox"** shows a list of checkboxes inside form
 
 #### property .delimiter = " "
 The string which will be used to delimit the values inside stored option
index dc42c28ab76daeb06787071b71f9a76bb77120c1..adf019c01a792c1a7ac099086ef22ad13453416a 100644 (file)
@@ -1,7 +1,7 @@
 LuCI has a simple regex based template processor which parses HTML-files to Lua functions and allows to store precompiled template files.
 The simplest form of a template is just an ordinary HTML-file. It will be printed out to the user as is.
 
-In LuCI every template is an object with an own scope. It can therefore be instanciated and each instance can has a different scope. As every template processor. LuCI supports several special markups. Those are enclosed in `<% %>`-Tags.
+In LuCI every template is an object with an own scope. It can therefore be instantiated and each instance can has a different scope. As every template processor. LuCI supports several special markups. Those are enclosed in `<% %>`-Tags.
 
 By adding `-` (dash) right after the opening `<%` every whitespace before the markup will be stripped. Adding a `-` right before the closing `%>` will equivalently strip every whitespace behind the markup.
 
index 7751e2baf444cbdc429d31056fecfe18992b1f92..9c7f01aedf00732783c755ea510eabe0d193b4f9 100644 (file)
@@ -7,7 +7,7 @@ vice versa.
 module "luci.http.mime"
 
 ---[[
-MIME mapping table containg extension - mimetype relations.
+MIME mapping table containing extension - mimetype relations.
 
 @class table
 ]]
index b1ecae1453957408b117b5ea37beee9b1b9f1c47..a2df96cdb5c6c1fbbe161b40bcd683c4d7594cae 100644 (file)
@@ -283,7 +283,7 @@ Fetch all routes, optionally matching the given criteria.
 @sort 9
 @name routes
 @param filter  <p>Table containing one or more of the possible filter
-critera described below (optional)</p><table>
+criteria described below (optional)</p><table>
 <tr><th>Field</th><th>Description</th></tr>
 <tr><td>`family`</td><td>
  Number describing the address family to return - `4` selects
@@ -363,7 +363,7 @@ Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table
 @sort 10
 @name neighbors
 @param filter  <p>Table containing one or more of the possible filter
-critera described below (optional)</p><table>
+criteria described below (optional)</p><table>
 <tr><th>Field</th><th>Description</th></tr>
 <tr><td>`family`</td><td>
  Number describing the address family to return - `4` selects
@@ -652,7 +652,7 @@ are considered lower than MAC addresses</li>
 @class function
 @sort 10
 @name cidr.lower
-@param addr A `luci.ip.cidr` instance or a string convertable by
+@param addr A `luci.ip.cidr` instance or a string convertible by
        `luci.ip.new()` to compare against.
 @return `true` if this CIDR is lower than the given address,
        else `false`.
@@ -676,7 +676,7 @@ are considered lower than MAC addresses</li>
 @class function
 @sort 11
 @name cidr.higher
-@param addr A `luci.ip.cidr` instance or a string convertable by
+@param addr A `luci.ip.cidr` instance or a string convertible by
        `luci.ip.new()` to compare against.
 @return `true` if this CIDR is higher than the given address,
        else `false`.
@@ -696,7 +696,7 @@ Checks whether this CIDR instance is equal to the given argument.
 @class function
 @sort 12
 @name cidr.equal
-@param addr A `luci.ip.cidr` instance or a string convertable by
+@param addr A `luci.ip.cidr` instance or a string convertible by
        `luci.ip.new()` to compare against.
 @return `true` if this CIDR is equal to the given address,
        else `false`.
@@ -877,7 +877,7 @@ Test whether CIDR contains given range.
 @class function
 @sort 21
 @name cidr.contains
-@param addr A `luci.ip.cidr` instance or a string convertable by
+@param addr A `luci.ip.cidr` instance or a string convertible by
        `luci.ip.new()` to test.
 @return `true` if this instance fully contains the given address else
        `false`.
@@ -903,12 +903,12 @@ address space, the result is set to the highest possible address.
 @sort 22
 @name cidr.add
 @param amount A numeric value between 0 and 0xFFFFFFFF, a
-       `luci.ip.cidr` instance or a string convertable by
+       `luci.ip.cidr` instance or a string convertible by
        `luci.ip.new()`.
 @param inplace If `true`, modify this instance instead of returning
        a new derived CIDR instance.
 @return <ul>
-       <li>When adding inplace: Return `true` if the addition succeded
+       <li>When adding inplace: Return `true` if the addition succeeded
            or `false` when the addition overflowed.</li>
        <li>When deriving new CIDR: Return new instance representing the value of
         this instance plus the added amount or the highest possible address if
@@ -952,7 +952,7 @@ possible address is returned.
 @sort 23
 @name cidr.sub
 @param amount A numeric value between 0 and 0xFFFFFFFF, a
-       `luci.ip.cidr` instance or a string convertable by
+       `luci.ip.cidr` instance or a string convertible by
        `luci.ip.new()`.
 @param inplace If `true`, modify this instance instead of returning
        a new derived CIDR instance.
diff --git a/libs/luci-lib-iptparser/Makefile b/libs/luci-lib-iptparser/Makefile
new file mode 100644 (file)
index 0000000..06748ad
--- /dev/null
@@ -0,0 +1,14 @@
+#
+# Copyright (C) 2018 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=Iptables listing parser class
+LUCI_DEPENDS:=+luci-base
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/libs/luci-lib-iptparser/luasrc/sys/iptparser.lua b/libs/luci-lib-iptparser/luasrc/sys/iptparser.lua
new file mode 100644 (file)
index 0000000..7ff665e
--- /dev/null
@@ -0,0 +1,374 @@
+--[[
+
+Iptables parser and query library
+(c) 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
+(c) 2008-2009 Steven Barth <steven@midlink.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+
+]]--
+
+local luci  = {}
+luci.util   = require "luci.util"
+luci.sys    = require "luci.sys"
+luci.ip     = require "luci.ip"
+
+local pcall = pcall
+local io = require "io"
+local tonumber, ipairs, table = tonumber, ipairs, table
+
+module("luci.sys.iptparser")
+
+IptParser = luci.util.class()
+
+function IptParser.__init__( self, family )
+       self._family = (tonumber(family) == 6) and 6 or 4
+       self._rules  = { }
+       self._chains = { }
+       self._tables = { }
+
+       local t = self._tables
+       local s = self:_supported_tables(self._family)
+
+       if s.filter then t[#t+1] = "filter" end
+       if s.nat    then t[#t+1] = "nat"    end
+       if s.mangle then t[#t+1] = "mangle" end
+       if s.raw    then t[#t+1] = "raw"    end
+
+       if self._family == 4 then
+               self._nulladdr = "0.0.0.0/0"
+               self._command  = "iptables -t %s --line-numbers -nxvL"
+       else
+               self._nulladdr = "::/0"
+               self._command  = "ip6tables -t %s --line-numbers -nxvL"
+       end
+
+       self:_parse_rules()
+end
+
+function IptParser._supported_tables( self, family )
+       local tables = { }
+       local ok, lines = pcall(io.lines,
+               (family == 6) and "/proc/net/ip6_tables_names"
+                              or "/proc/net/ip_tables_names")
+
+       if ok and lines then
+               local line
+               for line in lines do
+                       tables[line] = true
+               end
+       end
+
+       return tables
+end
+
+-- search criteria as only argument. If args is nil or an empty table then all
+-- rules will be returned.
+--
+-- The following keys in the args table are recognized:
+-- <ul>
+--  <li> table          - Match rules that are located within the given table
+--  <li> chain          - Match rules that are located within the given chain
+--  <li> target                 - Match rules with the given target
+--  <li> protocol       - Match rules that match the given protocol, rules with
+--                                             protocol "all" are always matched
+--  <li> source                 - Match rules with the given source, rules with source
+--                                             "0.0.0.0/0" (::/0) are always matched
+--  <li> destination - Match rules with the given destination, rules with
+--                                             destination "0.0.0.0/0" (::/0) are always matched
+--  <li> inputif        - Match rules with the given input interface, rules
+--                                             with input      interface "*" (=all) are always matched
+--  <li> outputif       - Match rules with the given output interface, rules
+--                                             with output     interface "*" (=all) are always matched
+--  <li> flags          - Match rules that match the given flags, current
+--                                             supported values are "-f" (--fragment)
+--                                             and "!f" (! --fragment)
+--  <li> options        - Match rules containing all given options
+-- </ul>
+-- The return value is a list of tables representing the matched rules.
+-- Each rule table contains the following fields:
+-- <ul>
+--  <li> index          - The index number of the rule
+--  <li> table          - The table where the rule is located, can be one
+--                                             of "filter", "nat" or "mangle"
+--  <li> chain          - The chain where the rule is located, e.g. "INPUT"
+--                                             or "postrouting_wan"
+--  <li> target                 - The rule target, e.g. "REJECT" or "DROP"
+--  <li> protocol              The matching protocols, e.g. "all" or "tcp"
+--  <li> flags          - Special rule options ("--", "-f" or "!f")
+--  <li> inputif        - Input interface of the rule, e.g. "eth0.0"
+--                                             or "*" for all interfaces
+--  <li> outputif       - Output interface of the rule,e.g. "eth0.0"
+--                                             or "*" for all interfaces
+--  <li> source                 - The source ip range, e.g. "0.0.0.0/0" (::/0)
+--  <li> destination - The destination ip range, e.g. "0.0.0.0/0" (::/0)
+--  <li> options        - A list of specific options of the rule,
+--                                             e.g. { "reject-with", "tcp-reset" }
+--  <li> packets        - The number of packets matched by the rule
+--  <li> bytes          - The number of total bytes matched by the rule
+-- </ul>
+-- Example:
+-- <pre>
+-- ip = luci.sys.iptparser.IptParser()
+-- result = ip.find( {
+--     target="REJECT",
+--     protocol="tcp",
+--     options={ "reject-with", "tcp-reset" }
+-- } )
+-- </pre>
+-- This will match all rules with target "-j REJECT",
+-- protocol "-p tcp" (or "-p all")
+-- and the option "--reject-with tcp-reset".
+function IptParser.find( self, args )
+
+       local args = args or { }
+       local rv   = { }
+
+       args.source      = args.source      and self:_parse_addr(args.source)
+       args.destination = args.destination and self:_parse_addr(args.destination)
+
+       for i, rule in ipairs(self._rules) do
+               local match = true
+
+               -- match table
+               if not ( not args.table or args.table:lower() == rule.table ) then
+                       match = false
+               end
+
+               -- match chain
+               if not ( match == true and (
+                       not args.chain or args.chain == rule.chain
+               ) ) then
+                       match = false
+               end
+
+               -- match target
+               if not ( match == true and (
+                       not args.target or args.target == rule.target
+               ) ) then
+                       match = false
+               end
+
+               -- match protocol
+               if not ( match == true and (
+                       not args.protocol or rule.protocol == "all" or
+                       args.protocol:lower() == rule.protocol
+               ) ) then
+                       match = false
+               end
+
+               -- match source
+               if not ( match == true and (
+                       not args.source or rule.source == self._nulladdr or
+                       self:_parse_addr(rule.source):contains(args.source)
+               ) ) then
+                       match = false
+               end
+
+               -- match destination
+               if not ( match == true and (
+                       not args.destination or rule.destination == self._nulladdr or
+                       self:_parse_addr(rule.destination):contains(args.destination)
+               ) ) then
+                       match = false
+               end
+
+               -- match input interface
+               if not ( match == true and (
+                       not args.inputif or rule.inputif == "*" or
+                       args.inputif == rule.inputif
+               ) ) then
+                       match = false
+               end
+
+               -- match output interface
+               if not ( match == true and (
+                       not args.outputif or rule.outputif == "*" or
+                       args.outputif == rule.outputif
+               ) ) then
+                       match = false
+               end
+
+               -- match flags (the "opt" column)
+               if not ( match == true and (
+                       not args.flags or rule.flags == args.flags
+               ) ) then
+                       match = false
+               end
+
+               -- match specific options
+               if not ( match == true and (
+                       not args.options or
+                       self:_match_options( rule.options, args.options )
+               ) ) then
+                       match = false
+               end
+
+               -- insert match
+               if match == true then
+                       rv[#rv+1] = rule
+               end
+       end
+
+       return rv
+end
+
+
+-- through external commands.
+function IptParser.resync( self )
+       self._rules = { }
+       self._chain = nil
+       self:_parse_rules()
+end
+
+
+function IptParser.tables( self )
+       return self._tables
+end
+
+
+function IptParser.chains( self, table )
+       local lookup = { }
+       local chains = { }
+       for _, r in ipairs(self:find({table=table})) do
+               if not lookup[r.chain] then
+                       lookup[r.chain]   = true
+                       chains[#chains+1] = r.chain
+               end
+       end
+       return chains
+end
+
+
+--                             and "rules". The "rules" field is a table of rule tables.
+function IptParser.chain( self, table, chain )
+       return self._chains[table:lower()] and self._chains[table:lower()][chain]
+end
+
+
+function IptParser.is_custom_target( self, target )
+       for _, r in ipairs(self._rules) do
+               if r.chain == target then
+                       return true
+               end
+       end
+       return false
+end
+
+
+-- [internal] Parse address according to family.
+function IptParser._parse_addr( self, addr )
+       if self._family == 4 then
+               return luci.ip.IPv4(addr)
+       else
+               return luci.ip.IPv6(addr)
+       end
+end
+
+-- [internal] Parse iptables output from all tables.
+function IptParser._parse_rules( self )
+
+       for i, tbl in ipairs(self._tables) do
+
+               self._chains[tbl] = { }
+
+               for i, rule in ipairs(luci.util.execl(self._command % tbl)) do
+
+                       if rule:find( "^Chain " ) == 1 then
+
+                               local crefs
+                               local cname, cpol, cpkt, cbytes = rule:match(
+                                       "^Chain ([^%s]*) %(policy (%w+) " ..
+                                       "(%d+) packets, (%d+) bytes%)"
+                               )
+
+                               if not cname then
+                                       cname, crefs = rule:match(
+                                               "^Chain ([^%s]*) %((%d+) references%)"
+                                       )
+                               end
+
+                               self._chain = cname
+                               self._chains[tbl][cname] = {
+                                       policy     = cpol,
+                                       packets    = tonumber(cpkt or 0),
+                                       bytes      = tonumber(cbytes or 0),
+                                       references = tonumber(crefs or 0),
+                                       rules      = { }
+                               }
+
+                       else
+                               if rule:find("%d") == 1 then
+
+                                       local rule_parts   = luci.util.split( rule, "%s+", nil, true )
+                                       local rule_details = { }
+
+                                       -- cope with rules that have no target assigned
+                                       if rule:match("^%d+%s+%d+%s+%d+%s%s") then
+                                               table.insert(rule_parts, 4, nil)
+                                       end
+
+                                       -- ip6tables opt column is usually zero-width
+                                       if self._family == 6 then
+                                               table.insert(rule_parts, 6, "--")
+                                       end
+
+                                       rule_details["table"]       = tbl
+                                       rule_details["chain"]       = self._chain
+                                       rule_details["index"]       = tonumber(rule_parts[1])
+                                       rule_details["packets"]     = tonumber(rule_parts[2])
+                                       rule_details["bytes"]       = tonumber(rule_parts[3])
+                                       rule_details["target"]      = rule_parts[4]
+                                       rule_details["protocol"]    = rule_parts[5]
+                                       rule_details["flags"]       = rule_parts[6]
+                                       rule_details["inputif"]     = rule_parts[7]
+                                       rule_details["outputif"]    = rule_parts[8]
+                                       rule_details["source"]      = rule_parts[9]
+                                       rule_details["destination"] = rule_parts[10]
+                                       rule_details["options"]     = { }
+
+                                       for i = 11, #rule_parts  do
+                                               if #rule_parts[i] > 0 then
+                                                       rule_details["options"][i-10] = rule_parts[i]
+                                               end
+                                       end
+
+                                       self._rules[#self._rules+1] = rule_details
+
+                                       self._chains[tbl][self._chain].rules[
+                                               #self._chains[tbl][self._chain].rules + 1
+                                       ] = rule_details
+                               end
+                       end
+               end
+       end
+
+       self._chain = nil
+end
+
+
+-- [internal] Return true if optlist1 contains all elements of optlist 2.
+--            Return false in all other cases.
+function IptParser._match_options( self, o1, o2 )
+
+       -- construct a hashtable of first options list to speed up lookups
+       local oh = { }
+       for i, opt in ipairs( o1 ) do oh[opt] = true end
+
+       -- iterate over second options list
+       -- each string in o2 must be also present in o1
+       -- if o2 contains a string which is not found in o1 then return false
+       for i, opt in ipairs( o2 ) do
+               if not oh[opt] then
+                       return false
+               end
+       end
+
+       return true
+end
diff --git a/libs/luci-lib-iptparser/luasrc/sys/iptparser.luadoc b/libs/luci-lib-iptparser/luasrc/sys/iptparser.luadoc
new file mode 100644 (file)
index 0000000..071e7d5
--- /dev/null
@@ -0,0 +1,69 @@
+---[[
+LuCI iptables parser and query library
+
+@cstyle        instance
+]]
+module "luci.sys.iptparser"
+
+---[[
+Create a new iptables parser object.
+
+@class function
+@name  IptParser
+@param family  Number specifying the address family. 4 for IPv4, 6 for IPv6
+@return        IptParser instance
+]]
+
+---[[
+Find all firewall rules that match the given criteria. Expects a table with
+
+search criteria as only argument. If args is nil or an empty table then all
+rules will be returned.
+]]
+
+---[[
+Rebuild the internal lookup table, for example when rules have changed
+
+through external commands.
+@class function
+@name IptParser.resync
+@return        nothing
+]]
+
+---[[
+Find the names of all tables.
+
+@class function
+@name IptParser.tables
+@return                Table of table names.
+]]
+
+---[[
+Find the names of all chains within the given table name.
+
+@class function
+@name IptParser.chains
+@param table   String containing the table name
+@return                Table of chain names in the order they occur.
+]]
+
+---[[
+Return the given firewall chain within the given table name.
+
+@class function
+@name IptParser.chain
+@param table   String containing the table name
+@param chain   String containing the chain name
+@return                Table containing the fields "policy", "packets", "bytes"
+--                             and "rules". The "rules" field is a table of rule tables.
+]]
+
+---[[
+Test whether the given target points to a custom chain.
+
+@class function
+@name IptParser.is_custom_target
+@param target  String containing the target action
+@return                        Boolean indicating whether target is a custom chain.
+]]
+
index aa318414029fba691d90a98339ed8dde370aa1dd..8c9260317ba8ee32a9e40754d0e73aced7c7d067 100644 (file)
@@ -10,7 +10,7 @@ module "nixio.CHANGELOG"
 -- <li>Added support for x509 certificates in DER format.</li>
 -- <li>Added support for splice() in UnifiedIO.copyz().</li>
 -- <li>Added interface to inject chunks into UnifiedIO.linesource() buffer.</li>
--- <li>Changed TLS behaviour to explicitely separate servers and clients.</li>
+-- <li>Changed TLS behaviour to explicitly separate servers and clients.</li>
 -- <li>Fixed usage of signed datatype breaking Base64 decoding.</li>
 -- <li>Fixed namespace clashes for nixio.fs.</li>
 -- <li>Fixed splice() support for some exotic C libraries.</li>
index 9860cf0919595f365d346d38c90b9cecd8f330d6..d663b629ee061e31e0f1d30bc46a878e85bd975f 100644 (file)
@@ -18,7 +18,7 @@ module "nixio.README"
 -- table <strong>nixio.const_sock</strong> for socket error codes. This might
 -- be important if you are dealing with Windows applications, on POSIX however
 -- const_sock is just an alias for const.</li>
--- <li>With some exceptions - which are explicitely stated in the function
+-- <li>With some exceptions - which are explicitly stated in the function
 -- documentation - all blocking functions are signal-protected and will not fail
 -- with EINTR.</li>
 -- <li>On POSIX the SIGPIPE signal will be set to ignore upon initialization.
index 1a0d69a054510bad87e793fc180572cf4454fee2..56a4afbb88c2e2c7d7610ba43dce2efb2ea18f85 100644 (file)
@@ -59,7 +59,7 @@ module "nixio"
 -- <li>aliases = Table of alias names</li>
 -- </ul>
 
---- Get all or a specifc proto entry.
+--- Get all or a specific proto entry.
 -- @class function
 -- @name nixio.getproto
 -- @param proto                protocol number or name to lookup (optional)
index 8b7c12ff00d430402f33368c2b7bcd5636e79f22..d2a8ff42e1452b87f22179ac6d01aabc3121e1da 100644 (file)
@@ -720,7 +720,7 @@ cleanup:
 }
 
 /*
- * Helper for mpi substraction
+ * Helper for mpi subtraction
  */
 static void mpi_sub_hlp( int n, t_int *s, t_int *d )
 {
@@ -741,7 +741,7 @@ static void mpi_sub_hlp( int n, t_int *s, t_int *d )
 }
 
 /*
- * Unsigned substraction: X = |A| - |B|  (HAC 14.9)
+ * Unsigned subtraction: X = |A| - |B|  (HAC 14.9)
  */
 int mpi_sub_abs( mpi *X, mpi *A, mpi *B )
 {
@@ -809,7 +809,7 @@ cleanup:
 }
 
 /*
- * Signed substraction: X = A - B
+ * Signed subtraction: X = A - B
  */
 int mpi_sub_mpi( mpi *X, mpi *A, mpi *B )
 {
@@ -856,7 +856,7 @@ int mpi_add_int( mpi *X, mpi *A, int b )
 }
 
 /*
- * Signed substraction: X = A - b
+ * Signed subtraction: X = A - b
  */
 int mpi_sub_int( mpi *X, mpi *A, int b )
 {
index 173610c1a03b03b7756efec2b64707cd864705af..b9ebf35bae560767d2f13929f7c9c246deabb3a5 100644 (file)
@@ -19,7 +19,7 @@
  *  MA  02110-1301  USA
  */
 /*
- *  The ITU-T X.509 standard defines a certificat format for PKI.
+ *  The ITU-T X.509 standard defines a certificate format for PKI.
  *
  *  http://www.ietf.org/rfc/rfc2459.txt
  *  http://www.ietf.org/rfc/rfc3279.txt
@@ -68,7 +68,7 @@ static int asn1_eval_octet(unsigned int digit)
 }
 
 /*
- * write the asn.1 lenght form into p
+ * write the asn.1 length form into p
  */
 static int asn1_add_len(unsigned int size, x509_node *node)
 {
@@ -788,7 +788,7 @@ static int x509write_parse_names(x509_node *node, unsigned char *names)
                     R_len = len;
                 }
 
-                /* set tag poiner to begin */
+                /* set tag pointer to begin */
                 tag_sp = tag;
 
                 /* is at end? */
@@ -866,7 +866,7 @@ static int x509write_parse_names(x509_node *node, unsigned char *names)
 }
 
 /*
- * Copy raw data from orginal ca to node
+ * Copy raw data from original ca to node
  */
 static int x509write_copy_from_raw(x509_node *node, x509_buf *raw)
 {
index c6673033299a7b892b2b34d57f947dce44ffd520..cf443ea922870bf3ccfc45e61a771887d3572782 100644 (file)
@@ -272,7 +272,7 @@ int mpi_cmp_int( mpi *X, int z );
 int mpi_add_abs( mpi *X, mpi *A, mpi *B );
 
 /**
- * \brief          Unsigned substraction: X = |A| - |B|
+ * \brief          Unsigned subtraction: X = |A| - |B|
  *
  * \return         0 if successful,
  *                 POLARSSL_ERR_MPI_NEGATIVE_VALUE if B is greater than A
@@ -288,7 +288,7 @@ int mpi_sub_abs( mpi *X, mpi *A, mpi *B );
 int mpi_add_mpi( mpi *X, mpi *A, mpi *B );
 
 /**
- * \brief          Signed substraction: X = A - B
+ * \brief          Signed subtraction: X = A - B
  *
  * \return         0 if successful,
  *                 1 if memory allocation failed
@@ -304,7 +304,7 @@ int mpi_sub_mpi( mpi *X, mpi *A, mpi *B );
 int mpi_add_int( mpi *X, mpi *A, int b );
 
 /**
- * \brief          Signed substraction: X = A - b
+ * \brief          Signed subtraction: X = A - b
  *
  * \return         0 if successful,
  *                 1 if memory allocation failed
index 908a1dbf51f71158f06a0647bae517e9712e94b5..6c9ef99a8ac3657582c5ca9fc16776cfdd004891 100644 (file)
@@ -375,7 +375,7 @@ int x509write_add_pubkey( x509_raw *chain, rsa_context *pubkey );
  *                 the string parse.
  *
  * \param chain    points to the raw certificate data
- * \param names    a string that can hold (separete with ";"):
+ * \param names    a string that can hold (separate with ";"):
  *                     CN=CommonName
  *                 --   O=Organization
  *                 --  OU=OrgUnit
@@ -402,7 +402,7 @@ int x509write_add_customize ( x509_raw *crt,
 * \brief          Add x509 issuer field
 *
 * \param chain    points to the raw certificate data
-* \param issuer   a string holding (separete with ";"):
+* \param issuer   a string holding (separate with ";"):
 *                     CN=CommonName
 *                 --   O=Organization
 *                 --  OU=OrgUnit
@@ -419,7 +419,7 @@ int x509write_add_issuer( x509_raw *crt, unsigned char *issuer);
  * \brief          Add x509 subject field
  *
  * \param chain    points to the raw certificate data
- * \param subject  a string holding (separete with ";"):
+ * \param subject  a string holding (separate with ";"):
  *                     CN=CommonName
  *                 --   O=Organization
  *                 --  OU=OrgUnit
index fcfc5069426685da91362906040a31533765f8e7..70255c0b588204ee9a53be25f26777734d38fe7a 100644 (file)
@@ -511,20 +511,19 @@ function cbi_d_update() {
                if (node && node.parentNode && !cbi_d_check(entry.deps)) {
                        node.parentNode.removeChild(node);
                        state = true;
-               } else if (parent && (!node || !node.parentNode) && cbi_d_check(entry.deps)) {
+               }
+               else if (parent && (!node || !node.parentNode) && cbi_d_check(entry.deps)) {
                        var next = undefined;
 
                        for (next = parent.firstChild; next; next = next.nextSibling) {
-                               if (next.getAttribute && parseInt(next.getAttribute('data-index'), 10) > entry.index) {
+                               if (next.getAttribute && parseInt(next.getAttribute('data-index'), 10) > entry.index)
                                        break;
-                               }
                        }
 
-                       if (!next) {
+                       if (!next)
                                parent.appendChild(entry.node);
-                       } else {
+                       else
                                parent.insertBefore(entry.node, next);
-                       }
 
                        state = true;
                }
@@ -539,9 +538,8 @@ function cbi_d_update() {
                        cbi_tag_last(parent);
        }
 
-       if (state) {
+       if (state)
                cbi_d_update();
-       }
 }
 
 function cbi_init() {
@@ -565,9 +563,8 @@ function cbi_init() {
                var index = parseInt(node.getAttribute('data-index'), 10);
                var depends = JSON.parse(node.getAttribute('data-depends'));
                if (!isNaN(index) && depends.length > 0) {
-                       for (var alt = 0; alt < depends.length; alt++) {
+                       for (var alt = 0; alt < depends.length; alt++)
                                cbi_d_add(node, depends[alt], index);
-                       }
                }
        }
 
@@ -575,9 +572,8 @@ function cbi_init() {
 
        for (var i = 0, node; (node = nodes[i]) !== undefined; i++) {
                var events = node.getAttribute('data-update').split(' ');
-               for (var j = 0, event; (event = events[j]) !== undefined; j++) {
+               for (var j = 0, event; (event = events[j]) !== undefined; j++)
                        cbi_bind(node, event, cbi_d_update);
-               }
        }
 
        nodes = document.querySelectorAll('[data-choices]');
@@ -670,13 +666,13 @@ function cbi_combobox(id, values, def, man, focus) {
        var sel = document.createElement("select");
                sel.id = selid;
                sel.index = obj.index;
-               sel.className = obj.className.replace(/cbi-input-text/, 'cbi-input-select');
+               sel.classList.remove('cbi-input-text');
+               sel.classList.add('cbi-input-select');
 
-       if (obj.nextSibling) {
+       if (obj.nextSibling)
                obj.parentNode.insertBefore(sel, obj.nextSibling);
-       } else {
+       else
                obj.parentNode.appendChild(sel);
-       }
 
        var dt = obj.getAttribute('cbi_datatype');
        var op = obj.getAttribute('cbi_optional');
@@ -687,7 +683,8 @@ function cbi_combobox(id, values, def, man, focus) {
                        optdef.value = "";
                        optdef.appendChild(document.createTextNode(typeof(def) === 'string' ? def : cbi_strings.label.choose));
                        sel.appendChild(optdef);
-               } else {
+               }
+               else {
                        var opt = document.createElement("option");
                        opt.value = obj.value;
                        opt.selected = "selected";
@@ -700,9 +697,8 @@ function cbi_combobox(id, values, def, man, focus) {
                var opt = document.createElement("option");
                opt.value = i;
 
-               if (obj.value == i) {
+               if (obj.value == i)
                        opt.selected = "selected";
-               }
 
                opt.appendChild(document.createTextNode(values[i]));
                sel.appendChild(opt);
@@ -724,7 +720,8 @@ function cbi_combobox(id, values, def, man, focus) {
                        sel.blur();
                        sel.parentNode.removeChild(sel);
                        obj.focus();
-               } else {
+               }
+               else {
                        obj.value = sel.options[sel.selectedIndex].value;
                }
 
@@ -788,35 +785,30 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
        {
                values = [ ];
 
-               while (parent.firstChild)
-               {
+               while (parent.firstChild) {
                        var n = parent.firstChild;
                        var i = +n.index;
 
-                       if (i != del)
-                       {
-                               if (n.nodeName.toLowerCase() == 'input')
+                       if (i != del) {
+                               if (matchesElem(n, 'input'))
                                        values.push(n.value || '');
-                               else if (n.nodeName.toLowerCase() == 'select')
+                               else if (matchesElem(n, 'select'))
                                        values[values.length-1] = n.options[n.selectedIndex].value;
                        }
 
                        parent.removeChild(n);
                }
 
-               if (add >= 0)
-               {
+               if (add >= 0) {
                        focus = add+1;
                        values.splice(focus, 0, '');
                }
-               else if (values.length == 0)
-               {
+               else if (values.length == 0) {
                        focus = 0;
                        values.push('');
                }
 
-               for (var i = 0; i < values.length; i++)
-               {
+               for (var i = 0; i < values.length; i++) {
                        var t = document.createElement('input');
                                t.id = prefix + '.' + (i+1);
                                t.name = prefix;
@@ -826,9 +818,7 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
                                t.className = 'cbi-input-text';
 
                        if (i == 0 && holder)
-                       {
                                t.placeholder = holder;
-                       }
 
                        var b = E('div', {
                                class: 'cbi-button cbi-button-' + ((i+1) < values.length ? 'remove' : 'add')
@@ -836,20 +826,16 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
 
                        parent.appendChild(t);
                        parent.appendChild(b);
+
                        if (datatype == 'file')
-                       {
                                cbi_browser_init(t.id, null, parent.getAttribute('data-browser-path'));
-                       }
 
                        parent.appendChild(document.createElement('br'));
 
                        if (datatype)
-                       {
                                cbi_validate_field(t.id, ((i+1) == values.length) || optional, datatype);
-                       }
 
-                       if (choices)
-                       {
+                       if (choices) {
                                cbi_combobox_init(t.id, choices, '', cbi_strings.label.custom);
                                b.index = i;
 
@@ -859,17 +845,14 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
                                if (i == focus || -i == focus)
                                        b.focus();
                        }
-                       else
-                       {
+                       else {
                                cbi_bind(t, 'keydown',  cbi_dynlist_keydown);
                                cbi_bind(t, 'keypress', cbi_dynlist_keypress);
 
-                               if (i == focus)
-                               {
+                               if (i == focus) {
                                        t.focus();
                                }
-                               else if (-i == focus)
-                               {
+                               else if (-i == focus) {
                                        t.focus();
 
                                        /* force cursor to end */
@@ -892,13 +875,11 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
                if (se.nodeType == 3)
                        se = se.parentNode;
 
-               switch (ev.keyCode)
-               {
+               switch (ev.keyCode) {
                        /* backspace, delete */
                        case 8:
                        case 46:
-                               if (se.value.length == 0)
-                               {
+                               if (se.value.length == 0) {
                                        if (ev.preventDefault)
                                                ev.preventDefault();
 
@@ -941,16 +922,14 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
                if (next && next.nextSibling.name == prefix)
                        next = next.nextSibling;
 
-               switch (ev.keyCode)
-               {
+               switch (ev.keyCode) {
                        /* backspace, delete */
                        case 8:
                        case 46:
-                               var del = (se.nodeName.toLowerCase() == 'select')
+                               var del = (matchesElem(se, 'select'))
                                        ? true : (se.value.length == 0);
 
-                               if (del)
-                               {
+                               if (del) {
                                        if (ev.preventDefault)
                                                ev.preventDefault();
 
@@ -994,9 +973,8 @@ function cbi_dynlist_init(parent, datatype, optional, choices)
 
                var se = ev.target ? ev.target : ev.srcElement;
                var input = se.previousSibling;
-               while (input && input.name != prefix) {
+               while (input && input.name != prefix)
                        input = input.previousSibling;
-               }
 
                if (se.classList.contains('cbi-button-remove')) {
                        input.value = '';
@@ -1024,39 +1002,45 @@ function cbi_t_add(section, tab) {
        var t = document.getElementById('tab.' + section + '.' + tab);
        var c = document.getElementById('container.' + section + '.' + tab);
 
-       if( t && c ) {
+       if (t && c) {
                cbi_t[section] = (cbi_t[section] || [ ]);
                cbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id };
        }
 }
 
 function cbi_t_switch(section, tab) {
-       if( cbi_t[section] && cbi_t[section][tab] ) {
+       if (cbi_t[section] && cbi_t[section][tab]) {
                var o = cbi_t[section][tab];
                var h = document.getElementById('tab.' + section);
-               for( var tid in cbi_t[section] ) {
+
+               for (var tid in cbi_t[section]) {
                        var o2 = cbi_t[section][tid];
-                       if( o.tab.id != o2.tab.id ) {
-                               o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, " cbi-tab-disabled ");
+
+                       if (o.tab.id != o2.tab.id) {
+                               o2.tab.classList.remove('cbi-tab');
+                               o2.tab.classList.add('cbi-tab-disabled');
                                o2.container.style.display = 'none';
                        }
                        else {
-                               if(h) h.value = tab;
-                               o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, " cbi-tab ");
+                               if(h)
+                                       h.value = tab;
+
+                               o2.tab.classList.remove('cbi-tab-disabled');
+                               o2.tab.classList.add('cbi-tab');
                                o2.container.style.display = 'block';
                        }
                }
        }
-       return false
+
+       return false;
 }
 
 function cbi_t_update() {
        var hl_tabs = [ ];
        var updated = false;
 
-       for( var sid in cbi_t )
-               for( var tid in cbi_t[sid] )
-               {
+       for (var sid in cbi_t)
+               for (var tid in cbi_t[sid]) {
                        var t = cbi_t[sid][tid].tab;
                        var c = cbi_t[sid][tid].container;
 
@@ -1065,7 +1049,7 @@ function cbi_t_update() {
                        }
                        else if (t.style.display == 'none') {
                                t.style.display = '';
-                               t.className += ' cbi-tab-highlighted';
+                               t.classList.add('cbi-tab-highlighted');
                                hl_tabs.push(t);
                        }
 
@@ -1075,8 +1059,8 @@ function cbi_t_update() {
 
        if (hl_tabs.length > 0)
                window.setTimeout(function() {
-                       for( var i = 0; i < hl_tabs.length; i++ )
-                               hl_tabs[i].className = hl_tabs[i].className.replace(/ cbi-tab-highlighted/g, '');
+                       for (var i = 0; i < hl_tabs.length; i++)
+                               hl_tabs[i].classList.remove('cbi-tab-highlighted');
                }, 750);
 
        return updated;
@@ -1086,16 +1070,14 @@ function cbi_t_update() {
 function cbi_validate_form(form, errmsg)
 {
        /* if triggered by a section removal or addition, don't validate */
-       if( form.cbi_state == 'add-section' || form.cbi_state == 'del-section' )
+       if (form.cbi_state == 'add-section' || form.cbi_state == 'del-section')
                return true;
 
-       if( form.cbi_validators )
-       {
-               for( var i = 0; i < form.cbi_validators.length; i++ )
-               {
+       if (form.cbi_validators) {
+               for (var i = 0; i < form.cbi_validators.length; i++) {
                        var validator = form.cbi_validators[i];
-                       if( !validator() && errmsg )
-                       {
+
+                       if (!validator() && errmsg) {
                                alert(errmsg);
                                return false;
                        }
@@ -1123,10 +1105,8 @@ function cbi_validate_compile(code)
 
        code += ',';
 
-       for (var i = 0; i < code.length; i++)
-       {
-               if (esc)
-               {
+       for (var i = 0; i < code.length; i++) {
+               if (esc) {
                        esc = false;
                        continue;
                }
@@ -1139,41 +1119,36 @@ function cbi_validate_compile(code)
 
                case 40:
                case 44:
-                       if (depth <= 0)
-                       {
-                               if (pos < i)
-                               {
+                       if (depth <= 0) {
+                               if (pos < i) {
                                        var label = code.substring(pos, i);
                                                label = label.replace(/\\(.)/g, '$1');
                                                label = label.replace(/^[ \t]+/g, '');
                                                label = label.replace(/[ \t]+$/g, '');
 
-                                       if (label && !isNaN(label))
-                                       {
+                                       if (label && !isNaN(label)) {
                                                stack.push(parseFloat(label));
                                        }
-                                       else if (label.match(/^(['"]).*\1$/))
-                                       {
+                                       else if (label.match(/^(['"]).*\1$/)) {
                                                stack.push(label.replace(/^(['"])(.*)\1$/, '$2'));
                                        }
-                                       else if (typeof cbi_validators[label] == 'function')
-                                       {
+                                       else if (typeof cbi_validators[label] == 'function') {
                                                stack.push(cbi_validators[label]);
                                                stack.push(null);
                                        }
-                                       else
-                                       {
+                                       else {
                                                throw "Syntax error, unhandled token '"+label+"'";
                                        }
                                }
+
                                pos = i+1;
                        }
+
                        depth += (code.charCodeAt(i) == 40);
                        break;
 
                case 41:
-                       if (--depth <= 0)
-                       {
+                       if (--depth <= 0) {
                                if (typeof stack[stack.length-2] != 'function')
                                        throw "Syntax error, argument list follows non-function";
 
@@ -1182,6 +1157,7 @@ function cbi_validate_compile(code)
 
                                pos = i+1;
                        }
+
                        break;
                }
        }
@@ -1194,23 +1170,20 @@ function cbi_validate_field(cbid, optional, type)
        var field = (typeof cbid == "string") ? document.getElementById(cbid) : cbid;
        var vstack; try { vstack = cbi_validate_compile(type); } catch(e) { };
 
-       if (field && vstack && typeof vstack[0] == "function")
-       {
+       if (field && vstack && typeof vstack[0] == "function") {
                var validator = function()
                {
                        // is not detached
-                       if( field.form )
-                       {
-                               field.className = field.className.replace(/ cbi-input-invalid/g, '');
+                       if (field.form) {
+                               field.classList.remove('cbi-input-invalid');
 
                                // validate value
                                var value = (field.options && field.options.selectedIndex > -1)
                                        ? field.options[field.options.selectedIndex].value : field.value;
 
-                               if (!(((value.length == 0) && optional) || vstack[0].apply(value, vstack[1])))
-                               {
+                               if (!(((value.length == 0) && optional) || vstack[0].apply(value, vstack[1]))) {
                                        // invalid
-                                       field.className += ' cbi-input-invalid';
+                                       field.classList.add('cbi-input-invalid');
                                        return false;
                                }
                        }
@@ -1218,7 +1191,7 @@ function cbi_validate_field(cbid, optional, type)
                        return true;
                };
 
-               if( ! field.form.cbi_validators )
+               if (!field.form.cbi_validators)
                        field.form.cbi_validators = [ ];
 
                field.form.cbi_validators.push(validator);
@@ -1226,8 +1199,7 @@ function cbi_validate_field(cbid, optional, type)
                cbi_bind(field, "blur",  validator);
                cbi_bind(field, "keyup", validator);
 
-               if (field.nodeName == 'SELECT')
-               {
+               if (matchesElem(field, 'select')) {
                        cbi_bind(field, "change", validator);
                        cbi_bind(field, "click",  validator);
                }
@@ -1291,7 +1263,8 @@ function cbi_row_swap(elem, up, store)
                input.value = ids.join(' ');
 
        window.scrollTo(0, tr.offsetTop);
-       window.setTimeout(function() { tr.classList.add('flash'); }, 1);
+       void tr.offsetWidth;
+       tr.classList.add('flash');
 
        return false;
 }
@@ -1300,20 +1273,16 @@ function cbi_tag_last(container)
 {
        var last;
 
-       for (var i = 0; i < container.childNodes.length; i++)
-       {
+       for (var i = 0; i < container.childNodes.length; i++) {
                var c = container.childNodes[i];
-               if (c.nodeType == 1 && c.nodeName.toLowerCase() == 'div')
-               {
-                       c.className = c.className.replace(/ cbi-value-last$/, '');
+               if (matchesElem(c, 'div')) {
+                       c.classList.remove('cbi-value-last');
                        last = c;
                }
        }
 
        if (last)
-       {
-               last.className += ' cbi-value-last';
-       }
+               last.classList.add('cbi-value-last');
 }
 
 function cbi_submit(elem, name, value, action)
@@ -1350,8 +1319,9 @@ String.prototype.format = function()
                if (typeof(s) !== 'string' && !(s instanceof String))
                        return '';
 
-               for( var i = 0; i < r.length; i += 2 )
+               for (var i = 0; i < r.length; i += 2)
                        s = s.replace(r[i], r[i+1]);
+
                return s;
        }
 
@@ -1360,22 +1330,18 @@ String.prototype.format = function()
        var re = /^(([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X|q|h|j|t|m))/;
        var a = b = [], numSubstitutions = 0, numMatches = 0;
 
-       while (a = re.exec(str))
-       {
+       while (a = re.exec(str)) {
                var m = a[1];
                var leftpart = a[2], pPad = a[3], pJustify = a[4], pMinLength = a[5];
                var pPrecision = a[6], pType = a[7];
 
                numMatches++;
 
-               if (pType == '%')
-               {
+               if (pType == '%') {
                        subst = '%';
                }
-               else
-               {
-                       if (numSubstitutions < arguments.length)
-                       {
+               else {
+                       if (numSubstitutions < arguments.length) {
                                var param = arguments[numSubstitutions++];
 
                                var pad = '';
@@ -1400,8 +1366,7 @@ String.prototype.format = function()
 
                                var subst = param;
 
-                               switch(pType)
-                               {
+                               switch(pType) {
                                        case 'b':
                                                subst = (+param || 0).toString(2);
                                                break;
@@ -1517,16 +1482,20 @@ String.prototype.nobr = function()
 String.format = function()
 {
        var a = [ ];
+
        for (var i = 1; i < arguments.length; i++)
                a.push(arguments[i]);
+
        return ''.format.apply(arguments[0], a);
 }
 
 String.nobr = function()
 {
        var a = [ ];
+
        for (var i = 1; i < arguments.length; i++)
                a.push(arguments[i]);
+
        return ''.nobr.apply(arguments[0], a);
 }
 
@@ -1569,12 +1538,16 @@ function toElem(s)
        return elem || null;
 }
 
+function matchesElem(node, selector)
+{
+       return ((node.matches && node.matches(selector)) ||
+               (node.msMatchesSelector && node.msMatchesSelector(selector)));
+}
+
 function findParent(node, selector)
 {
        while (node)
-               if (node.msMatchesSelector && node.msMatchesSelector(selector))
-                       return node;
-               else if (node.matches && node.matches(selector))
+               if (matchesElem(node, selector))
                        return node;
                else
                        node = node.parentNode;
@@ -1813,7 +1786,7 @@ CBIDropdown = {
                        return;
 
                document.querySelectorAll('.focus').forEach(function(e) {
-                       if (e.nodeName.toLowerCase() !== 'input') {
+                       if (!matchesElem(e, 'input')) {
                                e.classList.remove('focus');
                                e.blur();
                        }
@@ -1952,7 +1925,7 @@ function cbi_dropdown_init(sb) {
 
        sb.addEventListener('click', function(ev) {
                if (!this.hasAttribute('open')) {
-                       if (ev.target.nodeName.toLowerCase() !== 'input')
+                       if (!matchesElem(ev.target, 'input'))
                                sbox.openDropdown(this);
                }
                else {
@@ -1966,7 +1939,7 @@ function cbi_dropdown_init(sb) {
        });
 
        sb.addEventListener('keydown', function(ev) {
-               if (ev.target.nodeName.toLowerCase() === 'input')
+               if (matchesElem(ev.target, 'input'))
                        return;
 
                if (!this.hasAttribute('open')) {
@@ -2062,8 +2035,12 @@ function cbi_dropdown_init(sb) {
                create.addEventListener('keydown', function(ev) {
                        switch (ev.keyCode) {
                        case 13:
-                               sbox.createItems(sb, this.value);
                                ev.preventDefault();
+
+                               if (this.classList.contains('cbi-input-invalid'))
+                                       return;
+
+                               sbox.createItems(sb, this.value);
                                this.value = '';
                                this.blur();
                                break;
index ddf534b3e1e8f140b7a0f37f1eadbb29d93a586f..f26256953a4a1433916b5149ebb33d4d829a0b19 100644 (file)
@@ -22,7 +22,7 @@ Check whether a dispatch node shall be visible
 ]]
 
 ---[[
-Return a sorted table of visible childs within a given node
+Return a sorted table of visible children within a given node
 
 @class function
 @name node_childs
index f4ede4b8a5771ea3b7eacb301993f09d1ddee912..20b55f2854ff3304de29748131472a1419c66f4c 100644 (file)
@@ -335,13 +335,13 @@ end
 -- Content-Type. Stores all extracted data associated with its parameter name
 -- in the params table within the given message object. Multiple parameter
 -- values are stored as tables, ordinary ones as strings.
--- If an optional file callback function is given then it is feeded with the
+-- If an optional file callback function is given then it is fed with the
 -- file contents chunk by chunk and only the extracted file name is stored
 -- within the params table. The callback function will be called subsequently
 -- with three arguments:
 --  o Table containing decoded (name, file) and raw (headers) mime header data
 --  o String value containing a chunk of the file data
---  o Boolean which indicates wheather the current chunk is the last one (eof)
+--  o Boolean which indicates whether the current chunk is the last one (eof)
 function mimedecode_message_body(src, msg, file_cb)
        local parser, header, field
        local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil)
index f8121230b60642c7eae9148f964d378f59acb927..8f6f380d8bda091324f242b9c137cd6ff4f6ce9d 100644 (file)
@@ -204,13 +204,13 @@ Stores all extracted data associated with its parameter name
 in the params table within the given message object. Multiple parameter
 values are stored as tables, ordinary ones as strings.
 
-If an optional file callback function is given then it is feeded with the
+If an optional file callback function is given then it is fed with the
 file contents chunk by chunk and only the extracted file name is stored
 within the params table. The callback function will be called subsequently
 with three arguments:
  o Table containing decoded (name, file) and raw (headers) mime header data
  o String value containing a chunk of the file data
- o Boolean which indicates wheather the current chunk is the last one (eof)
+ o Boolean which indicates whether the current chunk is the last one (eof)
 
 @class                 function
 @name                  mimedecode_message_body
index 2119a210bb9884cf4e312a1ec181732c17dac5c0..a50e28a871c1351aecb5c7407571954a7305eb94 100644 (file)
@@ -15,7 +15,7 @@ local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
 -- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
 -- save the changes to the staging area via Cursor.save and finally
 -- Cursor.commit the data to the actual config files.
--- LuCI then needs to Cursor.apply the changes so deamons etc. are
+-- LuCI then needs to Cursor.apply the changes so daemons etc. are
 -- reloaded.
 module "luci.model.uci"
 
index d798b00338a5585f6afd36dee81f67d54c084773..0189d49aa1f5f2839533cfd018d459ae11b90ab2 100644 (file)
@@ -5,7 +5,7 @@ The typical workflow for UCI is:  Get a cursor instance from the
 cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
 save the changes to the staging area via Cursor.save and finally
 Cursor.commit the data to the actual config files.
-LuCI then needs to Cursor.apply the changes so deamons etc. are
+LuCI then needs to Cursor.apply the changes so daemons etc. are
 reloaded.
 @cstyle        instance
 ]]
@@ -172,7 +172,7 @@ has the same effect as deleting the option.
 ---[[
 Create a sub-state of this cursor.
 
-The sub-state is tied to the parent curser, means it the parent unloads or
+The sub-state is tied to the parent cursor, means it the parent unloads or
 loads configs, the sub state will do so as well.
 
 @class                         function
@@ -339,7 +339,7 @@ Set the configuration directory.
 ]]
 
 ---[[
-Set the directory for uncommited changes.
+Set the directory for uncommitted changes.
 
 @class                         function
 @name                          Cursor.set_savedir
index 1c1fa92602f38d5e62f1bc181dceaea0b6f7e7f6..3c7f69c6e9ecf40af11ddef78e6c8b59faed025a 100644 (file)
@@ -18,7 +18,7 @@ Execute a given shell command and capture its standard output
 @class         function
 @name          exec
 @param command Command to call
-@return                        String containg the return the output of the command
+@return                        String containing the return the output of the command
 ]]
 
 ---[[
@@ -38,7 +38,7 @@ exists.
 @class         function
 @name          getenv
 @param var     Name of the environment variable to retrieve (optional)
-@return                String containg the value of the specified variable
+@return                String containing the value of the specified variable
 @return                Table containing all variables if no variable name is given
 ]]
 
@@ -279,7 +279,7 @@ LuCI system utilities / user related functions.
 ]]
 
 ---[[
-Retrieve user informations for given uid.
+Retrieve user information for given uid.
 
 @class         function
 @name          getuser
@@ -305,7 +305,7 @@ Test whether given string matches the password of a given system user.
 @name user.checkpasswd
 @param username        String containing the Unix user name
 @param pass            String containing the password to compare
-@return                        Boolean indicating wheather the passwords are equal
+@return                        Boolean indicating whether the passwords are equal
 ]]
 
 ---[[
diff --git a/modules/luci-base/luasrc/sys/iptparser.lua b/modules/luci-base/luasrc/sys/iptparser.lua
deleted file mode 100644 (file)
index 7ff665e..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
---[[
-
-Iptables parser and query library
-(c) 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
-(c) 2008-2009 Steven Barth <steven@midlink.org>
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-$Id$
-
-]]--
-
-local luci  = {}
-luci.util   = require "luci.util"
-luci.sys    = require "luci.sys"
-luci.ip     = require "luci.ip"
-
-local pcall = pcall
-local io = require "io"
-local tonumber, ipairs, table = tonumber, ipairs, table
-
-module("luci.sys.iptparser")
-
-IptParser = luci.util.class()
-
-function IptParser.__init__( self, family )
-       self._family = (tonumber(family) == 6) and 6 or 4
-       self._rules  = { }
-       self._chains = { }
-       self._tables = { }
-
-       local t = self._tables
-       local s = self:_supported_tables(self._family)
-
-       if s.filter then t[#t+1] = "filter" end
-       if s.nat    then t[#t+1] = "nat"    end
-       if s.mangle then t[#t+1] = "mangle" end
-       if s.raw    then t[#t+1] = "raw"    end
-
-       if self._family == 4 then
-               self._nulladdr = "0.0.0.0/0"
-               self._command  = "iptables -t %s --line-numbers -nxvL"
-       else
-               self._nulladdr = "::/0"
-               self._command  = "ip6tables -t %s --line-numbers -nxvL"
-       end
-
-       self:_parse_rules()
-end
-
-function IptParser._supported_tables( self, family )
-       local tables = { }
-       local ok, lines = pcall(io.lines,
-               (family == 6) and "/proc/net/ip6_tables_names"
-                              or "/proc/net/ip_tables_names")
-
-       if ok and lines then
-               local line
-               for line in lines do
-                       tables[line] = true
-               end
-       end
-
-       return tables
-end
-
--- search criteria as only argument. If args is nil or an empty table then all
--- rules will be returned.
---
--- The following keys in the args table are recognized:
--- <ul>
---  <li> table          - Match rules that are located within the given table
---  <li> chain          - Match rules that are located within the given chain
---  <li> target                 - Match rules with the given target
---  <li> protocol       - Match rules that match the given protocol, rules with
---                                             protocol "all" are always matched
---  <li> source                 - Match rules with the given source, rules with source
---                                             "0.0.0.0/0" (::/0) are always matched
---  <li> destination - Match rules with the given destination, rules with
---                                             destination "0.0.0.0/0" (::/0) are always matched
---  <li> inputif        - Match rules with the given input interface, rules
---                                             with input      interface "*" (=all) are always matched
---  <li> outputif       - Match rules with the given output interface, rules
---                                             with output     interface "*" (=all) are always matched
---  <li> flags          - Match rules that match the given flags, current
---                                             supported values are "-f" (--fragment)
---                                             and "!f" (! --fragment)
---  <li> options        - Match rules containing all given options
--- </ul>
--- The return value is a list of tables representing the matched rules.
--- Each rule table contains the following fields:
--- <ul>
---  <li> index          - The index number of the rule
---  <li> table          - The table where the rule is located, can be one
---                                             of "filter", "nat" or "mangle"
---  <li> chain          - The chain where the rule is located, e.g. "INPUT"
---                                             or "postrouting_wan"
---  <li> target                 - The rule target, e.g. "REJECT" or "DROP"
---  <li> protocol              The matching protocols, e.g. "all" or "tcp"
---  <li> flags          - Special rule options ("--", "-f" or "!f")
---  <li> inputif        - Input interface of the rule, e.g. "eth0.0"
---                                             or "*" for all interfaces
---  <li> outputif       - Output interface of the rule,e.g. "eth0.0"
---                                             or "*" for all interfaces
---  <li> source                 - The source ip range, e.g. "0.0.0.0/0" (::/0)
---  <li> destination - The destination ip range, e.g. "0.0.0.0/0" (::/0)
---  <li> options        - A list of specific options of the rule,
---                                             e.g. { "reject-with", "tcp-reset" }
---  <li> packets        - The number of packets matched by the rule
---  <li> bytes          - The number of total bytes matched by the rule
--- </ul>
--- Example:
--- <pre>
--- ip = luci.sys.iptparser.IptParser()
--- result = ip.find( {
---     target="REJECT",
---     protocol="tcp",
---     options={ "reject-with", "tcp-reset" }
--- } )
--- </pre>
--- This will match all rules with target "-j REJECT",
--- protocol "-p tcp" (or "-p all")
--- and the option "--reject-with tcp-reset".
-function IptParser.find( self, args )
-
-       local args = args or { }
-       local rv   = { }
-
-       args.source      = args.source      and self:_parse_addr(args.source)
-       args.destination = args.destination and self:_parse_addr(args.destination)
-
-       for i, rule in ipairs(self._rules) do
-               local match = true
-
-               -- match table
-               if not ( not args.table or args.table:lower() == rule.table ) then
-                       match = false
-               end
-
-               -- match chain
-               if not ( match == true and (
-                       not args.chain or args.chain == rule.chain
-               ) ) then
-                       match = false
-               end
-
-               -- match target
-               if not ( match == true and (
-                       not args.target or args.target == rule.target
-               ) ) then
-                       match = false
-               end
-
-               -- match protocol
-               if not ( match == true and (
-                       not args.protocol or rule.protocol == "all" or
-                       args.protocol:lower() == rule.protocol
-               ) ) then
-                       match = false
-               end
-
-               -- match source
-               if not ( match == true and (
-                       not args.source or rule.source == self._nulladdr or
-                       self:_parse_addr(rule.source):contains(args.source)
-               ) ) then
-                       match = false
-               end
-
-               -- match destination
-               if not ( match == true and (
-                       not args.destination or rule.destination == self._nulladdr or
-                       self:_parse_addr(rule.destination):contains(args.destination)
-               ) ) then
-                       match = false
-               end
-
-               -- match input interface
-               if not ( match == true and (
-                       not args.inputif or rule.inputif == "*" or
-                       args.inputif == rule.inputif
-               ) ) then
-                       match = false
-               end
-
-               -- match output interface
-               if not ( match == true and (
-                       not args.outputif or rule.outputif == "*" or
-                       args.outputif == rule.outputif
-               ) ) then
-                       match = false
-               end
-
-               -- match flags (the "opt" column)
-               if not ( match == true and (
-                       not args.flags or rule.flags == args.flags
-               ) ) then
-                       match = false
-               end
-
-               -- match specific options
-               if not ( match == true and (
-                       not args.options or
-                       self:_match_options( rule.options, args.options )
-               ) ) then
-                       match = false
-               end
-
-               -- insert match
-               if match == true then
-                       rv[#rv+1] = rule
-               end
-       end
-
-       return rv
-end
-
-
--- through external commands.
-function IptParser.resync( self )
-       self._rules = { }
-       self._chain = nil
-       self:_parse_rules()
-end
-
-
-function IptParser.tables( self )
-       return self._tables
-end
-
-
-function IptParser.chains( self, table )
-       local lookup = { }
-       local chains = { }
-       for _, r in ipairs(self:find({table=table})) do
-               if not lookup[r.chain] then
-                       lookup[r.chain]   = true
-                       chains[#chains+1] = r.chain
-               end
-       end
-       return chains
-end
-
-
---                             and "rules". The "rules" field is a table of rule tables.
-function IptParser.chain( self, table, chain )
-       return self._chains[table:lower()] and self._chains[table:lower()][chain]
-end
-
-
-function IptParser.is_custom_target( self, target )
-       for _, r in ipairs(self._rules) do
-               if r.chain == target then
-                       return true
-               end
-       end
-       return false
-end
-
-
--- [internal] Parse address according to family.
-function IptParser._parse_addr( self, addr )
-       if self._family == 4 then
-               return luci.ip.IPv4(addr)
-       else
-               return luci.ip.IPv6(addr)
-       end
-end
-
--- [internal] Parse iptables output from all tables.
-function IptParser._parse_rules( self )
-
-       for i, tbl in ipairs(self._tables) do
-
-               self._chains[tbl] = { }
-
-               for i, rule in ipairs(luci.util.execl(self._command % tbl)) do
-
-                       if rule:find( "^Chain " ) == 1 then
-
-                               local crefs
-                               local cname, cpol, cpkt, cbytes = rule:match(
-                                       "^Chain ([^%s]*) %(policy (%w+) " ..
-                                       "(%d+) packets, (%d+) bytes%)"
-                               )
-
-                               if not cname then
-                                       cname, crefs = rule:match(
-                                               "^Chain ([^%s]*) %((%d+) references%)"
-                                       )
-                               end
-
-                               self._chain = cname
-                               self._chains[tbl][cname] = {
-                                       policy     = cpol,
-                                       packets    = tonumber(cpkt or 0),
-                                       bytes      = tonumber(cbytes or 0),
-                                       references = tonumber(crefs or 0),
-                                       rules      = { }
-                               }
-
-                       else
-                               if rule:find("%d") == 1 then
-
-                                       local rule_parts   = luci.util.split( rule, "%s+", nil, true )
-                                       local rule_details = { }
-
-                                       -- cope with rules that have no target assigned
-                                       if rule:match("^%d+%s+%d+%s+%d+%s%s") then
-                                               table.insert(rule_parts, 4, nil)
-                                       end
-
-                                       -- ip6tables opt column is usually zero-width
-                                       if self._family == 6 then
-                                               table.insert(rule_parts, 6, "--")
-                                       end
-
-                                       rule_details["table"]       = tbl
-                                       rule_details["chain"]       = self._chain
-                                       rule_details["index"]       = tonumber(rule_parts[1])
-                                       rule_details["packets"]     = tonumber(rule_parts[2])
-                                       rule_details["bytes"]       = tonumber(rule_parts[3])
-                                       rule_details["target"]      = rule_parts[4]
-                                       rule_details["protocol"]    = rule_parts[5]
-                                       rule_details["flags"]       = rule_parts[6]
-                                       rule_details["inputif"]     = rule_parts[7]
-                                       rule_details["outputif"]    = rule_parts[8]
-                                       rule_details["source"]      = rule_parts[9]
-                                       rule_details["destination"] = rule_parts[10]
-                                       rule_details["options"]     = { }
-
-                                       for i = 11, #rule_parts  do
-                                               if #rule_parts[i] > 0 then
-                                                       rule_details["options"][i-10] = rule_parts[i]
-                                               end
-                                       end
-
-                                       self._rules[#self._rules+1] = rule_details
-
-                                       self._chains[tbl][self._chain].rules[
-                                               #self._chains[tbl][self._chain].rules + 1
-                                       ] = rule_details
-                               end
-                       end
-               end
-       end
-
-       self._chain = nil
-end
-
-
--- [internal] Return true if optlist1 contains all elements of optlist 2.
---            Return false in all other cases.
-function IptParser._match_options( self, o1, o2 )
-
-       -- construct a hashtable of first options list to speed up lookups
-       local oh = { }
-       for i, opt in ipairs( o1 ) do oh[opt] = true end
-
-       -- iterate over second options list
-       -- each string in o2 must be also present in o1
-       -- if o2 contains a string which is not found in o1 then return false
-       for i, opt in ipairs( o2 ) do
-               if not oh[opt] then
-                       return false
-               end
-       end
-
-       return true
-end
diff --git a/modules/luci-base/luasrc/sys/iptparser.luadoc b/modules/luci-base/luasrc/sys/iptparser.luadoc
deleted file mode 100644 (file)
index 071e7d5..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
----[[
-LuCI iptables parser and query library
-
-@cstyle        instance
-]]
-module "luci.sys.iptparser"
-
----[[
-Create a new iptables parser object.
-
-@class function
-@name  IptParser
-@param family  Number specifying the address family. 4 for IPv4, 6 for IPv6
-@return        IptParser instance
-]]
-
----[[
-Find all firewall rules that match the given criteria. Expects a table with
-
-search criteria as only argument. If args is nil or an empty table then all
-rules will be returned.
-]]
-
----[[
-Rebuild the internal lookup table, for example when rules have changed
-
-through external commands.
-@class function
-@name IptParser.resync
-@return        nothing
-]]
-
----[[
-Find the names of all tables.
-
-@class function
-@name IptParser.tables
-@return                Table of table names.
-]]
-
----[[
-Find the names of all chains within the given table name.
-
-@class function
-@name IptParser.chains
-@param table   String containing the table name
-@return                Table of chain names in the order they occur.
-]]
-
----[[
-Return the given firewall chain within the given table name.
-
-@class function
-@name IptParser.chain
-@param table   String containing the table name
-@param chain   String containing the chain name
-@return                Table containing the fields "policy", "packets", "bytes"
---                             and "rules". The "rules" field is a table of rule tables.
-]]
-
----[[
-Test whether the given target points to a custom chain.
-
-@class function
-@name IptParser.is_custom_target
-@param target  String containing the target action
-@return                        Boolean indicating whether target is a custom chain.
-]]
-
index 47cb901a5b46f7b0149233c5876e932a89184e06..a97d2b4d6073b545e34ad92edebf7807a596004a 100644 (file)
@@ -270,7 +270,7 @@ TZ = {
        { 'Asia/Oral', '<+05>-5' },
        { 'Asia/Phnom Penh', '<+07>-7' },
        { 'Asia/Pontianak', 'WIB-7' },
-       { 'Asia/Pyongyang', 'KST-8:30' },
+       { 'Asia/Pyongyang', 'KST-9' },
        { 'Asia/Qatar', '<+03>-3' },
        { 'Asia/Qyzylorda', '<+06>-6' },
        { 'Asia/Riyadh', '<+03>-3' },
@@ -358,7 +358,7 @@ TZ = {
        { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
        { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' },
        { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
-       { 'Europe/Dublin', 'GMT0IST,M3.5.0/1,M10.5.0' },
+       { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' },
        { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' },
        { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' },
        { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
index cf5afeb9d8ee59686e5d81c6dc00369d62aca1dc..20f57dc1b29d5e4f4ed08e6eef825e13c09878f3 100644 (file)
@@ -34,7 +34,7 @@ OFFSET = {
        idt   =  10800, -- IDT
        pkt   =  18000, -- PKT
        wita  =  28800, -- WITA
-       kst   =  30600, -- KST
+       kst   =  32400, -- KST
        jst   =  32400, -- JST
        acst  =  34200, -- ACST
        acdt  =  37800, -- ACDT
index f16b3afb2e236ef3489cb58b14ab9e1cf893c2d7..1a329f3f20eaec2dda2e097dd11af5a4cef0aebc 100644 (file)
@@ -262,7 +262,7 @@ end
 
 -- one token per invocation, the tokens are separated by whitespace. If the
 -- input value is a table, it is transformed into a string first. A nil value
--- will result in a valid interator which aborts with the first invocation.
+-- will result in a valid iterator which aborts with the first invocation.
 function imatch(v)
        if type(v) == "table" then
                local k = nil
index c4f28d039a635297e1b58704a025deeca76e3d72..4ec68dd1efc0ed356876d584e8dee1e5e0a67b77 100644 (file)
@@ -158,7 +158,7 @@ Return a matching iterator for the given value.
 
 The iterator will return one token per invocation, the tokens are separated by
 whitespace. If the input value is a table, it is transformed into a string first.
-A nil value will result in a valid interator which aborts with the first invocation.
+A nil value will result in a valid iterator which aborts with the first invocation.
 
 @class                         function
 @name                          imatch
@@ -289,7 +289,7 @@ will be stripped before it is returned.
 ]]
 
 ---[[
-Strips unnescessary lua bytecode from given string.
+Strips unnecessary lua bytecode from given string.
 
 Information like line numbers and debugging numbers will be discarded.
 Original version by Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
index b38e4b13dbd229a5267e44904260b3860fe87efe..dc251dbd94d11eda56bf290ba07b3baf831b319a 100644 (file)
@@ -63,7 +63,7 @@
                if empty then
        %>
                <label class="zonebadge zonebadge-empty">
-                       <strong><%=zone:forward():upper()%></strong>
+                       <strong><%=def:forward():upper()%></strong>
                </label>
        <% end %>
        </div>
index 3a108020b6062907cbcaddc2f10ae21ef80e5bde..c5addc0ddb499a690fcda33b5062fc09507d96d2 100644 (file)
@@ -98,7 +98,7 @@
                        <span class="zonebadge">
                                <em><%:create%>:</em>
                                <input type="password" style="display:none" />
-                               <input class="create-item-input" type="text" />
+                               <input class="create-item-input" type="text" data-type="and(uciname,maxlength(11))" data-optional="true" />
                        </span>
                </li>
                <% end %>
index 9c656cc7cee6284bbd71b8cc117c8c06b2fcb708..146d9fe05f2af05ec44a56d359609540a929c511 100644 (file)
@@ -696,6 +696,9 @@ msgstr "Aplegant dades..."
 msgid "Command"
 msgstr "Ordre"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configuració comuna"
 
@@ -1461,6 +1464,9 @@ msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
 "No mostris l'<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "Nom de màquina"
 
@@ -2201,9 +2207,6 @@ msgstr "Cap servidor DHCP configurat en aquesta interfície"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "No hi ha cadenes en aquesta taula"
-
 msgid "No files found"
 msgstr "Cap fitxer trobat"
 
@@ -2228,7 +2231,7 @@ msgstr "No hi ha llistes de paquets disponibles"
 msgid "No password set!"
 msgstr "No hi ha cap contrasenya establerta!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "No hi ha regles en aquesta cadena"
 
 msgid "No scan results available yet..."
@@ -2572,6 +2575,9 @@ msgstr "Paquets"
 msgid "Please enter your username and password."
 msgstr "Si us plau entra el teu nom d'usuari i contrasenya."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Política"
 
@@ -2910,6 +2916,9 @@ msgstr ""
 "Les rutes especifiquen per quina interfície i passarel·la es pot arribar a "
 "un cert ordinador o xarxa."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -3026,6 +3035,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Atura aquesta interfície"
 
@@ -4052,6 +4064,9 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Enrere"
 
+#~ msgid "No chains in this table"
+#~ msgstr "No hi ha cadenes en aquesta taula"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Es mantindran els fitxers de configuració."
 
index 89a1404184fc68c04737a4ce1dcc11455bf20cda..37cc6464714aaf6fc4b0cabf61b5536659a2164f 100644 (file)
@@ -690,6 +690,9 @@ msgstr "Probíhá sběr dat..."
 msgid "Command"
 msgstr "Příkaz"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Společná nastavení"
 
@@ -1459,6 +1462,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Skrývat <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2209,9 +2215,6 @@ msgstr "Pro toto rozhraní není nastaven žádný DHCP server"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Žádné řetězce v této tabulce"
-
 msgid "No files found"
 msgstr "Nebyly nalezeny žádné soubory"
 
@@ -2236,7 +2239,7 @@ msgstr "Seznam balíčků není k dispozici"
 msgid "No password set!"
 msgstr "Žádné heslo!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Žádná pravidla v tomto řetězci"
 
 msgid "No scan results available yet..."
@@ -2581,6 +2584,9 @@ msgstr "Paketů"
 msgid "Please enter your username and password."
 msgstr "Prosím vložte vaše uživatelské jméno a heslo."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Politika"
 
@@ -2924,6 +2930,9 @@ msgid ""
 msgstr ""
 "Trasy určují, přes jaké rozhraní a bránu může být konkrétního hosta dosaženo."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Spustit kontrolu souborového systému před připojením zařízení"
 
@@ -3042,6 +3051,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Ukázat aktuální seznam záložních souborů"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Shodit toho rozhraní"
 
@@ -4082,6 +4094,9 @@ msgstr "ano"
 msgid "« Back"
 msgstr "« Zpět"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Žádné řetězce v této tabulce"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Konfigurační soubory budou zachovány."
 
index 261085ace82cb83fa845763c9800a676262758ab..917cf97ab622d850d97f0b24c9fe54c7a0e76020 100644 (file)
@@ -714,6 +714,9 @@ msgstr "Sammle Daten..."
 msgid "Command"
 msgstr "Befehl"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Allgemeine Konfiguration"
 
@@ -1513,6 +1516,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "ESSID verstecken"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2289,9 +2295,6 @@ msgstr "Kein DHCP Server auf dieser Schnittstelle eingerichtet"
 msgid "No NAT-T"
 msgstr "Kein NAT-T"
 
-msgid "No chains in this table"
-msgstr "Keine Ketten in dieser Tabelle"
-
 msgid "No files found"
 msgstr "Keine Dateien gefunden"
 
@@ -2317,7 +2320,7 @@ msgstr "Es sind keine Paketlisten vorhanden"
 msgid "No password set!"
 msgstr "Kein Passwort gesetzt!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Keine Regeln in dieser Kette"
 
 msgid "No scan results available yet..."
@@ -2679,6 +2682,9 @@ msgstr "Pkte."
 msgid "Please enter your username and password."
 msgstr "Bitte Benutzernamen und Passwort eingeben."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Standardregel"
 
@@ -3038,6 +3044,9 @@ msgstr ""
 "Netzwerkrouten geben an, über welche Schnittstellen bestimmte Rechner oder "
 "Netzwerke erreicht werden können"
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Vor dem Einhängen Dateisystemprüfung starten "
 
@@ -3159,6 +3168,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Zeige aktuelle Liste der gesicherten Dateien"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Diese Schnittstelle herunterfahren"
 
@@ -4250,6 +4262,9 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Zurück"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Keine Ketten in dieser Tabelle"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Konfigurationsdateien sichern"
 
index bc9a08e3c7debb990cea576db7ea4b84c1cbdf77..a8aa561187a1b18c067ad10e69bb5727420c07ef 100644 (file)
@@ -699,6 +699,9 @@ msgstr "Συλλογή δεδομένων..."
 msgid "Command"
 msgstr "Εντολή"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Κοινή Παραμετροποίηση"
 
@@ -1472,6 +1475,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Κρυφό <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2217,9 +2223,6 @@ msgstr "Δεν υπάρχει ρυθμισμένος DHCP εξυπηρετητή
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Δεν υπάρχουν αλυσίδες σε αυτόν τον πίνακα"
-
 msgid "No files found"
 msgstr "Δε βρέθηκαν αρχεία"
 
@@ -2244,7 +2247,7 @@ msgstr "Δεν υπάρχουν διαθέσιμες λίστες πακέτων
 msgid "No password set!"
 msgstr "Δεν έχει οριστεί κωδικός πρόσβασης!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Δεν υπάρχει κανόνας σε αυτή την αλυσίδα"
 
 msgid "No scan results available yet..."
@@ -2588,6 +2591,9 @@ msgstr "Πκτ."
 msgid "Please enter your username and password."
 msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Πολιτική"
 
@@ -2928,6 +2934,9 @@ msgstr ""
 "Οι διαδρομές ορίζουν τη διεπαφή και πύλη από την οποία κάποιος υπολογιστής ή "
 "δίκτυο μπορεί να είναι προσβάσιμο/ς."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Εκτέλεση ελέγχου του συστήματος αρχείων πριν προσαρτηθεί η συσκευή"
 
@@ -3044,6 +3053,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Απενεργοποίηση αυτής της διεπαφής"
 
@@ -4047,6 +4059,9 @@ msgstr "ναι"
 msgid "« Back"
 msgstr "« Πίσω"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Δεν υπάρχουν αλυσίδες σε αυτόν τον πίνακα"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Τα αρχεία παραμετροποίησης θα διατηρηθούν."
 
index 9371f5180199285b05182603512dc8ec56169906..bc7bc1965d0cd8ca631d848e46634d76b8aa379d 100644 (file)
@@ -687,6 +687,9 @@ msgstr "Collecting data..."
 msgid "Command"
 msgstr "Command"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Common Configuration"
 
@@ -1448,6 +1451,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2185,9 +2191,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "No chains in this table"
-
 msgid "No files found"
 msgstr ""
 
@@ -2212,8 +2215,8 @@ msgstr ""
 msgid "No password set!"
 msgstr ""
 
-msgid "No rules in this chain"
-msgstr "No rules in this chain"
+msgid "No rules in this chain."
+msgstr "No rules in this chain."
 
 msgid "No scan results available yet..."
 msgstr ""
@@ -2556,6 +2559,9 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "Please enter your username and password."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Policy"
 
@@ -2894,6 +2900,9 @@ msgstr ""
 "Routes specify over which interface and gateway a certain host or network "
 "can be reached."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -3009,6 +3018,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
@@ -4004,6 +4016,9 @@ msgstr ""
 msgid "« Back"
 msgstr "« Back"
 
+#~ msgid "No chains in this table"
+#~ msgstr "No chains in this table"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Configuration files will be kept."
 
index a68c95a3a3a528802cd507c5cf543a7dc7b68d5e..23632fd57a2786631f90e1fbcdca050c167f1717 100644 (file)
@@ -696,6 +696,9 @@ msgstr "Un momento..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configuración común"
 
@@ -1468,6 +1471,9 @@ msgstr "Claves públicas SSH. Ponga una por línea."
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Ocultar <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2224,9 +2230,6 @@ msgstr "No se ha configurado un servidor DHCP para esta interfaz"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "No hay cadenas en esta tabla"
-
 msgid "No files found"
 msgstr "No se han encontrado ficheros"
 
@@ -2251,7 +2254,7 @@ msgstr "No hay listas de paquetes disponibles"
 msgid "No password set!"
 msgstr "¡Sin contraseña!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "No hay reglas en esta cadena"
 
 msgid "No scan results available yet..."
@@ -2596,6 +2599,9 @@ msgstr "Paq."
 msgid "Please enter your username and password."
 msgstr "Por favor, introduzca su nombre de usuario y contraseña."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Política"
 
@@ -2939,6 +2945,9 @@ msgstr ""
 "Las rutas especifican sobre qué interfaz y pasarela se puede llegar a una "
 "cierta máquina o red."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Comprobar el sistema de ficheros antes de montar el dispositivo"
 
@@ -3057,6 +3066,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Mostrar lista de ficheros a salvar"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Apagar esta interfaz"
 
@@ -4111,6 +4123,9 @@ msgstr "sí"
 msgid "« Back"
 msgstr "« Volver"
 
+#~ msgid "No chains in this table"
+#~ msgstr "No hay cadenas en esta tabla"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Se mantendrán los ficheros de configuración."
 
index dc0a0d098c2881d4bacef59db44466fc50761663..f96ecd389371ca2c382334c8bae8999f26048f78 100644 (file)
@@ -702,6 +702,9 @@ msgstr "Récupération de données..."
 msgid "Command"
 msgstr "Commande"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configuration commune"
 
@@ -1481,6 +1484,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Cacher le ESSID"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2237,9 +2243,6 @@ msgstr "Aucun serveur DHCP configuré sur cette interface"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Aucune chaîne dans cette table"
-
 msgid "No files found"
 msgstr "Aucun fichier trouvé"
 
@@ -2264,7 +2267,7 @@ msgstr "Aucune liste de paquets disponible"
 msgid "No password set!"
 msgstr "Pas de mot de passe positionné !"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Aucune règle dans cette chaîne"
 
 msgid "No scan results available yet..."
@@ -2608,6 +2611,9 @@ msgstr "Pqts."
 msgid "Please enter your username and password."
 msgstr "Saisissez votre nom d'utilisateur et mot de passe."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Politique"
 
@@ -2950,6 +2956,9 @@ msgstr ""
 "Avec les routes statiques vous pouvez spécifier à travers quelle interface "
 "ou passerelle un réseau peut être contacté."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Faire un vérification du système de fichiers avant de monter le périphérique"
@@ -3069,6 +3078,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Afficher la liste des fichiers de la sauvegarde actuelle"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Arrêter cet interface"
 
@@ -4128,6 +4140,9 @@ msgstr "oui"
 msgid "« Back"
 msgstr "« Retour"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Aucune chaîne dans cette table"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Les fichiers de configuration seront préservés."
 
index 0a6204aa87ca08cffcba5907171f947638b93be4..0b3acb89cc9da983301cb9ef1dfce7ed5bef5d63 100644 (file)
@@ -681,6 +681,9 @@ msgstr "אוסף מידע..."
 msgid "Command"
 msgstr "פקודה"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "הגדרות נפוצות"
 
@@ -1432,6 +1435,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2159,9 +2165,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr ""
-
 msgid "No files found"
 msgstr ""
 
@@ -2186,7 +2189,7 @@ msgstr "אין רשימת חבילות זמינה"
 msgid "No password set!"
 msgstr "לא הוגדרה סיסמה!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr ""
 
 msgid "No scan results available yet..."
@@ -2524,6 +2527,9 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr "אנא הזן את שם המשתמש והסיסמה שלך:"
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2858,6 +2864,9 @@ msgid ""
 "can be reached."
 msgstr ""
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2974,6 +2983,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
index 724d3ea48128d339c725ad6d28d78d155c4488f3..5a75deb7840c87b78573d5ea36e3b674f3b60c74 100644 (file)
@@ -697,6 +697,9 @@ msgstr "Adatok összegyűjtése..."
 msgid "Command"
 msgstr "Parancs"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Álatános beállítás"
 
@@ -1470,6 +1473,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr> elrejtése"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2226,9 +2232,6 @@ msgstr "Ehhez az interfészhez nincs DHCP kiszolgáló beállítva"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Ez a tábla nem tartalmaz láncokat."
-
 msgid "No files found"
 msgstr "Nem találhatók fájlok"
 
@@ -2253,7 +2256,7 @@ msgstr "Csomaglisták nem állnak rendelkezésre"
 msgid "No password set!"
 msgstr "Nincs jelszó!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Ez a lánc nem tartalmaz szabályokat"
 
 msgid "No scan results available yet..."
@@ -2598,6 +2601,9 @@ msgstr "csom."
 msgid "Please enter your username and password."
 msgstr "Adja meg a felhasználónevét és a jelszavát."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Szabály"
 
@@ -2942,6 +2948,9 @@ msgstr ""
 "Az útvonalak határozzák meg, hogy bizonyos gépek illetve hálózatok melyik "
 "interfészen keresztül érhetők el."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Fájlrendszer ellenőrzés futtatása az eszköz csatolása előtt"
 
@@ -3060,6 +3069,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Mentendő fájlok aktuális listájának megjelenítése"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Interfész leállítása"
 
@@ -4117,6 +4129,9 @@ msgstr "igen"
 msgid "« Back"
 msgstr "« Vissza"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Ez a tábla nem tartalmaz láncokat."
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "A konfigurációs fájlok megmaradnak."
 
index adb5c65b3ef6d1674d801e904187ef51749dec41..b81b9c875eead5d66e2096b334c32486df69b131 100644 (file)
@@ -703,6 +703,9 @@ msgstr "Raccolgo i dati..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configurazioni Comuni"
 
@@ -1475,6 +1478,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Nascondi <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2227,9 +2233,6 @@ msgstr "Nessun Server DHCP configurato per questa interfaccia"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr ""
-
 msgid "No files found"
 msgstr "Nessun file trovato"
 
@@ -2254,7 +2257,7 @@ msgstr "Nessuna lista pacchetti disponibile"
 msgid "No password set!"
 msgstr "Nessuna password immessa!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Nessuna regola in questa catena"
 
 msgid "No scan results available yet..."
@@ -2599,6 +2602,9 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr "Per favore inserisci il tuo username e la password."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2940,6 +2946,9 @@ msgstr ""
 "Le route specificano attraverso quale interfaccia e gateway un certo host o "
 "rete può essere raggiunto."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Esegui un controllo del filesystem prima di montare il dispositivo"
 
@@ -3055,6 +3064,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
index 122b285acc2b915eb814174e1506134086d51dec..f3847f64f1877b475d02164c3a73b0184a6e3e97 100644 (file)
@@ -705,6 +705,9 @@ msgstr "データ収集中です..."
 msgid "Command"
 msgstr "コマンド"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "一般設定"
 
@@ -1493,6 +1496,9 @@ msgstr "SSH公開鍵認証で使用するSSH公開鍵を1行づつペースト
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>の隠匿"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "ホスト"
 
@@ -2254,9 +2260,6 @@ msgstr "このインターフェースにはDHCPサーバーが設定されて
 msgid "No NAT-T"
 msgstr "NAT-Tを使用しない"
 
-msgid "No chains in this table"
-msgstr "チェイン内にルールがありません"
-
 msgid "No files found"
 msgstr "ファイルが見つかりませんでした"
 
@@ -2281,7 +2284,7 @@ msgstr "パッケージ リストがありません"
 msgid "No password set!"
 msgstr "パスワードが設定されていません!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "チェイン内にルールがありません"
 
 msgid "No scan results available yet..."
@@ -2633,6 +2636,9 @@ msgstr "パケット"
 msgid "Please enter your username and password."
 msgstr "ユーザー名とパスワードを入力してください。"
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "ポリシー"
 
@@ -2984,6 +2990,9 @@ msgstr ""
 "特定のホスト又はネットワークに、どのインターフェース及びゲートウェイを通して"
 "通信を行うか、経路情報を設定します。"
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "デバイスのマウントを行う前にファイルシステムチェックを行う"
 
@@ -3104,6 +3113,9 @@ msgstr "Short Preamble"
 msgid "Show current backup file list"
 msgstr "現在のバックアップファイルのリストを表示する"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "インターフェースを終了"
 
@@ -4163,3 +4175,6 @@ msgstr "はい"
 
 msgid "« Back"
 msgstr "« 戻る"
+
+#~ msgid "No chains in this table"
+#~ msgstr "チェイン内にルールがありません"
index fa22c23bb3b2c3664bf6da5ff2cef576a2c33073..2f94e495fa616ccdbb2da72967ed7a075eda5280 100644 (file)
@@ -683,6 +683,9 @@ msgstr "Data 를 수집중입니다..."
 msgid "Command"
 msgstr "명령어"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "공통 설정"
 
@@ -1447,6 +1450,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr> 숨기기"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "호스트"
 
@@ -2176,9 +2182,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "이 table 에는 정의된 chain 이 없음"
-
 msgid "No files found"
 msgstr ""
 
@@ -2203,7 +2206,7 @@ msgstr ""
 msgid "No password set!"
 msgstr "암호 설정을 해주세요!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr ""
 
 msgid "No scan results available yet..."
@@ -2549,6 +2552,9 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "사용자이름과 암호를 입력해 주세요."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2887,6 +2893,9 @@ msgstr ""
 "Route 경로는 특정 호스트 혹은 네트워크가 사용해야 할 인터페이스와 gateway 정"
 "보를 나타냅니다."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -3002,6 +3011,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "현재 백업 파일 목록 보기"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "이 인터페이스를 정지합니다"
 
@@ -4009,6 +4021,9 @@ msgstr ""
 msgid "« Back"
 msgstr ""
 
+#~ msgid "No chains in this table"
+#~ msgstr "이 table 에는 정의된 chain 이 없음"
+
 #~ msgid "Activate this network"
 #~ msgstr "이 네트워를 활성화합니다"
 
index 715c3100d107a43d3b550b631b8b36e6f493b269..42c020806bcb2ecf84ff32ce703b5b2d95f5ce2a 100644 (file)
@@ -666,6 +666,9 @@ msgstr ""
 msgid "Command"
 msgstr "Perintah"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr ""
 
@@ -1419,6 +1422,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Menyembunyikan ESSID"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2157,9 +2163,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Tiada rantai dalam jadual ini"
-
 msgid "No files found"
 msgstr ""
 
@@ -2184,7 +2187,7 @@ msgstr ""
 msgid "No password set!"
 msgstr ""
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Tidak ada peraturan dalam rantai ini"
 
 msgid "No scan results available yet..."
@@ -2527,6 +2530,9 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "Sila masukkan username dan kata laluan anda."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Dasar"
 
@@ -2864,6 +2870,9 @@ msgstr ""
 "Laluan menentukan di mana interface dan gateway host atau rangkaian tertentu "
 "yang boleh dicapai."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2979,6 +2988,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
@@ -3970,6 +3982,9 @@ msgstr ""
 msgid "« Back"
 msgstr "« Kembali"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Tiada rantai dalam jadual ini"
+
 #~ msgid "help"
 #~ msgstr "Membantu"
 
index 70ed34b42ce4e0067f198dfa149315603198667f..dd4094df642ceb742a25fb6deb61c2493eb12c42 100644 (file)
@@ -687,6 +687,9 @@ msgstr "Henter data..."
 msgid "Command"
 msgstr "Kommando"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Vanlige Innstillinger"
 
@@ -1456,6 +1459,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Skjul <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2201,9 +2207,6 @@ msgstr "Ingen DHCP server er konfigurert for dette grensesnittet"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Ingen lenker i denne tabellen"
-
 msgid "No files found"
 msgstr "Ingen filer funnet"
 
@@ -2228,7 +2231,7 @@ msgstr "Ingen pakkelister tilgjengelig"
 msgid "No password set!"
 msgstr "Ruteren er ikke passordbeskyttet!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Ingen regler i denne tabellen"
 
 msgid "No scan results available yet..."
@@ -2574,6 +2577,9 @@ msgstr "Pakker."
 msgid "Please enter your username and password."
 msgstr "Skriv inn ditt brukernavn og passord."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Policy"
 
@@ -2916,6 +2922,9 @@ msgstr ""
 "Ruter, angir hvilket nettverksgrensesnitt og hvilken gateway som brukes for "
 "å nå et gitt nettverk eller vert."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Kjør filsystem sjekk før montering av enheten"
 
@@ -3034,6 +3043,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Vis gjeldende liste med sikkerhetskopifiler"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Slå av dette grensesnittet"
 
@@ -4083,6 +4095,9 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Tilbake"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Ingen lenker i denne tabellen"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Konfigurasjonsfiler vil bli bevart."
 
index cf6ffccc57c1968eb44a72ee3309ab768bc90194..c811c1316a4fd771652cedf587885a6e4df00506 100644 (file)
@@ -712,6 +712,9 @@ msgstr "Zbieranie danych..."
 msgid "Command"
 msgstr "Polecenie"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Konfiguracja podstawowa"
 
@@ -1506,6 +1509,9 @@ msgstr ""
 "Ukryj <abbr title=\"Extended Service Set Identifier (Nazwę sieci)\">ESSID</"
 "abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2261,9 +2267,6 @@ msgstr "Brak skonfigurowanego serwera DHCP dla tego interfejsu"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Brak łańcuchów w tej tablicy"
-
 msgid "No files found"
 msgstr "Nie znaleziono plików"
 
@@ -2288,7 +2291,7 @@ msgstr "Lista pakietów nie jest dostępna"
 msgid "No password set!"
 msgstr "Nie ustawiono hasła!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Brak zasad w tym łańcuchu"
 
 msgid "No scan results available yet..."
@@ -2639,6 +2642,9 @@ msgstr "Pktw."
 msgid "Please enter your username and password."
 msgstr "Proszę wprowadź swój login i hasło."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Zasada"
 
@@ -2988,6 +2994,9 @@ msgstr ""
 "Ścieżki routingu pokazują routerowi przez który interfejs oraz którą bramę "
 "może skomunikować się z daną siecią lub komputerem."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Sprawdź czy system plików nie zawiera błędów przed zamontowaniem urządzenia"
@@ -3112,6 +3121,9 @@ msgstr "Krótki Wstęp"
 msgid "Show current backup file list"
 msgstr "Pokaż aktualną listę plików do backupu"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Wyłącz ten interfejs"
 
@@ -4182,6 +4194,9 @@ msgstr "tak"
 msgid "« Back"
 msgstr "« Wróć"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Brak łańcuchów w tej tablicy"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Pliki konfiguracyjne zostaną zachowane."
 
index 40440c12429d8153f7252f9c8a381249559047d5..42f9d505d83c589eece9a8a755153cc87b016f27 100644 (file)
@@ -744,6 +744,9 @@ msgstr "Coletando dados..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configuração Comum"
 
@@ -1570,6 +1573,9 @@ msgstr ""
 "Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos"
 "\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "Equipamento"
 
@@ -2361,9 +2367,6 @@ msgstr "Nenhum Servidor DHCP configurado para esta interface"
 msgid "No NAT-T"
 msgstr "Sem NAT-T"
 
-msgid "No chains in this table"
-msgstr "Nenhuma cadeira nesta tabela"
-
 msgid "No files found"
 msgstr "Nenhum arquivo encontrado"
 
@@ -2388,7 +2391,7 @@ msgstr "Nenhuma lista de pacotes disponível"
 msgid "No password set!"
 msgstr "Nenhuma senha definida!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Sem regras nesta cadeia"
 
 msgid "No scan results available yet..."
@@ -2755,6 +2758,9 @@ msgstr "Pcts."
 msgid "Please enter your username and password."
 msgstr "Entre com o seu usuário e senha."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Política"
 
@@ -3116,6 +3122,9 @@ msgstr ""
 "As rotas especificam através de qual interface e roteador um certo destino "
 "podem ser alcançado."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Execute a verificação do sistema de arquivos antes da montagem do dispositivo"
@@ -3244,6 +3253,9 @@ msgstr "Preâmbulo curto"
 msgid "Show current backup file list"
 msgstr "Mostra a lista atual de arquivos para a cópia de segurança"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Desligar esta interface"
 
@@ -4342,6 +4354,9 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Nenhuma cadeira nesta tabela"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Os arquivos de configuração serão mantidos."
 
index e967b066814678f6654a717198e3b21f47aab219..394572c631eafbbd8931736d5c0f2d5cfb7503f9 100644 (file)
@@ -700,6 +700,9 @@ msgstr "A obter dados..."
 msgid "Command"
 msgstr "Comando"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configuração comum"
 
@@ -1477,6 +1480,9 @@ msgstr ""
 "Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos"
 "\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2225,9 +2231,6 @@ msgstr "Sem Servidor DHCP configurado nesta interface"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Tabela sem chains"
-
 msgid "No files found"
 msgstr "Não foram encontrados ficheiros"
 
@@ -2252,7 +2255,7 @@ msgstr "Não há listas de pacotes disponiveis"
 msgid "No password set!"
 msgstr "Sem password definida!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Sem regras nesta cadeia"
 
 msgid "No scan results available yet..."
@@ -2596,6 +2599,9 @@ msgstr "Pkts."
 msgid "Please enter your username and password."
 msgstr "Insira o seu username e password."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Política"
 
@@ -2936,6 +2942,9 @@ msgstr ""
 "As rotas especificam através de que interfaces ou gateways podem ser "
 "alcançados determinadas redes ou hosts."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 "Correr uma verificação do sistema de ficheiros antes de montar um dispositivo"
@@ -3053,6 +3062,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "Mostrar lista ficheiros para backup"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Desligar esta interface"
 
@@ -4079,6 +4091,9 @@ msgstr "sim"
 msgid "« Back"
 msgstr "« Voltar"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Tabela sem chains"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Os ficheiros de configuração serão mantidos."
 
index 6a0bcf130e1179089c40ea28111a66c3feee9617..e3bb7bb82ac321853d2125c3dea18abfe75eff38 100644 (file)
@@ -676,6 +676,9 @@ msgstr "Colectez datele.."
 msgid "Command"
 msgstr "Comanda"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Configurarea obisnuita"
 
@@ -1426,6 +1429,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Ascunde <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2156,9 +2162,6 @@ msgstr "Nici un server DHCP configurat pentru aceasta interfata"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr ""
-
 msgid "No files found"
 msgstr "Nici un fisier gasit"
 
@@ -2183,7 +2186,7 @@ msgstr ""
 msgid "No password set!"
 msgstr "Nici o parola setata !"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr ""
 
 msgid "No scan results available yet..."
@@ -2521,6 +2524,9 @@ msgstr "Packete."
 msgid "Please enter your username and password."
 msgstr "Introdu utilizatorul si parola."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2857,6 +2863,9 @@ msgid ""
 "can be reached."
 msgstr ""
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2973,6 +2982,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Opreste aceasta interfata"
 
index bcee9876b35c1fa742c38435812ff85e219a8ce6..32ce4653256369d25fa7ee0e80e94cebc423c9ed 100644 (file)
@@ -727,6 +727,9 @@ msgstr "Сбор данных..."
 msgid "Command"
 msgstr "Команда"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Общие настройки"
 
@@ -1521,6 +1524,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Скрыть <abbr title=\"Расширенный идентификатор сети\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "Хост"
 
@@ -2292,9 +2298,6 @@ msgstr "DHCP-сервер не настроен для этого интерфе
 msgid "No NAT-T"
 msgstr "Без NAT-T"
 
-msgid "No chains in this table"
-msgstr "Нет цепочек в этой таблице"
-
 msgid "No files found"
 msgstr "Файлы не найдены"
 
@@ -2319,7 +2322,7 @@ msgstr "Список пакетов не доступен"
 msgid "No password set!"
 msgstr "Пароль не установлен!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Нет правил в данной цепочке"
 
 msgid "No scan results available yet..."
@@ -2681,6 +2684,9 @@ msgstr "Пакетов"
 msgid "Please enter your username and password."
 msgstr "Введите логин и пароль."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Политика"
 
@@ -3042,6 +3048,9 @@ msgstr ""
 "Маршрутизация служит для определения через, какой интерфейс и шлюз можно "
 "достичь определенного хоста или сети."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Проверять файловую систему перед монтированием раздела."
 
@@ -3163,6 +3172,9 @@ msgstr "Короткая преамбула"
 msgid "Show current backup file list"
 msgstr "Показать текущий список файлов резервной копии"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Выключить этот интерфейс"
 
@@ -4243,6 +4255,9 @@ msgstr "да"
 msgid "« Back"
 msgstr "« Назад"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Нет цепочек в этой таблице"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Config файлы будут сохранены."
 
index a0b0464b23ba9f12a06ed0cd4fa94bb65f7d74c7..c944c85ec91c065a8e7cd3d4649db0ebf4902b3d 100644 (file)
@@ -659,6 +659,9 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr ""
 
@@ -1404,6 +1407,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2131,9 +2137,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr ""
-
 msgid "No files found"
 msgstr ""
 
@@ -2158,7 +2161,7 @@ msgstr ""
 msgid "No password set!"
 msgstr ""
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr ""
 
 msgid "No scan results available yet..."
@@ -2496,6 +2499,9 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2830,6 +2836,9 @@ msgid ""
 "can be reached."
 msgstr ""
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2945,6 +2954,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
index fddaa3fd80509089ab0d35de7c344bd30fc64094..53f929c3f9536d267296fef09a28c431bfc0095c 100644 (file)
@@ -673,6 +673,9 @@ msgstr "Samlar in data..."
 msgid "Command"
 msgstr "Kommando"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Vanlig konfiguration"
 
@@ -1424,6 +1427,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Göm <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "Värd"
 
@@ -2152,9 +2158,6 @@ msgstr "Det finns ingen DHCP-server inställd för det här gränssnittet"
 msgid "No NAT-T"
 msgstr "Ingen NAT-T"
 
-msgid "No chains in this table"
-msgstr "Inga kedjor i den här tabellen"
-
 msgid "No files found"
 msgstr "Inga filer hittades"
 
@@ -2179,7 +2182,7 @@ msgstr "Ingen paketlista tillgänglig"
 msgid "No password set!"
 msgstr "Inget lösenord inställt!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Inga regler i den här kedjan"
 
 msgid "No scan results available yet..."
@@ -2517,6 +2520,9 @@ msgstr "Pkt."
 msgid "Please enter your username and password."
 msgstr "Vänligen ange ditt användarnamn och lösenord."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2853,6 +2859,9 @@ msgid ""
 "can be reached."
 msgstr ""
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Kör en filsystemskontroll innan enheten monteras"
 
@@ -2968,6 +2977,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Stäng ner det här gränssnittet"
 
@@ -3947,6 +3959,9 @@ msgstr "ja"
 msgid "« Back"
 msgstr "« Bakåt"
 
+#~ msgid "No chains in this table"
+#~ msgstr "Inga kedjor i den här tabellen"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "Konfigurationsfiler kommer att behållas."
 
index bc456385644bafeae6180b23c3de06f78cd11d91..3424eee5060814ee979123d460424ff18662b645 100644 (file)
@@ -652,6 +652,9 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr ""
 
@@ -1397,6 +1400,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2124,9 +2130,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr ""
-
 msgid "No files found"
 msgstr ""
 
@@ -2151,7 +2154,7 @@ msgstr ""
 msgid "No password set!"
 msgstr ""
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr ""
 
 msgid "No scan results available yet..."
@@ -2489,6 +2492,9 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2823,6 +2829,9 @@ msgid ""
 "can be reached."
 msgstr ""
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2938,6 +2947,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
index b84b0657bc0f5c34dc1b6b9cddde3936e80b7f92..769619f5d59a3a23e111aec0c8f871f8b50a8450 100644 (file)
@@ -675,6 +675,9 @@ msgstr ""
 msgid "Command"
 msgstr ""
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr ""
 
@@ -1422,6 +1425,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr ""
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2149,9 +2155,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr ""
-
 msgid "No files found"
 msgstr ""
 
@@ -2176,7 +2179,7 @@ msgstr ""
 msgid "No password set!"
 msgstr ""
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr ""
 
 msgid "No scan results available yet..."
@@ -2514,6 +2517,9 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr ""
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr ""
 
@@ -2848,6 +2854,9 @@ msgid ""
 "can be reached."
 msgstr ""
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Cihazı bağlamadan önce bir dosya sistemi kontrolü yapın"
 
@@ -2963,6 +2972,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
index 4dab4f6ba8d8c6ba42037c6c4b04c65738a35cba..070eaa324a3574d02e3756a6820720d1c825def1 100644 (file)
@@ -734,6 +734,9 @@ msgstr "Збирання даних..."
 msgid "Command"
 msgstr "Команда"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "Загальна конфігурація"
 
@@ -1536,6 +1539,9 @@ msgstr ""
 "Приховати <abbr title=\"Extended Service Set Identifier — ідентифікатор "
 "розширеної служби послуг\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "Вузол"
 
@@ -2318,9 +2324,6 @@ msgstr "Немає DHCP-сервера, налаштованого для цьо
 msgid "No NAT-T"
 msgstr "Немає NAT-T"
 
-msgid "No chains in this table"
-msgstr "У цій таблиці немає ланцюжків"
-
 msgid "No files found"
 msgstr "Файли не знайдено"
 
@@ -2345,7 +2348,7 @@ msgstr "Немає доступних списків пакетів"
 msgid "No password set!"
 msgstr "Пароль не встановлено!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "У цьму ланцюжку нема правил"
 
 msgid "No scan results available yet..."
@@ -2709,6 +2712,9 @@ msgstr "пакетів"
 msgid "Please enter your username and password."
 msgstr "Введіть ім’я користувача і пароль."
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Політика"
 
@@ -3061,6 +3067,9 @@ msgstr ""
 "Маршрути визначають через який інтерфейс і шлюз можна досягнути певного "
 "вузла або мережі."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "Виконати перевірку файлової системи перед монтуванням пристрою"
 
@@ -3183,6 +3192,9 @@ msgstr "Коротка преамбула"
 msgid "Show current backup file list"
 msgstr "Показати поточний список файлів резервного копіювання"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "Вимкнути цей інтерфейс"
 
@@ -4264,3 +4276,6 @@ msgstr "так"
 
 msgid "« Back"
 msgstr "« Назад"
+
+#~ msgid "No chains in this table"
+#~ msgstr "У цій таблиці немає ланцюжків"
index 3ad0a0bfefaf794a9ac7c6d2985dc0f8df8c6ff1..83566f27b126c4d272728c00827f6ec48da784f0 100644 (file)
@@ -666,6 +666,9 @@ msgstr ""
 msgid "Command"
 msgstr "Lệnh"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr ""
 
@@ -1424,6 +1427,9 @@ msgstr ""
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "Giấu <abbr title=\"Chế độ mở rộng đặt Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2161,9 +2167,6 @@ msgstr ""
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "Không có chuỗi trong bảng này"
-
 msgid "No files found"
 msgstr ""
 
@@ -2188,7 +2191,7 @@ msgstr ""
 msgid "No password set!"
 msgstr ""
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "Không có quy luật trong chuỗi này"
 
 msgid "No scan results available yet..."
@@ -2532,6 +2535,9 @@ msgstr ""
 msgid "Please enter your username and password."
 msgstr "Nhập tên và mật mã"
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "Chính sách"
 
@@ -2870,6 +2876,9 @@ msgstr ""
 "Routes chỉ định trên giao diện và cổng một host nhất định hay network được "
 "tiếp cận."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr ""
 
@@ -2985,6 +2994,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr ""
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr ""
 
@@ -3975,6 +3987,9 @@ msgstr ""
 msgid "« Back"
 msgstr ""
 
+#~ msgid "No chains in this table"
+#~ msgstr "Không có chuỗi trong bảng này"
+
 #~ msgid "Backup / Restore"
 #~ msgstr "Backup/ Restore"
 
index df8fd735ba41b93615ebfe897ba4158a0c8c4509..a0534db70e2c2d1f8ba2e1de957cf0c480870bd8 100644 (file)
@@ -677,6 +677,9 @@ msgstr "正在收集数据…"
 msgid "Command"
 msgstr "命令"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "一般配置"
 
@@ -1442,6 +1445,9 @@ msgstr "请在此处粘贴 SSH 公钥,每行一个,用于 SSH 公钥认证
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "隐藏 <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr "主机"
 
@@ -2185,9 +2191,6 @@ msgstr "本接口未配置 DHCP 服务器"
 msgid "No NAT-T"
 msgstr "无 NAT-T"
 
-msgid "No chains in this table"
-msgstr "本表中没有链"
-
 msgid "No files found"
 msgstr "未找到文件"
 
@@ -2212,7 +2215,7 @@ msgstr "无可用软件列表"
 msgid "No password set!"
 msgstr "未设置密码!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "本链没有规则"
 
 msgid "No scan results available yet..."
@@ -2560,6 +2563,9 @@ msgstr "数据包"
 msgid "Please enter your username and password."
 msgstr "请输入用户名和密码。"
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "策略"
 
@@ -2904,6 +2910,9 @@ msgid ""
 "can be reached."
 msgstr "路由表描述了数据包的可达路径。"
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "挂载设备前运行文件系统检查"
 
@@ -3021,6 +3030,9 @@ msgstr "Short Preamble"
 msgid "Show current backup file list"
 msgstr "显示当前备份文件列表"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "关闭此接口"
 
@@ -4036,6 +4048,9 @@ msgstr "是"
 msgid "« Back"
 msgstr "« 后退"
 
+#~ msgid "No chains in this table"
+#~ msgstr "本表中没有链"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "配置文件将被保留。"
 
index 8dac1b7744cc576a5e4f7adc6bc6d4b6fea837d9..c34e0fe7b02c513cd8a785e51bc361b8836f3d81 100644 (file)
@@ -675,6 +675,9 @@ msgstr "收集資料中..."
 msgid "Command"
 msgstr "指令"
 
+msgid "Comment"
+msgstr ""
+
 msgid "Common Configuration"
 msgstr "一般設定"
 
@@ -1433,6 +1436,9 @@ msgstr "在這裡貼上公用SSH-Keys (每行一個)以便驗證"
 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 msgstr "隱藏 <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
 
+msgid "Hide empty chains"
+msgstr ""
+
 msgid "Host"
 msgstr ""
 
@@ -2166,9 +2172,6 @@ msgstr "在這個介面尚無DHCP伺服器"
 msgid "No NAT-T"
 msgstr ""
 
-msgid "No chains in this table"
-msgstr "尚未綁在這個表格中"
-
 msgid "No files found"
 msgstr "尚未發現任何檔案"
 
@@ -2193,7 +2196,7 @@ msgstr "尚無列出的軟體包可運用"
 msgid "No password set!"
 msgstr "尚未設定密碼!"
 
-msgid "No rules in this chain"
+msgid "No rules in this chain."
 msgstr "尚無規則在這個鏈接上"
 
 msgid "No scan results available yet..."
@@ -2535,6 +2538,9 @@ msgstr "封包數."
 msgid "Please enter your username and password."
 msgstr "請輸入您的用戶名稱和密碼"
 
+msgid "Please update package lists first"
+msgstr ""
+
 msgid "Policy"
 msgstr "策略"
 
@@ -2873,6 +2879,9 @@ msgid ""
 "can be reached."
 msgstr "路由器指定介面導出到特定主機或者能夠到達的網路."
 
+msgid "Rule"
+msgstr ""
+
 msgid "Run a filesystem check before mounting the device"
 msgstr "掛載這個設備前先跑系統檢查"
 
@@ -2989,6 +2998,9 @@ msgstr ""
 msgid "Show current backup file list"
 msgstr "顯示現今的備份檔清單"
 
+msgid "Show empty chains"
+msgstr ""
+
 msgid "Shutdown this interface"
 msgstr "關閉這個介面"
 
@@ -4005,6 +4017,9 @@ msgstr "是的"
 msgid "« Back"
 msgstr "« 倒退"
 
+#~ msgid "No chains in this table"
+#~ msgstr "尚未綁在這個表格中"
+
 #~ msgid "Configuration files will be kept."
 #~ msgstr "設定檔將被存檔"
 
index 3979487f1276453ca32d06d26e8eb4de0584114b..0411932ce99ff9ac05914938eb549267d67fdfc0 100644 (file)
@@ -258,7 +258,7 @@ static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
                                break;
                }
 
-               /* advance beyound the last found valid continuation char */
+               /* advance beyond the last found valid continuation char */
                o = v;
                ptr += v;
        }
index 8be354b448c17a4c2a943b86c8e0661ab43fea85..bff859befa2337c3ff6a1d6f0ff26a2cac3ee230 100644 (file)
@@ -284,7 +284,7 @@ if not net:is_floating() then
        ifname_single = s:taboption("physical", Value, "ifname_single", translate("Interface"))
        ifname_single.template = "cbi/network_ifacelist"
        ifname_single.widget = "radio"
-       ifname_single.nobridges = true
+       ifname_single.nobridges = net:is_bridge()
        ifname_single.noaliases = false
        ifname_single.rmempty = false
        ifname_single.network = arg[1]
@@ -341,7 +341,7 @@ end
 if not net:is_virtual() then
        ifname_multi = s:taboption("physical", Value, "ifname_multi", translate("Interface"))
        ifname_multi.template = "cbi/network_ifacelist"
-       ifname_multi.nobridges = true
+       ifname_multi.nobridges = net:is_bridge()
        ifname_multi.noaliases = true
        ifname_multi.rmempty = false
        ifname_multi.network = arg[1]
index 4f04cce5456622e6a075a16b91e3b3361fb82070..5b496d83f2375e42e5808f1b9d78a9b94dd1908d 100644 (file)
@@ -8,6 +8,7 @@ function index()
        entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
 
        entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true
+       entry({"admin", "status", "iptables_dump"}, call("dump_iptables")).leaf = true
        entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true
 
        entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3)
@@ -44,6 +45,37 @@ function action_dmesg()
        luci.template.render("admin_status/dmesg", {dmesg=dmesg})
 end
 
+function dump_iptables(family, table)
+       local prefix = (family == "6") and "ip6" or "ip"
+       local ok, lines = pcall(io.lines, "/proc/net/%s_tables_names" % prefix)
+       if ok and lines then
+               local s
+               for s in lines do
+                       if s == table then
+                               local ipt = io.popen(
+                                       "/usr/sbin/%stables -t %s --line-numbers -nxvL"
+                                       %{ prefix, table })
+
+                               if ipt then
+                                       luci.http.prepare_content("text/plain")
+
+                                       while true do
+                                               s = ipt:read(1024)
+                                               if not s then break end
+                                               luci.http.write(s)
+                                       end
+
+                                       ipt:close()
+                                       return
+                               end
+                       end
+               end
+       end
+
+       luci.http.status(404, "No such table")
+       luci.http.prepare_content("text/plain")
+end
+
 function action_iptables()
        if luci.http.formvalue("zero") then
                if luci.http.formvalue("family") == "6" then
index 51e428e40e01a66402134c2bf0b60b3cab0e2467..50defac90eff7ed7afc8d6a670c91f9230140326 100644 (file)
@@ -1,16 +1,11 @@
 <%#
  Copyright 2008-2009 Steven Barth <steven@midlink.org>
- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io>
  Licensed to the public under the Apache License 2.0.
 -%>
 
 <%-
-
-       require "luci.sys.iptparser"
-       local wba = require "luci.tools.webadmin"
        local fs = require "nixio.fs"
-       local io = require "io"
-
        local has_ip6tables = fs.access("/usr/sbin/ip6tables")
        local mode = 4
 
                mode = luci.dispatcher.context.requestpath
            mode = tonumber(mode[#mode] ~= "iptables" and mode[#mode]) or 4
        end
+-%>
 
-       local ipt = luci.sys.iptparser.IptParser(mode)
+<%+header%>
 
-       local rowcnt = 1
-       function rowstyle()
-               rowcnt = rowcnt + 1
-               return (rowcnt % 2) + 1
-       end
+<style type="text/css">
+       span.jump, .cbi-tooltip-container {
+               border-bottom: 1px dotted blue;
+               cursor: pointer;
+       }
 
-       function link_target(t,c)
-               if ipt:is_custom_target(c) then
-                       return '<a href="#rule_%s_%s">%s</a>' %{ t:lower(), c, c }
-               end
-               return c
-       end
+       ul {
+               list-style: none;
+       }
+
+       .references {
+               position: relative;
+       }
+
+       .references .cbi-tooltip {
+               left: 0 !important;
+               top: 1.5em !important;
+       }
+
+       h4 > span {
+               font-size: 90%;
+       }
+</style>
+
+<script type="text/javascript">//<![CDATA[
+       var table_names = [ 'Filter', 'NAT', 'Mangle', 'Raw' ];
+
+       function create_table_section(table)
+       {
+               var idiv = document.getElementById('iptables'),
+                   tdiv = idiv.querySelector('[data-table="%s"]'.format(table)),
+                   title = '<%:Table%>: %s'.format(table);
+
+               if (!tdiv) {
+                       tdiv = E('div', { 'data-table': table }, [
+                               E('h3', {}, title),
+                               E('div')
+                       ]);
+
+                       if (idiv.firstElementChild.nodeName.toLowerCase() === 'p')
+                               idiv.removeChild(idiv.firstElementChild);
+
+                       var added = false, thisIdx = table_names.indexOf(table);
+
+                       idiv.querySelectorAll('[data-table]').forEach(function(child) {
+                               var childIdx = table_names.indexOf(child.getAttribute('data-table'));
+
+                               if (added === false && childIdx > thisIdx) {
+                                       idiv.insertBefore(tdiv, child);
+                                       added = true;
+                               }
+                       });
+
+                       if (added === false)
+                               idiv.appendChild(tdiv);
+               }
+
+               return tdiv.lastElementChild;
+       }
+
+       function create_chain_section(table, chain, policy, packets, bytes, references)
+       {
+               var tdiv = create_table_section(table),
+                   cdiv = tdiv.querySelector('[data-chain="%s"]'.format(chain)),
+                   title;
+
+               if (policy)
+                       title = '<%:Chain%> <em>%s</em> <span>(<%:Policy%>: <em>%s</em>, %d <%:Packets%>, %.2mB <%:Traffic%>)</span>'.format(chain, policy, packets, bytes);
+               else
+                       title = '<%:Chain%> <em>%s</em> <span class="references">(%d <%:References%>)</span>'.format(chain, references);
+
+               if (!cdiv) {
+                       cdiv = E('div', { 'data-chain': chain }, [
+                               E('h4', { 'id': 'rule_%s_%s'.format(table.toLowerCase(), chain) }, title),
+                               E('div', { 'class': 'table' }, [
+                                       E('div', { 'class': 'tr table-titles' }, [
+                                               E('div', { 'class': 'th center' }, '<%:Pkts.%>'),
+                                               E('div', { 'class': 'th center' }, '<%:Traffic%>'),
+                                               E('div', { 'class': 'th' }, '<%:Target%>'),
+                                               E('div', { 'class': 'th' }, '<%:Prot.%>'),
+                                               E('div', { 'class': 'th' }, '<%:In%>'),
+                                               E('div', { 'class': 'th' }, '<%:Out%>'),
+                                               E('div', { 'class': 'th' }, '<%:Source%>'),
+                                               E('div', { 'class': 'th' }, '<%:Destination%>'),
+                                               E('div', { 'class': 'th' }, '<%:Options%>'),
+                                               E('div', { 'class': 'th' }, '<%:Comment%>')
+                                       ])
+                               ])
+                       ]);
+
+                       tdiv.appendChild(cdiv);
+               }
+               else {
+                       cdiv.firstElementChild.innerHTML = title;
+               }
+
+               return cdiv.lastElementChild;
+       }
+
+       function update_chain_section(chaintable, rows)
+       {
+               if (!chaintable)
+                       return;
+
+               cbi_update_table(chaintable, rows, '<%:No rules in this chain.%>');
 
-       function link_iface(i)
-               local net = wba.iface_get_network(i)
-               if net and i ~= "lo" then
-                       return '<a href="%s">%s</a>' %{
-                               url("admin/network/network", net), i
+               if (rows.length === 0 &&
+                   document.querySelector('form > [data-hide-empty="true"]'))
+                       chaintable.parentNode.style.display = 'none';
+               else
+                       chaintable.parentNode.style.display = '';
+
+               chaintable.parentNode.setAttribute('data-empty', rows.length === 0);
+       }
+
+       function hide_empty(btn)
+       {
+               var hide = (btn.getAttribute('data-hide-empty') === 'false');
+
+               btn.setAttribute('data-hide-empty', hide);
+               btn.value = hide ? '<%:Show empty chains%>' : '<%:Hide empty chains%>';
+               btn.blur();
+
+               document.querySelectorAll('[data-chain][data-empty="true"]')
+                       .forEach(function(chaintable) {
+                               chaintable.style.display = hide ? 'none' : '';
+                       });
+       }
+
+       function jump_target(ev)
+       {
+               var link = ev.target,
+                   table = findParent(link, '[data-table]').getAttribute('data-table'),
+                   chain = link.textContent,
+                   num = +link.getAttribute('data-num'),
+                   elem = document.getElementById('rule_%s_%s'.format(table.toLowerCase(), chain));
+
+               if (elem) {
+                       (document.documentElement || document.body.parentNode || document.body).scrollTop = elem.offsetTop - 40;
+                       elem.classList.remove('flash');
+                       void elem.offsetWidth;
+                       elem.classList.add('flash');
+
+                       if (num) {
+                               var rule = elem.nextElementSibling.childNodes[num];
+                               if (rule) {
+                                       rule.classList.remove('flash');
+                                       void rule.offsetWidth;
+                                       rule.classList.add('flash');
+                               }
                        }
+               }
+       }
 
-               end
-               return i
-       end
+       function parse_output(table, s)
+       {
+               var current_chain = null;
+               var current_rules = [];
+               var seen_chains = {};
+               var chain_refs = {};
+               var re = /([^\n]*)\n/g;
+               var m, m2;
 
-       local tables = { "Filter", "NAT", "Mangle", "Raw" }
-       if mode == 6 then
-               tables = { "Filter", "Mangle", "Raw" }
-               local ok, lines = pcall(io.lines, "/proc/net/ip6_tables_names")
-               if ok and lines then
-                       local line
-                       for line in lines do
-                               if line == "nat" then
-                                       tables = { "Filter", "NAT", "Mangle", "Raw" }
-                               end
-                       end
-               end
-       end
--%>
+               while ((m = re.exec(s)) != null) {
+                       if (m[1].match(/^Chain (.+) \(policy (\w+) (\d+) packets, (\d+) bytes\)$/)) {
+                               var chain = RegExp.$1,
+                                   policy = RegExp.$2,
+                                   packets = +RegExp.$3,
+                                   bytes = +RegExp.$4;
 
-<%+header%>
+                               update_chain_section(current_chain, current_rules);
 
-<style type="text/css">
-       span:target {
-               color: blue;
-               text-decoration: underline;
+                               seen_chains[chain] = true;
+                               current_chain = create_chain_section(table, chain, policy, packets, bytes);
+                               current_rules = [];
+                       }
+                       else if (m[1].match(/^Chain (.+) \((\d+) references\)$/)) {
+                               var chain = RegExp.$1,
+                                   references = +RegExp.$2;
+
+                               update_chain_section(current_chain, current_rules);
+
+                               seen_chains[chain] = true;
+                               current_chain = create_chain_section(table, chain, null, null, null, references);
+                               current_rules = [];
+                       }
+                       else if (m[1].match(/^num /)) {
+                               continue;
+                       }
+                       else if ((m2 = m[1].match(/^(\d+) +(\d+) +(\d+) +(.*?) +(\S+) +(\S*) +(\S+) +(\S+) +([a-f0-9:.]+\/\d+) +([a-f0-9:.]+\/\d+) +(.+)$/)) !== null) {
+                               var num = +m2[1],
+                                   pkts = +m2[2],
+                                   bytes = +m2[3],
+                                   target = m2[4],
+                                   proto = m2[5],
+                                   indev = m2[7],
+                                   outdev = m2[8],
+                                   srcnet = m2[9],
+                                   dstnet = m2[10],
+                                   options = m2[11] || '-',
+                                   comment = '-';
+
+                               options = options.trim().replace(/(?:^| )\/\* (.+) \*\//,
+                                       function(m1, m2) {
+                                               comment = m2.replace(/^!fw3(: |$)/, '').trim() || '-';
+                                               return '';
+                                       }) || '-';
+
+                               current_rules.push([
+                                       '%.2m'.format(pkts).nobr(),
+                                       '%.2mB'.format(bytes).nobr(),
+                                       target ? '<span class="target">%s</span>'.format(target) : '-',
+                                       proto,
+                                       (indev !== '*') ? '<span class="ifacebadge">%s</span>'.format(indev) : '*',
+                                       (outdev !== '*') ? '<span class="ifacebadge">%s</span>'.format(outdev) : '*',
+                                       srcnet,
+                                       dstnet,
+                                       options,
+                                       comment
+                               ]);
+
+                               if (target) {
+                                       chain_refs[target] = chain_refs[target] || [];
+                                       chain_refs[target].push([ current_chain, num ]);
+                               }
+                       }
+               }
+
+               update_chain_section(current_chain, current_rules);
+
+               document.querySelectorAll('[data-table="%s"] [data-chain]'.format(table))
+                       .forEach(function(cdiv) {
+                               if (!seen_chains[cdiv.getAttribute('data-chain')]) {
+                                       cdiv.parentNode.removeChild(cdiv);
+                                       return;
+                               }
+
+                               cdiv.querySelectorAll('.target').forEach(function(tspan) {
+                                       if (seen_chains[tspan.textContent]) {
+                                               tspan.classList.add('jump');
+                                               tspan.addEventListener('click', jump_target);
+                                       }
+                               });
+
+                               cdiv.querySelectorAll('.references').forEach(function(rspan) {
+                                       var refs = chain_refs[cdiv.getAttribute('data-chain')];
+                                       if (refs && refs.length) {
+                                               rspan.classList.add('cbi-tooltip-container');
+                                               rspan.appendChild(E('small', { 'class': 'cbi-tooltip ifacebadge', 'style': 'top:1em; left:auto' }, [ E('ul') ]));
+
+                                               refs.forEach(function(ref) {
+                                                       var chain = ref[0].parentNode.getAttribute('data-chain'),
+                                                           num = ref[1];
+
+                                                       rspan.lastElementChild.lastElementChild.appendChild(E('li', {}, [
+                                                               '<%:Chain%> ',
+                                                               E('span', {
+                                                                       'class': 'jump',
+                                                                       'data-num': num,
+                                                                       'onclick': 'jump_target(event)'
+                                                               }, chain),
+                                                               ', <%:Rule%> #%d'.format(num)
+                                                       ]));
+                                               });
+                                       }
+                               });
+                       });
        }
-</style>
+
+       table_names.forEach(function(table) {
+               XHR.poll(5, '<%=url("admin/status/iptables_dump", tostring(mode))%>/' + table.toLowerCase(), null,
+                       function (xhr) {
+                               parse_output(table, xhr.responseText);
+                       });
+       });
+//]]></script>
 
 <h2 name="content"><%:Firewall Status%></h2>
 
 </ul>
 <% end %>
 
-<div class="cbi-map" style="position: relative">
-
+<div style="position: relative">
        <form method="post" action="<%=url("admin/status/iptables_action")%>" style="position: absolute; right: 0">
                <input type="hidden" name="token" value="<%=token%>" />
                <input type="hidden" name="family" value="<%=mode%>" />
+               <input type="button" class="cbi-button" data-hide-empty="false" value="<%:Hide empty chains%>" onclick="hide_empty(this)" />
                <input type="submit" class="cbi-button" name="zero" value="<%:Reset Counters%>" />
                <input type="submit" class="cbi-button" name="restart" value="<%:Restart Firewall%>" />
        </form>
+</div>
 
-       <div class="cbi-section">
-
-               <% for _, tbl in ipairs(tables) do chaincnt = 0 %>
-                       <h3><%:Table%>: <%=tbl%></h3>
-
-                       <% for _, chain in ipairs(ipt:chains(tbl)) do
-                               rowcnt    = 0
-                               chaincnt  = chaincnt + 1
-                               chaininfo = ipt:chain(tbl, chain)
-                       %>
-                               <h4  id="rule_<%=tbl:lower()%>_<%=chain%>">
-                                       <%:Chain%> <em><%=chain%></em>
-                                       (<%- if chaininfo.policy then -%>
-                                               <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
-                                       <%- else -%>
-                                               <%:References%>: <%=chaininfo.references-%>
-                                       <%- end -%>)
-                               </h4>
-
-                               <div class="cbi-section-node">
-                                       <div class="table" style="font-size:90%">
-                                               <div class="tr table-titles cbi-rowstyle-<%=rowstyle()%>">
-                                                       <div class="th hide-xs"><%:Pkts.%></div>
-                                                       <div class="th nowrap"><%:Traffic%></div>
-                                                       <div class="th col-5"><%:Target%></div>
-                                                       <div class="th"><%:Prot.%></div>
-                                                       <div class="th"><%:In%></div>
-                                                       <div class="th"><%:Out%></div>
-                                                       <div class="th"><%:Source%></div>
-                                                       <div class="th"><%:Destination%></div>
-                                                       <div class="th col-9 hide-xs"><%:Options%></div>
-                                               </div>
-
-                                               <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
-                                                       <div class="tr cbi-rowstyle-<%=rowstyle()%>">
-                                                               <div class="td"><%=rule.packets%></div>
-                                                               <div class="td nowrap"><%=wba.byte_format(rule.bytes)%></div>
-                                                               <div class="td col-5"><%=rule.target and link_target(tbl, rule.target) or "-"%></div>
-                                                               <div class="td"><%=rule.protocol%></div>
-                                                               <div class="td"><%=link_iface(rule.inputif)%></div>
-                                                               <div class="td"><%=link_iface(rule.outputif)%></div>
-                                                               <div class="td"><%=rule.source%></div>
-                                                               <div class="td"><%=rule.destination%></div>
-                                                               <div class="td col-9 hide-xs"><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></div>
-                                                       </div>
-                                               <% end %>
-
-                                               <% if rowcnt == 1 then %>
-                                                       <div class="tr cbi-rowstyle-<%=rowstyle()%>">
-                                                               <div class="td" colspan="9"><em><%:No rules in this chain%></em></div>
-                                                       </div>
-                                               <% end %>
-                                       </div>
-                               </div>
-                       <% end %>
-
-                       <% if chaincnt == 0 then %>
-                               <em><%:No chains in this table%></em>
-                       <% end %>
-
-                       <br /><br />
-               <% end %>
-       </div>
+<div id="iptables">
+       <p><em><%:Collecting data...%></em></p>
 </div>
 
 <%+footer%>
index a68c439141a02a884ab54501af4623688f647d73..7558d421611f4fcac4dbb99c87c6e33ffc577919 100644 (file)
@@ -130,7 +130,7 @@ end
 
 
 --
--- Langauge & Style
+-- Language & Style
 --
 
 o = s:taboption("language", ListValue, "_lang", translate("Language"))
index 280eabb8eab7a105831b7d7c9d7efef7730ce5f7..39582c6a93b0320a00791c997985695e61960809 100644 (file)
@@ -102,16 +102,16 @@ end
                                <div class="cbi-value">
                                        <label class="cbi-value-title"><%:Download and install package%>:</label>
                                        <div class="cbi-value-field">
-                                               <span><input type="text" name="url" size="30" value="" /></span>
-                                               <input class="cbi-button cbi-button-save" type="submit" name="go" value="<%:OK%>" />
+                                               <span><input type="text" name="url" size="30" <% if no_lists then %>disabled="disabled" placeholder="<%:Please update package lists first%>"<% end %> value="" /></span>
+                                               <input class="cbi-button cbi-button-save" type="submit" name="go" <% if no_lists then %>disabled="disabled"<% end %> value="<%:OK%>" />
                                        </div>
                                </div>
 
                                <div class="cbi-value cbi-value-last">
                                        <label class="cbi-value-title"><%:Filter%>:</label>
                                        <div class="cbi-value-field">
-                                               <span><input type="text" name="query" size="20" value="<%=pcdata(query)%>" /></span>
-                                               <input type="submit" class="cbi-button cbi-button-action" name="search" value="<%:Find package%>" />
+                                               <span><input type="text" name="query" size="20" <% if no_lists then %>disabled="disabled" placeholder="<%:Please update package lists first%>"<% else %>value="<%=pcdata(query)%>"<% end %> /></span>
+                                               <input type="submit" class="cbi-button cbi-button-action" name="search" <% if no_lists then %>disabled="disabled"<% end %> value="<%:Find package%>" />
                                        </div>
                                </div>
                        </div>