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
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)
--- 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")
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 = { }
--- 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
<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 />
-- 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)
-- 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 "-"
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
"rules"
msgstr ""
+msgid "Max TTL"
+msgstr ""
+
msgid "Max packet latency [ms]"
msgstr ""
"スは使用できません。<br />インターフェースには、設定済みのメンバーやポリ"
"シー、ルールと同じ名前を使用することはできません。"
+msgid "Max TTL"
+msgstr ""
+
msgid "Max packet latency [ms]"
msgstr "最大パケットレイテンシ [ms]"
"символы A-Z, a-z, 0-9, _ и пробелы.<br />Интерфейсы не могут иметь "
"одинаковые имена с настроенными узлами, политиками или правилами."
+msgid "Max TTL"
+msgstr ""
+
msgid "Max packet latency [ms]"
msgstr ""
"rules"
msgstr ""
+msgid "Max TTL"
+msgstr ""
+
msgid "Max packet latency [ms]"
msgstr ""
"的接口名称匹配。<br />名称允许包括 A-Z、a-z、0-9、_ 但是不能有空格。<br />接"
"口不应该与成员、策略、规则中的任意一个设置项使用相同的名称"
+msgid "Max TTL"
+msgstr ""
+
msgid "Max packet latency [ms]"
msgstr "最大数据包延迟 [ms]"
"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]"
">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 "分配的成員"
"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 />規則不能與配置的介面、成員或策略共享相同的名稱"
"\"wwan0\")<br /><br />"
msgstr ""
"這裡允許您修改“/etc/mwan3.user”的內容。<br />該檔案在 sysupgrade 期間也會保"
-"留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼的第一行必"
-"須是 "#!/bin/sh",不帶引號。<br />以 # 開頭的行是註釋,不會執行。"
+"留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼的第一"
+"行必須是 "#!/bin/sh",不帶引號。<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"
#~ "g. \"eth0\" or \"wwan0\")<br /><br />"
#~ msgstr ""
#~ "這裡允許您修改“/etc/mwan3.user”的內容。<br />該檔案在 sysupgrade 期間也會"
-#~ "保留。<br /><br />注意:<br />該檔案會作為 shell 指令碼解釋。<br />指令碼的第"
-#~ "一行必須是"#!/bin/sh",不帶引號。<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 />指令碼"
+#~ "的第一行必須是"#!/bin/sh",不帶引號。<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 "當前配置的介面"
#~ "no spaces<br />Rules may not share the same name as configured "
#~ "interfaces, members or policies"
#~ msgstr ""
-#~ "“規則”基於 IP 位址、協議、埠把流量劃分到指定的“策略”中。<br />規則按照從"
-#~ "上到下的順序進行匹配。除了第一條能夠匹配一次通訊的規則以外,其它規則將被忽"
+#~ "“規則”基於 IP 位址、協議、埠把流量劃分到指定的“策略”中。<br />規則按照從上"
+#~ "到下的順序進行匹配。除了第一條能夠匹配一次通訊的規則以外,其它規則將被忽"
#~ "略。不匹配任何規則的通訊將會由系統預設路由表進行。<br />來自已知的網路的轉"
#~ "發流量由系統預設路由表接手,然後 MWAN 從中匹配出相應的流量並轉移到 MWAN 自"
#~ "己的路由表。但是所有被劃分到一個無法使用的策略的流量將會無法正常進行路由。"
#~ "$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 />"
-#~ "指令碼的第一行必須是 "#!/bin/sh" 不含引號<br />以#開頭的行是註釋,"
-#~ "不會執行<br /><br />可用變數:<br />$ACTION 是 Hotplug 事件(ifup, ifdown)"
-#~ "<br />$INTERFACE 是介面名稱(wan1、wan2 等)<br />$DEVICE 是連線到介面的設"
-#~ "備名稱 (eth0.1、eth1 等)"
+#~ "口 ifup 或 ifdown Hotplug 事件時執行系統指令或指令碼<br /><br />注意:<br /"
+#~ ">指令碼的第一行必須是 "#!/bin/sh" 不含引號<br />以#開頭的行是註"
+#~ "釋,不會執行<br /><br />可用變數:<br />$ACTION 是 Hotplug 事件(ifup, "
+#~ "ifdown)<br />$INTERFACE 是介面名稱(wan1、wan2 等)<br />$DEVICE 是連線到"
+#~ "介面的設備名稱 (eth0.1、eth1 等)"
}
}
else {
- // beginn somewhere
+ // begin somewhere
n.x = Math.random()*400;
n.y = Math.random()*400;
}
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
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
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
-- * 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
msgid "Some output"
msgstr "一些输出"
+msgid "Start Simple Adblock service"
+msgstr ""
+
msgid "Stop the download if it is stalled for set number of seconds"
msgstr "如果下载停滞设定的秒数后,则停止下载"
msgid "Some output"
msgstr "一些輸出"
+msgid "Start Simple Adblock service"
+msgstr ""
+
msgid "Stop the download if it is stalled for set number of seconds"
msgstr "如果下載停滯設定的秒數後,則停止下載"
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")
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
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 />
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
[ -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
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
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
-- 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" }
},
-- 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" }
},
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ja\n"
+msgid "AP on"
+msgstr ""
+
msgid "Action"
msgstr ""
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 "接続制限"
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"
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>"
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 が無線アップリンクへの接続成功を待つ時間です。"
"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 "再スキャン"
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 "アップリンクへの接続を試行する回数です。"
msgid "Scan"
msgstr "スキャン:"
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
msgid "Signal Quality Threshold"
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 "最終実行日時"
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"
"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
+msgid "AP on"
+msgstr ""
+
msgid "Action"
msgstr ""
"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 "Ограничение соединений"
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"
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>"
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 ""
"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 "Повторить поиск"
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 ""
msgid "Scan"
msgstr "Поиск"
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
msgid "Signal Quality Threshold"
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 "Дата последнего запуска"
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
+msgid "AP on"
+msgstr ""
+
msgid "Action"
msgstr ""
"functionality."
msgstr ""
-msgid ""
-"Connect your Android or iOS devices to your router's WiFi using the shown QR "
-"code."
-msgstr ""
-
msgid "Connection Limit"
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"
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>"
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 ""
"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"
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."
msgid "Scan"
msgstr ""
+msgid "Show/Hide QR-Codes"
+msgstr ""
+
msgid "Signal Quality Threshold"
msgstr ""
msgid "hidden"
msgstr ""
+
+msgid "with SSID"
+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 "添加上行连接"
"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 "连接限制"
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>"
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 上行连接成功最长时间。"
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-) "
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 "连接到上行连接的重试限制。"
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)."
"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 状态(质量)"
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"
"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 "新增上行連線"
msgid ""
"Check the internet availability, log captive portal redirections and keep "
"the uplink connection 'alive'."
-msgstr "檢查網際網路可用性,記錄強制網路門戶重定向,並保持上行連線為“活動”狀態。"
+msgstr ""
+"檢查網際網路可用性,記錄強制網路門戶重定向,並保持上行連線為“活動”狀態。"
msgid "Cipher"
msgstr "密碼"
"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 "連線限制"
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>"
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 上行連線成功最長時間。"
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-) "
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 "連線到上行連線的重試限制。"
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)."
"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 狀態(質量)"
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"
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")
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")
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")
"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"
"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"
## 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.
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.
`wifi_schedule.sh cron`
All commands:
-
+
```
wifi_schedule.sh cron|start|stop|forcestop|recheck|getmodules|savemodules|help
msgid "Public Key"
msgstr "公開鍵"
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr "WireGuard ステータス"
msgid "Public Key"
msgstr "Chave Pública"
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr "Estado do WireGuard"
msgid "Public Key"
msgstr "Публичный Ключ"
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr "Состояние WireGuard"
msgid "Public Key"
msgstr "Publik nyckel"
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr "Status för WireGuard"
msgid "Public Key"
msgstr ""
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr ""
msgid "Public Key"
msgstr "公钥"
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr "WireGuard 状态"
msgid "Public Key"
msgstr "公鑰"
+msgid "Show/Hide QR-Code"
+msgstr ""
+
msgid "WireGuard Status"
msgstr "WireGuard 狀態"
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
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;
-------------------------------------------------------------------------------
-- 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 $
-------------------------------------------------------------------------------
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'
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'
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'
option 'splash_prefix' '28'
config 'defaults' 'interface'
- option 'dns' '216.87.84.211'
+ option 'dns' '80.67.169.40 216.87.84.211'
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"
} || {
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
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
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.
module "luci.http.mime"
---[[
-MIME mapping table containg extension - mimetype relations.
+MIME mapping table containing extension - mimetype relations.
@class table
]]
@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
@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
@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`.
@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`.
@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`.
@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`.
@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
@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.
--- /dev/null
+#
+# 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
--- /dev/null
+--[[
+
+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
--- /dev/null
+---[[
+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.
+]]
+
-- <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>
-- 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.
-- <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)
}
/*
- * Helper for mpi substraction
+ * Helper for mpi subtraction
*/
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 )
{
}
/*
- * Signed substraction: X = A - B
+ * Signed subtraction: X = A - B
*/
int mpi_sub_mpi( mpi *X, mpi *A, mpi *B )
{
}
/*
- * Signed substraction: X = A - b
+ * Signed subtraction: X = A - b
*/
int mpi_sub_int( mpi *X, mpi *A, int b )
{
* 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
}
/*
- * 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)
{
R_len = len;
}
- /* set tag poiner to begin */
+ /* set tag pointer to begin */
tag_sp = tag;
/* is at end? */
}
/*
- * 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)
{
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
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
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
* 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
* \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
* \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
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;
}
cbi_tag_last(parent);
}
- if (state) {
+ if (state)
cbi_d_update();
- }
}
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);
- }
}
}
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]');
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');
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";
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);
sel.blur();
sel.parentNode.removeChild(sel);
obj.focus();
- } else {
+ }
+ else {
obj.value = sel.options[sel.selectedIndex].value;
}
{
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;
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')
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;
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 */
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();
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();
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 = '';
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;
}
else if (t.style.display == 'none') {
t.style.display = '';
- t.className += ' cbi-tab-highlighted';
+ t.classList.add('cbi-tab-highlighted');
hl_tabs.push(t);
}
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;
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;
}
code += ',';
- for (var i = 0; i < code.length; i++)
- {
- if (esc)
- {
+ for (var i = 0; i < code.length; i++) {
+ if (esc) {
esc = false;
continue;
}
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";
pos = i+1;
}
+
break;
}
}
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;
}
}
return true;
};
- if( ! field.form.cbi_validators )
+ if (!field.form.cbi_validators)
field.form.cbi_validators = [ ];
field.form.cbi_validators.push(validator);
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);
}
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;
}
{
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)
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;
}
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 = '';
var subst = param;
- switch(pType)
- {
+ switch(pType) {
case 'b':
subst = (+param || 0).toString(2);
break;
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);
}
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;
return;
document.querySelectorAll('.focus').forEach(function(e) {
- if (e.nodeName.toLowerCase() !== 'input') {
+ if (!matchesElem(e, 'input')) {
e.classList.remove('focus');
e.blur();
}
sb.addEventListener('click', function(ev) {
if (!this.hasAttribute('open')) {
- if (ev.target.nodeName.toLowerCase() !== 'input')
+ if (!matchesElem(ev.target, 'input'))
sbox.openDropdown(this);
}
else {
});
sb.addEventListener('keydown', function(ev) {
- if (ev.target.nodeName.toLowerCase() === 'input')
+ if (matchesElem(ev.target, 'input'))
return;
if (!this.hasAttribute('open')) {
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;
]]
---[[
-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
-- 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)
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
-- 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"
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
]]
---[[
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
]]
---[[
-Set the directory for uncommited changes.
+Set the directory for uncommitted changes.
@class function
@name Cursor.set_savedir
@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
]]
---[[
@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
]]
]]
---[[
-Retrieve user informations for given uid.
+Retrieve user information for given uid.
@class function
@name getuser
@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
]]
---[[
+++ /dev/null
---[[
-
-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
+++ /dev/null
----[[
-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.
-]]
-
{ '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' },
{ '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' },
idt = 10800, -- IDT
pkt = 18000, -- PKT
wita = 28800, -- WITA
- kst = 30600, -- KST
+ kst = 32400, -- KST
jst = 32400, -- JST
acst = 34200, -- ACST
acdt = 37800, -- ACDT
-- 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
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
]]
---[[
-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)
if empty then
%>
<label class="zonebadge zonebadge-empty">
- <strong><%=zone:forward():upper()%></strong>
+ <strong><%=def:forward():upper()%></strong>
</label>
<% end %>
</div>
<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 %>
msgid "Command"
msgstr "Ordre"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configuració comuna"
msgstr ""
"No mostris l'<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr "Nom de màquina"
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"
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..."
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"
"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 ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "Atura aquesta interfície"
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ó."
msgid "Command"
msgstr "Příkaz"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Společná nastavení"
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 ""
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"
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..."
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"
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í"
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í"
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."
msgid "Command"
msgstr "Befehl"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Allgemeine Konfiguration"
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr "ESSID verstecken"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
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"
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..."
msgid "Please enter your username and password."
msgstr "Bitte Benutzernamen und Passwort eingeben."
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "Standardregel"
"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 "
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"
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"
msgid "Command"
msgstr "Εντολή"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
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 ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr "Δεν υπάρχουν αλυσίδες σε αυτόν τον πίνακα"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης."
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "Πολιτική"
"Οι διαδρομές ορίζουν τη διεπαφή και πύλη από την οποία κάποιος υπολογιστής ή "
"δίκτυο μπορεί να είναι προσβάσιμο/ς."
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "Εκτέλεση ελέγχου του συστήματος αρχείων πριν προσαρτηθεί η συσκευή"
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "Απενεργοποίηση αυτής της διεπαφής"
msgid "« Back"
msgstr "« Πίσω"
+#~ msgid "No chains in this table"
+#~ msgstr "Δεν υπάρχουν αλυσίδες σε αυτόν τον πίνακα"
+
#~ msgid "Configuration files will be kept."
#~ msgstr "Τα αρχεία παραμετροποίησης θα διατηρηθούν."
msgid "Command"
msgstr "Command"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Common Configuration"
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 ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr "No chains in this table"
-
msgid "No files found"
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 ""
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"
"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 ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
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."
msgid "Command"
msgstr "Comando"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configuración común"
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 ""
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"
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..."
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"
"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"
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"
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."
msgid "Command"
msgstr "Commande"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configuration commune"
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr "Cacher le ESSID"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
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é"
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..."
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"
"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"
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"
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."
msgid "Command"
msgstr "פקודה"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "הגדרות נפוצות"
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr ""
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr ""
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "אנא הזן את שם המשתמש והסיסמה שלך:"
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr ""
"can be reached."
msgstr ""
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr ""
msgid "Command"
msgstr "Parancs"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Álatános beállítás"
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 ""
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"
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..."
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"
"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"
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"
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."
msgid "Command"
msgstr "Comando"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configurazioni Comuni"
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 ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr ""
-
msgid "No files found"
msgstr "Nessun file trovato"
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..."
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 ""
"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"
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr ""
msgid "Command"
msgstr "コマンド"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
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 "ホスト"
msgid "No NAT-T"
msgstr "NAT-Tを使用しない"
-msgid "No chains in this table"
-msgstr "チェイン内にルールがありません"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "ユーザー名とパスワードを入力してください。"
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "ポリシー"
"特定のホスト又はネットワークに、どのインターフェース及びゲートウェイを通して"
"通信を行うか、経路情報を設定します。"
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "デバイスのマウントを行う前にファイルシステムチェックを行う"
msgid "Show current backup file list"
msgstr "現在のバックアップファイルのリストを表示する"
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "インターフェースを終了"
msgid "« Back"
msgstr "« 戻る"
+
+#~ msgid "No chains in this table"
+#~ msgstr "チェイン内にルールがありません"
msgid "Command"
msgstr "명령어"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
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 "호스트"
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr "이 table 에는 정의된 chain 이 없음"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "사용자이름과 암호를 입력해 주세요."
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr ""
"Route 경로는 특정 호스트 혹은 네트워크가 사용해야 할 인터페이스와 gateway 정"
"보를 나타냅니다."
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr ""
msgid "Show current backup file list"
msgstr "현재 백업 파일 목록 보기"
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "이 인터페이스를 정지합니다"
msgid "« Back"
msgstr ""
+#~ msgid "No chains in this table"
+#~ msgstr "이 table 에는 정의된 chain 이 없음"
+
#~ msgid "Activate this network"
#~ msgstr "이 네트워를 활성화합니다"
msgid "Command"
msgstr "Perintah"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr ""
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr "Menyembunyikan ESSID"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr "Tiada rantai dalam jadual ini"
-
msgid "No files found"
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..."
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"
"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 ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr ""
msgid "« Back"
msgstr "« Kembali"
+#~ msgid "No chains in this table"
+#~ msgstr "Tiada rantai dalam jadual ini"
+
#~ msgid "help"
#~ msgstr "Membantu"
msgid "Command"
msgstr "Kommando"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Vanlige Innstillinger"
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 ""
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"
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..."
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"
"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"
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"
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."
msgid "Command"
msgstr "Polecenie"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Konfiguracja podstawowa"
"Ukryj <abbr title=\"Extended Service Set Identifier (Nazwę sieci)\">ESSID</"
"abbr>"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
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"
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..."
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"
"Ś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"
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"
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."
msgid "Command"
msgstr "Comando"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configuração Comum"
"Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos"
"\">ESSID</abbr>"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr "Equipamento"
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"
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..."
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"
"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"
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"
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."
msgid "Command"
msgstr "Comando"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configuração comum"
"Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos"
"\">ESSID</abbr>"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
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"
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..."
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"
"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"
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"
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."
msgid "Command"
msgstr "Comanda"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Configurarea obisnuita"
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 ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr ""
-
msgid "No files found"
msgstr "Nici un fisier gasit"
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..."
msgid "Please enter your username and password."
msgstr "Introdu utilizatorul si parola."
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr ""
"can be reached."
msgstr ""
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "Opreste aceasta interfata"
msgid "Command"
msgstr "Команда"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Общие настройки"
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr "Скрыть <abbr title=\"Расширенный идентификатор сети\">ESSID</abbr>"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr "Хост"
msgid "No NAT-T"
msgstr "Без NAT-T"
-msgid "No chains in this table"
-msgstr "Нет цепочек в этой таблице"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "Введите логин и пароль."
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "Политика"
"Маршрутизация служит для определения через, какой интерфейс и шлюз можно "
"достичь определенного хоста или сети."
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "Проверять файловую систему перед монтированием раздела."
msgid "Show current backup file list"
msgstr "Показать текущий список файлов резервной копии"
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "Выключить этот интерфейс"
msgid "« Back"
msgstr "« Назад"
+#~ msgid "No chains in this table"
+#~ msgstr "Нет цепочек в этой таблице"
+
#~ msgid "Configuration files will be kept."
#~ msgstr "Config файлы будут сохранены."
msgid "Command"
msgstr ""
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr ""
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr ""
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr ""
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr ""
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr ""
"can be reached."
msgstr ""
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr ""
msgid "Command"
msgstr "Kommando"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Vanlig konfiguration"
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"
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"
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..."
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 ""
"can be reached."
msgstr ""
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "Kör en filsystemskontroll innan enheten monteras"
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"
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."
msgid "Command"
msgstr ""
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr ""
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr ""
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr ""
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr ""
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr ""
"can be reached."
msgstr ""
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr ""
msgid "Command"
msgstr ""
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr ""
msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
msgstr ""
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr ""
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr ""
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr ""
"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"
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr ""
msgid "Command"
msgstr "Команда"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
msgstr "Загальна конфігурація"
"Приховати <abbr title=\"Extended Service Set Identifier — ідентифікатор "
"розширеної служби послуг\">ESSID</abbr>"
+msgid "Hide empty chains"
+msgstr ""
+
msgid "Host"
msgstr "Вузол"
msgid "No NAT-T"
msgstr "Немає NAT-T"
-msgid "No chains in this table"
-msgstr "У цій таблиці немає ланцюжків"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "Введіть ім’я користувача і пароль."
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "Політика"
"Маршрути визначають через який інтерфейс і шлюз можна досягнути певного "
"вузла або мережі."
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "Виконати перевірку файлової системи перед монтуванням пристрою"
msgid "Show current backup file list"
msgstr "Показати поточний список файлів резервного копіювання"
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "Вимкнути цей інтерфейс"
msgid "« Back"
msgstr "« Назад"
+
+#~ msgid "No chains in this table"
+#~ msgstr "У цій таблиці немає ланцюжків"
msgid "Command"
msgstr "Lệnh"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
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 ""
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 ""
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..."
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"
"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 ""
msgid "Show current backup file list"
msgstr ""
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
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"
msgid "Command"
msgstr "命令"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
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 "主机"
msgid "No NAT-T"
msgstr "无 NAT-T"
-msgid "No chains in this table"
-msgstr "本表中没有链"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "请输入用户名和密码。"
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "策略"
"can be reached."
msgstr "路由表描述了数据包的可达路径。"
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "挂载设备前运行文件系统检查"
msgid "Show current backup file list"
msgstr "显示当前备份文件列表"
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "关闭此接口"
msgid "« Back"
msgstr "« 后退"
+#~ msgid "No chains in this table"
+#~ msgstr "本表中没有链"
+
#~ msgid "Configuration files will be kept."
#~ msgstr "配置文件将被保留。"
msgid "Command"
msgstr "指令"
+msgid "Comment"
+msgstr ""
+
msgid "Common Configuration"
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 ""
msgid "No NAT-T"
msgstr ""
-msgid "No chains in this table"
-msgstr "尚未綁在這個表格中"
-
msgid "No files found"
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..."
msgid "Please enter your username and password."
msgstr "請輸入您的用戶名稱和密碼"
+msgid "Please update package lists first"
+msgstr ""
+
msgid "Policy"
msgstr "策略"
"can be reached."
msgstr "路由器指定介面導出到特定主機或者能夠到達的網路."
+msgid "Rule"
+msgstr ""
+
msgid "Run a filesystem check before mounting the device"
msgstr "掛載這個設備前先跑系統檢查"
msgid "Show current backup file list"
msgstr "顯示現今的備份檔清單"
+msgid "Show empty chains"
+msgstr ""
+
msgid "Shutdown this interface"
msgstr "關閉這個介面"
msgid "« Back"
msgstr "« 倒退"
+#~ msgid "No chains in this table"
+#~ msgstr "尚未綁在這個表格中"
+
#~ msgid "Configuration files will be kept."
#~ msgstr "設定檔將被存檔"
break;
}
- /* advance beyound the last found valid continuation char */
+ /* advance beyond the last found valid continuation char */
o = v;
ptr += v;
}
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]
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]
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)
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
<%#
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%>
--
--- Langauge & Style
+-- Language & Style
--
o = s:taboption("language", ListValue, "_lang", translate("Language"))
<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>