diff options
Diffstat (limited to 'modules')
49 files changed, 945 insertions, 827 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/cbi.js b/modules/luci-base/htdocs/luci-static/resources/cbi.js index fcfc506942..70255c0b58 100644 --- a/modules/luci-base/htdocs/luci-static/resources/cbi.js +++ b/modules/luci-base/htdocs/luci-static/resources/cbi.js @@ -511,20 +511,19 @@ function cbi_d_update() { if (node && node.parentNode && !cbi_d_check(entry.deps)) { node.parentNode.removeChild(node); state = true; - } else if (parent && (!node || !node.parentNode) && cbi_d_check(entry.deps)) { + } + else if (parent && (!node || !node.parentNode) && cbi_d_check(entry.deps)) { var next = undefined; for (next = parent.firstChild; next; next = next.nextSibling) { - if (next.getAttribute && parseInt(next.getAttribute('data-index'), 10) > entry.index) { + if (next.getAttribute && parseInt(next.getAttribute('data-index'), 10) > entry.index) break; - } } - if (!next) { + if (!next) parent.appendChild(entry.node); - } else { + else parent.insertBefore(entry.node, next); - } state = true; } @@ -539,9 +538,8 @@ function cbi_d_update() { cbi_tag_last(parent); } - if (state) { + if (state) cbi_d_update(); - } } function cbi_init() { @@ -565,9 +563,8 @@ function cbi_init() { var index = parseInt(node.getAttribute('data-index'), 10); var depends = JSON.parse(node.getAttribute('data-depends')); if (!isNaN(index) && depends.length > 0) { - for (var alt = 0; alt < depends.length; alt++) { + for (var alt = 0; alt < depends.length; alt++) cbi_d_add(node, depends[alt], index); - } } } @@ -575,9 +572,8 @@ function cbi_init() { for (var i = 0, node; (node = nodes[i]) !== undefined; i++) { var events = node.getAttribute('data-update').split(' '); - for (var j = 0, event; (event = events[j]) !== undefined; j++) { + for (var j = 0, event; (event = events[j]) !== undefined; j++) cbi_bind(node, event, cbi_d_update); - } } nodes = document.querySelectorAll('[data-choices]'); @@ -670,13 +666,13 @@ function cbi_combobox(id, values, def, man, focus) { var sel = document.createElement("select"); sel.id = selid; sel.index = obj.index; - sel.className = obj.className.replace(/cbi-input-text/, 'cbi-input-select'); + sel.classList.remove('cbi-input-text'); + sel.classList.add('cbi-input-select'); - if (obj.nextSibling) { + if (obj.nextSibling) obj.parentNode.insertBefore(sel, obj.nextSibling); - } else { + else obj.parentNode.appendChild(sel); - } var dt = obj.getAttribute('cbi_datatype'); var op = obj.getAttribute('cbi_optional'); @@ -687,7 +683,8 @@ function cbi_combobox(id, values, def, man, focus) { optdef.value = ""; optdef.appendChild(document.createTextNode(typeof(def) === 'string' ? def : cbi_strings.label.choose)); sel.appendChild(optdef); - } else { + } + else { var opt = document.createElement("option"); opt.value = obj.value; opt.selected = "selected"; @@ -700,9 +697,8 @@ function cbi_combobox(id, values, def, man, focus) { var opt = document.createElement("option"); opt.value = i; - if (obj.value == i) { + if (obj.value == i) opt.selected = "selected"; - } opt.appendChild(document.createTextNode(values[i])); sel.appendChild(opt); @@ -724,7 +720,8 @@ function cbi_combobox(id, values, def, man, focus) { sel.blur(); sel.parentNode.removeChild(sel); obj.focus(); - } else { + } + else { obj.value = sel.options[sel.selectedIndex].value; } @@ -788,35 +785,30 @@ function cbi_dynlist_init(parent, datatype, optional, choices) { values = [ ]; - while (parent.firstChild) - { + while (parent.firstChild) { var n = parent.firstChild; var i = +n.index; - if (i != del) - { - if (n.nodeName.toLowerCase() == 'input') + if (i != del) { + if (matchesElem(n, 'input')) values.push(n.value || ''); - else if (n.nodeName.toLowerCase() == 'select') + else if (matchesElem(n, 'select')) values[values.length-1] = n.options[n.selectedIndex].value; } parent.removeChild(n); } - if (add >= 0) - { + if (add >= 0) { focus = add+1; values.splice(focus, 0, ''); } - else if (values.length == 0) - { + else if (values.length == 0) { focus = 0; values.push(''); } - for (var i = 0; i < values.length; i++) - { + for (var i = 0; i < values.length; i++) { var t = document.createElement('input'); t.id = prefix + '.' + (i+1); t.name = prefix; @@ -826,9 +818,7 @@ function cbi_dynlist_init(parent, datatype, optional, choices) t.className = 'cbi-input-text'; if (i == 0 && holder) - { t.placeholder = holder; - } var b = E('div', { class: 'cbi-button cbi-button-' + ((i+1) < values.length ? 'remove' : 'add') @@ -836,20 +826,16 @@ function cbi_dynlist_init(parent, datatype, optional, choices) parent.appendChild(t); parent.appendChild(b); + if (datatype == 'file') - { cbi_browser_init(t.id, null, parent.getAttribute('data-browser-path')); - } parent.appendChild(document.createElement('br')); if (datatype) - { cbi_validate_field(t.id, ((i+1) == values.length) || optional, datatype); - } - if (choices) - { + if (choices) { cbi_combobox_init(t.id, choices, '', cbi_strings.label.custom); b.index = i; @@ -859,17 +845,14 @@ function cbi_dynlist_init(parent, datatype, optional, choices) if (i == focus || -i == focus) b.focus(); } - else - { + else { cbi_bind(t, 'keydown', cbi_dynlist_keydown); cbi_bind(t, 'keypress', cbi_dynlist_keypress); - if (i == focus) - { + if (i == focus) { t.focus(); } - else if (-i == focus) - { + else if (-i == focus) { t.focus(); /* force cursor to end */ @@ -892,13 +875,11 @@ function cbi_dynlist_init(parent, datatype, optional, choices) if (se.nodeType == 3) se = se.parentNode; - switch (ev.keyCode) - { + switch (ev.keyCode) { /* backspace, delete */ case 8: case 46: - if (se.value.length == 0) - { + if (se.value.length == 0) { if (ev.preventDefault) ev.preventDefault(); @@ -941,16 +922,14 @@ function cbi_dynlist_init(parent, datatype, optional, choices) if (next && next.nextSibling.name == prefix) next = next.nextSibling; - switch (ev.keyCode) - { + switch (ev.keyCode) { /* backspace, delete */ case 8: case 46: - var del = (se.nodeName.toLowerCase() == 'select') + var del = (matchesElem(se, 'select')) ? true : (se.value.length == 0); - if (del) - { + if (del) { if (ev.preventDefault) ev.preventDefault(); @@ -994,9 +973,8 @@ function cbi_dynlist_init(parent, datatype, optional, choices) var se = ev.target ? ev.target : ev.srcElement; var input = se.previousSibling; - while (input && input.name != prefix) { + while (input && input.name != prefix) input = input.previousSibling; - } if (se.classList.contains('cbi-button-remove')) { input.value = ''; @@ -1024,39 +1002,45 @@ function cbi_t_add(section, tab) { var t = document.getElementById('tab.' + section + '.' + tab); var c = document.getElementById('container.' + section + '.' + tab); - if( t && c ) { + if (t && c) { cbi_t[section] = (cbi_t[section] || [ ]); cbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id }; } } function cbi_t_switch(section, tab) { - if( cbi_t[section] && cbi_t[section][tab] ) { + if (cbi_t[section] && cbi_t[section][tab]) { var o = cbi_t[section][tab]; var h = document.getElementById('tab.' + section); - for( var tid in cbi_t[section] ) { + + for (var tid in cbi_t[section]) { var o2 = cbi_t[section][tid]; - if( o.tab.id != o2.tab.id ) { - o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, " cbi-tab-disabled "); + + if (o.tab.id != o2.tab.id) { + o2.tab.classList.remove('cbi-tab'); + o2.tab.classList.add('cbi-tab-disabled'); o2.container.style.display = 'none'; } else { - if(h) h.value = tab; - o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, " cbi-tab "); + if(h) + h.value = tab; + + o2.tab.classList.remove('cbi-tab-disabled'); + o2.tab.classList.add('cbi-tab'); o2.container.style.display = 'block'; } } } - return false + + return false; } function cbi_t_update() { var hl_tabs = [ ]; var updated = false; - for( var sid in cbi_t ) - for( var tid in cbi_t[sid] ) - { + for (var sid in cbi_t) + for (var tid in cbi_t[sid]) { var t = cbi_t[sid][tid].tab; var c = cbi_t[sid][tid].container; @@ -1065,7 +1049,7 @@ function cbi_t_update() { } else if (t.style.display == 'none') { t.style.display = ''; - t.className += ' cbi-tab-highlighted'; + t.classList.add('cbi-tab-highlighted'); hl_tabs.push(t); } @@ -1075,8 +1059,8 @@ function cbi_t_update() { if (hl_tabs.length > 0) window.setTimeout(function() { - for( var i = 0; i < hl_tabs.length; i++ ) - hl_tabs[i].className = hl_tabs[i].className.replace(/ cbi-tab-highlighted/g, ''); + for (var i = 0; i < hl_tabs.length; i++) + hl_tabs[i].classList.remove('cbi-tab-highlighted'); }, 750); return updated; @@ -1086,16 +1070,14 @@ function cbi_t_update() { function cbi_validate_form(form, errmsg) { /* if triggered by a section removal or addition, don't validate */ - if( form.cbi_state == 'add-section' || form.cbi_state == 'del-section' ) + if (form.cbi_state == 'add-section' || form.cbi_state == 'del-section') return true; - if( form.cbi_validators ) - { - for( var i = 0; i < form.cbi_validators.length; i++ ) - { + if (form.cbi_validators) { + for (var i = 0; i < form.cbi_validators.length; i++) { var validator = form.cbi_validators[i]; - if( !validator() && errmsg ) - { + + if (!validator() && errmsg) { alert(errmsg); return false; } @@ -1123,10 +1105,8 @@ function cbi_validate_compile(code) code += ','; - for (var i = 0; i < code.length; i++) - { - if (esc) - { + for (var i = 0; i < code.length; i++) { + if (esc) { esc = false; continue; } @@ -1139,41 +1119,36 @@ function cbi_validate_compile(code) case 40: case 44: - if (depth <= 0) - { - if (pos < i) - { + if (depth <= 0) { + if (pos < i) { var label = code.substring(pos, i); label = label.replace(/\\(.)/g, '$1'); label = label.replace(/^[ \t]+/g, ''); label = label.replace(/[ \t]+$/g, ''); - if (label && !isNaN(label)) - { + if (label && !isNaN(label)) { stack.push(parseFloat(label)); } - else if (label.match(/^(['"]).*\1$/)) - { + else if (label.match(/^(['"]).*\1$/)) { stack.push(label.replace(/^(['"])(.*)\1$/, '$2')); } - else if (typeof cbi_validators[label] == 'function') - { + else if (typeof cbi_validators[label] == 'function') { stack.push(cbi_validators[label]); stack.push(null); } - else - { + else { throw "Syntax error, unhandled token '"+label+"'"; } } + pos = i+1; } + depth += (code.charCodeAt(i) == 40); break; case 41: - if (--depth <= 0) - { + if (--depth <= 0) { if (typeof stack[stack.length-2] != 'function') throw "Syntax error, argument list follows non-function"; @@ -1182,6 +1157,7 @@ function cbi_validate_compile(code) pos = i+1; } + break; } } @@ -1194,23 +1170,20 @@ function cbi_validate_field(cbid, optional, type) var field = (typeof cbid == "string") ? document.getElementById(cbid) : cbid; var vstack; try { vstack = cbi_validate_compile(type); } catch(e) { }; - if (field && vstack && typeof vstack[0] == "function") - { + if (field && vstack && typeof vstack[0] == "function") { var validator = function() { // is not detached - if( field.form ) - { - field.className = field.className.replace(/ cbi-input-invalid/g, ''); + if (field.form) { + field.classList.remove('cbi-input-invalid'); // validate value var value = (field.options && field.options.selectedIndex > -1) ? field.options[field.options.selectedIndex].value : field.value; - if (!(((value.length == 0) && optional) || vstack[0].apply(value, vstack[1]))) - { + if (!(((value.length == 0) && optional) || vstack[0].apply(value, vstack[1]))) { // invalid - field.className += ' cbi-input-invalid'; + field.classList.add('cbi-input-invalid'); return false; } } @@ -1218,7 +1191,7 @@ function cbi_validate_field(cbid, optional, type) return true; }; - if( ! field.form.cbi_validators ) + if (!field.form.cbi_validators) field.form.cbi_validators = [ ]; field.form.cbi_validators.push(validator); @@ -1226,8 +1199,7 @@ function cbi_validate_field(cbid, optional, type) cbi_bind(field, "blur", validator); cbi_bind(field, "keyup", validator); - if (field.nodeName == 'SELECT') - { + if (matchesElem(field, 'select')) { cbi_bind(field, "change", validator); cbi_bind(field, "click", validator); } @@ -1291,7 +1263,8 @@ function cbi_row_swap(elem, up, store) input.value = ids.join(' '); window.scrollTo(0, tr.offsetTop); - window.setTimeout(function() { tr.classList.add('flash'); }, 1); + void tr.offsetWidth; + tr.classList.add('flash'); return false; } @@ -1300,20 +1273,16 @@ function cbi_tag_last(container) { var last; - for (var i = 0; i < container.childNodes.length; i++) - { + for (var i = 0; i < container.childNodes.length; i++) { var c = container.childNodes[i]; - if (c.nodeType == 1 && c.nodeName.toLowerCase() == 'div') - { - c.className = c.className.replace(/ cbi-value-last$/, ''); + if (matchesElem(c, 'div')) { + c.classList.remove('cbi-value-last'); last = c; } } if (last) - { - last.className += ' cbi-value-last'; - } + last.classList.add('cbi-value-last'); } function cbi_submit(elem, name, value, action) @@ -1350,8 +1319,9 @@ String.prototype.format = function() if (typeof(s) !== 'string' && !(s instanceof String)) return ''; - for( var i = 0; i < r.length; i += 2 ) + for (var i = 0; i < r.length; i += 2) s = s.replace(r[i], r[i+1]); + return s; } @@ -1360,22 +1330,18 @@ String.prototype.format = function() var re = /^(([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X|q|h|j|t|m))/; var a = b = [], numSubstitutions = 0, numMatches = 0; - while (a = re.exec(str)) - { + while (a = re.exec(str)) { var m = a[1]; var leftpart = a[2], pPad = a[3], pJustify = a[4], pMinLength = a[5]; var pPrecision = a[6], pType = a[7]; numMatches++; - if (pType == '%') - { + if (pType == '%') { subst = '%'; } - else - { - if (numSubstitutions < arguments.length) - { + else { + if (numSubstitutions < arguments.length) { var param = arguments[numSubstitutions++]; var pad = ''; @@ -1400,8 +1366,7 @@ String.prototype.format = function() var subst = param; - switch(pType) - { + switch(pType) { case 'b': subst = (+param || 0).toString(2); break; @@ -1517,16 +1482,20 @@ String.prototype.nobr = function() String.format = function() { var a = [ ]; + for (var i = 1; i < arguments.length; i++) a.push(arguments[i]); + return ''.format.apply(arguments[0], a); } String.nobr = function() { var a = [ ]; + for (var i = 1; i < arguments.length; i++) a.push(arguments[i]); + return ''.nobr.apply(arguments[0], a); } @@ -1569,12 +1538,16 @@ function toElem(s) return elem || null; } +function matchesElem(node, selector) +{ + return ((node.matches && node.matches(selector)) || + (node.msMatchesSelector && node.msMatchesSelector(selector))); +} + function findParent(node, selector) { while (node) - if (node.msMatchesSelector && node.msMatchesSelector(selector)) - return node; - else if (node.matches && node.matches(selector)) + if (matchesElem(node, selector)) return node; else node = node.parentNode; @@ -1813,7 +1786,7 @@ CBIDropdown = { return; document.querySelectorAll('.focus').forEach(function(e) { - if (e.nodeName.toLowerCase() !== 'input') { + if (!matchesElem(e, 'input')) { e.classList.remove('focus'); e.blur(); } @@ -1952,7 +1925,7 @@ function cbi_dropdown_init(sb) { sb.addEventListener('click', function(ev) { if (!this.hasAttribute('open')) { - if (ev.target.nodeName.toLowerCase() !== 'input') + if (!matchesElem(ev.target, 'input')) sbox.openDropdown(this); } else { @@ -1966,7 +1939,7 @@ function cbi_dropdown_init(sb) { }); sb.addEventListener('keydown', function(ev) { - if (ev.target.nodeName.toLowerCase() === 'input') + if (matchesElem(ev.target, 'input')) return; if (!this.hasAttribute('open')) { @@ -2062,8 +2035,12 @@ function cbi_dropdown_init(sb) { create.addEventListener('keydown', function(ev) { switch (ev.keyCode) { case 13: - sbox.createItems(sb, this.value); ev.preventDefault(); + + if (this.classList.contains('cbi-input-invalid')) + return; + + sbox.createItems(sb, this.value); this.value = ''; this.blur(); break; diff --git a/modules/luci-base/luasrc/dispatcher.luadoc b/modules/luci-base/luasrc/dispatcher.luadoc index ddf534b3e1..f26256953a 100644 --- a/modules/luci-base/luasrc/dispatcher.luadoc +++ b/modules/luci-base/luasrc/dispatcher.luadoc @@ -22,7 +22,7 @@ Check whether a dispatch node shall be visible ]] ---[[ -Return a sorted table of visible childs within a given node +Return a sorted table of visible children within a given node @class function @name node_childs diff --git a/modules/luci-base/luasrc/http.lua b/modules/luci-base/luasrc/http.lua index f4ede4b8a5..20b55f2854 100644 --- a/modules/luci-base/luasrc/http.lua +++ b/modules/luci-base/luasrc/http.lua @@ -335,13 +335,13 @@ end -- Content-Type. Stores all extracted data associated with its parameter name -- in the params table within the given message object. Multiple parameter -- values are stored as tables, ordinary ones as strings. --- If an optional file callback function is given then it is feeded with the +-- If an optional file callback function is given then it is fed with the -- file contents chunk by chunk and only the extracted file name is stored -- within the params table. The callback function will be called subsequently -- with three arguments: -- o Table containing decoded (name, file) and raw (headers) mime header data -- o String value containing a chunk of the file data --- o Boolean which indicates wheather the current chunk is the last one (eof) +-- o Boolean which indicates whether the current chunk is the last one (eof) function mimedecode_message_body(src, msg, file_cb) local parser, header, field local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil) diff --git a/modules/luci-base/luasrc/http.luadoc b/modules/luci-base/luasrc/http.luadoc index f8121230b6..8f6f380d8b 100644 --- a/modules/luci-base/luasrc/http.luadoc +++ b/modules/luci-base/luasrc/http.luadoc @@ -204,13 +204,13 @@ Stores all extracted data associated with its parameter name in the params table within the given message object. Multiple parameter values are stored as tables, ordinary ones as strings. -If an optional file callback function is given then it is feeded with the +If an optional file callback function is given then it is fed with the file contents chunk by chunk and only the extracted file name is stored within the params table. The callback function will be called subsequently with three arguments: o Table containing decoded (name, file) and raw (headers) mime header data o String value containing a chunk of the file data - o Boolean which indicates wheather the current chunk is the last one (eof) + o Boolean which indicates whether the current chunk is the last one (eof) @class function @name mimedecode_message_body diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua index 2119a210bb..a50e28a871 100644 --- a/modules/luci-base/luasrc/model/uci.lua +++ b/modules/luci-base/luasrc/model/uci.lua @@ -15,7 +15,7 @@ local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack -- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.), -- save the changes to the staging area via Cursor.save and finally -- Cursor.commit the data to the actual config files. --- LuCI then needs to Cursor.apply the changes so deamons etc. are +-- LuCI then needs to Cursor.apply the changes so daemons etc. are -- reloaded. module "luci.model.uci" diff --git a/modules/luci-base/luasrc/model/uci.luadoc b/modules/luci-base/luasrc/model/uci.luadoc index d798b00338..0189d49aa1 100644 --- a/modules/luci-base/luasrc/model/uci.luadoc +++ b/modules/luci-base/luasrc/model/uci.luadoc @@ -5,7 +5,7 @@ The typical workflow for UCI is: Get a cursor instance from the cursor factory, modify data (via Cursor.add, Cursor.delete, etc.), save the changes to the staging area via Cursor.save and finally Cursor.commit the data to the actual config files. -LuCI then needs to Cursor.apply the changes so deamons etc. are +LuCI then needs to Cursor.apply the changes so daemons etc. are reloaded. @cstyle instance ]] @@ -172,7 +172,7 @@ has the same effect as deleting the option. ---[[ Create a sub-state of this cursor. -The sub-state is tied to the parent curser, means it the parent unloads or +The sub-state is tied to the parent cursor, means it the parent unloads or loads configs, the sub state will do so as well. @class function @@ -339,7 +339,7 @@ Set the configuration directory. ]] ---[[ -Set the directory for uncommited changes. +Set the directory for uncommitted changes. @class function @name Cursor.set_savedir diff --git a/modules/luci-base/luasrc/sys.luadoc b/modules/luci-base/luasrc/sys.luadoc index 1c1fa92602..3c7f69c6e9 100644 --- a/modules/luci-base/luasrc/sys.luadoc +++ b/modules/luci-base/luasrc/sys.luadoc @@ -18,7 +18,7 @@ Execute a given shell command and capture its standard output @class function @name exec @param command Command to call -@return String containg the return the output of the command +@return String containing the return the output of the command ]] ---[[ @@ -38,7 +38,7 @@ exists. @class function @name getenv @param var Name of the environment variable to retrieve (optional) -@return String containg the value of the specified variable +@return String containing the value of the specified variable @return Table containing all variables if no variable name is given ]] @@ -279,7 +279,7 @@ LuCI system utilities / user related functions. ]] ---[[ -Retrieve user informations for given uid. +Retrieve user information for given uid. @class function @name getuser @@ -305,7 +305,7 @@ Test whether given string matches the password of a given system user. @name user.checkpasswd @param username String containing the Unix user name @param pass String containing the password to compare -@return Boolean indicating wheather the passwords are equal +@return Boolean indicating whether the passwords are equal ]] ---[[ diff --git a/modules/luci-base/luasrc/sys/iptparser.lua b/modules/luci-base/luasrc/sys/iptparser.lua deleted file mode 100644 index 7ff665e7af..0000000000 --- a/modules/luci-base/luasrc/sys/iptparser.lua +++ /dev/null @@ -1,374 +0,0 @@ ---[[ - -Iptables parser and query library -(c) 2008-2009 Jo-Philipp Wich <jow@openwrt.org> -(c) 2008-2009 Steven Barth <steven@midlink.org> - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -$Id$ - -]]-- - -local luci = {} -luci.util = require "luci.util" -luci.sys = require "luci.sys" -luci.ip = require "luci.ip" - -local pcall = pcall -local io = require "io" -local tonumber, ipairs, table = tonumber, ipairs, table - -module("luci.sys.iptparser") - -IptParser = luci.util.class() - -function IptParser.__init__( self, family ) - self._family = (tonumber(family) == 6) and 6 or 4 - self._rules = { } - self._chains = { } - self._tables = { } - - local t = self._tables - local s = self:_supported_tables(self._family) - - if s.filter then t[#t+1] = "filter" end - if s.nat then t[#t+1] = "nat" end - if s.mangle then t[#t+1] = "mangle" end - if s.raw then t[#t+1] = "raw" end - - if self._family == 4 then - self._nulladdr = "0.0.0.0/0" - self._command = "iptables -t %s --line-numbers -nxvL" - else - self._nulladdr = "::/0" - self._command = "ip6tables -t %s --line-numbers -nxvL" - end - - self:_parse_rules() -end - -function IptParser._supported_tables( self, family ) - local tables = { } - local ok, lines = pcall(io.lines, - (family == 6) and "/proc/net/ip6_tables_names" - or "/proc/net/ip_tables_names") - - if ok and lines then - local line - for line in lines do - tables[line] = true - end - end - - return tables -end - --- search criteria as only argument. If args is nil or an empty table then all --- rules will be returned. --- --- The following keys in the args table are recognized: --- <ul> --- <li> table - Match rules that are located within the given table --- <li> chain - Match rules that are located within the given chain --- <li> target - Match rules with the given target --- <li> protocol - Match rules that match the given protocol, rules with --- protocol "all" are always matched --- <li> source - Match rules with the given source, rules with source --- "0.0.0.0/0" (::/0) are always matched --- <li> destination - Match rules with the given destination, rules with --- destination "0.0.0.0/0" (::/0) are always matched --- <li> inputif - Match rules with the given input interface, rules --- with input interface "*" (=all) are always matched --- <li> outputif - Match rules with the given output interface, rules --- with output interface "*" (=all) are always matched --- <li> flags - Match rules that match the given flags, current --- supported values are "-f" (--fragment) --- and "!f" (! --fragment) --- <li> options - Match rules containing all given options --- </ul> --- The return value is a list of tables representing the matched rules. --- Each rule table contains the following fields: --- <ul> --- <li> index - The index number of the rule --- <li> table - The table where the rule is located, can be one --- of "filter", "nat" or "mangle" --- <li> chain - The chain where the rule is located, e.g. "INPUT" --- or "postrouting_wan" --- <li> target - The rule target, e.g. "REJECT" or "DROP" --- <li> protocol The matching protocols, e.g. "all" or "tcp" --- <li> flags - Special rule options ("--", "-f" or "!f") --- <li> inputif - Input interface of the rule, e.g. "eth0.0" --- or "*" for all interfaces --- <li> outputif - Output interface of the rule,e.g. "eth0.0" --- or "*" for all interfaces --- <li> source - The source ip range, e.g. "0.0.0.0/0" (::/0) --- <li> destination - The destination ip range, e.g. "0.0.0.0/0" (::/0) --- <li> options - A list of specific options of the rule, --- e.g. { "reject-with", "tcp-reset" } --- <li> packets - The number of packets matched by the rule --- <li> bytes - The number of total bytes matched by the rule --- </ul> --- Example: --- <pre> --- ip = luci.sys.iptparser.IptParser() --- result = ip.find( { --- target="REJECT", --- protocol="tcp", --- options={ "reject-with", "tcp-reset" } --- } ) --- </pre> --- This will match all rules with target "-j REJECT", --- protocol "-p tcp" (or "-p all") --- and the option "--reject-with tcp-reset". -function IptParser.find( self, args ) - - local args = args or { } - local rv = { } - - args.source = args.source and self:_parse_addr(args.source) - args.destination = args.destination and self:_parse_addr(args.destination) - - for i, rule in ipairs(self._rules) do - local match = true - - -- match table - if not ( not args.table or args.table:lower() == rule.table ) then - match = false - end - - -- match chain - if not ( match == true and ( - not args.chain or args.chain == rule.chain - ) ) then - match = false - end - - -- match target - if not ( match == true and ( - not args.target or args.target == rule.target - ) ) then - match = false - end - - -- match protocol - if not ( match == true and ( - not args.protocol or rule.protocol == "all" or - args.protocol:lower() == rule.protocol - ) ) then - match = false - end - - -- match source - if not ( match == true and ( - not args.source or rule.source == self._nulladdr or - self:_parse_addr(rule.source):contains(args.source) - ) ) then - match = false - end - - -- match destination - if not ( match == true and ( - not args.destination or rule.destination == self._nulladdr or - self:_parse_addr(rule.destination):contains(args.destination) - ) ) then - match = false - end - - -- match input interface - if not ( match == true and ( - not args.inputif or rule.inputif == "*" or - args.inputif == rule.inputif - ) ) then - match = false - end - - -- match output interface - if not ( match == true and ( - not args.outputif or rule.outputif == "*" or - args.outputif == rule.outputif - ) ) then - match = false - end - - -- match flags (the "opt" column) - if not ( match == true and ( - not args.flags or rule.flags == args.flags - ) ) then - match = false - end - - -- match specific options - if not ( match == true and ( - not args.options or - self:_match_options( rule.options, args.options ) - ) ) then - match = false - end - - -- insert match - if match == true then - rv[#rv+1] = rule - end - end - - return rv -end - - --- through external commands. -function IptParser.resync( self ) - self._rules = { } - self._chain = nil - self:_parse_rules() -end - - -function IptParser.tables( self ) - return self._tables -end - - -function IptParser.chains( self, table ) - local lookup = { } - local chains = { } - for _, r in ipairs(self:find({table=table})) do - if not lookup[r.chain] then - lookup[r.chain] = true - chains[#chains+1] = r.chain - end - end - return chains -end - - --- and "rules". The "rules" field is a table of rule tables. -function IptParser.chain( self, table, chain ) - return self._chains[table:lower()] and self._chains[table:lower()][chain] -end - - -function IptParser.is_custom_target( self, target ) - for _, r in ipairs(self._rules) do - if r.chain == target then - return true - end - end - return false -end - - --- [internal] Parse address according to family. -function IptParser._parse_addr( self, addr ) - if self._family == 4 then - return luci.ip.IPv4(addr) - else - return luci.ip.IPv6(addr) - end -end - --- [internal] Parse iptables output from all tables. -function IptParser._parse_rules( self ) - - for i, tbl in ipairs(self._tables) do - - self._chains[tbl] = { } - - for i, rule in ipairs(luci.util.execl(self._command % tbl)) do - - if rule:find( "^Chain " ) == 1 then - - local crefs - local cname, cpol, cpkt, cbytes = rule:match( - "^Chain ([^%s]*) %(policy (%w+) " .. - "(%d+) packets, (%d+) bytes%)" - ) - - if not cname then - cname, crefs = rule:match( - "^Chain ([^%s]*) %((%d+) references%)" - ) - end - - self._chain = cname - self._chains[tbl][cname] = { - policy = cpol, - packets = tonumber(cpkt or 0), - bytes = tonumber(cbytes or 0), - references = tonumber(crefs or 0), - rules = { } - } - - else - if rule:find("%d") == 1 then - - local rule_parts = luci.util.split( rule, "%s+", nil, true ) - local rule_details = { } - - -- cope with rules that have no target assigned - if rule:match("^%d+%s+%d+%s+%d+%s%s") then - table.insert(rule_parts, 4, nil) - end - - -- ip6tables opt column is usually zero-width - if self._family == 6 then - table.insert(rule_parts, 6, "--") - end - - rule_details["table"] = tbl - rule_details["chain"] = self._chain - rule_details["index"] = tonumber(rule_parts[1]) - rule_details["packets"] = tonumber(rule_parts[2]) - rule_details["bytes"] = tonumber(rule_parts[3]) - rule_details["target"] = rule_parts[4] - rule_details["protocol"] = rule_parts[5] - rule_details["flags"] = rule_parts[6] - rule_details["inputif"] = rule_parts[7] - rule_details["outputif"] = rule_parts[8] - rule_details["source"] = rule_parts[9] - rule_details["destination"] = rule_parts[10] - rule_details["options"] = { } - - for i = 11, #rule_parts do - if #rule_parts[i] > 0 then - rule_details["options"][i-10] = rule_parts[i] - end - end - - self._rules[#self._rules+1] = rule_details - - self._chains[tbl][self._chain].rules[ - #self._chains[tbl][self._chain].rules + 1 - ] = rule_details - end - end - end - end - - self._chain = nil -end - - --- [internal] Return true if optlist1 contains all elements of optlist 2. --- Return false in all other cases. -function IptParser._match_options( self, o1, o2 ) - - -- construct a hashtable of first options list to speed up lookups - local oh = { } - for i, opt in ipairs( o1 ) do oh[opt] = true end - - -- iterate over second options list - -- each string in o2 must be also present in o1 - -- if o2 contains a string which is not found in o1 then return false - for i, opt in ipairs( o2 ) do - if not oh[opt] then - return false - end - end - - return true -end diff --git a/modules/luci-base/luasrc/sys/iptparser.luadoc b/modules/luci-base/luasrc/sys/iptparser.luadoc deleted file mode 100644 index 071e7d52e4..0000000000 --- a/modules/luci-base/luasrc/sys/iptparser.luadoc +++ /dev/null @@ -1,69 +0,0 @@ ----[[ -LuCI iptables parser and query library - -@cstyle instance -]] -module "luci.sys.iptparser" - ----[[ -Create a new iptables parser object. - -@class function -@name IptParser -@param family Number specifying the address family. 4 for IPv4, 6 for IPv6 -@return IptParser instance -]] - ----[[ -Find all firewall rules that match the given criteria. Expects a table with - -search criteria as only argument. If args is nil or an empty table then all -rules will be returned. -]] - ----[[ -Rebuild the internal lookup table, for example when rules have changed - -through external commands. -@class function -@name IptParser.resync -@return nothing -]] - ----[[ -Find the names of all tables. - -@class function -@name IptParser.tables -@return Table of table names. -]] - ----[[ -Find the names of all chains within the given table name. - -@class function -@name IptParser.chains -@param table String containing the table name -@return Table of chain names in the order they occur. -]] - ----[[ -Return the given firewall chain within the given table name. - -@class function -@name IptParser.chain -@param table String containing the table name -@param chain String containing the chain name -@return Table containing the fields "policy", "packets", "bytes" --- and "rules". The "rules" field is a table of rule tables. -]] - ----[[ -Test whether the given target points to a custom chain. - -@class function -@name IptParser.is_custom_target -@param target String containing the target action -@return Boolean indicating whether target is a custom chain. -]] - diff --git a/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua b/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua index 47cb901a5b..a97d2b4d60 100644 --- a/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua +++ b/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua @@ -270,7 +270,7 @@ TZ = { { 'Asia/Oral', '<+05>-5' }, { 'Asia/Phnom Penh', '<+07>-7' }, { 'Asia/Pontianak', 'WIB-7' }, - { 'Asia/Pyongyang', 'KST-8:30' }, + { 'Asia/Pyongyang', 'KST-9' }, { 'Asia/Qatar', '<+03>-3' }, { 'Asia/Qyzylorda', '<+06>-6' }, { 'Asia/Riyadh', '<+03>-3' }, @@ -358,7 +358,7 @@ TZ = { { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' }, { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Dublin', 'GMT0IST,M3.5.0/1,M10.5.0' }, + { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' }, { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' }, { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' }, { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, diff --git a/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua b/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua index cf5afeb9d8..20f57dc1b2 100644 --- a/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua +++ b/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua @@ -34,7 +34,7 @@ OFFSET = { idt = 10800, -- IDT pkt = 18000, -- PKT wita = 28800, -- WITA - kst = 30600, -- KST + kst = 32400, -- KST jst = 32400, -- JST acst = 34200, -- ACST acdt = 37800, -- ACDT diff --git a/modules/luci-base/luasrc/template.lua b/modules/luci-base/luasrc/template.lua index 588028c2ee..ed46f50753 100644 --- a/modules/luci-base/luasrc/template.lua +++ b/modules/luci-base/luasrc/template.lua @@ -95,6 +95,6 @@ function Template.render(self, scope) local stat, err = util.copcall(self.template) if not stat then error("Failed to execute template '" .. self.name .. "'.\n" .. - "A runtime error occured: " .. tostring(err or "(nil)")) + "A runtime error occurred: " .. tostring(err or "(nil)")) end end diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua index f16b3afb2e..1a329f3f20 100644 --- a/modules/luci-base/luasrc/util.lua +++ b/modules/luci-base/luasrc/util.lua @@ -262,7 +262,7 @@ end -- one token per invocation, the tokens are separated by whitespace. If the -- input value is a table, it is transformed into a string first. A nil value --- will result in a valid interator which aborts with the first invocation. +-- will result in a valid iterator which aborts with the first invocation. function imatch(v) if type(v) == "table" then local k = nil diff --git a/modules/luci-base/luasrc/util.luadoc b/modules/luci-base/luasrc/util.luadoc index c4f28d039a..4ec68dd1ef 100644 --- a/modules/luci-base/luasrc/util.luadoc +++ b/modules/luci-base/luasrc/util.luadoc @@ -158,7 +158,7 @@ Return a matching iterator for the given value. The iterator will return one token per invocation, the tokens are separated by whitespace. If the input value is a table, it is transformed into a string first. -A nil value will result in a valid interator which aborts with the first invocation. +A nil value will result in a valid iterator which aborts with the first invocation. @class function @name imatch @@ -289,7 +289,7 @@ will be stripped before it is returned. ]] ---[[ -Strips unnescessary lua bytecode from given string. +Strips unnecessary lua bytecode from given string. Information like line numbers and debugging numbers will be discarded. Original version by Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html) diff --git a/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm b/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm index b38e4b13db..dc251dbd94 100644 --- a/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm +++ b/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm @@ -63,7 +63,7 @@ if empty then %> <label class="zonebadge zonebadge-empty"> - <strong><%=zone:forward():upper()%></strong> + <strong><%=def:forward():upper()%></strong> </label> <% end %> </div> diff --git a/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm b/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm index 3a108020b6..c5addc0ddb 100644 --- a/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm +++ b/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm @@ -98,7 +98,7 @@ <span class="zonebadge"> <em><%:create%>:</em> <input type="password" style="display:none" /> - <input class="create-item-input" type="text" /> + <input class="create-item-input" type="text" data-type="and(uciname,maxlength(11))" data-optional="true" /> </span> </li> <% end %> diff --git a/modules/luci-base/po/ca/base.po b/modules/luci-base/po/ca/base.po index 9c656cc7ce..146d9fe05f 100644 --- a/modules/luci-base/po/ca/base.po +++ b/modules/luci-base/po/ca/base.po @@ -696,6 +696,9 @@ msgstr "Aplegant dades..." msgid "Command" msgstr "Ordre" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configuració comuna" @@ -1461,6 +1464,9 @@ msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "" "No mostris l'<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "Nom de màquina" @@ -2201,9 +2207,6 @@ msgstr "Cap servidor DHCP configurat en aquesta interfície" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "No hi ha cadenes en aquesta taula" - msgid "No files found" msgstr "Cap fitxer trobat" @@ -2228,7 +2231,7 @@ msgstr "No hi ha llistes de paquets disponibles" msgid "No password set!" msgstr "No hi ha cap contrasenya establerta!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "No hi ha regles en aquesta cadena" msgid "No scan results available yet..." @@ -2572,6 +2575,9 @@ msgstr "Paquets" msgid "Please enter your username and password." msgstr "Si us plau entra el teu nom d'usuari i contrasenya." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Política" @@ -2910,6 +2916,9 @@ msgstr "" "Les rutes especifiquen per quina interfície i passarel·la es pot arribar a " "un cert ordinador o xarxa." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -3026,6 +3035,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Atura aquesta interfície" @@ -4052,6 +4064,9 @@ msgstr "sí" msgid "« Back" msgstr "« Enrere" +#~ msgid "No chains in this table" +#~ msgstr "No hi ha cadenes en aquesta taula" + #~ msgid "Configuration files will be kept." #~ msgstr "Es mantindran els fitxers de configuració." diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po index 89a1404184..37cc646471 100644 --- a/modules/luci-base/po/cs/base.po +++ b/modules/luci-base/po/cs/base.po @@ -690,6 +690,9 @@ msgstr "Probíhá sběr dat..." msgid "Command" msgstr "Příkaz" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Společná nastavení" @@ -1459,6 +1462,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Skrývat <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2209,9 +2215,6 @@ msgstr "Pro toto rozhraní není nastaven žádný DHCP server" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Žádné řetězce v této tabulce" - msgid "No files found" msgstr "Nebyly nalezeny žádné soubory" @@ -2236,7 +2239,7 @@ msgstr "Seznam balíčků není k dispozici" msgid "No password set!" msgstr "Žádné heslo!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Žádná pravidla v tomto řetězci" msgid "No scan results available yet..." @@ -2581,6 +2584,9 @@ msgstr "Paketů" msgid "Please enter your username and password." msgstr "Prosím vložte vaše uživatelské jméno a heslo." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Politika" @@ -2924,6 +2930,9 @@ msgid "" msgstr "" "Trasy určují, přes jaké rozhraní a bránu může být konkrétního hosta dosaženo." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Spustit kontrolu souborového systému před připojením zařízení" @@ -3042,6 +3051,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Ukázat aktuální seznam záložních souborů" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Shodit toho rozhraní" @@ -4082,6 +4094,9 @@ msgstr "ano" msgid "« Back" msgstr "« Zpět" +#~ msgid "No chains in this table" +#~ msgstr "Žádné řetězce v této tabulce" + #~ msgid "Configuration files will be kept." #~ msgstr "Konfigurační soubory budou zachovány." diff --git a/modules/luci-base/po/de/base.po b/modules/luci-base/po/de/base.po index 261085ace8..917cf97ab6 100644 --- a/modules/luci-base/po/de/base.po +++ b/modules/luci-base/po/de/base.po @@ -714,6 +714,9 @@ msgstr "Sammle Daten..." msgid "Command" msgstr "Befehl" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Allgemeine Konfiguration" @@ -1513,6 +1516,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "ESSID verstecken" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2289,9 +2295,6 @@ msgstr "Kein DHCP Server auf dieser Schnittstelle eingerichtet" msgid "No NAT-T" msgstr "Kein NAT-T" -msgid "No chains in this table" -msgstr "Keine Ketten in dieser Tabelle" - msgid "No files found" msgstr "Keine Dateien gefunden" @@ -2317,7 +2320,7 @@ msgstr "Es sind keine Paketlisten vorhanden" msgid "No password set!" msgstr "Kein Passwort gesetzt!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Keine Regeln in dieser Kette" msgid "No scan results available yet..." @@ -2679,6 +2682,9 @@ msgstr "Pkte." msgid "Please enter your username and password." msgstr "Bitte Benutzernamen und Passwort eingeben." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Standardregel" @@ -3038,6 +3044,9 @@ msgstr "" "Netzwerkrouten geben an, über welche Schnittstellen bestimmte Rechner oder " "Netzwerke erreicht werden können" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Vor dem Einhängen Dateisystemprüfung starten " @@ -3159,6 +3168,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Zeige aktuelle Liste der gesicherten Dateien" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Diese Schnittstelle herunterfahren" @@ -4250,6 +4262,9 @@ msgstr "ja" msgid "« Back" msgstr "« Zurück" +#~ msgid "No chains in this table" +#~ msgstr "Keine Ketten in dieser Tabelle" + #~ msgid "Configuration files will be kept." #~ msgstr "Konfigurationsdateien sichern" diff --git a/modules/luci-base/po/el/base.po b/modules/luci-base/po/el/base.po index bc9a08e3c7..a8aa561187 100644 --- a/modules/luci-base/po/el/base.po +++ b/modules/luci-base/po/el/base.po @@ -699,6 +699,9 @@ msgstr "Συλλογή δεδομένων..." msgid "Command" msgstr "Εντολή" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Κοινή Παραμετροποίηση" @@ -1472,6 +1475,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Κρυφό <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2217,9 +2223,6 @@ msgstr "Δεν υπάρχει ρυθμισμένος DHCP εξυπηρετητή msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Δεν υπάρχουν αλυσίδες σε αυτόν τον πίνακα" - msgid "No files found" msgstr "Δε βρέθηκαν αρχεία" @@ -2244,7 +2247,7 @@ msgstr "Δεν υπάρχουν διαθέσιμες λίστες πακέτων msgid "No password set!" msgstr "Δεν έχει οριστεί κωδικός πρόσβασης!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Δεν υπάρχει κανόνας σε αυτή την αλυσίδα" msgid "No scan results available yet..." @@ -2588,6 +2591,9 @@ msgstr "Πκτ." msgid "Please enter your username and password." msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Πολιτική" @@ -2928,6 +2934,9 @@ msgstr "" "Οι διαδρομές ορίζουν τη διεπαφή και πύλη από την οποία κάποιος υπολογιστής ή " "δίκτυο μπορεί να είναι προσβάσιμο/ς." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Εκτέλεση ελέγχου του συστήματος αρχείων πριν προσαρτηθεί η συσκευή" @@ -3044,6 +3053,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Απενεργοποίηση αυτής της διεπαφής" @@ -4047,6 +4059,9 @@ msgstr "ναι" msgid "« Back" msgstr "« Πίσω" +#~ msgid "No chains in this table" +#~ msgstr "Δεν υπάρχουν αλυσίδες σε αυτόν τον πίνακα" + #~ msgid "Configuration files will be kept." #~ msgstr "Τα αρχεία παραμετροποίησης θα διατηρηθούν." diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po index 9371f51801..bc7bc1965d 100644 --- a/modules/luci-base/po/en/base.po +++ b/modules/luci-base/po/en/base.po @@ -687,6 +687,9 @@ msgstr "Collecting data..." msgid "Command" msgstr "Command" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Common Configuration" @@ -1448,6 +1451,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2185,9 +2191,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "No chains in this table" - msgid "No files found" msgstr "" @@ -2212,8 +2215,8 @@ msgstr "" msgid "No password set!" msgstr "" -msgid "No rules in this chain" -msgstr "No rules in this chain" +msgid "No rules in this chain." +msgstr "No rules in this chain." msgid "No scan results available yet..." msgstr "" @@ -2556,6 +2559,9 @@ msgstr "Pkts." msgid "Please enter your username and password." msgstr "Please enter your username and password." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Policy" @@ -2894,6 +2900,9 @@ msgstr "" "Routes specify over which interface and gateway a certain host or network " "can be reached." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -3009,6 +3018,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" @@ -4004,6 +4016,9 @@ msgstr "" msgid "« Back" msgstr "« Back" +#~ msgid "No chains in this table" +#~ msgstr "No chains in this table" + #~ msgid "Configuration files will be kept." #~ msgstr "Configuration files will be kept." diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po index a68c95a3a3..23632fd57a 100644 --- a/modules/luci-base/po/es/base.po +++ b/modules/luci-base/po/es/base.po @@ -696,6 +696,9 @@ msgstr "Un momento..." msgid "Command" msgstr "Comando" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configuración común" @@ -1468,6 +1471,9 @@ msgstr "Claves públicas SSH. Ponga una por línea." msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Ocultar <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2224,9 +2230,6 @@ msgstr "No se ha configurado un servidor DHCP para esta interfaz" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "No hay cadenas en esta tabla" - msgid "No files found" msgstr "No se han encontrado ficheros" @@ -2251,7 +2254,7 @@ msgstr "No hay listas de paquetes disponibles" msgid "No password set!" msgstr "¡Sin contraseña!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "No hay reglas en esta cadena" msgid "No scan results available yet..." @@ -2596,6 +2599,9 @@ msgstr "Paq." msgid "Please enter your username and password." msgstr "Por favor, introduzca su nombre de usuario y contraseña." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Política" @@ -2939,6 +2945,9 @@ msgstr "" "Las rutas especifican sobre qué interfaz y pasarela se puede llegar a una " "cierta máquina o red." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Comprobar el sistema de ficheros antes de montar el dispositivo" @@ -3057,6 +3066,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Mostrar lista de ficheros a salvar" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Apagar esta interfaz" @@ -4111,6 +4123,9 @@ msgstr "sí" msgid "« Back" msgstr "« Volver" +#~ msgid "No chains in this table" +#~ msgstr "No hay cadenas en esta tabla" + #~ msgid "Configuration files will be kept." #~ msgstr "Se mantendrán los ficheros de configuración." diff --git a/modules/luci-base/po/fr/base.po b/modules/luci-base/po/fr/base.po index dc0a0d098c..f96ecd3893 100644 --- a/modules/luci-base/po/fr/base.po +++ b/modules/luci-base/po/fr/base.po @@ -702,6 +702,9 @@ msgstr "Récupération de données..." msgid "Command" msgstr "Commande" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configuration commune" @@ -1481,6 +1484,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Cacher le ESSID" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2237,9 +2243,6 @@ msgstr "Aucun serveur DHCP configuré sur cette interface" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Aucune chaîne dans cette table" - msgid "No files found" msgstr "Aucun fichier trouvé" @@ -2264,7 +2267,7 @@ msgstr "Aucune liste de paquets disponible" msgid "No password set!" msgstr "Pas de mot de passe positionné !" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Aucune règle dans cette chaîne" msgid "No scan results available yet..." @@ -2608,6 +2611,9 @@ msgstr "Pqts." msgid "Please enter your username and password." msgstr "Saisissez votre nom d'utilisateur et mot de passe." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Politique" @@ -2950,6 +2956,9 @@ msgstr "" "Avec les routes statiques vous pouvez spécifier à travers quelle interface " "ou passerelle un réseau peut être contacté." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" "Faire un vérification du système de fichiers avant de monter le périphérique" @@ -3069,6 +3078,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Afficher la liste des fichiers de la sauvegarde actuelle" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Arrêter cet interface" @@ -4128,6 +4140,9 @@ msgstr "oui" msgid "« Back" msgstr "« Retour" +#~ msgid "No chains in this table" +#~ msgstr "Aucune chaîne dans cette table" + #~ msgid "Configuration files will be kept." #~ msgstr "Les fichiers de configuration seront préservés." diff --git a/modules/luci-base/po/he/base.po b/modules/luci-base/po/he/base.po index 0a6204aa87..0b3acb89cc 100644 --- a/modules/luci-base/po/he/base.po +++ b/modules/luci-base/po/he/base.po @@ -681,6 +681,9 @@ msgstr "אוסף מידע..." msgid "Command" msgstr "פקודה" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "הגדרות נפוצות" @@ -1432,6 +1435,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2159,9 +2165,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "" - msgid "No files found" msgstr "" @@ -2186,7 +2189,7 @@ msgstr "אין רשימת חבילות זמינה" msgid "No password set!" msgstr "לא הוגדרה סיסמה!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "" msgid "No scan results available yet..." @@ -2524,6 +2527,9 @@ msgstr "" msgid "Please enter your username and password." msgstr "אנא הזן את שם המשתמש והסיסמה שלך:" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2858,6 +2864,9 @@ msgid "" "can be reached." msgstr "" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -2974,6 +2983,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po index 724d3ea481..5a75deb784 100644 --- a/modules/luci-base/po/hu/base.po +++ b/modules/luci-base/po/hu/base.po @@ -697,6 +697,9 @@ msgstr "Adatok összegyűjtése..." msgid "Command" msgstr "Parancs" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Álatános beállítás" @@ -1470,6 +1473,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr> elrejtése" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2226,9 +2232,6 @@ msgstr "Ehhez az interfészhez nincs DHCP kiszolgáló beállítva" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Ez a tábla nem tartalmaz láncokat." - msgid "No files found" msgstr "Nem találhatók fájlok" @@ -2253,7 +2256,7 @@ msgstr "Csomaglisták nem állnak rendelkezésre" msgid "No password set!" msgstr "Nincs jelszó!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Ez a lánc nem tartalmaz szabályokat" msgid "No scan results available yet..." @@ -2598,6 +2601,9 @@ msgstr "csom." msgid "Please enter your username and password." msgstr "Adja meg a felhasználónevét és a jelszavát." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Szabály" @@ -2942,6 +2948,9 @@ msgstr "" "Az útvonalak határozzák meg, hogy bizonyos gépek illetve hálózatok melyik " "interfészen keresztül érhetők el." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Fájlrendszer ellenőrzés futtatása az eszköz csatolása előtt" @@ -3060,6 +3069,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Mentendő fájlok aktuális listájának megjelenítése" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Interfész leállítása" @@ -4117,6 +4129,9 @@ msgstr "igen" msgid "« Back" msgstr "« Vissza" +#~ msgid "No chains in this table" +#~ msgstr "Ez a tábla nem tartalmaz láncokat." + #~ msgid "Configuration files will be kept." #~ msgstr "A konfigurációs fájlok megmaradnak." diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po index adb5c65b3e..b81b9c875e 100644 --- a/modules/luci-base/po/it/base.po +++ b/modules/luci-base/po/it/base.po @@ -703,6 +703,9 @@ msgstr "Raccolgo i dati..." msgid "Command" msgstr "Comando" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configurazioni Comuni" @@ -1475,6 +1478,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Nascondi <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2227,9 +2233,6 @@ msgstr "Nessun Server DHCP configurato per questa interfaccia" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "" - msgid "No files found" msgstr "Nessun file trovato" @@ -2254,7 +2257,7 @@ msgstr "Nessuna lista pacchetti disponibile" msgid "No password set!" msgstr "Nessuna password immessa!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Nessuna regola in questa catena" msgid "No scan results available yet..." @@ -2599,6 +2602,9 @@ msgstr "" msgid "Please enter your username and password." msgstr "Per favore inserisci il tuo username e la password." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2940,6 +2946,9 @@ msgstr "" "Le route specificano attraverso quale interfaccia e gateway un certo host o " "rete può essere raggiunto." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Esegui un controllo del filesystem prima di montare il dispositivo" @@ -3055,6 +3064,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" diff --git a/modules/luci-base/po/ja/base.po b/modules/luci-base/po/ja/base.po index 122b285acc..f3847f64f1 100644 --- a/modules/luci-base/po/ja/base.po +++ b/modules/luci-base/po/ja/base.po @@ -705,6 +705,9 @@ msgstr "データ収集中です..." msgid "Command" msgstr "コマンド" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "一般設定" @@ -1493,6 +1496,9 @@ msgstr "SSH公開鍵認証で使用するSSH公開鍵を1行づつペースト msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>の隠匿" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "ホスト" @@ -2254,9 +2260,6 @@ msgstr "このインターフェースにはDHCPサーバーが設定されて msgid "No NAT-T" msgstr "NAT-Tを使用しない" -msgid "No chains in this table" -msgstr "チェイン内にルールがありません" - msgid "No files found" msgstr "ファイルが見つかりませんでした" @@ -2281,7 +2284,7 @@ msgstr "パッケージ リストがありません" msgid "No password set!" msgstr "パスワードが設定されていません!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "チェイン内にルールがありません" msgid "No scan results available yet..." @@ -2633,6 +2636,9 @@ msgstr "パケット" msgid "Please enter your username and password." msgstr "ユーザー名とパスワードを入力してください。" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "ポリシー" @@ -2984,6 +2990,9 @@ msgstr "" "特定のホスト又はネットワークに、どのインターフェース及びゲートウェイを通して" "通信を行うか、経路情報を設定します。" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "デバイスのマウントを行う前にファイルシステムチェックを行う" @@ -3104,6 +3113,9 @@ msgstr "Short Preamble" msgid "Show current backup file list" msgstr "現在のバックアップファイルのリストを表示する" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "インターフェースを終了" @@ -4163,3 +4175,6 @@ msgstr "はい" msgid "« Back" msgstr "« 戻る" + +#~ msgid "No chains in this table" +#~ msgstr "チェイン内にルールがありません" diff --git a/modules/luci-base/po/ko/base.po b/modules/luci-base/po/ko/base.po index fa22c23bb3..2f94e495fa 100644 --- a/modules/luci-base/po/ko/base.po +++ b/modules/luci-base/po/ko/base.po @@ -683,6 +683,9 @@ msgstr "Data 를 수집중입니다..." msgid "Command" msgstr "명령어" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "공통 설정" @@ -1447,6 +1450,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr> 숨기기" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "호스트" @@ -2176,9 +2182,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "이 table 에는 정의된 chain 이 없음" - msgid "No files found" msgstr "" @@ -2203,7 +2206,7 @@ msgstr "" msgid "No password set!" msgstr "암호 설정을 해주세요!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "" msgid "No scan results available yet..." @@ -2549,6 +2552,9 @@ msgstr "Pkts." msgid "Please enter your username and password." msgstr "사용자이름과 암호를 입력해 주세요." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2887,6 +2893,9 @@ msgstr "" "Route 경로는 특정 호스트 혹은 네트워크가 사용해야 할 인터페이스와 gateway 정" "보를 나타냅니다." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -3002,6 +3011,9 @@ msgstr "" msgid "Show current backup file list" msgstr "현재 백업 파일 목록 보기" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "이 인터페이스를 정지합니다" @@ -4009,6 +4021,9 @@ msgstr "" msgid "« Back" msgstr "" +#~ msgid "No chains in this table" +#~ msgstr "이 table 에는 정의된 chain 이 없음" + #~ msgid "Activate this network" #~ msgstr "이 네트워를 활성화합니다" diff --git a/modules/luci-base/po/ms/base.po b/modules/luci-base/po/ms/base.po index 715c3100d1..42c020806b 100644 --- a/modules/luci-base/po/ms/base.po +++ b/modules/luci-base/po/ms/base.po @@ -666,6 +666,9 @@ msgstr "" msgid "Command" msgstr "Perintah" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "" @@ -1419,6 +1422,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Menyembunyikan ESSID" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2157,9 +2163,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Tiada rantai dalam jadual ini" - msgid "No files found" msgstr "" @@ -2184,7 +2187,7 @@ msgstr "" msgid "No password set!" msgstr "" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Tidak ada peraturan dalam rantai ini" msgid "No scan results available yet..." @@ -2527,6 +2530,9 @@ msgstr "Pkts." msgid "Please enter your username and password." msgstr "Sila masukkan username dan kata laluan anda." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Dasar" @@ -2864,6 +2870,9 @@ msgstr "" "Laluan menentukan di mana interface dan gateway host atau rangkaian tertentu " "yang boleh dicapai." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -2979,6 +2988,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" @@ -3970,6 +3982,9 @@ msgstr "" msgid "« Back" msgstr "« Kembali" +#~ msgid "No chains in this table" +#~ msgstr "Tiada rantai dalam jadual ini" + #~ msgid "help" #~ msgstr "Membantu" diff --git a/modules/luci-base/po/no/base.po b/modules/luci-base/po/no/base.po index 70ed34b42c..dd4094df64 100644 --- a/modules/luci-base/po/no/base.po +++ b/modules/luci-base/po/no/base.po @@ -687,6 +687,9 @@ msgstr "Henter data..." msgid "Command" msgstr "Kommando" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Vanlige Innstillinger" @@ -1456,6 +1459,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Skjul <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2201,9 +2207,6 @@ msgstr "Ingen DHCP server er konfigurert for dette grensesnittet" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Ingen lenker i denne tabellen" - msgid "No files found" msgstr "Ingen filer funnet" @@ -2228,7 +2231,7 @@ msgstr "Ingen pakkelister tilgjengelig" msgid "No password set!" msgstr "Ruteren er ikke passordbeskyttet!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Ingen regler i denne tabellen" msgid "No scan results available yet..." @@ -2574,6 +2577,9 @@ msgstr "Pakker." msgid "Please enter your username and password." msgstr "Skriv inn ditt brukernavn og passord." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Policy" @@ -2916,6 +2922,9 @@ msgstr "" "Ruter, angir hvilket nettverksgrensesnitt og hvilken gateway som brukes for " "å nå et gitt nettverk eller vert." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Kjør filsystem sjekk før montering av enheten" @@ -3034,6 +3043,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Vis gjeldende liste med sikkerhetskopifiler" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Slå av dette grensesnittet" @@ -4083,6 +4095,9 @@ msgstr "ja" msgid "« Back" msgstr "« Tilbake" +#~ msgid "No chains in this table" +#~ msgstr "Ingen lenker i denne tabellen" + #~ msgid "Configuration files will be kept." #~ msgstr "Konfigurasjonsfiler vil bli bevart." diff --git a/modules/luci-base/po/pl/base.po b/modules/luci-base/po/pl/base.po index cf6ffccc57..c811c1316a 100644 --- a/modules/luci-base/po/pl/base.po +++ b/modules/luci-base/po/pl/base.po @@ -712,6 +712,9 @@ msgstr "Zbieranie danych..." msgid "Command" msgstr "Polecenie" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Konfiguracja podstawowa" @@ -1506,6 +1509,9 @@ msgstr "" "Ukryj <abbr title=\"Extended Service Set Identifier (Nazwę sieci)\">ESSID</" "abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2261,9 +2267,6 @@ msgstr "Brak skonfigurowanego serwera DHCP dla tego interfejsu" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Brak łańcuchów w tej tablicy" - msgid "No files found" msgstr "Nie znaleziono plików" @@ -2288,7 +2291,7 @@ msgstr "Lista pakietów nie jest dostępna" msgid "No password set!" msgstr "Nie ustawiono hasła!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Brak zasad w tym łańcuchu" msgid "No scan results available yet..." @@ -2639,6 +2642,9 @@ msgstr "Pktw." msgid "Please enter your username and password." msgstr "Proszę wprowadź swój login i hasło." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Zasada" @@ -2988,6 +2994,9 @@ msgstr "" "Ścieżki routingu pokazują routerowi przez który interfejs oraz którą bramę " "może skomunikować się z daną siecią lub komputerem." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" "Sprawdź czy system plików nie zawiera błędów przed zamontowaniem urządzenia" @@ -3112,6 +3121,9 @@ msgstr "Krótki Wstęp" msgid "Show current backup file list" msgstr "Pokaż aktualną listę plików do backupu" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Wyłącz ten interfejs" @@ -4182,6 +4194,9 @@ msgstr "tak" msgid "« Back" msgstr "« Wróć" +#~ msgid "No chains in this table" +#~ msgstr "Brak łańcuchów w tej tablicy" + #~ msgid "Configuration files will be kept." #~ msgstr "Pliki konfiguracyjne zostaną zachowane." diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po index 40440c1242..42f9d505d8 100644 --- a/modules/luci-base/po/pt-br/base.po +++ b/modules/luci-base/po/pt-br/base.po @@ -744,6 +744,9 @@ msgstr "Coletando dados..." msgid "Command" msgstr "Comando" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configuração Comum" @@ -1570,6 +1573,9 @@ msgstr "" "Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos" "\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "Equipamento" @@ -2361,9 +2367,6 @@ msgstr "Nenhum Servidor DHCP configurado para esta interface" msgid "No NAT-T" msgstr "Sem NAT-T" -msgid "No chains in this table" -msgstr "Nenhuma cadeira nesta tabela" - msgid "No files found" msgstr "Nenhum arquivo encontrado" @@ -2388,7 +2391,7 @@ msgstr "Nenhuma lista de pacotes disponível" msgid "No password set!" msgstr "Nenhuma senha definida!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Sem regras nesta cadeia" msgid "No scan results available yet..." @@ -2755,6 +2758,9 @@ msgstr "Pcts." msgid "Please enter your username and password." msgstr "Entre com o seu usuário e senha." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Política" @@ -3116,6 +3122,9 @@ msgstr "" "As rotas especificam através de qual interface e roteador um certo destino " "podem ser alcançado." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" "Execute a verificação do sistema de arquivos antes da montagem do dispositivo" @@ -3244,6 +3253,9 @@ msgstr "Preâmbulo curto" msgid "Show current backup file list" msgstr "Mostra a lista atual de arquivos para a cópia de segurança" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Desligar esta interface" @@ -4342,6 +4354,9 @@ msgstr "sim" msgid "« Back" msgstr "« Voltar" +#~ msgid "No chains in this table" +#~ msgstr "Nenhuma cadeira nesta tabela" + #~ msgid "Configuration files will be kept." #~ msgstr "Os arquivos de configuração serão mantidos." diff --git a/modules/luci-base/po/pt/base.po b/modules/luci-base/po/pt/base.po index e967b06681..394572c631 100644 --- a/modules/luci-base/po/pt/base.po +++ b/modules/luci-base/po/pt/base.po @@ -700,6 +700,9 @@ msgstr "A obter dados..." msgid "Command" msgstr "Comando" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configuração comum" @@ -1477,6 +1480,9 @@ msgstr "" "Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos" "\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2225,9 +2231,6 @@ msgstr "Sem Servidor DHCP configurado nesta interface" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Tabela sem chains" - msgid "No files found" msgstr "Não foram encontrados ficheiros" @@ -2252,7 +2255,7 @@ msgstr "Não há listas de pacotes disponiveis" msgid "No password set!" msgstr "Sem password definida!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Sem regras nesta cadeia" msgid "No scan results available yet..." @@ -2596,6 +2599,9 @@ msgstr "Pkts." msgid "Please enter your username and password." msgstr "Insira o seu username e password." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Política" @@ -2936,6 +2942,9 @@ msgstr "" "As rotas especificam através de que interfaces ou gateways podem ser " "alcançados determinadas redes ou hosts." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" "Correr uma verificação do sistema de ficheiros antes de montar um dispositivo" @@ -3053,6 +3062,9 @@ msgstr "" msgid "Show current backup file list" msgstr "Mostrar lista ficheiros para backup" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Desligar esta interface" @@ -4079,6 +4091,9 @@ msgstr "sim" msgid "« Back" msgstr "« Voltar" +#~ msgid "No chains in this table" +#~ msgstr "Tabela sem chains" + #~ msgid "Configuration files will be kept." #~ msgstr "Os ficheiros de configuração serão mantidos." diff --git a/modules/luci-base/po/ro/base.po b/modules/luci-base/po/ro/base.po index 6a0bcf130e..e3bb7bb82a 100644 --- a/modules/luci-base/po/ro/base.po +++ b/modules/luci-base/po/ro/base.po @@ -676,6 +676,9 @@ msgstr "Colectez datele.." msgid "Command" msgstr "Comanda" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Configurarea obisnuita" @@ -1426,6 +1429,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Ascunde <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2156,9 +2162,6 @@ msgstr "Nici un server DHCP configurat pentru aceasta interfata" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "" - msgid "No files found" msgstr "Nici un fisier gasit" @@ -2183,7 +2186,7 @@ msgstr "" msgid "No password set!" msgstr "Nici o parola setata !" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "" msgid "No scan results available yet..." @@ -2521,6 +2524,9 @@ msgstr "Packete." msgid "Please enter your username and password." msgstr "Introdu utilizatorul si parola." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2857,6 +2863,9 @@ msgid "" "can be reached." msgstr "" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -2973,6 +2982,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Opreste aceasta interfata" diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po index bcee9876b3..32ce465325 100644 --- a/modules/luci-base/po/ru/base.po +++ b/modules/luci-base/po/ru/base.po @@ -727,6 +727,9 @@ msgstr "Сбор данных..." msgid "Command" msgstr "Команда" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Общие настройки" @@ -1521,6 +1524,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Скрыть <abbr title=\"Расширенный идентификатор сети\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "Хост" @@ -2292,9 +2298,6 @@ msgstr "DHCP-сервер не настроен для этого интерфе msgid "No NAT-T" msgstr "Без NAT-T" -msgid "No chains in this table" -msgstr "Нет цепочек в этой таблице" - msgid "No files found" msgstr "Файлы не найдены" @@ -2319,7 +2322,7 @@ msgstr "Список пакетов не доступен" msgid "No password set!" msgstr "Пароль не установлен!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Нет правил в данной цепочке" msgid "No scan results available yet..." @@ -2681,6 +2684,9 @@ msgstr "Пакетов" msgid "Please enter your username and password." msgstr "Введите логин и пароль." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Политика" @@ -3042,6 +3048,9 @@ msgstr "" "Маршрутизация служит для определения через, какой интерфейс и шлюз можно " "достичь определенного хоста или сети." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Проверять файловую систему перед монтированием раздела." @@ -3163,6 +3172,9 @@ msgstr "Короткая преамбула" msgid "Show current backup file list" msgstr "Показать текущий список файлов резервной копии" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Выключить этот интерфейс" @@ -4243,6 +4255,9 @@ msgstr "да" msgid "« Back" msgstr "« Назад" +#~ msgid "No chains in this table" +#~ msgstr "Нет цепочек в этой таблице" + #~ msgid "Configuration files will be kept." #~ msgstr "Config файлы будут сохранены." diff --git a/modules/luci-base/po/sk/base.po b/modules/luci-base/po/sk/base.po index a0b0464b23..c944c85ec9 100644 --- a/modules/luci-base/po/sk/base.po +++ b/modules/luci-base/po/sk/base.po @@ -659,6 +659,9 @@ msgstr "" msgid "Command" msgstr "" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "" @@ -1404,6 +1407,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2131,9 +2137,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "" - msgid "No files found" msgstr "" @@ -2158,7 +2161,7 @@ msgstr "" msgid "No password set!" msgstr "" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "" msgid "No scan results available yet..." @@ -2496,6 +2499,9 @@ msgstr "" msgid "Please enter your username and password." msgstr "" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2830,6 +2836,9 @@ msgid "" "can be reached." msgstr "" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -2945,6 +2954,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" diff --git a/modules/luci-base/po/sv/base.po b/modules/luci-base/po/sv/base.po index fddaa3fd80..53f929c3f9 100644 --- a/modules/luci-base/po/sv/base.po +++ b/modules/luci-base/po/sv/base.po @@ -673,6 +673,9 @@ msgstr "Samlar in data..." msgid "Command" msgstr "Kommando" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Vanlig konfiguration" @@ -1424,6 +1427,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Göm <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "Värd" @@ -2152,9 +2158,6 @@ msgstr "Det finns ingen DHCP-server inställd för det här gränssnittet" msgid "No NAT-T" msgstr "Ingen NAT-T" -msgid "No chains in this table" -msgstr "Inga kedjor i den här tabellen" - msgid "No files found" msgstr "Inga filer hittades" @@ -2179,7 +2182,7 @@ msgstr "Ingen paketlista tillgänglig" msgid "No password set!" msgstr "Inget lösenord inställt!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Inga regler i den här kedjan" msgid "No scan results available yet..." @@ -2517,6 +2520,9 @@ msgstr "Pkt." msgid "Please enter your username and password." msgstr "Vänligen ange ditt användarnamn och lösenord." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2853,6 +2859,9 @@ msgid "" "can be reached." msgstr "" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Kör en filsystemskontroll innan enheten monteras" @@ -2968,6 +2977,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Stäng ner det här gränssnittet" @@ -3947,6 +3959,9 @@ msgstr "ja" msgid "« Back" msgstr "« Bakåt" +#~ msgid "No chains in this table" +#~ msgstr "Inga kedjor i den här tabellen" + #~ msgid "Configuration files will be kept." #~ msgstr "Konfigurationsfiler kommer att behållas." diff --git a/modules/luci-base/po/templates/base.pot b/modules/luci-base/po/templates/base.pot index bc45638564..3424eee506 100644 --- a/modules/luci-base/po/templates/base.pot +++ b/modules/luci-base/po/templates/base.pot @@ -652,6 +652,9 @@ msgstr "" msgid "Command" msgstr "" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "" @@ -1397,6 +1400,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2124,9 +2130,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "" - msgid "No files found" msgstr "" @@ -2151,7 +2154,7 @@ msgstr "" msgid "No password set!" msgstr "" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "" msgid "No scan results available yet..." @@ -2489,6 +2492,9 @@ msgstr "" msgid "Please enter your username and password." msgstr "" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2823,6 +2829,9 @@ msgid "" "can be reached." msgstr "" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -2938,6 +2947,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" diff --git a/modules/luci-base/po/tr/base.po b/modules/luci-base/po/tr/base.po index b84b0657bc..769619f5d5 100644 --- a/modules/luci-base/po/tr/base.po +++ b/modules/luci-base/po/tr/base.po @@ -675,6 +675,9 @@ msgstr "" msgid "Command" msgstr "" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "" @@ -1422,6 +1425,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2149,9 +2155,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "" - msgid "No files found" msgstr "" @@ -2176,7 +2179,7 @@ msgstr "" msgid "No password set!" msgstr "" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "" msgid "No scan results available yet..." @@ -2514,6 +2517,9 @@ msgstr "" msgid "Please enter your username and password." msgstr "" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "" @@ -2848,6 +2854,9 @@ msgid "" "can be reached." msgstr "" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Cihazı bağlamadan önce bir dosya sistemi kontrolü yapın" @@ -2963,6 +2972,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po index 4dab4f6ba8..070eaa324a 100644 --- a/modules/luci-base/po/uk/base.po +++ b/modules/luci-base/po/uk/base.po @@ -734,6 +734,9 @@ msgstr "Збирання даних..." msgid "Command" msgstr "Команда" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "Загальна конфігурація" @@ -1536,6 +1539,9 @@ msgstr "" "Приховати <abbr title=\"Extended Service Set Identifier — ідентифікатор " "розширеної служби послуг\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "Вузол" @@ -2318,9 +2324,6 @@ msgstr "Немає DHCP-сервера, налаштованого для цьо msgid "No NAT-T" msgstr "Немає NAT-T" -msgid "No chains in this table" -msgstr "У цій таблиці немає ланцюжків" - msgid "No files found" msgstr "Файли не знайдено" @@ -2345,7 +2348,7 @@ msgstr "Немає доступних списків пакетів" msgid "No password set!" msgstr "Пароль не встановлено!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "У цьму ланцюжку нема правил" msgid "No scan results available yet..." @@ -2709,6 +2712,9 @@ msgstr "пакетів" msgid "Please enter your username and password." msgstr "Введіть ім’я користувача і пароль." +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Політика" @@ -3061,6 +3067,9 @@ msgstr "" "Маршрути визначають через який інтерфейс і шлюз можна досягнути певного " "вузла або мережі." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "Виконати перевірку файлової системи перед монтуванням пристрою" @@ -3183,6 +3192,9 @@ msgstr "Коротка преамбула" msgid "Show current backup file list" msgstr "Показати поточний список файлів резервного копіювання" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "Вимкнути цей інтерфейс" @@ -4264,3 +4276,6 @@ msgstr "так" msgid "« Back" msgstr "« Назад" + +#~ msgid "No chains in this table" +#~ msgstr "У цій таблиці немає ланцюжків" diff --git a/modules/luci-base/po/vi/base.po b/modules/luci-base/po/vi/base.po index 3ad0a0bfef..83566f27b1 100644 --- a/modules/luci-base/po/vi/base.po +++ b/modules/luci-base/po/vi/base.po @@ -666,6 +666,9 @@ msgstr "" msgid "Command" msgstr "Lệnh" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "" @@ -1424,6 +1427,9 @@ msgstr "" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "Giấu <abbr title=\"Chế độ mở rộng đặt Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2161,9 +2167,6 @@ msgstr "" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "Không có chuỗi trong bảng này" - msgid "No files found" msgstr "" @@ -2188,7 +2191,7 @@ msgstr "" msgid "No password set!" msgstr "" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "Không có quy luật trong chuỗi này" msgid "No scan results available yet..." @@ -2532,6 +2535,9 @@ msgstr "" msgid "Please enter your username and password." msgstr "Nhập tên và mật mã" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "Chính sách" @@ -2870,6 +2876,9 @@ msgstr "" "Routes chỉ định trên giao diện và cổng một host nhất định hay network được " "tiếp cận." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "" @@ -2985,6 +2994,9 @@ msgstr "" msgid "Show current backup file list" msgstr "" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "" @@ -3975,6 +3987,9 @@ msgstr "" msgid "« Back" msgstr "" +#~ msgid "No chains in this table" +#~ msgstr "Không có chuỗi trong bảng này" + #~ msgid "Backup / Restore" #~ msgstr "Backup/ Restore" diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po index df8fd735ba..a0534db70e 100644 --- a/modules/luci-base/po/zh-cn/base.po +++ b/modules/luci-base/po/zh-cn/base.po @@ -677,6 +677,9 @@ msgstr "正在收集数据…" msgid "Command" msgstr "命令" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "一般配置" @@ -1442,6 +1445,9 @@ msgstr "请在此处粘贴 SSH 公钥,每行一个,用于 SSH 公钥认证 msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "隐藏 <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "主机" @@ -2185,9 +2191,6 @@ msgstr "本接口未配置 DHCP 服务器" msgid "No NAT-T" msgstr "无 NAT-T" -msgid "No chains in this table" -msgstr "本表中没有链" - msgid "No files found" msgstr "未找到文件" @@ -2212,7 +2215,7 @@ msgstr "无可用软件列表" msgid "No password set!" msgstr "未设置密码!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "本链没有规则" msgid "No scan results available yet..." @@ -2560,6 +2563,9 @@ msgstr "数据包" msgid "Please enter your username and password." msgstr "请输入用户名和密码。" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "策略" @@ -2904,6 +2910,9 @@ msgid "" "can be reached." msgstr "路由表描述了数据包的可达路径。" +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "挂载设备前运行文件系统检查" @@ -3021,6 +3030,9 @@ msgstr "Short Preamble" msgid "Show current backup file list" msgstr "显示当前备份文件列表" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "关闭此接口" @@ -4036,6 +4048,9 @@ msgstr "是" msgid "« Back" msgstr "« 后退" +#~ msgid "No chains in this table" +#~ msgstr "本表中没有链" + #~ msgid "Configuration files will be kept." #~ msgstr "配置文件将被保留。" diff --git a/modules/luci-base/po/zh-tw/base.po b/modules/luci-base/po/zh-tw/base.po index 8dac1b7744..c34e0fe7b0 100644 --- a/modules/luci-base/po/zh-tw/base.po +++ b/modules/luci-base/po/zh-tw/base.po @@ -675,6 +675,9 @@ msgstr "收集資料中..." msgid "Command" msgstr "指令" +msgid "Comment" +msgstr "" + msgid "Common Configuration" msgstr "一般設定" @@ -1433,6 +1436,9 @@ msgstr "在這裡貼上公用SSH-Keys (每行一個)以便驗證" msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" msgstr "隱藏 <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>" +msgid "Hide empty chains" +msgstr "" + msgid "Host" msgstr "" @@ -2166,9 +2172,6 @@ msgstr "在這個介面尚無DHCP伺服器" msgid "No NAT-T" msgstr "" -msgid "No chains in this table" -msgstr "尚未綁在這個表格中" - msgid "No files found" msgstr "尚未發現任何檔案" @@ -2193,7 +2196,7 @@ msgstr "尚無列出的軟體包可運用" msgid "No password set!" msgstr "尚未設定密碼!" -msgid "No rules in this chain" +msgid "No rules in this chain." msgstr "尚無規則在這個鏈接上" msgid "No scan results available yet..." @@ -2535,6 +2538,9 @@ msgstr "封包數." msgid "Please enter your username and password." msgstr "請輸入您的用戶名稱和密碼" +msgid "Please update package lists first" +msgstr "" + msgid "Policy" msgstr "策略" @@ -2873,6 +2879,9 @@ msgid "" "can be reached." msgstr "路由器指定介面導出到特定主機或者能夠到達的網路." +msgid "Rule" +msgstr "" + msgid "Run a filesystem check before mounting the device" msgstr "掛載這個設備前先跑系統檢查" @@ -2989,6 +2998,9 @@ msgstr "" msgid "Show current backup file list" msgstr "顯示現今的備份檔清單" +msgid "Show empty chains" +msgstr "" + msgid "Shutdown this interface" msgstr "關閉這個介面" @@ -4005,6 +4017,9 @@ msgstr "是的" msgid "« Back" msgstr "« 倒退" +#~ msgid "No chains in this table" +#~ msgstr "尚未綁在這個表格中" + #~ msgid "Configuration files will be kept." #~ msgstr "設定檔將被存檔" diff --git a/modules/luci-base/src/template_utils.c b/modules/luci-base/src/template_utils.c index 3979487f12..0411932ce9 100644 --- a/modules/luci-base/src/template_utils.c +++ b/modules/luci-base/src/template_utils.c @@ -258,7 +258,7 @@ static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf) break; } - /* advance beyound the last found valid continuation char */ + /* advance beyond the last found valid continuation char */ o = v; ptr += v; } diff --git a/modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua b/modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua index 8be354b448..bff859befa 100644 --- a/modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua +++ b/modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua @@ -284,7 +284,7 @@ if not net:is_floating() then ifname_single = s:taboption("physical", Value, "ifname_single", translate("Interface")) ifname_single.template = "cbi/network_ifacelist" ifname_single.widget = "radio" - ifname_single.nobridges = true + ifname_single.nobridges = net:is_bridge() ifname_single.noaliases = false ifname_single.rmempty = false ifname_single.network = arg[1] @@ -341,7 +341,7 @@ end if not net:is_virtual() then ifname_multi = s:taboption("physical", Value, "ifname_multi", translate("Interface")) ifname_multi.template = "cbi/network_ifacelist" - ifname_multi.nobridges = true + ifname_multi.nobridges = net:is_bridge() ifname_multi.noaliases = true ifname_multi.rmempty = false ifname_multi.network = arg[1] diff --git a/modules/luci-mod-status/luasrc/controller/admin/status.lua b/modules/luci-mod-status/luasrc/controller/admin/status.lua index 4f04cce545..5b496d83f2 100644 --- a/modules/luci-mod-status/luasrc/controller/admin/status.lua +++ b/modules/luci-mod-status/luasrc/controller/admin/status.lua @@ -8,6 +8,7 @@ function index() entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1) entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true + entry({"admin", "status", "iptables_dump"}, call("dump_iptables")).leaf = true entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3) @@ -44,6 +45,37 @@ function action_dmesg() luci.template.render("admin_status/dmesg", {dmesg=dmesg}) end +function dump_iptables(family, table) + local prefix = (family == "6") and "ip6" or "ip" + local ok, lines = pcall(io.lines, "/proc/net/%s_tables_names" % prefix) + if ok and lines then + local s + for s in lines do + if s == table then + local ipt = io.popen( + "/usr/sbin/%stables -t %s --line-numbers -nxvL" + %{ prefix, table }) + + if ipt then + luci.http.prepare_content("text/plain") + + while true do + s = ipt:read(1024) + if not s then break end + luci.http.write(s) + end + + ipt:close() + return + end + end + end + end + + luci.http.status(404, "No such table") + luci.http.prepare_content("text/plain") +end + function action_iptables() if luci.http.formvalue("zero") then if luci.http.formvalue("family") == "6" then diff --git a/modules/luci-mod-status/luasrc/view/admin_status/iptables.htm b/modules/luci-mod-status/luasrc/view/admin_status/iptables.htm index 51e428e40e..50defac90e 100644 --- a/modules/luci-mod-status/luasrc/view/admin_status/iptables.htm +++ b/modules/luci-mod-status/luasrc/view/admin_status/iptables.htm @@ -1,16 +1,11 @@ <%# Copyright 2008-2009 Steven Barth <steven@midlink.org> - Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org> + Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io> Licensed to the public under the Apache License 2.0. -%> <%- - - require "luci.sys.iptparser" - local wba = require "luci.tools.webadmin" local fs = require "nixio.fs" - local io = require "io" - local has_ip6tables = fs.access("/usr/sbin/ip6tables") local mode = 4 @@ -18,56 +13,286 @@ 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> @@ -78,78 +303,18 @@ </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%> diff --git a/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua b/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua index a68c439141..7558d42161 100644 --- a/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua +++ b/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua @@ -130,7 +130,7 @@ end -- --- Langauge & Style +-- Language & Style -- o = s:taboption("language", ListValue, "_lang", translate("Language")) diff --git a/modules/luci-mod-system/luasrc/view/admin_system/packages.htm b/modules/luci-mod-system/luasrc/view/admin_system/packages.htm index 280eabb8ea..39582c6a93 100644 --- a/modules/luci-mod-system/luasrc/view/admin_system/packages.htm +++ b/modules/luci-mod-system/luasrc/view/admin_system/packages.htm @@ -102,16 +102,16 @@ end <div class="cbi-value"> <label class="cbi-value-title"><%:Download and install package%>:</label> <div class="cbi-value-field"> - <span><input type="text" name="url" size="30" value="" /></span> - <input class="cbi-button cbi-button-save" type="submit" name="go" value="<%:OK%>" /> + <span><input type="text" name="url" size="30" <% if no_lists then %>disabled="disabled" placeholder="<%:Please update package lists first%>"<% end %> value="" /></span> + <input class="cbi-button cbi-button-save" type="submit" name="go" <% if no_lists then %>disabled="disabled"<% end %> value="<%:OK%>" /> </div> </div> <div class="cbi-value cbi-value-last"> <label class="cbi-value-title"><%:Filter%>:</label> <div class="cbi-value-field"> - <span><input type="text" name="query" size="20" value="<%=pcdata(query)%>" /></span> - <input type="submit" class="cbi-button cbi-button-action" name="search" value="<%:Find package%>" /> + <span><input type="text" name="query" size="20" <% if no_lists then %>disabled="disabled" placeholder="<%:Please update package lists first%>"<% else %>value="<%=pcdata(query)%>"<% end %> /></span> + <input type="submit" class="cbi-button cbi-button-action" name="search" <% if no_lists then %>disabled="disabled"<% end %> value="<%:Find package%>" /> </div> </div> </div> |