mirror of
https://github.com/Ysurac/openmptcprouter-feeds.git
synced 2025-03-09 15:40:03 +00:00
Update luci-base
This commit is contained in:
parent
f7b2096fa2
commit
b2999bb6b2
64 changed files with 2089 additions and 2008 deletions
|
@ -12,8 +12,7 @@ LUCI_TYPE:=mod
|
||||||
LUCI_BASENAME:=base
|
LUCI_BASENAME:=base
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI core libraries
|
LUCI_TITLE:=LuCI core libraries
|
||||||
LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc
|
LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +liblucihttp-lua
|
||||||
LUCI_EXTRA_DEPENDS:=libuci-lua (>= 2018-01-01)
|
|
||||||
|
|
||||||
PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
|
PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
|
||||||
PKG_SOURCE_URL:=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/luasrcdiet
|
PKG_SOURCE_URL:=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/luasrcdiet
|
||||||
|
|
|
@ -218,12 +218,13 @@ var cbi_validators = {
|
||||||
((ipv4only == 1) && cbi_validators.ip4addr.apply(this));
|
((ipv4only == 1) && cbi_validators.ip4addr.apply(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
'hostname': function()
|
'hostname': function(strict)
|
||||||
{
|
{
|
||||||
if (this.length <= 253)
|
if (this.length <= 253)
|
||||||
return (this.match(/^[a-zA-Z0-9]+$/) != null ||
|
return (this.match(/^[a-zA-Z0-9_]+$/) != null ||
|
||||||
(this.match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) &&
|
(this.match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) &&
|
||||||
this.match(/[^0-9.]/)));
|
this.match(/[^0-9.]/))) &&
|
||||||
|
(!strict || !this.match(/^_/));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
|
@ -39,7 +39,7 @@ XHR = function()
|
||||||
this._xmlHttp.abort();
|
this._xmlHttp.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.get = function(url,data,callback)
|
this.get = function(url,data,callback,timeout)
|
||||||
{
|
{
|
||||||
this.reinit();
|
this.reinit();
|
||||||
|
|
||||||
|
@ -56,6 +56,9 @@ XHR = function()
|
||||||
|
|
||||||
xhr.open('GET', url, true);
|
xhr.open('GET', url, true);
|
||||||
|
|
||||||
|
if (!isNaN(timeout))
|
||||||
|
xhr.timeout = timeout;
|
||||||
|
|
||||||
xhr.onreadystatechange = function()
|
xhr.onreadystatechange = function()
|
||||||
{
|
{
|
||||||
if (xhr.readyState == 4) {
|
if (xhr.readyState == 4) {
|
||||||
|
@ -76,7 +79,7 @@ XHR = function()
|
||||||
xhr.send(null);
|
xhr.send(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.post = function(url,data,callback)
|
this.post = function(url,data,callback,timeout)
|
||||||
{
|
{
|
||||||
this.reinit();
|
this.reinit();
|
||||||
|
|
||||||
|
@ -90,6 +93,10 @@ XHR = function()
|
||||||
}
|
}
|
||||||
|
|
||||||
xhr.open('POST', url, true);
|
xhr.open('POST', url, true);
|
||||||
|
|
||||||
|
if (!isNaN(timeout))
|
||||||
|
xhr.timeout = timeout;
|
||||||
|
|
||||||
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
||||||
xhr.send(code);
|
xhr.send(code);
|
||||||
}
|
}
|
||||||
|
@ -168,7 +175,7 @@ XHR.get = function(url, data, callback)
|
||||||
(new XHR()).get(url, data, callback);
|
(new XHR()).get(url, data, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
XHR.poll = function(interval, url, data, callback)
|
XHR.poll = function(interval, url, data, callback, post)
|
||||||
{
|
{
|
||||||
if (isNaN(interval) || interval < 1)
|
if (isNaN(interval) || interval < 1)
|
||||||
interval = 5;
|
interval = 5;
|
||||||
|
@ -181,22 +188,38 @@ XHR.poll = function(interval, url, data, callback)
|
||||||
for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i])
|
for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i])
|
||||||
{
|
{
|
||||||
if (!(XHR._t % e.interval) && !e.xhr.busy())
|
if (!(XHR._t % e.interval) && !e.xhr.busy())
|
||||||
e.xhr.get(e.url, e.data, e.callback);
|
e.xhr[post ? 'post' : 'get'](e.url, e.data, e.callback, e.interval * 1000 - 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
XHR._t++;
|
XHR._t++;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
XHR._q.push({
|
var e = {
|
||||||
interval: interval,
|
interval: interval,
|
||||||
callback: callback,
|
callback: callback,
|
||||||
url: url,
|
url: url,
|
||||||
data: data,
|
data: data,
|
||||||
xhr: new XHR()
|
xhr: new XHR()
|
||||||
});
|
};
|
||||||
|
|
||||||
|
XHR._q.push(e);
|
||||||
XHR.run();
|
XHR.run();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
XHR.stop = function(e)
|
||||||
|
{
|
||||||
|
for (var i = 0; XHR._q && XHR._q[i]; i++) {
|
||||||
|
if (XHR._q[i] === e) {
|
||||||
|
e.xhr.cancel();
|
||||||
|
XHR._q.splice(i, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
XHR.halt = function()
|
XHR.halt = function()
|
||||||
|
|
|
@ -199,13 +199,13 @@ function macaddr(val)
|
||||||
return ip.checkmac(val) and true or false
|
return ip.checkmac(val) and true or false
|
||||||
end
|
end
|
||||||
|
|
||||||
function hostname(val)
|
function hostname(val, strict)
|
||||||
if val and (#val < 254) and (
|
if val and (#val < 254) and (
|
||||||
val:match("^[a-zA-Z_]+$") or
|
val:match("^[a-zA-Z_]+$") or
|
||||||
(val:match("^[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*[a-zA-Z0-9]$") and
|
(val:match("^[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*[a-zA-Z0-9]$") and
|
||||||
val:match("[^0-9%.]"))
|
val:match("[^0-9%.]"))
|
||||||
) then
|
) then
|
||||||
return true
|
return (not strict or not val:match("^_"))
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
|
@ -75,11 +75,16 @@ function error404(message)
|
||||||
http.status(404, "Not Found")
|
http.status(404, "Not Found")
|
||||||
message = message or "Not Found"
|
message = message or "Not Found"
|
||||||
|
|
||||||
require("luci.template")
|
local function render()
|
||||||
if not util.copcall(luci.template.render, "error404") then
|
local template = require "luci.template"
|
||||||
|
template.render("error404")
|
||||||
|
end
|
||||||
|
|
||||||
|
if not util.copcall(render) then
|
||||||
http.prepare_content("text/plain")
|
http.prepare_content("text/plain")
|
||||||
http.write(message)
|
http.write(message)
|
||||||
end
|
end
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -113,7 +118,8 @@ function httpdispatch(request, prefix)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for node in pathinfo:gmatch("[^/]+") do
|
local node
|
||||||
|
for node in pathinfo:gmatch("[^/%z]+") do
|
||||||
r[#r+1] = node
|
r[#r+1] = node
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -136,8 +142,7 @@ local function require_post_security(target)
|
||||||
|
|
||||||
if (type(required_val) == "string" and
|
if (type(required_val) == "string" and
|
||||||
request_val ~= required_val) or
|
request_val ~= required_val) or
|
||||||
(required_val == true and
|
(required_val == true and request_val == nil)
|
||||||
(request_val == nil or request_val == ""))
|
|
||||||
then
|
then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
@ -346,15 +351,23 @@ function dispatch(request)
|
||||||
ifattr = function(...) return _ifattr(...) end;
|
ifattr = function(...) return _ifattr(...) end;
|
||||||
attr = function(...) return _ifattr(true, ...) end;
|
attr = function(...) return _ifattr(true, ...) end;
|
||||||
url = build_url;
|
url = build_url;
|
||||||
}, {__index=function(table, key)
|
}, {__index=function(tbl, key)
|
||||||
if key == "controller" then
|
if key == "controller" then
|
||||||
return build_url()
|
return build_url()
|
||||||
elseif key == "REQUEST_URI" then
|
elseif key == "REQUEST_URI" then
|
||||||
return build_url(unpack(ctx.requestpath))
|
return build_url(unpack(ctx.requestpath))
|
||||||
|
elseif key == "FULL_REQUEST_URI" then
|
||||||
|
local url = { http.getenv("SCRIPT_NAME"), http.getenv("PATH_INFO") }
|
||||||
|
local query = http.getenv("QUERY_STRING")
|
||||||
|
if query and #query > 0 then
|
||||||
|
url[#url+1] = "?"
|
||||||
|
url[#url+1] = query
|
||||||
|
end
|
||||||
|
return table.concat(url, "")
|
||||||
elseif key == "token" then
|
elseif key == "token" then
|
||||||
return ctx.authtoken
|
return ctx.authtoken
|
||||||
else
|
else
|
||||||
return rawget(table, key) or _G[key]
|
return rawget(tbl, key) or _G[key]
|
||||||
end
|
end
|
||||||
end})
|
end})
|
||||||
end
|
end
|
||||||
|
@ -429,6 +442,13 @@ function dispatch(request)
|
||||||
ctx.authuser = sdat.username
|
ctx.authuser = sdat.username
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if track.cors and http.getenv("REQUEST_METHOD") == "OPTIONS" then
|
||||||
|
luci.http.status(200, "OK")
|
||||||
|
luci.http.header("Access-Control-Allow-Origin", http.getenv("HTTP_ORIGIN") or "*")
|
||||||
|
luci.http.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if c and require_post_security(c.target) then
|
if c and require_post_security(c.target) then
|
||||||
if not test_post_security(c) then
|
if not test_post_security(c) then
|
||||||
return
|
return
|
||||||
|
@ -650,6 +670,23 @@ function node(...)
|
||||||
return c
|
return c
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function lookup(...)
|
||||||
|
local i, path = nil, {}
|
||||||
|
for i = 1, select('#', ...) do
|
||||||
|
local name, arg = nil, tostring(select(i, ...))
|
||||||
|
for name in arg:gmatch("[^/]+") do
|
||||||
|
path[#path+1] = name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = #path, 1, -1 do
|
||||||
|
local node = context.treecache[table.concat(path, ".", 1, i)]
|
||||||
|
if node and (i == #path or node.leaf) then
|
||||||
|
return node, build_url(unpack(path))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function _create_node(path)
|
function _create_node(path)
|
||||||
if #path == 0 then
|
if #path == 0 then
|
||||||
return context.tree
|
return context.tree
|
||||||
|
@ -791,7 +828,16 @@ local function _cbi(self, ...)
|
||||||
|
|
||||||
local state = nil
|
local state = nil
|
||||||
|
|
||||||
|
local i, res
|
||||||
for i, res in ipairs(maps) do
|
for i, res in ipairs(maps) do
|
||||||
|
if util.instanceof(res, cbi.SimpleForm) then
|
||||||
|
io.stderr:write("Model %s returns SimpleForm but is dispatched via cbi(),\n"
|
||||||
|
% self.model)
|
||||||
|
|
||||||
|
io.stderr:write("please change %s to use the form() action instead.\n"
|
||||||
|
% table.concat(context.request, "/"))
|
||||||
|
end
|
||||||
|
|
||||||
res.flow = config
|
res.flow = config
|
||||||
local cstate = res:parse()
|
local cstate = res:parse()
|
||||||
if cstate and (not state or cstate < state) then
|
if cstate and (not state or cstate < state) then
|
||||||
|
@ -884,7 +930,7 @@ end
|
||||||
function cbi(model, config)
|
function cbi(model, config)
|
||||||
return {
|
return {
|
||||||
type = "cbi",
|
type = "cbi",
|
||||||
post = { ["cbi.submit"] = "1" },
|
post = { ["cbi.submit"] = true },
|
||||||
config = config,
|
config = config,
|
||||||
model = model,
|
model = model,
|
||||||
target = _cbi
|
target = _cbi
|
||||||
|
@ -912,6 +958,7 @@ local function _form(self, ...)
|
||||||
local maps = luci.cbi.load(self.model, ...)
|
local maps = luci.cbi.load(self.model, ...)
|
||||||
local state = nil
|
local state = nil
|
||||||
|
|
||||||
|
local i, res
|
||||||
for i, res in ipairs(maps) do
|
for i, res in ipairs(maps) do
|
||||||
local cstate = res:parse()
|
local cstate = res:parse()
|
||||||
if cstate and (not state or cstate < state) then
|
if cstate and (not state or cstate < state) then
|
||||||
|
@ -930,7 +977,7 @@ end
|
||||||
function form(model)
|
function form(model)
|
||||||
return {
|
return {
|
||||||
type = "cbi",
|
type = "cbi",
|
||||||
post = { ["cbi.submit"] = "1" },
|
post = { ["cbi.submit"] = true },
|
||||||
model = model,
|
model = model,
|
||||||
target = _form
|
target = _form
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,8 +116,8 @@ Create a new dispatching node and define common parameters.
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Fetch or create a dispatching node without setting the target module or
|
Fetch or create a dispatching node without setting the target module or
|
||||||
|
|
||||||
enabling the node.
|
enabling the node.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name get
|
@name get
|
||||||
@param ... Virtual path
|
@param ... Virtual path
|
||||||
|
@ -133,6 +133,15 @@ Fetch or create a new dispatching node.
|
||||||
@return Dispatching tree node
|
@return Dispatching tree node
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Lookup node in dispatching tree.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name lookup
|
||||||
|
@param ... Virtual path
|
||||||
|
@return Node object, canonical url or nil if the path was not found.
|
||||||
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Alias the first (lowest order) page automatically
|
Alias the first (lowest order) page automatically
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,21 @@
|
||||||
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
||||||
|
-- Copyright 2010-2018 Jo-Philipp Wich <jo@mein.io>
|
||||||
-- Licensed to the public under the Apache License 2.0.
|
-- Licensed to the public under the Apache License 2.0.
|
||||||
|
|
||||||
local ltn12 = require "luci.ltn12"
|
|
||||||
local protocol = require "luci.http.protocol"
|
|
||||||
local util = require "luci.util"
|
local util = require "luci.util"
|
||||||
local string = require "string"
|
|
||||||
local coroutine = require "coroutine"
|
local coroutine = require "coroutine"
|
||||||
local table = require "table"
|
local table = require "table"
|
||||||
|
local lhttp = require "lucihttp"
|
||||||
|
local nixio = require "nixio"
|
||||||
|
local ltn12 = require "luci.ltn12"
|
||||||
|
|
||||||
local ipairs, pairs, next, type, tostring, error =
|
local table, ipairs, pairs, type, tostring, tonumber, error =
|
||||||
ipairs, pairs, next, type, tostring, error
|
table, ipairs, pairs, type, tostring, tonumber, error
|
||||||
|
|
||||||
module "luci.http"
|
module "luci.http"
|
||||||
|
|
||||||
|
HTTP_MAX_CONTENT = 1024*8 -- 8 kB maximum content size
|
||||||
|
|
||||||
context = util.threadlocal()
|
context = util.threadlocal()
|
||||||
|
|
||||||
Request = util.class()
|
Request = util.class()
|
||||||
|
@ -28,7 +31,7 @@ function Request.__init__(self, env, sourcein, sinkerr)
|
||||||
self.message = {
|
self.message = {
|
||||||
env = env,
|
env = env,
|
||||||
headers = {},
|
headers = {},
|
||||||
params = protocol.urldecode_params(env.QUERY_STRING or ""),
|
params = urldecode_params(env.QUERY_STRING or ""),
|
||||||
}
|
}
|
||||||
|
|
||||||
self.parsed_input = false
|
self.parsed_input = false
|
||||||
|
@ -73,10 +76,7 @@ function Request.content(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Request.getcookie(self, name)
|
function Request.getcookie(self, name)
|
||||||
local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";")
|
return lhttp.header_attribute("cookie; " .. (self:getenv("HTTP_COOKIE") or ""), name)
|
||||||
local p = ";" .. name .. "=(.-);"
|
|
||||||
local i, j, value = c:find(p)
|
|
||||||
return value and urldecode(value)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function Request.getenv(self, name)
|
function Request.getenv(self, name)
|
||||||
|
@ -90,40 +90,34 @@ end
|
||||||
function Request.setfilehandler(self, callback)
|
function Request.setfilehandler(self, callback)
|
||||||
self.filehandler = callback
|
self.filehandler = callback
|
||||||
|
|
||||||
-- If input has already been parsed then any files are either in temporary files
|
if not self.parsed_input then
|
||||||
-- or are in self.message.params[key]
|
return
|
||||||
if self.parsed_input then
|
end
|
||||||
for param, value in pairs(self.message.params) do
|
|
||||||
repeat
|
-- If input has already been parsed then uploads are stored as unlinked
|
||||||
-- We're only interested in files
|
-- temporary files pointed to by open file handles in the parameter
|
||||||
if (not value["file"]) then break end
|
-- value table. Loop all params, and invoke the file callback for any
|
||||||
-- If we were able to write to temporary file
|
-- param with an open file handle.
|
||||||
if (value["fd"]) then
|
local name, value
|
||||||
fd = value["fd"]
|
for name, value in pairs(self.message.params) do
|
||||||
local eof = false
|
if type(value) == "table" then
|
||||||
repeat
|
while value.fd do
|
||||||
filedata = fd:read(1024)
|
local data = value.fd:read(1024)
|
||||||
if (filedata:len() < 1024) then
|
local eof = (not data or data == "")
|
||||||
eof = true
|
|
||||||
end
|
callback(value, data, eof)
|
||||||
callback({ name=value["name"], file=value["file"] }, filedata, eof)
|
|
||||||
until (eof)
|
if eof then
|
||||||
fd:close()
|
value.fd:close()
|
||||||
value["fd"] = nil
|
value.fd = nil
|
||||||
-- We had to read into memory
|
|
||||||
else
|
|
||||||
-- There should only be one numbered value in table - the data
|
|
||||||
for k, v in ipairs(value) do
|
|
||||||
callback({ name=value["name"], file=value["file"] }, v, true)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
until true
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Request._parse_input(self)
|
function Request._parse_input(self)
|
||||||
protocol.parse_message_body(
|
parse_message_body(
|
||||||
self.input,
|
self.input,
|
||||||
self.message,
|
self.message,
|
||||||
self.filehandler
|
self.filehandler
|
||||||
|
@ -254,23 +248,307 @@ function redirect(url)
|
||||||
end
|
end
|
||||||
|
|
||||||
function build_querystring(q)
|
function build_querystring(q)
|
||||||
local s = { "?" }
|
local s, n, k, v = {}, 1, nil, nil
|
||||||
|
|
||||||
for k, v in pairs(q) do
|
for k, v in pairs(q) do
|
||||||
if #s > 1 then s[#s+1] = "&" end
|
s[n+0] = (n == 1) and "?" or "&"
|
||||||
|
s[n+1] = util.urlencode(k)
|
||||||
s[#s+1] = urldecode(k)
|
s[n+2] = "="
|
||||||
s[#s+1] = "="
|
s[n+3] = util.urlencode(v)
|
||||||
s[#s+1] = urldecode(v)
|
n = n + 4
|
||||||
end
|
end
|
||||||
|
|
||||||
return table.concat(s, "")
|
return table.concat(s, "")
|
||||||
end
|
end
|
||||||
|
|
||||||
urldecode = protocol.urldecode
|
urldecode = util.urldecode
|
||||||
|
|
||||||
urlencode = protocol.urlencode
|
urlencode = util.urlencode
|
||||||
|
|
||||||
function write_json(x)
|
function write_json(x)
|
||||||
util.serialize_json(x, write)
|
util.serialize_json(x, write)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- from given url or string. Returns a table with urldecoded values.
|
||||||
|
-- Simple parameters are stored as string values associated with the parameter
|
||||||
|
-- name within the table. Parameters with multiple values are stored as array
|
||||||
|
-- containing the corresponding values.
|
||||||
|
function urldecode_params(url, tbl)
|
||||||
|
local parser, name
|
||||||
|
local params = tbl or { }
|
||||||
|
|
||||||
|
parser = lhttp.urlencoded_parser(function (what, buffer, length)
|
||||||
|
if what == parser.TUPLE then
|
||||||
|
name, value = nil, nil
|
||||||
|
elseif what == parser.NAME then
|
||||||
|
name = lhttp.urldecode(buffer)
|
||||||
|
elseif what == parser.VALUE and name then
|
||||||
|
params[name] = lhttp.urldecode(buffer) or ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
|
||||||
|
if parser then
|
||||||
|
parser:parse((url or ""):match("[^?]*$"))
|
||||||
|
parser:parse(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
return params
|
||||||
|
end
|
||||||
|
|
||||||
|
-- separated by "&". Tables are encoded as parameters with multiple values by
|
||||||
|
-- repeating the parameter name with each value.
|
||||||
|
function urlencode_params(tbl)
|
||||||
|
local k, v
|
||||||
|
local n, enc = 1, {}
|
||||||
|
for k, v in pairs(tbl) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
local i, v2
|
||||||
|
for i, v2 in ipairs(v) do
|
||||||
|
if enc[1] then
|
||||||
|
enc[n] = "&"
|
||||||
|
n = n + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
enc[n+0] = lhttp.urlencode(k)
|
||||||
|
enc[n+1] = "="
|
||||||
|
enc[n+2] = lhttp.urlencode(v2)
|
||||||
|
n = n + 3
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if enc[1] then
|
||||||
|
enc[n] = "&"
|
||||||
|
n = n + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
enc[n+0] = lhttp.urlencode(k)
|
||||||
|
enc[n+1] = "="
|
||||||
|
enc[n+2] = lhttp.urlencode(v)
|
||||||
|
n = n + 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(enc, "")
|
||||||
|
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
|
||||||
|
-- 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)
|
||||||
|
function mimedecode_message_body(src, msg, file_cb)
|
||||||
|
local parser, header, field
|
||||||
|
local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil)
|
||||||
|
|
||||||
|
parser, err = lhttp.multipart_parser(msg.env.CONTENT_TYPE, function (what, buffer, length)
|
||||||
|
if what == parser.PART_INIT then
|
||||||
|
field = { }
|
||||||
|
|
||||||
|
elseif what == parser.HEADER_NAME then
|
||||||
|
header = buffer:lower()
|
||||||
|
|
||||||
|
elseif what == parser.HEADER_VALUE and header then
|
||||||
|
if header:lower() == "content-disposition" and
|
||||||
|
lhttp.header_attribute(buffer, nil) == "form-data"
|
||||||
|
then
|
||||||
|
field.name = lhttp.header_attribute(buffer, "name")
|
||||||
|
field.file = lhttp.header_attribute(buffer, "filename")
|
||||||
|
field[1] = field.file
|
||||||
|
end
|
||||||
|
|
||||||
|
if field.headers then
|
||||||
|
field.headers[header] = buffer
|
||||||
|
else
|
||||||
|
field.headers = { [header] = buffer }
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif what == parser.PART_BEGIN then
|
||||||
|
return not field.file
|
||||||
|
|
||||||
|
elseif what == parser.PART_DATA and field.name and length > 0 then
|
||||||
|
if field.file then
|
||||||
|
if file_cb then
|
||||||
|
file_cb(field, buffer, false)
|
||||||
|
msg.params[field.name] = msg.params[field.name] or field
|
||||||
|
else
|
||||||
|
if not field.fd then
|
||||||
|
field.fd = nixio.mkstemp(field.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
if field.fd then
|
||||||
|
field.fd:write(buffer)
|
||||||
|
msg.params[field.name] = msg.params[field.name] or field
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
field.value = buffer
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif what == parser.PART_END and field.name then
|
||||||
|
if field.file and msg.params[field.name] then
|
||||||
|
if file_cb then
|
||||||
|
file_cb(field, "", true)
|
||||||
|
elseif field.fd then
|
||||||
|
field.fd:seek(0, "set")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local val = msg.params[field.name]
|
||||||
|
|
||||||
|
if type(val) == "table" then
|
||||||
|
val[#val+1] = field.value or ""
|
||||||
|
elseif val ~= nil then
|
||||||
|
msg.params[field.name] = { val, field.value or "" }
|
||||||
|
else
|
||||||
|
msg.params[field.name] = field.value or ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
field = nil
|
||||||
|
|
||||||
|
elseif what == parser.ERROR then
|
||||||
|
err = buffer
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
|
||||||
|
return ltn12.pump.all(src, function (chunk)
|
||||||
|
len = len + (chunk and #chunk or 0)
|
||||||
|
|
||||||
|
if maxlen and len > maxlen + 2 then
|
||||||
|
return nil, "Message body size exceeds Content-Length"
|
||||||
|
end
|
||||||
|
|
||||||
|
if not parser or not parser:parse(chunk) then
|
||||||
|
return nil, err
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
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.
|
||||||
|
function urldecode_message_body(src, msg)
|
||||||
|
local err, name, value, parser
|
||||||
|
local len, maxlen = 0, tonumber(msg.env.CONTENT_LENGTH or nil)
|
||||||
|
|
||||||
|
parser = lhttp.urlencoded_parser(function (what, buffer, length)
|
||||||
|
if what == parser.TUPLE then
|
||||||
|
name, value = nil, nil
|
||||||
|
elseif what == parser.NAME then
|
||||||
|
name = lhttp.urldecode(buffer, lhttp.DECODE_PLUS)
|
||||||
|
elseif what == parser.VALUE and name then
|
||||||
|
local val = msg.params[name]
|
||||||
|
|
||||||
|
if type(val) == "table" then
|
||||||
|
val[#val+1] = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or ""
|
||||||
|
elseif val ~= nil then
|
||||||
|
msg.params[name] = { val, lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or "" }
|
||||||
|
else
|
||||||
|
msg.params[name] = lhttp.urldecode(buffer, lhttp.DECODE_PLUS) or ""
|
||||||
|
end
|
||||||
|
elseif what == parser.ERROR then
|
||||||
|
err = buffer
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
|
||||||
|
return ltn12.pump.all(src, function (chunk)
|
||||||
|
len = len + (chunk and #chunk or 0)
|
||||||
|
|
||||||
|
if maxlen and len > maxlen + 2 then
|
||||||
|
return nil, "Message body size exceeds Content-Length"
|
||||||
|
elseif len > HTTP_MAX_CONTENT then
|
||||||
|
return nil, "Message body size exceeds maximum allowed length"
|
||||||
|
end
|
||||||
|
|
||||||
|
if not parser or not parser:parse(chunk) then
|
||||||
|
return nil, err
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- This function will examine the Content-Type within the given message object
|
||||||
|
-- to select the appropriate content decoder.
|
||||||
|
-- Currently the application/x-www-urlencoded and application/form-data
|
||||||
|
-- mime types are supported. If the encountered content encoding can't be
|
||||||
|
-- handled then the whole message body will be stored unaltered as "content"
|
||||||
|
-- property within the given message object.
|
||||||
|
function parse_message_body(src, msg, filecb)
|
||||||
|
if msg.env.CONTENT_LENGTH or msg.env.REQUEST_METHOD == "POST" then
|
||||||
|
local ctype = lhttp.header_attribute(msg.env.CONTENT_TYPE, nil)
|
||||||
|
|
||||||
|
-- Is it multipart/mime ?
|
||||||
|
if ctype == "multipart/form-data" then
|
||||||
|
return mimedecode_message_body(src, msg, filecb)
|
||||||
|
|
||||||
|
-- Is it application/x-www-form-urlencoded ?
|
||||||
|
elseif ctype == "application/x-www-form-urlencoded" then
|
||||||
|
return urldecode_message_body(src, msg)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Unhandled encoding
|
||||||
|
-- If a file callback is given then feed it chunk by chunk, else
|
||||||
|
-- store whole buffer in message.content
|
||||||
|
local sink
|
||||||
|
|
||||||
|
-- If we have a file callback then feed it
|
||||||
|
if type(filecb) == "function" then
|
||||||
|
local meta = {
|
||||||
|
name = "raw",
|
||||||
|
encoding = msg.env.CONTENT_TYPE
|
||||||
|
}
|
||||||
|
sink = function( chunk )
|
||||||
|
if chunk then
|
||||||
|
return filecb(meta, chunk, false)
|
||||||
|
else
|
||||||
|
return filecb(meta, nil, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- ... else append to .content
|
||||||
|
else
|
||||||
|
msg.content = ""
|
||||||
|
msg.content_length = 0
|
||||||
|
|
||||||
|
sink = function( chunk )
|
||||||
|
if chunk then
|
||||||
|
if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then
|
||||||
|
msg.content = msg.content .. chunk
|
||||||
|
msg.content_length = msg.content_length + #chunk
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return nil, "POST data exceeds maximum allowed length"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pump data...
|
||||||
|
while true do
|
||||||
|
local ok, err = ltn12.pump.step( src, sink )
|
||||||
|
|
||||||
|
if not ok and err then
|
||||||
|
return nil, err
|
||||||
|
elseif not ok then -- eof
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
|
@ -6,25 +6,24 @@ module "luci.http"
|
||||||
---[[
|
---[[
|
||||||
Close the HTTP-Connection.
|
Close the HTTP-Connection.
|
||||||
|
|
||||||
|
@class function
|
||||||
@class function
|
@name close
|
||||||
@name close
|
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return the request content if the request was of unknown type.
|
Return the request content if the request was of unknown type.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name content
|
@name content
|
||||||
@return HTTP request body
|
@return HTTP request body
|
||||||
@return HTTP request body length
|
@return HTTP request body length
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get a certain HTTP input value or a table of all input values.
|
Get a certain HTTP input value or a table of all input values.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name formvalue
|
@name formvalue
|
||||||
@param name Name of the GET or POST variable to fetch
|
@param name Name of the GET or POST variable to fetch
|
||||||
@param noparse Don't parse POST data before getting the value
|
@param noparse Don't parse POST data before getting the value
|
||||||
@return HTTP input value or table of all input value
|
@return HTTP input value or table of all input value
|
||||||
|
@ -33,8 +32,8 @@ Get a certain HTTP input value or a table of all input values.
|
||||||
---[[
|
---[[
|
||||||
Get a table of all HTTP input values with a certain prefix.
|
Get a table of all HTTP input values with a certain prefix.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name formvaluetable
|
@name formvaluetable
|
||||||
@param prefix Prefix
|
@param prefix Prefix
|
||||||
@return Table of all HTTP input values with given prefix
|
@return Table of all HTTP input values with given prefix
|
||||||
]]
|
]]
|
||||||
|
@ -42,18 +41,18 @@ Get a table of all HTTP input values with a certain prefix.
|
||||||
---[[
|
---[[
|
||||||
Get the value of a certain HTTP-Cookie.
|
Get the value of a certain HTTP-Cookie.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name getcookie
|
@name getcookie
|
||||||
@param name Cookie Name
|
@param name Cookie Name
|
||||||
@return String containing cookie data
|
@return String containing cookie data
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get the value of a certain HTTP environment variable
|
Get the value of a certain HTTP environment variable
|
||||||
|
|
||||||
or the environment table itself.
|
or the environment table itself.
|
||||||
@class function
|
|
||||||
@name getenv
|
@class function
|
||||||
|
@name getenv
|
||||||
@param name Environment variable
|
@param name Environment variable
|
||||||
@return HTTP environment value or environment table
|
@return HTTP environment value or environment table
|
||||||
]]
|
]]
|
||||||
|
@ -61,41 +60,41 @@ or the environment table itself.
|
||||||
---[[
|
---[[
|
||||||
Set a handler function for incoming user file uploads.
|
Set a handler function for incoming user file uploads.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name setfilehandler
|
@name setfilehandler
|
||||||
@param callback Handler function
|
@param callback Handler function
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Send a HTTP-Header.
|
Send a HTTP-Header.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name header
|
@name header
|
||||||
@param key Header key
|
@param key Header key
|
||||||
@param value Header value
|
@param value Header value
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Set the mime type of following content data.
|
Set the mime type of following content data.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name prepare_content
|
@name prepare_content
|
||||||
@param mime Mimetype of following content
|
@param mime Mimetype of following content
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get the RAW HTTP input source
|
Get the RAW HTTP input source
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name source
|
@name source
|
||||||
@return HTTP LTN12 source
|
@return HTTP LTN12 source
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Set the HTTP status code and status message.
|
Set the HTTP status code and status message.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name status
|
@name status
|
||||||
@param code Status code
|
@param code Status code
|
||||||
@param message Status message
|
@param message Status message
|
||||||
]]
|
]]
|
||||||
|
@ -105,8 +104,9 @@ Send a chunk of content data to the client.
|
||||||
|
|
||||||
This function is as a valid LTN12 sink.
|
This function is as a valid LTN12 sink.
|
||||||
If the content chunk is nil this function will automatically invoke close.
|
If the content chunk is nil this function will automatically invoke close.
|
||||||
@class function
|
|
||||||
@name write
|
@class function
|
||||||
|
@name write
|
||||||
@param content Content chunk
|
@param content Content chunk
|
||||||
@param src_err Error object from source (optional)
|
@param src_err Error object from source (optional)
|
||||||
@see close
|
@see close
|
||||||
|
@ -115,51 +115,146 @@ If the content chunk is nil this function will automatically invoke close.
|
||||||
---[[
|
---[[
|
||||||
Splice data from a filedescriptor to the client.
|
Splice data from a filedescriptor to the client.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name splice
|
@name splice
|
||||||
@param fp File descriptor
|
@param fp File descriptor
|
||||||
@param size Bytes to splice (optional)
|
@param size Bytes to splice (optional)
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Redirects the client to a new URL and closes the connection.
|
Redirects the client to a new URL and closes the connection.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name redirect
|
@name redirect
|
||||||
@param url Target URL
|
@param url Target URL
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Create a querystring out of a table of key - value pairs.
|
Create a querystring out of a table of key - value pairs.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name build_querystring
|
@name build_querystring
|
||||||
@param table Query string source table
|
@param table Query string source table
|
||||||
@return Encoded HTTP query string
|
@return Encoded HTTP query string
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return the URL-decoded equivalent of a string.
|
Return the URL-decoded equivalent of a string.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urldecode
|
||||||
@param str URL-encoded string
|
@param str URL-encoded string
|
||||||
@param no_plus Don't decode + to " "
|
@param no_plus Don't decode + to " "
|
||||||
@return URL-decoded string
|
@return URL-decoded string
|
||||||
@see urlencode
|
@see urlencode
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return the URL-encoded equivalent of a string.
|
Return the URL-encoded equivalent of a string.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urlencode
|
||||||
@param str Source string
|
@param str Source string
|
||||||
@return URL-encoded string
|
@return URL-encoded string
|
||||||
@see urldecode
|
@see urldecode
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Send the given data as JSON encoded string.
|
Send the given data as JSON encoded string.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name write_json
|
@name write_json
|
||||||
@param data Data to send
|
@param data Data to send
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Extract and split urlencoded data pairs, separated bei either "&" or ";"
|
||||||
|
from given url or string. Returns a table with urldecoded values.
|
||||||
|
|
||||||
|
Simple parameters are stored as string values associated with the parameter
|
||||||
|
name within the table. Parameters with multiple values are stored as array
|
||||||
|
containing the corresponding values.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urldecode_params
|
||||||
|
@param url The url or string which contains x-www-urlencoded form data
|
||||||
|
@param tbl Use the given table for storing values (optional)
|
||||||
|
@return Table containing the urldecoded parameters
|
||||||
|
@see urlencode_params
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Encode each key-value-pair in given table to x-www-urlencoded format,
|
||||||
|
separated by "&".
|
||||||
|
|
||||||
|
Tables are encoded as parameters with multiple values by repeating the
|
||||||
|
parameter name with each value.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urlencode_params
|
||||||
|
@param tbl Table with the values
|
||||||
|
@return String containing encoded values
|
||||||
|
@see urldecode_params
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Decode a mime encoded http message body with multipart/form-data 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
|
||||||
|
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)
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name mimedecode_message_body
|
||||||
|
@param src Ltn12 source function
|
||||||
|
@param msg HTTP message object
|
||||||
|
@param filecb File callback function (optional)
|
||||||
|
@return Value indicating successful operation (not nil means "ok")
|
||||||
|
@return String containing the error if unsuccessful
|
||||||
|
@see parse_message_header
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Decode an urlencoded http message body with application/x-www-urlencoded
|
||||||
|
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.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urldecode_message_body
|
||||||
|
@param src Ltn12 source function
|
||||||
|
@param msg HTTP message object
|
||||||
|
@return Value indicating successful operation (not nil means "ok")
|
||||||
|
@return String containing the error if unsuccessful
|
||||||
|
@see parse_message_header
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Try to extract and decode a http message body from the given ltn12 source.
|
||||||
|
This function will examine the Content-Type within the given message object
|
||||||
|
to select the appropriate content decoder.
|
||||||
|
|
||||||
|
Currently the application/x-www-urlencoded and application/form-data
|
||||||
|
mime types are supported. If the encountered content encoding can't be
|
||||||
|
handled then the whole message body will be stored unaltered as "content"
|
||||||
|
property within the given message object.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name parse_message_body
|
||||||
|
@param src Ltn12 source function
|
||||||
|
@param msg HTTP message object
|
||||||
|
@param filecb File data callback (optional, see mimedecode_message_body())
|
||||||
|
@return Value indicating successful operation (not nil means "ok")
|
||||||
|
@return String containing the error if unsuccessful
|
||||||
|
@see parse_message_header
|
||||||
|
]]
|
||||||
|
|
|
@ -1,649 +0,0 @@
|
||||||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
|
||||||
-- Licensed to the public under the Apache License 2.0.
|
|
||||||
|
|
||||||
-- This class contains several functions useful for http message- and content
|
|
||||||
-- decoding and to retrive form data from raw http messages.
|
|
||||||
module("luci.http.protocol", package.seeall)
|
|
||||||
|
|
||||||
local ltn12 = require("luci.ltn12")
|
|
||||||
|
|
||||||
HTTP_MAX_CONTENT = 1024*8 -- 8 kB maximum content size
|
|
||||||
|
|
||||||
-- the "+" sign to " " - and return the decoded string.
|
|
||||||
function urldecode( str, no_plus )
|
|
||||||
|
|
||||||
local function __chrdec( hex )
|
|
||||||
return string.char( tonumber( hex, 16 ) )
|
|
||||||
end
|
|
||||||
|
|
||||||
if type(str) == "string" then
|
|
||||||
if not no_plus then
|
|
||||||
str = str:gsub( "+", " " )
|
|
||||||
end
|
|
||||||
|
|
||||||
str = str:gsub( "%%([a-fA-F0-9][a-fA-F0-9])", __chrdec )
|
|
||||||
end
|
|
||||||
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
|
|
||||||
-- from given url or string. Returns a table with urldecoded values.
|
|
||||||
-- Simple parameters are stored as string values associated with the parameter
|
|
||||||
-- name within the table. Parameters with multiple values are stored as array
|
|
||||||
-- containing the corresponding values.
|
|
||||||
function urldecode_params( url, tbl )
|
|
||||||
|
|
||||||
local params = tbl or { }
|
|
||||||
|
|
||||||
if url:find("?") then
|
|
||||||
url = url:gsub( "^.+%?([^?]+)", "%1" )
|
|
||||||
end
|
|
||||||
|
|
||||||
for pair in url:gmatch( "[^&;]+" ) do
|
|
||||||
|
|
||||||
-- find key and value
|
|
||||||
local key = urldecode( pair:match("^([^=]+)") )
|
|
||||||
local val = urldecode( pair:match("^[^=]+=(.+)$") )
|
|
||||||
|
|
||||||
-- store
|
|
||||||
if type(key) == "string" and key:len() > 0 then
|
|
||||||
if type(val) ~= "string" then val = "" end
|
|
||||||
|
|
||||||
if not params[key] then
|
|
||||||
params[key] = val
|
|
||||||
elseif type(params[key]) ~= "table" then
|
|
||||||
params[key] = { params[key], val }
|
|
||||||
else
|
|
||||||
table.insert( params[key], val )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return params
|
|
||||||
end
|
|
||||||
|
|
||||||
function urlencode( str )
|
|
||||||
|
|
||||||
local function __chrenc( chr )
|
|
||||||
return string.format(
|
|
||||||
"%%%02x", string.byte( chr )
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
if type(str) == "string" then
|
|
||||||
str = str:gsub(
|
|
||||||
"([^a-zA-Z0-9$_%-%.%~])",
|
|
||||||
__chrenc
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
|
|
||||||
-- separated by "&". Tables are encoded as parameters with multiple values by
|
|
||||||
-- repeating the parameter name with each value.
|
|
||||||
function urlencode_params( tbl )
|
|
||||||
local enc = ""
|
|
||||||
|
|
||||||
for k, v in pairs(tbl) do
|
|
||||||
if type(v) == "table" then
|
|
||||||
for i, v2 in ipairs(v) do
|
|
||||||
enc = enc .. ( #enc > 0 and "&" or "" ) ..
|
|
||||||
urlencode(k) .. "=" .. urlencode(v2)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
enc = enc .. ( #enc > 0 and "&" or "" ) ..
|
|
||||||
urlencode(k) .. "=" .. urlencode(v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return enc
|
|
||||||
end
|
|
||||||
|
|
||||||
-- (Internal function)
|
|
||||||
-- Initialize given parameter and coerce string into table when the parameter
|
|
||||||
-- already exists.
|
|
||||||
local function __initval( tbl, key )
|
|
||||||
if tbl[key] == nil then
|
|
||||||
tbl[key] = ""
|
|
||||||
elseif type(tbl[key]) == "string" then
|
|
||||||
tbl[key] = { tbl[key], "" }
|
|
||||||
else
|
|
||||||
table.insert( tbl[key], "" )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- (Internal function)
|
|
||||||
-- Initialize given file parameter.
|
|
||||||
local function __initfileval( tbl, key, filename, fd )
|
|
||||||
if tbl[key] == nil then
|
|
||||||
tbl[key] = { file=filename, fd=fd, name=key, "" }
|
|
||||||
else
|
|
||||||
table.insert( tbl[key], "" )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- (Internal function)
|
|
||||||
-- Append given data to given parameter, either by extending the string value
|
|
||||||
-- or by appending it to the last string in the parameter's value table.
|
|
||||||
local function __appendval( tbl, key, chunk )
|
|
||||||
if type(tbl[key]) == "table" then
|
|
||||||
tbl[key][#tbl[key]] = tbl[key][#tbl[key]] .. chunk
|
|
||||||
else
|
|
||||||
tbl[key] = tbl[key] .. chunk
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- (Internal function)
|
|
||||||
-- Finish the value of given parameter, either by transforming the string value
|
|
||||||
-- or - in the case of multi value parameters - the last element in the
|
|
||||||
-- associated values table.
|
|
||||||
local function __finishval( tbl, key, handler )
|
|
||||||
if handler then
|
|
||||||
if type(tbl[key]) == "table" then
|
|
||||||
tbl[key][#tbl[key]] = handler( tbl[key][#tbl[key]] )
|
|
||||||
else
|
|
||||||
tbl[key] = handler( tbl[key] )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Table of our process states
|
|
||||||
local process_states = { }
|
|
||||||
|
|
||||||
-- Extract "magic", the first line of a http message.
|
|
||||||
-- Extracts the message type ("get", "post" or "response"), the requested uri
|
|
||||||
-- or the status code if the line descripes a http response.
|
|
||||||
process_states['magic'] = function( msg, chunk, err )
|
|
||||||
|
|
||||||
if chunk ~= nil then
|
|
||||||
-- ignore empty lines before request
|
|
||||||
if #chunk == 0 then
|
|
||||||
return true, nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Is it a request?
|
|
||||||
local method, uri, http_ver = chunk:match("^([A-Z]+) ([^ ]+) HTTP/([01]%.[019])$")
|
|
||||||
|
|
||||||
-- Yup, it is
|
|
||||||
if method then
|
|
||||||
|
|
||||||
msg.type = "request"
|
|
||||||
msg.request_method = method:lower()
|
|
||||||
msg.request_uri = uri
|
|
||||||
msg.http_version = tonumber( http_ver )
|
|
||||||
msg.headers = { }
|
|
||||||
|
|
||||||
-- We're done, next state is header parsing
|
|
||||||
return true, function( chunk )
|
|
||||||
return process_states['headers']( msg, chunk )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Is it a response?
|
|
||||||
else
|
|
||||||
|
|
||||||
local http_ver, code, message = chunk:match("^HTTP/([01]%.[019]) ([0-9]+) ([^\r\n]+)$")
|
|
||||||
|
|
||||||
-- Is a response
|
|
||||||
if code then
|
|
||||||
|
|
||||||
msg.type = "response"
|
|
||||||
msg.status_code = code
|
|
||||||
msg.status_message = message
|
|
||||||
msg.http_version = tonumber( http_ver )
|
|
||||||
msg.headers = { }
|
|
||||||
|
|
||||||
-- We're done, next state is header parsing
|
|
||||||
return true, function( chunk )
|
|
||||||
return process_states['headers']( msg, chunk )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Can't handle it
|
|
||||||
return nil, "Invalid HTTP message magic"
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Extract headers from given string.
|
|
||||||
process_states['headers'] = function( msg, chunk )
|
|
||||||
|
|
||||||
if chunk ~= nil then
|
|
||||||
|
|
||||||
-- Look for a valid header format
|
|
||||||
local hdr, val = chunk:match( "^([A-Za-z][A-Za-z0-9%-_]+): +(.+)$" )
|
|
||||||
|
|
||||||
if type(hdr) == "string" and hdr:len() > 0 and
|
|
||||||
type(val) == "string" and val:len() > 0
|
|
||||||
then
|
|
||||||
msg.headers[hdr] = val
|
|
||||||
|
|
||||||
-- Valid header line, proceed
|
|
||||||
return true, nil
|
|
||||||
|
|
||||||
elseif #chunk == 0 then
|
|
||||||
-- Empty line, we won't accept data anymore
|
|
||||||
return false, nil
|
|
||||||
else
|
|
||||||
-- Junk data
|
|
||||||
return nil, "Invalid HTTP header received"
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return nil, "Unexpected EOF"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- data line by line with the trailing \r\n stripped of.
|
|
||||||
function header_source( sock )
|
|
||||||
return ltn12.source.simplify( function()
|
|
||||||
|
|
||||||
local chunk, err, part = sock:receive("*l")
|
|
||||||
|
|
||||||
-- Line too long
|
|
||||||
if chunk == nil then
|
|
||||||
if err ~= "timeout" then
|
|
||||||
return nil, part
|
|
||||||
and "Line exceeds maximum allowed length"
|
|
||||||
or "Unexpected EOF"
|
|
||||||
else
|
|
||||||
return nil, err
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Line ok
|
|
||||||
elseif chunk ~= nil then
|
|
||||||
|
|
||||||
-- Strip trailing CR
|
|
||||||
chunk = chunk:gsub("\r$","")
|
|
||||||
|
|
||||||
return chunk, nil
|
|
||||||
end
|
|
||||||
end )
|
|
||||||
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
|
|
||||||
-- 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)
|
|
||||||
function mimedecode_message_body( src, msg, filecb )
|
|
||||||
|
|
||||||
if msg and msg.env.CONTENT_TYPE then
|
|
||||||
msg.mime_boundary = msg.env.CONTENT_TYPE:match("^multipart/form%-data; boundary=(.+)$")
|
|
||||||
end
|
|
||||||
|
|
||||||
if not msg.mime_boundary then
|
|
||||||
return nil, "Invalid Content-Type found"
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local tlen = 0
|
|
||||||
local inhdr = false
|
|
||||||
local field = nil
|
|
||||||
local store = nil
|
|
||||||
local lchunk = nil
|
|
||||||
|
|
||||||
local function parse_headers( chunk, field )
|
|
||||||
|
|
||||||
local stat
|
|
||||||
repeat
|
|
||||||
chunk, stat = chunk:gsub(
|
|
||||||
"^([A-Z][A-Za-z0-9%-_]+): +([^\r\n]+)\r\n",
|
|
||||||
function(k,v)
|
|
||||||
field.headers[k] = v
|
|
||||||
return ""
|
|
||||||
end
|
|
||||||
)
|
|
||||||
until stat == 0
|
|
||||||
|
|
||||||
chunk, stat = chunk:gsub("^\r\n","")
|
|
||||||
|
|
||||||
-- End of headers
|
|
||||||
if stat > 0 then
|
|
||||||
if field.headers["Content-Disposition"] then
|
|
||||||
if field.headers["Content-Disposition"]:match("^form%-data; ") then
|
|
||||||
field.name = field.headers["Content-Disposition"]:match('name="(.-)"')
|
|
||||||
field.file = field.headers["Content-Disposition"]:match('filename="(.+)"$')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not field.headers["Content-Type"] then
|
|
||||||
field.headers["Content-Type"] = "text/plain"
|
|
||||||
end
|
|
||||||
|
|
||||||
if field.name and field.file and filecb then
|
|
||||||
__initval( msg.params, field.name )
|
|
||||||
__appendval( msg.params, field.name, field.file )
|
|
||||||
|
|
||||||
store = filecb
|
|
||||||
elseif field.name and field.file then
|
|
||||||
local nxf = require "nixio"
|
|
||||||
local fd = nxf.mkstemp(field.name)
|
|
||||||
__initfileval ( msg.params, field.name, field.file, fd )
|
|
||||||
if fd then
|
|
||||||
store = function(hdr, buf, eof)
|
|
||||||
fd:write(buf)
|
|
||||||
if (eof) then
|
|
||||||
fd:seek(0, "set")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
store = function( hdr, buf, eof )
|
|
||||||
__appendval( msg.params, field.name, buf )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elseif field.name then
|
|
||||||
__initval( msg.params, field.name )
|
|
||||||
|
|
||||||
store = function( hdr, buf, eof )
|
|
||||||
__appendval( msg.params, field.name, buf )
|
|
||||||
end
|
|
||||||
else
|
|
||||||
store = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
return chunk, true
|
|
||||||
end
|
|
||||||
|
|
||||||
return chunk, false
|
|
||||||
end
|
|
||||||
|
|
||||||
local function snk( chunk )
|
|
||||||
|
|
||||||
tlen = tlen + ( chunk and #chunk or 0 )
|
|
||||||
|
|
||||||
if msg.env.CONTENT_LENGTH and tlen > tonumber(msg.env.CONTENT_LENGTH) + 2 then
|
|
||||||
return nil, "Message body size exceeds Content-Length"
|
|
||||||
end
|
|
||||||
|
|
||||||
if chunk and not lchunk then
|
|
||||||
lchunk = "\r\n" .. chunk
|
|
||||||
|
|
||||||
elseif lchunk then
|
|
||||||
local data = lchunk .. ( chunk or "" )
|
|
||||||
local spos, epos, found
|
|
||||||
|
|
||||||
repeat
|
|
||||||
spos, epos = data:find( "\r\n--" .. msg.mime_boundary .. "\r\n", 1, true )
|
|
||||||
|
|
||||||
if not spos then
|
|
||||||
spos, epos = data:find( "\r\n--" .. msg.mime_boundary .. "--\r\n", 1, true )
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
if spos then
|
|
||||||
local predata = data:sub( 1, spos - 1 )
|
|
||||||
|
|
||||||
if inhdr then
|
|
||||||
predata, eof = parse_headers( predata, field )
|
|
||||||
|
|
||||||
if not eof then
|
|
||||||
return nil, "Invalid MIME section header"
|
|
||||||
elseif not field.name then
|
|
||||||
return nil, "Invalid Content-Disposition header"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if store then
|
|
||||||
store( field, predata, true )
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
field = { headers = { } }
|
|
||||||
found = found or true
|
|
||||||
|
|
||||||
data, eof = parse_headers( data:sub( epos + 1, #data ), field )
|
|
||||||
inhdr = not eof
|
|
||||||
end
|
|
||||||
until not spos
|
|
||||||
|
|
||||||
if found then
|
|
||||||
-- We found at least some boundary. Save
|
|
||||||
-- the unparsed remaining data for the
|
|
||||||
-- next chunk.
|
|
||||||
lchunk, data = data, nil
|
|
||||||
else
|
|
||||||
-- There was a complete chunk without a boundary. Parse it as headers or
|
|
||||||
-- append it as data, depending on our current state.
|
|
||||||
if inhdr then
|
|
||||||
lchunk, eof = parse_headers( data, field )
|
|
||||||
inhdr = not eof
|
|
||||||
else
|
|
||||||
-- We're inside data, so append the data. Note that we only append
|
|
||||||
-- lchunk, not all of data, since there is a chance that chunk
|
|
||||||
-- contains half a boundary. Assuming that each chunk is at least the
|
|
||||||
-- boundary in size, this should prevent problems
|
|
||||||
store( field, lchunk, false )
|
|
||||||
lchunk, chunk = chunk, nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
return ltn12.pump.all( src, snk )
|
|
||||||
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.
|
|
||||||
function urldecode_message_body( src, msg )
|
|
||||||
|
|
||||||
local tlen = 0
|
|
||||||
local lchunk = nil
|
|
||||||
|
|
||||||
local function snk( chunk )
|
|
||||||
|
|
||||||
tlen = tlen + ( chunk and #chunk or 0 )
|
|
||||||
|
|
||||||
if msg.env.CONTENT_LENGTH and tlen > tonumber(msg.env.CONTENT_LENGTH) + 2 then
|
|
||||||
return nil, "Message body size exceeds Content-Length"
|
|
||||||
elseif tlen > HTTP_MAX_CONTENT then
|
|
||||||
return nil, "Message body size exceeds maximum allowed length"
|
|
||||||
end
|
|
||||||
|
|
||||||
if not lchunk and chunk then
|
|
||||||
lchunk = chunk
|
|
||||||
|
|
||||||
elseif lchunk then
|
|
||||||
local data = lchunk .. ( chunk or "&" )
|
|
||||||
local spos, epos
|
|
||||||
|
|
||||||
repeat
|
|
||||||
spos, epos = data:find("^.-[;&]")
|
|
||||||
|
|
||||||
if spos then
|
|
||||||
local pair = data:sub( spos, epos - 1 )
|
|
||||||
local key = pair:match("^(.-)=")
|
|
||||||
local val = pair:match("=([^%s]*)%s*$")
|
|
||||||
|
|
||||||
if key and #key > 0 then
|
|
||||||
__initval( msg.params, key )
|
|
||||||
__appendval( msg.params, key, val )
|
|
||||||
__finishval( msg.params, key, urldecode )
|
|
||||||
end
|
|
||||||
|
|
||||||
data = data:sub( epos + 1, #data )
|
|
||||||
end
|
|
||||||
until not spos
|
|
||||||
|
|
||||||
lchunk = data
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
return ltn12.pump.all( src, snk )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- version, message headers and resulting CGI environment variables from the
|
|
||||||
-- given ltn12 source.
|
|
||||||
function parse_message_header( src )
|
|
||||||
|
|
||||||
local ok = true
|
|
||||||
local msg = { }
|
|
||||||
|
|
||||||
local sink = ltn12.sink.simplify(
|
|
||||||
function( chunk )
|
|
||||||
return process_states['magic']( msg, chunk )
|
|
||||||
end
|
|
||||||
)
|
|
||||||
|
|
||||||
-- Pump input data...
|
|
||||||
while ok do
|
|
||||||
|
|
||||||
-- get data
|
|
||||||
ok, err = ltn12.pump.step( src, sink )
|
|
||||||
|
|
||||||
-- error
|
|
||||||
if not ok and err then
|
|
||||||
return nil, err
|
|
||||||
|
|
||||||
-- eof
|
|
||||||
elseif not ok then
|
|
||||||
|
|
||||||
-- Process get parameters
|
|
||||||
if ( msg.request_method == "get" or msg.request_method == "post" ) and
|
|
||||||
msg.request_uri:match("?")
|
|
||||||
then
|
|
||||||
msg.params = urldecode_params( msg.request_uri )
|
|
||||||
else
|
|
||||||
msg.params = { }
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Populate common environment variables
|
|
||||||
msg.env = {
|
|
||||||
CONTENT_LENGTH = msg.headers['Content-Length'];
|
|
||||||
CONTENT_TYPE = msg.headers['Content-Type'] or msg.headers['Content-type'];
|
|
||||||
REQUEST_METHOD = msg.request_method:upper();
|
|
||||||
REQUEST_URI = msg.request_uri;
|
|
||||||
SCRIPT_NAME = msg.request_uri:gsub("?.+$","");
|
|
||||||
SCRIPT_FILENAME = ""; -- XXX implement me
|
|
||||||
SERVER_PROTOCOL = "HTTP/" .. string.format("%.1f", msg.http_version);
|
|
||||||
QUERY_STRING = msg.request_uri:match("?")
|
|
||||||
and msg.request_uri:gsub("^.+?","") or ""
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Populate HTTP_* environment variables
|
|
||||||
for i, hdr in ipairs( {
|
|
||||||
'Accept',
|
|
||||||
'Accept-Charset',
|
|
||||||
'Accept-Encoding',
|
|
||||||
'Accept-Language',
|
|
||||||
'Connection',
|
|
||||||
'Cookie',
|
|
||||||
'Host',
|
|
||||||
'Referer',
|
|
||||||
'User-Agent',
|
|
||||||
} ) do
|
|
||||||
local var = 'HTTP_' .. hdr:upper():gsub("%-","_")
|
|
||||||
local val = msg.headers[hdr]
|
|
||||||
|
|
||||||
msg.env[var] = val
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return msg
|
|
||||||
end
|
|
||||||
|
|
||||||
-- This function will examine the Content-Type within the given message object
|
|
||||||
-- to select the appropriate content decoder.
|
|
||||||
-- Currently the application/x-www-urlencoded and application/form-data
|
|
||||||
-- mime types are supported. If the encountered content encoding can't be
|
|
||||||
-- handled then the whole message body will be stored unaltered as "content"
|
|
||||||
-- property within the given message object.
|
|
||||||
function parse_message_body( src, msg, filecb )
|
|
||||||
-- Is it multipart/mime ?
|
|
||||||
if msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE and
|
|
||||||
msg.env.CONTENT_TYPE:match("^multipart/form%-data")
|
|
||||||
then
|
|
||||||
|
|
||||||
return mimedecode_message_body( src, msg, filecb )
|
|
||||||
|
|
||||||
-- Is it application/x-www-form-urlencoded ?
|
|
||||||
elseif msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE and
|
|
||||||
msg.env.CONTENT_TYPE:match("^application/x%-www%-form%-urlencoded")
|
|
||||||
then
|
|
||||||
return urldecode_message_body( src, msg, filecb )
|
|
||||||
|
|
||||||
|
|
||||||
-- Unhandled encoding
|
|
||||||
-- If a file callback is given then feed it chunk by chunk, else
|
|
||||||
-- store whole buffer in message.content
|
|
||||||
else
|
|
||||||
|
|
||||||
local sink
|
|
||||||
|
|
||||||
-- If we have a file callback then feed it
|
|
||||||
if type(filecb) == "function" then
|
|
||||||
local meta = {
|
|
||||||
name = "raw",
|
|
||||||
encoding = msg.env.CONTENT_TYPE
|
|
||||||
}
|
|
||||||
sink = function( chunk )
|
|
||||||
if chunk then
|
|
||||||
return filecb(meta, chunk, false)
|
|
||||||
else
|
|
||||||
return filecb(meta, nil, true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- ... else append to .content
|
|
||||||
else
|
|
||||||
msg.content = ""
|
|
||||||
msg.content_length = 0
|
|
||||||
|
|
||||||
sink = function( chunk )
|
|
||||||
if chunk then
|
|
||||||
if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then
|
|
||||||
msg.content = msg.content .. chunk
|
|
||||||
msg.content_length = msg.content_length + #chunk
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
return nil, "POST data exceeds maximum allowed length"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Pump data...
|
|
||||||
while true do
|
|
||||||
local ok, err = ltn12.pump.step( src, sink )
|
|
||||||
|
|
||||||
if not ok and err then
|
|
||||||
return nil, err
|
|
||||||
elseif not ok then -- eof
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
statusmsg = {
|
|
||||||
[200] = "OK",
|
|
||||||
[206] = "Partial Content",
|
|
||||||
[301] = "Moved Permanently",
|
|
||||||
[302] = "Found",
|
|
||||||
[304] = "Not Modified",
|
|
||||||
[400] = "Bad Request",
|
|
||||||
[403] = "Forbidden",
|
|
||||||
[404] = "Not Found",
|
|
||||||
[405] = "Method Not Allowed",
|
|
||||||
[408] = "Request Time-out",
|
|
||||||
[411] = "Length Required",
|
|
||||||
[412] = "Precondition Failed",
|
|
||||||
[416] = "Requested range not satisfiable",
|
|
||||||
[500] = "Internal Server Error",
|
|
||||||
[503] = "Server Unavailable",
|
|
||||||
}
|
|
|
@ -1,142 +0,0 @@
|
||||||
---[[
|
|
||||||
LuCI http protocol class.
|
|
||||||
|
|
||||||
This class contains several functions useful for http message- and content
|
|
||||||
decoding and to retrive form data from raw http messages.
|
|
||||||
]]
|
|
||||||
module "luci.http.protocol"
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Decode an urlencoded string - optionally without decoding
|
|
||||||
|
|
||||||
the "+" sign to " " - and return the decoded string.
|
|
||||||
@class function
|
|
||||||
@name urldecode
|
|
||||||
@param str Input string in x-www-urlencoded format
|
|
||||||
@param no_plus Don't decode "+" signs to spaces
|
|
||||||
@return The decoded string
|
|
||||||
@see urlencode
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Extract and split urlencoded data pairs, separated bei either "&" or ";"
|
|
||||||
|
|
||||||
from given url or string. Returns a table with urldecoded values.
|
|
||||||
Simple parameters are stored as string values associated with the parameter
|
|
||||||
name within the table. Parameters with multiple values are stored as array
|
|
||||||
containing the corresponding values.
|
|
||||||
@class function
|
|
||||||
@name urldecode_params
|
|
||||||
@param url The url or string which contains x-www-urlencoded form data
|
|
||||||
@param tbl Use the given table for storing values (optional)
|
|
||||||
@return Table containing the urldecoded parameters
|
|
||||||
@see urlencode_params
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Encode given string to x-www-urlencoded format.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name urlencode
|
|
||||||
@param str String to encode
|
|
||||||
@return String containing the encoded data
|
|
||||||
@see urldecode
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Encode each key-value-pair in given table to x-www-urlencoded format,
|
|
||||||
|
|
||||||
separated by "&". Tables are encoded as parameters with multiple values by
|
|
||||||
repeating the parameter name with each value.
|
|
||||||
@class function
|
|
||||||
@name urlencode_params
|
|
||||||
@param tbl Table with the values
|
|
||||||
@return String containing encoded values
|
|
||||||
@see urldecode_params
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Creates a ltn12 source from the given socket. The source will return it's
|
|
||||||
|
|
||||||
data line by line with the trailing \r\n stripped of.
|
|
||||||
@class function
|
|
||||||
@name header_source
|
|
||||||
@param sock Readable network socket
|
|
||||||
@return Ltn12 source function
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Decode a mime encoded http message body with multipart/form-data
|
|
||||||
|
|
||||||
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
|
|
||||||
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)
|
|
||||||
@class function
|
|
||||||
@name mimedecode_message_body
|
|
||||||
@param src Ltn12 source function
|
|
||||||
@param msg HTTP message object
|
|
||||||
@param filecb File callback function (optional)
|
|
||||||
@return Value indicating successful operation (not nil means "ok")
|
|
||||||
@return String containing the error if unsuccessful
|
|
||||||
@see parse_message_header
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Decode an urlencoded http message body with application/x-www-urlencoded
|
|
||||||
|
|
||||||
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.
|
|
||||||
@class function
|
|
||||||
@name urldecode_message_body
|
|
||||||
@param src Ltn12 source function
|
|
||||||
@param msg HTTP message object
|
|
||||||
@return Value indicating successful operation (not nil means "ok")
|
|
||||||
@return String containing the error if unsuccessful
|
|
||||||
@see parse_message_header
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Try to extract an http message header including information like protocol
|
|
||||||
|
|
||||||
version, message headers and resulting CGI environment variables from the
|
|
||||||
given ltn12 source.
|
|
||||||
@class function
|
|
||||||
@name parse_message_header
|
|
||||||
@param src Ltn12 source function
|
|
||||||
@return HTTP message object
|
|
||||||
@see parse_message_body
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Try to extract and decode a http message body from the given ltn12 source.
|
|
||||||
|
|
||||||
This function will examine the Content-Type within the given message object
|
|
||||||
to select the appropriate content decoder.
|
|
||||||
Currently the application/x-www-urlencoded and application/form-data
|
|
||||||
mime types are supported. If the encountered content encoding can't be
|
|
||||||
handled then the whole message body will be stored unaltered as "content"
|
|
||||||
property within the given message object.
|
|
||||||
@class function
|
|
||||||
@name parse_message_body
|
|
||||||
@param src Ltn12 source function
|
|
||||||
@param msg HTTP message object
|
|
||||||
@param filecb File data callback (optional, see mimedecode_message_body())
|
|
||||||
@return Value indicating successful operation (not nil means "ok")
|
|
||||||
@return String containing the error if unsuccessful
|
|
||||||
@see parse_message_header
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Table containing human readable messages for several http status codes.
|
|
||||||
|
|
||||||
@class table
|
|
||||||
]]
|
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
|
||||||
-- Licensed to the public under the Apache License 2.0.
|
|
||||||
|
|
||||||
-- This class provides basic ETag handling and implements most of the
|
|
||||||
-- conditional HTTP/1.1 headers specified in RFC2616 Sct. 14.24 - 14.28 .
|
|
||||||
module("luci.http.protocol.conditionals", package.seeall)
|
|
||||||
|
|
||||||
local date = require("luci.http.protocol.date")
|
|
||||||
|
|
||||||
|
|
||||||
function mk_etag( stat )
|
|
||||||
if stat ~= nil then
|
|
||||||
return string.format( '"%x-%x-%x"', stat.ino, stat.size, stat.mtime )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Test whether the given message object contains an "If-Match" header and
|
|
||||||
-- compare it against the given stat object.
|
|
||||||
function if_match( req, stat )
|
|
||||||
local h = req.headers
|
|
||||||
local etag = mk_etag( stat )
|
|
||||||
|
|
||||||
-- Check for matching resource
|
|
||||||
if type(h['If-Match']) == "string" then
|
|
||||||
for ent in h['If-Match']:gmatch("([^, ]+)") do
|
|
||||||
if ( ent == '*' or ent == etag ) and stat ~= nil then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return false, 412
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Test whether the given message object contains an "If-Modified-Since" header
|
|
||||||
-- and compare it against the given stat object.
|
|
||||||
function if_modified_since( req, stat )
|
|
||||||
local h = req.headers
|
|
||||||
|
|
||||||
-- Compare mtimes
|
|
||||||
if type(h['If-Modified-Since']) == "string" then
|
|
||||||
local since = date.to_unix( h['If-Modified-Since'] )
|
|
||||||
|
|
||||||
if stat == nil or since < stat.mtime then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
return false, 304, {
|
|
||||||
["ETag"] = mk_etag( stat );
|
|
||||||
["Date"] = date.to_http( os.time() );
|
|
||||||
["Last-Modified"] = date.to_http( stat.mtime )
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Test whether the given message object contains an "If-None-Match" header and
|
|
||||||
-- compare it against the given stat object.
|
|
||||||
function if_none_match( req, stat )
|
|
||||||
local h = req.headers
|
|
||||||
local etag = mk_etag( stat )
|
|
||||||
local method = req.env and req.env.REQUEST_METHOD or "GET"
|
|
||||||
|
|
||||||
-- Check for matching resource
|
|
||||||
if type(h['If-None-Match']) == "string" then
|
|
||||||
for ent in h['If-None-Match']:gmatch("([^, ]+)") do
|
|
||||||
if ( ent == '*' or ent == etag ) and stat ~= nil then
|
|
||||||
if method == "GET" or method == "HEAD" then
|
|
||||||
return false, 304, {
|
|
||||||
["ETag"] = etag;
|
|
||||||
["Date"] = date.to_http( os.time() );
|
|
||||||
["Last-Modified"] = date.to_http( stat.mtime )
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false, 412
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- The If-Range header is currently not implemented due to the lack of general
|
|
||||||
-- byte range stuff in luci.http.protocol . This function will always return
|
|
||||||
-- false, 412 to indicate a failed precondition.
|
|
||||||
function if_range( req, stat )
|
|
||||||
-- Sorry, no subranges (yet)
|
|
||||||
return false, 412
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Test whether the given message object contains an "If-Unmodified-Since"
|
|
||||||
-- header and compare it against the given stat object.
|
|
||||||
function if_unmodified_since( req, stat )
|
|
||||||
local h = req.headers
|
|
||||||
|
|
||||||
-- Compare mtimes
|
|
||||||
if type(h['If-Unmodified-Since']) == "string" then
|
|
||||||
local since = date.to_unix( h['If-Unmodified-Since'] )
|
|
||||||
|
|
||||||
if stat ~= nil and since <= stat.mtime then
|
|
||||||
return false, 412
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
|
@ -1,85 +0,0 @@
|
||||||
---[[
|
|
||||||
LuCI http protocol implementation - HTTP/1.1 bits.
|
|
||||||
|
|
||||||
This class provides basic ETag handling and implements most of the
|
|
||||||
conditional HTTP/1.1 headers specified in RFC2616 Sct. 14.24 - 14.28 .
|
|
||||||
]]
|
|
||||||
module "luci.http.protocol.conditionals"
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Implement 14.19 / ETag.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name mk_etag
|
|
||||||
@param stat A file.stat structure
|
|
||||||
@return String containing the generated tag suitable for ETag headers
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
14.24 / If-Match
|
|
||||||
|
|
||||||
Test whether the given message object contains an "If-Match" header and
|
|
||||||
compare it against the given stat object.
|
|
||||||
@class function
|
|
||||||
@name if_match
|
|
||||||
@param req HTTP request message object
|
|
||||||
@param stat A file.stat object
|
|
||||||
@return Boolean indicating whether the precondition is ok
|
|
||||||
@return Alternative status code if the precondition failed
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
14.25 / If-Modified-Since
|
|
||||||
|
|
||||||
Test whether the given message object contains an "If-Modified-Since" header
|
|
||||||
and compare it against the given stat object.
|
|
||||||
@class function
|
|
||||||
@name if_modified_since
|
|
||||||
@param req HTTP request message object
|
|
||||||
@param stat A file.stat object
|
|
||||||
@return Boolean indicating whether the precondition is ok
|
|
||||||
@return Alternative status code if the precondition failed
|
|
||||||
@return Table containing extra HTTP headers if the precondition failed
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
14.26 / If-None-Match
|
|
||||||
|
|
||||||
Test whether the given message object contains an "If-None-Match" header and
|
|
||||||
compare it against the given stat object.
|
|
||||||
@class function
|
|
||||||
@name if_none_match
|
|
||||||
@param req HTTP request message object
|
|
||||||
@param stat A file.stat object
|
|
||||||
@return Boolean indicating whether the precondition is ok
|
|
||||||
@return Alternative status code if the precondition failed
|
|
||||||
@return Table containing extra HTTP headers if the precondition failed
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
14.27 / If-Range
|
|
||||||
|
|
||||||
The If-Range header is currently not implemented due to the lack of general
|
|
||||||
byte range stuff in luci.http.protocol . This function will always return
|
|
||||||
false, 412 to indicate a failed precondition.
|
|
||||||
@class function
|
|
||||||
@name if_range
|
|
||||||
@param req HTTP request message object
|
|
||||||
@param stat A file.stat object
|
|
||||||
@return Boolean indicating whether the precondition is ok
|
|
||||||
@return Alternative status code if the precondition failed
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
14.28 / If-Unmodified-Since
|
|
||||||
|
|
||||||
Test whether the given message object contains an "If-Unmodified-Since"
|
|
||||||
header and compare it against the given stat object.
|
|
||||||
@class function
|
|
||||||
@name if_unmodified_since
|
|
||||||
@param req HTTP request message object
|
|
||||||
@param stat A file.stat object
|
|
||||||
@return Boolean indicating whether the precondition is ok
|
|
||||||
@return Alternative status code if the precondition failed
|
|
||||||
]]
|
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
|
||||||
-- Licensed to the public under the Apache License 2.0.
|
|
||||||
|
|
||||||
-- This class contains functions to parse, compare and format http dates.
|
|
||||||
module("luci.http.protocol.date", package.seeall)
|
|
||||||
|
|
||||||
require("luci.sys.zoneinfo")
|
|
||||||
|
|
||||||
|
|
||||||
MONTHS = {
|
|
||||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
|
|
||||||
"Sep", "Oct", "Nov", "Dec"
|
|
||||||
}
|
|
||||||
|
|
||||||
function tz_offset(tz)
|
|
||||||
|
|
||||||
if type(tz) == "string" then
|
|
||||||
|
|
||||||
-- check for a numeric identifier
|
|
||||||
local s, v = tz:match("([%+%-])([0-9]+)")
|
|
||||||
if s == '+' then s = 1 else s = -1 end
|
|
||||||
if v then v = tonumber(v) end
|
|
||||||
|
|
||||||
if s and v then
|
|
||||||
return s * 60 * ( math.floor( v / 100 ) * 60 + ( v % 100 ) )
|
|
||||||
|
|
||||||
-- lookup symbolic tz
|
|
||||||
elseif luci.sys.zoneinfo.OFFSET[tz:lower()] then
|
|
||||||
return luci.sys.zoneinfo.OFFSET[tz:lower()]
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- bad luck
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function to_unix(date)
|
|
||||||
|
|
||||||
local wd, day, mon, yr, hr, min, sec, tz = date:match(
|
|
||||||
"([A-Z][a-z][a-z]), ([0-9]+) " ..
|
|
||||||
"([A-Z][a-z][a-z]) ([0-9]+) " ..
|
|
||||||
"([0-9]+):([0-9]+):([0-9]+) " ..
|
|
||||||
"([A-Z0-9%+%-]+)"
|
|
||||||
)
|
|
||||||
|
|
||||||
if day and mon and yr and hr and min and sec then
|
|
||||||
-- find month
|
|
||||||
local month = 1
|
|
||||||
for i = 1, 12 do
|
|
||||||
if MONTHS[i] == mon then
|
|
||||||
month = i
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- convert to epoch time
|
|
||||||
return tz_offset(tz) + os.time( {
|
|
||||||
year = yr,
|
|
||||||
month = month,
|
|
||||||
day = day,
|
|
||||||
hour = hr,
|
|
||||||
min = min,
|
|
||||||
sec = sec
|
|
||||||
} )
|
|
||||||
end
|
|
||||||
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function to_http(time)
|
|
||||||
return os.date( "%a, %d %b %Y %H:%M:%S GMT", time )
|
|
||||||
end
|
|
||||||
|
|
||||||
function compare(d1, d2)
|
|
||||||
|
|
||||||
if d1:match("[^0-9]") then d1 = to_unix(d1) end
|
|
||||||
if d2:match("[^0-9]") then d2 = to_unix(d2) end
|
|
||||||
|
|
||||||
if d1 == d2 then
|
|
||||||
return 0
|
|
||||||
elseif d1 < d2 then
|
|
||||||
return -1
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,46 +0,0 @@
|
||||||
---[[
|
|
||||||
LuCI http protocol implementation - date helper class.
|
|
||||||
|
|
||||||
This class contains functions to parse, compare and format http dates.
|
|
||||||
]]
|
|
||||||
module "luci.http.protocol.date"
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Return the time offset in seconds between the UTC and given time zone.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name tz_offset
|
|
||||||
@param tz Symbolic or numeric timezone specifier
|
|
||||||
@return Time offset to UTC in seconds
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Parse given HTTP date string and convert it to unix epoch time.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name to_unix
|
|
||||||
@param data String containing the date
|
|
||||||
@return Unix epoch time
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Convert the given unix epoch time to valid HTTP date string.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name to_http
|
|
||||||
@param time Unix epoch time
|
|
||||||
@return String containing the formatted date
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Compare two dates which can either be unix epoch times or HTTP date strings.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name compare
|
|
||||||
@param d1 The first date or epoch time to compare
|
|
||||||
@param d2 The first date or epoch time to compare
|
|
||||||
@return -1 - if d1 is lower then d2
|
|
||||||
@return 0 - if both dates are equal
|
|
||||||
@return 1 - if d1 is higher then d2
|
|
||||||
]]
|
|
||||||
|
|
|
@ -1,78 +0,0 @@
|
||||||
-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
|
|
||||||
-- Licensed to the public under the Apache License 2.0.
|
|
||||||
|
|
||||||
-- This class provides functions to guess mime types from file extensions and
|
|
||||||
-- vice versa.
|
|
||||||
module("luci.http.protocol.mime", package.seeall)
|
|
||||||
|
|
||||||
require("luci.util")
|
|
||||||
|
|
||||||
MIME_TYPES = {
|
|
||||||
["txt"] = "text/plain";
|
|
||||||
["js"] = "text/javascript";
|
|
||||||
["css"] = "text/css";
|
|
||||||
["htm"] = "text/html";
|
|
||||||
["html"] = "text/html";
|
|
||||||
["patch"] = "text/x-patch";
|
|
||||||
["c"] = "text/x-csrc";
|
|
||||||
["h"] = "text/x-chdr";
|
|
||||||
["o"] = "text/x-object";
|
|
||||||
["ko"] = "text/x-object";
|
|
||||||
|
|
||||||
["bmp"] = "image/bmp";
|
|
||||||
["gif"] = "image/gif";
|
|
||||||
["png"] = "image/png";
|
|
||||||
["jpg"] = "image/jpeg";
|
|
||||||
["jpeg"] = "image/jpeg";
|
|
||||||
["svg"] = "image/svg+xml";
|
|
||||||
|
|
||||||
["zip"] = "application/zip";
|
|
||||||
["pdf"] = "application/pdf";
|
|
||||||
["xml"] = "application/xml";
|
|
||||||
["xsl"] = "application/xml";
|
|
||||||
["doc"] = "application/msword";
|
|
||||||
["ppt"] = "application/vnd.ms-powerpoint";
|
|
||||||
["xls"] = "application/vnd.ms-excel";
|
|
||||||
["odt"] = "application/vnd.oasis.opendocument.text";
|
|
||||||
["odp"] = "application/vnd.oasis.opendocument.presentation";
|
|
||||||
["pl"] = "application/x-perl";
|
|
||||||
["sh"] = "application/x-shellscript";
|
|
||||||
["php"] = "application/x-php";
|
|
||||||
["deb"] = "application/x-deb";
|
|
||||||
["iso"] = "application/x-cd-image";
|
|
||||||
["tgz"] = "application/x-compressed-tar";
|
|
||||||
|
|
||||||
["mp3"] = "audio/mpeg";
|
|
||||||
["ogg"] = "audio/x-vorbis+ogg";
|
|
||||||
["wav"] = "audio/x-wav";
|
|
||||||
|
|
||||||
["mpg"] = "video/mpeg";
|
|
||||||
["mpeg"] = "video/mpeg";
|
|
||||||
["avi"] = "video/x-msvideo";
|
|
||||||
}
|
|
||||||
|
|
||||||
-- "application/octet-stream" if the extension is unknown.
|
|
||||||
function to_mime(filename)
|
|
||||||
if type(filename) == "string" then
|
|
||||||
local ext = filename:match("[^%.]+$")
|
|
||||||
|
|
||||||
if ext and MIME_TYPES[ext:lower()] then
|
|
||||||
return MIME_TYPES[ext:lower()]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return "application/octet-stream"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- given mime-type is unknown.
|
|
||||||
function to_ext(mimetype)
|
|
||||||
if type(mimetype) == "string" then
|
|
||||||
for ext, type in luci.util.kspairs( MIME_TYPES ) do
|
|
||||||
if type == mimetype then
|
|
||||||
return ext
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return nil
|
|
||||||
end
|
|
|
@ -1,34 +0,0 @@
|
||||||
---[[
|
|
||||||
LuCI http protocol implementation - mime helper class.
|
|
||||||
|
|
||||||
This class provides functions to guess mime types from file extensions and
|
|
||||||
vice versa.
|
|
||||||
]]
|
|
||||||
module "luci.http.protocol.mime"
|
|
||||||
|
|
||||||
---[[
|
|
||||||
MIME mapping table containg extension - mimetype relations.
|
|
||||||
|
|
||||||
@class table
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Extract extension from a filename and return corresponding mime-type or
|
|
||||||
|
|
||||||
"application/octet-stream" if the extension is unknown.
|
|
||||||
@class function
|
|
||||||
@name to_mime
|
|
||||||
@param filename The filename for which the mime type is guessed
|
|
||||||
@return String containign the determined mime type
|
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Return corresponding extension for a given mime type or nil if the
|
|
||||||
|
|
||||||
given mime-type is unknown.
|
|
||||||
@class function
|
|
||||||
@name to_ext
|
|
||||||
@param mimetype The mimetype to retrieve the extension from
|
|
||||||
@return String with the extension or nil for unknown type
|
|
||||||
]]
|
|
||||||
|
|
|
@ -20,12 +20,14 @@ module "luci.model.ipkg"
|
||||||
|
|
||||||
-- Internal action function
|
-- Internal action function
|
||||||
local function _action(cmd, ...)
|
local function _action(cmd, ...)
|
||||||
local pkg = ""
|
local cmdline = { ipkg, cmd }
|
||||||
|
|
||||||
|
local k, v
|
||||||
for k, v in pairs({...}) do
|
for k, v in pairs({...}) do
|
||||||
pkg = pkg .. " '" .. v:gsub("'", "") .. "'"
|
cmdline[#cmdline+1] = util.shellquote(v)
|
||||||
end
|
end
|
||||||
|
|
||||||
local c = "%s %s %s >/tmp/opkg.stdout 2>/tmp/opkg.stderr" %{ ipkg, cmd, pkg }
|
local c = "%s >/tmp/opkg.stdout 2>/tmp/opkg.stderr" % table.concat(cmdline, " ")
|
||||||
local r = os.execute(c)
|
local r = os.execute(c)
|
||||||
local e = fs.readfile("/tmp/opkg.stderr")
|
local e = fs.readfile("/tmp/opkg.stderr")
|
||||||
local o = fs.readfile("/tmp/opkg.stdout")
|
local o = fs.readfile("/tmp/opkg.stdout")
|
||||||
|
@ -74,17 +76,17 @@ local function _parselist(rawdata)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Internal lookup function
|
-- Internal lookup function
|
||||||
local function _lookup(act, pkg)
|
local function _lookup(cmd, pkg)
|
||||||
local cmd = ipkg .. " " .. act
|
local cmdline = { ipkg, cmd }
|
||||||
if pkg then
|
if pkg then
|
||||||
cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'"
|
cmdline[#cmdline+1] = util.shellquote(pkg)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- OPKG sometimes kills the whole machine because it sucks
|
-- OPKG sometimes kills the whole machine because it sucks
|
||||||
-- Therefore we have to use a sucky approach too and use
|
-- Therefore we have to use a sucky approach too and use
|
||||||
-- tmpfiles instead of directly reading the output
|
-- tmpfiles instead of directly reading the output
|
||||||
local tmpfile = os.tmpname()
|
local tmpfile = os.tmpname()
|
||||||
os.execute(cmd .. (" >%s 2>/dev/null" % tmpfile))
|
os.execute("%s >%s 2>/dev/null" %{ table.concat(cmdline, " "), tmpfile })
|
||||||
|
|
||||||
local data = _parselist(io.lines(tmpfile))
|
local data = _parselist(io.lines(tmpfile))
|
||||||
os.remove(tmpfile)
|
os.remove(tmpfile)
|
||||||
|
@ -123,9 +125,12 @@ end
|
||||||
|
|
||||||
-- List helper
|
-- List helper
|
||||||
local function _list(action, pat, cb)
|
local function _list(action, pat, cb)
|
||||||
local fd = io.popen(ipkg .. " " .. action ..
|
local cmdline = { ipkg, action }
|
||||||
(pat and (" '%s'" % pat:gsub("'", "")) or ""))
|
if pat then
|
||||||
|
cmdline[#cmdline+1] = util.shellquote(pat)
|
||||||
|
end
|
||||||
|
|
||||||
|
local fd = io.popen(table.concat(cmdline, " "))
|
||||||
if fd then
|
if fd then
|
||||||
local name, version, sz, desc
|
local name, version, sz, desc
|
||||||
while true do
|
while true do
|
||||||
|
|
|
@ -629,7 +629,7 @@ function get_interface(self, i)
|
||||||
if _interfaces[i] or _wifi_iface(i) then
|
if _interfaces[i] or _wifi_iface(i) then
|
||||||
return interface(i)
|
return interface(i)
|
||||||
else
|
else
|
||||||
local netid = _wifi_netid_by_netname(i)
|
local netid = _wifi_netid_by_sid(i)
|
||||||
return netid and interface(netid)
|
return netid and interface(netid)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,13 +2,12 @@
|
||||||
-- Licensed to the public under the Apache License 2.0.
|
-- Licensed to the public under the Apache License 2.0.
|
||||||
|
|
||||||
local os = require "os"
|
local os = require "os"
|
||||||
local uci = require "uci"
|
|
||||||
local util = require "luci.util"
|
local util = require "luci.util"
|
||||||
local table = require "table"
|
local table = require "table"
|
||||||
|
|
||||||
|
|
||||||
local setmetatable, rawget, rawset = setmetatable, rawget, rawset
|
local setmetatable, rawget, rawset = setmetatable, rawget, rawset
|
||||||
local require, getmetatable = require, getmetatable
|
local require, getmetatable, assert = require, getmetatable, assert
|
||||||
local error, pairs, ipairs = error, pairs, ipairs
|
local error, pairs, ipairs = error, pairs, ipairs
|
||||||
local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
|
local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
|
||||||
|
|
||||||
|
@ -20,151 +19,436 @@ local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
|
||||||
-- reloaded.
|
-- reloaded.
|
||||||
module "luci.model.uci"
|
module "luci.model.uci"
|
||||||
|
|
||||||
cursor = uci.cursor
|
local ERRSTR = {
|
||||||
|
"Invalid command",
|
||||||
|
"Invalid argument",
|
||||||
|
"Method not found",
|
||||||
|
"Entry not found",
|
||||||
|
"No data",
|
||||||
|
"Permission denied",
|
||||||
|
"Timeout",
|
||||||
|
"Not supported",
|
||||||
|
"Unknown error",
|
||||||
|
"Connection failed"
|
||||||
|
}
|
||||||
|
|
||||||
APIVERSION = uci.APIVERSION
|
local session_id = nil
|
||||||
|
|
||||||
function cursor_state()
|
local function call(cmd, args)
|
||||||
return cursor(nil, "/var/state")
|
if type(args) == "table" and session_id then
|
||||||
|
args.ubus_rpc_session = session_id
|
||||||
|
end
|
||||||
|
return util.ubus("uci", cmd, args)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
inst = cursor()
|
function cursor()
|
||||||
inst_state = cursor_state()
|
return _M
|
||||||
|
end
|
||||||
|
|
||||||
local Cursor = getmetatable(inst)
|
function cursor_state()
|
||||||
|
return _M
|
||||||
|
end
|
||||||
|
|
||||||
function Cursor.apply(self, configlist, command)
|
function substate(self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function get_confdir(self)
|
||||||
|
return "/etc/config"
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_savedir(self)
|
||||||
|
return "/tmp/.uci"
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_session_id(self)
|
||||||
|
return session_id
|
||||||
|
end
|
||||||
|
|
||||||
|
function set_confdir(self, directory)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function set_savedir(self, directory)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function set_session_id(self, id)
|
||||||
|
session_id = id
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function load(self, config)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function save(self, config)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function unload(self, config)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function changes(self, config)
|
||||||
|
local rv = call("changes", { config = config })
|
||||||
|
local res = {}
|
||||||
|
|
||||||
|
if type(rv) == "table" and type(rv.changes) == "table" then
|
||||||
|
local package, changes
|
||||||
|
for package, changes in pairs(rv.changes) do
|
||||||
|
res[package] = {}
|
||||||
|
|
||||||
|
local _, change
|
||||||
|
for _, change in ipairs(changes) do
|
||||||
|
local operation, section, option, value = unpack(change)
|
||||||
|
if option and value and operation ~= "add" then
|
||||||
|
res[package][section] = res[package][section] or { }
|
||||||
|
|
||||||
|
if operation == "list-add" then
|
||||||
|
local v = res[package][section][option]
|
||||||
|
if type(v) == "table" then
|
||||||
|
v[#v+1] = value or ""
|
||||||
|
elseif v ~= nil then
|
||||||
|
res[package][section][option] = { v, value }
|
||||||
|
else
|
||||||
|
res[package][section][option] = { value }
|
||||||
|
end
|
||||||
|
else
|
||||||
|
res[package][section][option] = value or ""
|
||||||
|
end
|
||||||
|
else
|
||||||
|
res[package][section] = res[package][section] or {}
|
||||||
|
res[package][section][".type"] = option or ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function revert(self, config)
|
||||||
|
local _, err = call("revert", { config = config })
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
|
||||||
|
function commit(self, config)
|
||||||
|
local _, err = call("commit", { config = config })
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
function apply(self, configs, command)
|
||||||
|
local _, config
|
||||||
|
|
||||||
|
assert(not command, "Apply command not supported anymore")
|
||||||
|
|
||||||
|
if type(configs) == "table" then
|
||||||
|
for _, config in ipairs(configs) do
|
||||||
|
call("service", "event", {
|
||||||
|
type = "config.change",
|
||||||
|
data = { package = config }
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
|
|
||||||
|
function foreach(self, config, stype, callback)
|
||||||
|
if type(callback) == "function" then
|
||||||
|
local rv, err = call("get", {
|
||||||
|
config = config,
|
||||||
|
type = stype
|
||||||
|
})
|
||||||
|
|
||||||
|
if type(rv) == "table" and type(rv.values) == "table" then
|
||||||
|
local sections = { }
|
||||||
|
local res = false
|
||||||
|
local index = 1
|
||||||
|
|
||||||
|
local _, section
|
||||||
|
for _, section in pairs(rv.values) do
|
||||||
|
section[".index"] = section[".index"] or index
|
||||||
|
sections[index] = section
|
||||||
|
index = index + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(sections, function(a, b)
|
||||||
|
return a[".index"] < b[".index"]
|
||||||
|
end)
|
||||||
|
|
||||||
|
for _, section in ipairs(sections) do
|
||||||
|
local continue = callback(section)
|
||||||
|
res = true
|
||||||
|
if continue == false then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return res
|
||||||
|
else
|
||||||
|
return false, ERRSTR[err] or "No data"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return false, "Invalid argument"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _get(self, operation, config, section, option)
|
||||||
|
if section == nil then
|
||||||
|
return nil
|
||||||
|
elseif type(option) == "string" and option:byte(1) ~= 46 then
|
||||||
|
local rv, err = call(operation, {
|
||||||
|
config = config,
|
||||||
|
section = section,
|
||||||
|
option = option
|
||||||
|
})
|
||||||
|
|
||||||
|
if type(rv) == "table" then
|
||||||
|
return rv.value or nil
|
||||||
|
elseif err then
|
||||||
|
return false, ERRSTR[err]
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
elseif option == nil then
|
||||||
|
local values = self:get_all(config, section)
|
||||||
|
if values then
|
||||||
|
return values[".type"], values[".name"]
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return false, "Invalid argument"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function get(self, ...)
|
||||||
|
return _get(self, "get", ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_state(self, ...)
|
||||||
|
return _get(self, "state", ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_all(self, config, section)
|
||||||
|
local rv, err = call("get", {
|
||||||
|
config = config,
|
||||||
|
section = section
|
||||||
|
})
|
||||||
|
|
||||||
|
if type(rv) == "table" and type(rv.values) == "table" then
|
||||||
|
return rv.values
|
||||||
|
elseif err then
|
||||||
|
return false, ERRSTR[err]
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_bool(self, ...)
|
||||||
|
local val = self:get(...)
|
||||||
|
return (val == "1" or val == "true" or val == "yes" or val == "on")
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_first(self, config, stype, option, default)
|
||||||
|
local rv = default
|
||||||
|
|
||||||
|
self:foreach(config, stype, function(s)
|
||||||
|
local val = not option and s[".name"] or s[option]
|
||||||
|
|
||||||
|
if type(default) == "number" then
|
||||||
|
val = tonumber(val)
|
||||||
|
elseif type(default) == "boolean" then
|
||||||
|
val = (val == "1" or val == "true" or
|
||||||
|
val == "yes" or val == "on")
|
||||||
|
end
|
||||||
|
|
||||||
|
if val ~= nil then
|
||||||
|
rv = val
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
return rv
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_list(self, config, section, option)
|
||||||
|
if config and section and option then
|
||||||
|
local val = self:get(config, section, option)
|
||||||
|
return (type(val) == "table" and val or { val })
|
||||||
|
end
|
||||||
|
return { }
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function section(self, config, stype, name, values)
|
||||||
|
local rv, err = call("add", {
|
||||||
|
config = config,
|
||||||
|
type = stype,
|
||||||
|
name = name,
|
||||||
|
values = values
|
||||||
|
})
|
||||||
|
|
||||||
|
if type(rv) == "table" then
|
||||||
|
return rv.section
|
||||||
|
elseif err then
|
||||||
|
return false, ERRSTR[err]
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function add(self, config, stype)
|
||||||
|
return self:section(config, stype)
|
||||||
|
end
|
||||||
|
|
||||||
|
function set(self, config, section, option, value)
|
||||||
|
if value == nil then
|
||||||
|
local sname, err = self:section(config, option, section)
|
||||||
|
return (not not sname), err
|
||||||
|
else
|
||||||
|
local _, err = call("set", {
|
||||||
|
config = config,
|
||||||
|
section = section,
|
||||||
|
values = { [option] = value }
|
||||||
|
})
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function set_list(self, config, section, option, value)
|
||||||
|
if section == nil or option == nil then
|
||||||
|
return false
|
||||||
|
elseif value == nil or (type(value) == "table" and #value == 0) then
|
||||||
|
return self:delete(config, section, option)
|
||||||
|
elseif type(value) == "table" then
|
||||||
|
return self:set(config, section, option, value)
|
||||||
|
else
|
||||||
|
return self:set(config, section, option, { value })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function tset(self, config, section, values)
|
||||||
|
local _, err = call("set", {
|
||||||
|
config = config,
|
||||||
|
section = section,
|
||||||
|
values = values
|
||||||
|
})
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
|
||||||
|
function reorder(self, config, section, index)
|
||||||
|
local sections
|
||||||
|
|
||||||
|
if type(section) == "string" and type(index) == "number" then
|
||||||
|
local pos = 0
|
||||||
|
|
||||||
|
sections = { }
|
||||||
|
|
||||||
|
self:foreach(config, nil, function(s)
|
||||||
|
if pos == index then
|
||||||
|
pos = pos + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if s[".name"] ~= section then
|
||||||
|
pos = pos + 1
|
||||||
|
sections[pos] = s[".name"]
|
||||||
|
else
|
||||||
|
sections[index + 1] = section
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
elseif type(section) == "table" then
|
||||||
|
sections = section
|
||||||
|
else
|
||||||
|
return false, "Invalid argument"
|
||||||
|
end
|
||||||
|
|
||||||
|
local _, err = call("order", {
|
||||||
|
config = config,
|
||||||
|
sections = sections
|
||||||
|
})
|
||||||
|
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function delete(self, config, section, option)
|
||||||
|
local _, err = call("delete", {
|
||||||
|
config = config,
|
||||||
|
section = section,
|
||||||
|
option = option
|
||||||
|
})
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
|
||||||
|
function delete_all(self, config, stype, comparator)
|
||||||
|
local _, err
|
||||||
|
if type(comparator) == "table" then
|
||||||
|
_, err = call("delete", {
|
||||||
|
config = config,
|
||||||
|
type = stype,
|
||||||
|
match = comparator
|
||||||
|
})
|
||||||
|
elseif type(comparator) == "function" then
|
||||||
|
local rv = call("get", {
|
||||||
|
config = config,
|
||||||
|
type = stype
|
||||||
|
})
|
||||||
|
|
||||||
|
if type(rv) == "table" and type(rv.values) == "table" then
|
||||||
|
local sname, section
|
||||||
|
for sname, section in pairs(rv.values) do
|
||||||
|
if comparator(section) then
|
||||||
|
_, err = call("delete", {
|
||||||
|
config = config,
|
||||||
|
section = sname
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif comparator == nil then
|
||||||
|
_, err = call("delete", {
|
||||||
|
config = config,
|
||||||
|
type = stype
|
||||||
|
})
|
||||||
|
else
|
||||||
|
return false, "Invalid argument"
|
||||||
|
end
|
||||||
|
|
||||||
|
return (err == nil), ERRSTR[err]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function apply(self, configlist, command)
|
||||||
configlist = self:_affected(configlist)
|
configlist = self:_affected(configlist)
|
||||||
if command then
|
if command then
|
||||||
return { "/sbin/luci-reload", unpack(configlist) }
|
return { "/sbin/luci-reload", unpack(configlist) }
|
||||||
else
|
else
|
||||||
return os.execute("/sbin/luci-reload %s >/dev/null 2>&1"
|
return os.execute("/sbin/luci-reload %s >/dev/null 2>&1"
|
||||||
% table.concat(configlist, " "))
|
% util.shellquote(table.concat(configlist, " ")))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- returns a boolean whether to delete the current section (optional)
|
|
||||||
function Cursor.delete_all(self, config, stype, comparator)
|
|
||||||
local del = {}
|
|
||||||
|
|
||||||
if type(comparator) == "table" then
|
|
||||||
local tbl = comparator
|
|
||||||
comparator = function(section)
|
|
||||||
for k, v in pairs(tbl) do
|
|
||||||
if section[k] ~= v then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function helper (section)
|
|
||||||
|
|
||||||
if not comparator or comparator(section) then
|
|
||||||
del[#del+1] = section[".name"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
self:foreach(config, stype, helper)
|
|
||||||
|
|
||||||
for i, j in ipairs(del) do
|
|
||||||
self:delete(config, j)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function Cursor.section(self, config, type, name, values)
|
|
||||||
local stat = true
|
|
||||||
if name then
|
|
||||||
stat = self:set(config, name, type)
|
|
||||||
else
|
|
||||||
name = self:add(config, type)
|
|
||||||
stat = name and true
|
|
||||||
end
|
|
||||||
|
|
||||||
if stat and values then
|
|
||||||
stat = self:tset(config, name, values)
|
|
||||||
end
|
|
||||||
|
|
||||||
return stat and name
|
|
||||||
end
|
|
||||||
|
|
||||||
function Cursor.tset(self, config, section, values)
|
|
||||||
local stat = true
|
|
||||||
for k, v in pairs(values) do
|
|
||||||
if k:sub(1, 1) ~= "." then
|
|
||||||
stat = stat and self:set(config, section, k, v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return stat
|
|
||||||
end
|
|
||||||
|
|
||||||
function Cursor.get_bool(self, ...)
|
|
||||||
local val = self:get(...)
|
|
||||||
return ( val == "1" or val == "true" or val == "yes" or val == "on" )
|
|
||||||
end
|
|
||||||
|
|
||||||
function Cursor.get_list(self, config, section, option)
|
|
||||||
if config and section and option then
|
|
||||||
local val = self:get(config, section, option)
|
|
||||||
return ( type(val) == "table" and val or { val } )
|
|
||||||
end
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
|
|
||||||
function Cursor.get_first(self, conf, stype, opt, def)
|
|
||||||
local rv = def
|
|
||||||
|
|
||||||
self:foreach(conf, stype,
|
|
||||||
function(s)
|
|
||||||
local val = not opt and s['.name'] or s[opt]
|
|
||||||
|
|
||||||
if type(def) == "number" then
|
|
||||||
val = tonumber(val)
|
|
||||||
elseif type(def) == "boolean" then
|
|
||||||
val = (val == "1" or val == "true" or
|
|
||||||
val == "yes" or val == "on")
|
|
||||||
end
|
|
||||||
|
|
||||||
if val ~= nil then
|
|
||||||
rv = val
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
return rv
|
|
||||||
end
|
|
||||||
|
|
||||||
function Cursor.set_list(self, config, section, option, value)
|
|
||||||
if config and section and option then
|
|
||||||
if not value or #value == 0 then
|
|
||||||
return self:delete(config, section, option)
|
|
||||||
end
|
|
||||||
return self:set(
|
|
||||||
config, section, option,
|
|
||||||
( type(value) == "table" and value or { value } )
|
|
||||||
)
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Return a list of initscripts affected by configuration changes.
|
-- Return a list of initscripts affected by configuration changes.
|
||||||
function Cursor._affected(self, configlist)
|
function _affected(self, configlist)
|
||||||
configlist = type(configlist) == "table" and configlist or {configlist}
|
configlist = type(configlist) == "table" and configlist or { configlist }
|
||||||
|
|
||||||
local c = cursor()
|
|
||||||
c:load("ucitrack")
|
|
||||||
|
|
||||||
-- Resolve dependencies
|
-- Resolve dependencies
|
||||||
local reloadlist = {}
|
local reloadlist = { }
|
||||||
|
|
||||||
local function _resolve_deps(name)
|
local function _resolve_deps(name)
|
||||||
local reload = {name}
|
local reload = { name }
|
||||||
local deps = {}
|
local deps = { }
|
||||||
|
|
||||||
c:foreach("ucitrack", name,
|
self:foreach("ucitrack", name,
|
||||||
function(section)
|
function(section)
|
||||||
if section.affects then
|
if section.affects then
|
||||||
for i, aff in ipairs(section.affects) do
|
for i, aff in ipairs(section.affects) do
|
||||||
|
@ -173,7 +457,9 @@ function Cursor._affected(self, configlist)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
local i, dep
|
||||||
for i, dep in ipairs(deps) do
|
for i, dep in ipairs(deps) do
|
||||||
|
local j, add
|
||||||
for j, add in ipairs(_resolve_deps(dep)) do
|
for j, add in ipairs(_resolve_deps(dep)) do
|
||||||
reload[#reload+1] = add
|
reload[#reload+1] = add
|
||||||
end
|
end
|
||||||
|
@ -183,7 +469,9 @@ function Cursor._affected(self, configlist)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Collect initscripts
|
-- Collect initscripts
|
||||||
|
local j, config
|
||||||
for j, config in ipairs(configlist) do
|
for j, config in ipairs(configlist) do
|
||||||
|
local i, e
|
||||||
for i, e in ipairs(_resolve_deps(config)) do
|
for i, e in ipairs(_resolve_deps(config)) do
|
||||||
if not util.contains(reloadlist, e) then
|
if not util.contains(reloadlist, e) then
|
||||||
reloadlist[#reloadlist+1] = e
|
reloadlist[#reloadlist+1] = e
|
||||||
|
@ -193,44 +481,3 @@ function Cursor._affected(self, configlist)
|
||||||
|
|
||||||
return reloadlist
|
return reloadlist
|
||||||
end
|
end
|
||||||
|
|
||||||
-- curser, means it the parent unloads or loads configs, the sub state will
|
|
||||||
-- do so as well.
|
|
||||||
function Cursor.substate(self)
|
|
||||||
Cursor._substates = Cursor._substates or { }
|
|
||||||
Cursor._substates[self] = Cursor._substates[self] or cursor_state()
|
|
||||||
return Cursor._substates[self]
|
|
||||||
end
|
|
||||||
|
|
||||||
local _load = Cursor.load
|
|
||||||
function Cursor.load(self, ...)
|
|
||||||
if Cursor._substates and Cursor._substates[self] then
|
|
||||||
_load(Cursor._substates[self], ...)
|
|
||||||
end
|
|
||||||
return _load(self, ...)
|
|
||||||
end
|
|
||||||
|
|
||||||
local _unload = Cursor.unload
|
|
||||||
function Cursor.unload(self, ...)
|
|
||||||
if Cursor._substates and Cursor._substates[self] then
|
|
||||||
_unload(Cursor._substates[self], ...)
|
|
||||||
end
|
|
||||||
return _unload(self, ...)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,224 +14,226 @@ module "luci.model.uci"
|
||||||
---[[
|
---[[
|
||||||
Create a new UCI-Cursor.
|
Create a new UCI-Cursor.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name cursor
|
@name cursor
|
||||||
@return UCI-Cursor
|
@return UCI-Cursor
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Create a new Cursor initialized to the state directory.
|
Create a new Cursor initialized to the state directory.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name cursor_state
|
@name cursor_state
|
||||||
@return UCI cursor
|
@return UCI cursor
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Applies UCI configuration changes
|
Applies UCI configuration changes
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.apply
|
@name Cursor.apply
|
||||||
@param configlist List of UCI configurations
|
@param configlist List of UCI configurations
|
||||||
@param command Don't apply only return the command
|
@param command Don't apply only return the command
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Delete all sections of a given type that match certain criteria.
|
Delete all sections of a given type that match certain criteria.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.delete_all
|
@name Cursor.delete_all
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param type UCI section type
|
@param type UCI section type
|
||||||
@param comparator Function that will be called for each section and
|
@param comparator Function that will be called for each section and returns
|
||||||
returns a boolean whether to delete the current section (optional)
|
a boolean whether to delete the current section (optional)
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Create a new section and initialize it with data.
|
Create a new section and initialize it with data.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.section
|
@name Cursor.section
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param type UCI section type
|
@param type UCI section type
|
||||||
@param name UCI section name (optional)
|
@param name UCI section name (optional)
|
||||||
@param values Table of key - value pairs to initialize the section with
|
@param values Table of key - value pairs to initialize the section with
|
||||||
@return Name of created section
|
@return Name of created section
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Updated the data of a section using data from a table.
|
Updated the data of a section using data from a table.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.tset
|
@name Cursor.tset
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name (optional)
|
@param section UCI section name (optional)
|
||||||
@param values Table of key - value pairs to update the section with
|
@param values Table of key - value pairs to update the section with
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get a boolean option and return it's value as true or false.
|
Get a boolean option and return it's value as true or false.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get_bool
|
@name Cursor.get_bool
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name
|
@param section UCI section name
|
||||||
@param option UCI option
|
@param option UCI option
|
||||||
@return Boolean
|
@return Boolean
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get an option or list and return values as table.
|
Get an option or list and return values as table.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get_list
|
@name Cursor.get_list
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name
|
@param section UCI section name
|
||||||
@param option UCI option
|
@param option UCI option
|
||||||
@return table. If the option was not found, you will simply get
|
@return table. If the option was not found, you will simply get an empty
|
||||||
-- an empty table.
|
table.
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get the given option from the first section with the given type.
|
Get the given option from the first section with the given type.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get_first
|
@name Cursor.get_first
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param type UCI section type
|
@param type UCI section type
|
||||||
@param option UCI option (optional)
|
@param option UCI option (optional)
|
||||||
@param default Default value (optional)
|
@param default Default value (optional)
|
||||||
@return UCI value
|
@return UCI value
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Set given values as list. Setting a list option to an empty list
|
Set given values as list. Setting a list option to an empty list
|
||||||
has the same effect as deleting the option.
|
has the same effect as deleting the option.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.set_list
|
@name Cursor.set_list
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name
|
@param section UCI section name
|
||||||
@param option UCI option
|
@param option UCI option
|
||||||
@param value value or table. Raw values will become a single item table.
|
@param value Value or table. Non-table values will be set as single
|
||||||
@return Boolean whether operation succeeded
|
item UCI list.
|
||||||
|
@return Boolean whether operation succeeded
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Create a sub-state of this cursor. The sub-state is tied to the parent
|
Create a sub-state of this cursor.
|
||||||
|
|
||||||
curser, means it the parent unloads or loads configs, the sub state will
|
The sub-state is tied to the parent curser, means it the parent unloads or
|
||||||
do so as well.
|
loads configs, the sub state will do so as well.
|
||||||
@class function
|
|
||||||
@name Cursor.substate
|
@class function
|
||||||
@return UCI state cursor tied to the parent cursor
|
@name Cursor.substate
|
||||||
|
@return UCI state cursor tied to the parent cursor
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Add an anonymous section.
|
Add an anonymous section.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.add
|
@name Cursor.add
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param type UCI section type
|
@param type UCI section type
|
||||||
@return Name of created section
|
@return Name of created section
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get a table of saved but uncommitted changes.
|
Get a table of saved but uncommitted changes.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.changes
|
@name Cursor.changes
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@return Table of changes
|
@return Table of changes
|
||||||
@see Cursor.save
|
@see Cursor.save
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Commit saved changes.
|
Commit saved changes.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.commit
|
@name Cursor.commit
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
@see Cursor.revert
|
@see Cursor.revert
|
||||||
@see Cursor.save
|
@see Cursor.save
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Deletes a section or an option.
|
Deletes a section or an option.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.delete
|
@name Cursor.delete
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name
|
@param section UCI section name
|
||||||
@param option UCI option (optional)
|
@param option UCI option (optional)
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Call a function for every section of a certain type.
|
Call a function for every section of a certain type.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.foreach
|
@name Cursor.foreach
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param type UCI section type
|
@param type UCI section type
|
||||||
@param callback Function to be called
|
@param callback Function to be called
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get a section type or an option
|
Get a section type or an option
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get
|
@name Cursor.get
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name
|
@param section UCI section name
|
||||||
@param option UCI option (optional)
|
@param option UCI option (optional)
|
||||||
@return UCI value
|
@return UCI value
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get all sections of a config or all values of a section.
|
Get all sections of a config or all values of a section.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get_all
|
@name Cursor.get_all
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name (optional)
|
@param section UCI section name (optional)
|
||||||
@return Table of UCI sections or table of UCI values
|
@return Table of UCI sections or table of UCI values
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Manually load a config.
|
Manually load a config.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.load
|
@name Cursor.load
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
@see Cursor.save
|
@see Cursor.save
|
||||||
@see Cursor.unload
|
@see Cursor.unload
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Revert saved but uncommitted changes.
|
Revert saved but uncommitted changes.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.revert
|
@name Cursor.revert
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
@see Cursor.commit
|
@see Cursor.commit
|
||||||
@see Cursor.save
|
@see Cursor.save
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Saves changes made to a config to make them committable.
|
Saves changes made to a config to make them committable.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.save
|
@name Cursor.save
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
@see Cursor.load
|
@see Cursor.load
|
||||||
@see Cursor.unload
|
@see Cursor.unload
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
|
@ -243,57 +245,74 @@ then a named section of the given type is created.
|
||||||
When invoked with four arguments `config`, `sectionname`, `optionname` and
|
When invoked with four arguments `config`, `sectionname`, `optionname` and
|
||||||
`optionvalue` then the value of the specified option is set to the given value.
|
`optionvalue` then the value of the specified option is set to the given value.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.set
|
@name Cursor.set
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@param section UCI section name
|
@param section UCI section name
|
||||||
@param option UCI option or UCI section type
|
@param option UCI option or UCI section type
|
||||||
@param value UCI value or nothing if you want to create a section
|
@param value UCI value or nothing if you want to create a section
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get the configuration directory.
|
Get the configuration directory.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get_confdir
|
@name Cursor.get_confdir
|
||||||
@return Configuration directory
|
@return Configuration directory
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Get the directory for uncomitted changes.
|
Get the directory for uncomitted changes.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.get_savedir
|
@name Cursor.get_savedir
|
||||||
@return Save directory
|
@return Save directory
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Get the effective session ID.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name Cursor.get_session_id
|
||||||
|
@return String containing the session ID
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Set the configuration directory.
|
Set the configuration directory.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.set_confdir
|
@name Cursor.set_confdir
|
||||||
@param directory UCI configuration directory
|
@param directory UCI configuration directory
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Set the directory for uncommited changes.
|
Set the directory for uncommited changes.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.set_savedir
|
@name Cursor.set_savedir
|
||||||
@param directory UCI changes directory
|
@param directory UCI changes directory
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Set the effective session ID.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name Cursor.set_session_id
|
||||||
|
@param id String containing the session ID to set
|
||||||
|
@return Boolean whether operation succeeded
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Discard changes made to a config.
|
Discard changes made to a config.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name Cursor.unload
|
@name Cursor.unload
|
||||||
@param config UCI config
|
@param config UCI config
|
||||||
@return Boolean whether operation succeeded
|
@return Boolean whether operation succeeded
|
||||||
@see Cursor.load
|
@see Cursor.load
|
||||||
@see Cursor.save
|
@see Cursor.save
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
|
|
@ -87,10 +87,10 @@ end
|
||||||
function httpget(url, stream, target)
|
function httpget(url, stream, target)
|
||||||
if not target then
|
if not target then
|
||||||
local source = stream and io.popen or luci.util.exec
|
local source = stream and io.popen or luci.util.exec
|
||||||
return source("wget -qO- '"..url:gsub("'", "").."'")
|
return source("wget -qO- %s" % luci.util.shellquote(url))
|
||||||
else
|
else
|
||||||
return os.execute("wget -qO '%s' '%s'" %
|
return os.execute("wget -qO %s %s" %
|
||||||
{target:gsub("'", ""), url:gsub("'", "")})
|
{luci.util.shellquote(target), luci.util.shellquote(url)})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -443,18 +443,11 @@ function user.checkpasswd(username, pass)
|
||||||
end
|
end
|
||||||
|
|
||||||
function user.setpasswd(username, password)
|
function user.setpasswd(username, password)
|
||||||
if password then
|
return os.execute("(echo %s; sleep 1; echo %s) | passwd %s >/dev/null 2>&1" %{
|
||||||
password = password:gsub("'", [['"'"']])
|
luci.util.shellquote(password),
|
||||||
end
|
luci.util.shellquote(password),
|
||||||
|
luci.util.shellquote(username)
|
||||||
if username then
|
})
|
||||||
username = username:gsub("'", [['"'"']])
|
|
||||||
end
|
|
||||||
|
|
||||||
return os.execute(
|
|
||||||
"(echo '" .. password .. "'; sleep 1; echo '" .. password .. "') | " ..
|
|
||||||
"passwd '" .. username .. "' >/dev/null 2>&1"
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -202,7 +202,7 @@ TZ = {
|
||||||
{ 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' },
|
{ 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' },
|
||||||
{ 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' },
|
{ 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' },
|
||||||
{ 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' },
|
{ 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' },
|
||||||
{ 'Antarctica/Casey', '<+11>-11' },
|
{ 'Antarctica/Casey', '<+08>-8' },
|
||||||
{ 'Antarctica/Davis', '<+07>-7' },
|
{ 'Antarctica/Davis', '<+07>-7' },
|
||||||
{ 'Antarctica/DumontDUrville', '<+10>-10' },
|
{ 'Antarctica/DumontDUrville', '<+10>-10' },
|
||||||
{ 'Antarctica/Macquarie', '<+11>-11' },
|
{ 'Antarctica/Macquarie', '<+11>-11' },
|
||||||
|
@ -239,8 +239,8 @@ TZ = {
|
||||||
{ 'Asia/Dubai', '<+04>-4' },
|
{ 'Asia/Dubai', '<+04>-4' },
|
||||||
{ 'Asia/Dushanbe', '<+05>-5' },
|
{ 'Asia/Dushanbe', '<+05>-5' },
|
||||||
{ 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
|
{ 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
|
||||||
{ 'Asia/Gaza', 'EET-2EEST,M3.5.6/1,M10.5.6/1' },
|
{ 'Asia/Gaza', 'EET-2EEST,M3.4.6/1,M10.5.6/1' },
|
||||||
{ 'Asia/Hebron', 'EET-2EEST,M3.5.6/1,M10.5.6/1' },
|
{ 'Asia/Hebron', 'EET-2EEST,M3.4.6/1,M10.5.6/1' },
|
||||||
{ 'Asia/Ho Chi Minh', '<+07>-7' },
|
{ 'Asia/Ho Chi Minh', '<+07>-7' },
|
||||||
{ 'Asia/Hong Kong', 'HKT-8' },
|
{ 'Asia/Hong Kong', 'HKT-8' },
|
||||||
{ 'Asia/Hovd', '<+07>-7' },
|
{ 'Asia/Hovd', '<+07>-7' },
|
||||||
|
|
|
@ -187,7 +187,9 @@ function switch_status(devs)
|
||||||
local switches = { }
|
local switches = { }
|
||||||
for dev in devs:gmatch("[^%s,]+") do
|
for dev in devs:gmatch("[^%s,]+") do
|
||||||
local ports = { }
|
local ports = { }
|
||||||
local swc = io.popen("swconfig dev %q show" % dev, "r")
|
local swc = io.popen("swconfig dev %s show"
|
||||||
|
% luci.util.shellquote(dev), "r")
|
||||||
|
|
||||||
if swc then
|
if swc then
|
||||||
local l
|
local l
|
||||||
repeat
|
repeat
|
||||||
|
|
|
@ -10,6 +10,7 @@ local string = require "string"
|
||||||
local coroutine = require "coroutine"
|
local coroutine = require "coroutine"
|
||||||
local tparser = require "luci.template.parser"
|
local tparser = require "luci.template.parser"
|
||||||
local json = require "luci.jsonc"
|
local json = require "luci.jsonc"
|
||||||
|
local lhttp = require "lucihttp"
|
||||||
|
|
||||||
local _ubus = require "ubus"
|
local _ubus = require "ubus"
|
||||||
local _ubus_connection = nil
|
local _ubus_connection = nil
|
||||||
|
@ -160,10 +161,33 @@ function pcdata(value)
|
||||||
return value and tparser.pcdata(tostring(value))
|
return value and tparser.pcdata(tostring(value))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function urlencode(value)
|
||||||
|
if value ~= nil then
|
||||||
|
local str = tostring(value)
|
||||||
|
return lhttp.urlencode(str, lhttp.ENCODE_IF_NEEDED + lhttp.ENCODE_FULL)
|
||||||
|
or str
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function urldecode(value, decode_plus)
|
||||||
|
if value ~= nil then
|
||||||
|
local flag = decode_plus and lhttp.DECODE_PLUS or 0
|
||||||
|
local str = tostring(value)
|
||||||
|
return lhttp.urldecode(str, lhttp.DECODE_IF_NEEDED + flag)
|
||||||
|
or str
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
function striptags(value)
|
function striptags(value)
|
||||||
return value and tparser.striptags(tostring(value))
|
return value and tparser.striptags(tostring(value))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function shellquote(value)
|
||||||
|
return string.format("'%s'", string.gsub(value or "", "'", "'\\''"))
|
||||||
|
end
|
||||||
|
|
||||||
-- for bash, ash and similar shells single-quoted strings are taken
|
-- for bash, ash and similar shells single-quoted strings are taken
|
||||||
-- literally except for single quotes (which terminate the string)
|
-- literally except for single quotes (which terminate the string)
|
||||||
-- (and the exception noted below for dash (-) at the start of a
|
-- (and the exception noted below for dash (-) at the start of a
|
||||||
|
@ -383,16 +407,6 @@ function clone(object, deep)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function dtable()
|
|
||||||
return setmetatable({}, { __index =
|
|
||||||
function(tbl, key)
|
|
||||||
return rawget(tbl, key)
|
|
||||||
or rawget(rawset(tbl, key, dtable()), key)
|
|
||||||
end
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Serialize the contents of a table value.
|
-- Serialize the contents of a table value.
|
||||||
function _serialize_table(t, seen)
|
function _serialize_table(t, seen)
|
||||||
assert(not seen[t], "Recursion detected.")
|
assert(not seen[t], "Recursion detected.")
|
||||||
|
@ -617,6 +631,20 @@ function execl(command)
|
||||||
return data
|
return data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local ubus_codes = {
|
||||||
|
"INVALID_COMMAND",
|
||||||
|
"INVALID_ARGUMENT",
|
||||||
|
"METHOD_NOT_FOUND",
|
||||||
|
"NOT_FOUND",
|
||||||
|
"NO_DATA",
|
||||||
|
"PERMISSION_DENIED",
|
||||||
|
"TIMEOUT",
|
||||||
|
"NOT_SUPPORTED",
|
||||||
|
"UNKNOWN_ERROR",
|
||||||
|
"CONNECTION_FAILED"
|
||||||
|
}
|
||||||
|
|
||||||
function ubus(object, method, data)
|
function ubus(object, method, data)
|
||||||
if not _ubus_connection then
|
if not _ubus_connection then
|
||||||
_ubus_connection = _ubus.connect()
|
_ubus_connection = _ubus.connect()
|
||||||
|
@ -627,7 +655,8 @@ function ubus(object, method, data)
|
||||||
if type(data) ~= "table" then
|
if type(data) ~= "table" then
|
||||||
data = { }
|
data = { }
|
||||||
end
|
end
|
||||||
return _ubus_connection:call(object, method, data)
|
local rv, err = _ubus_connection:call(object, method, data)
|
||||||
|
return rv, err, ubus_codes[err]
|
||||||
elseif object then
|
elseif object then
|
||||||
return _ubus_connection:signatures(object)
|
return _ubus_connection:signatures(object)
|
||||||
else
|
else
|
||||||
|
@ -652,10 +681,11 @@ end
|
||||||
function checklib(fullpathexe, wantedlib)
|
function checklib(fullpathexe, wantedlib)
|
||||||
local fs = require "nixio.fs"
|
local fs = require "nixio.fs"
|
||||||
local haveldd = fs.access('/usr/bin/ldd')
|
local haveldd = fs.access('/usr/bin/ldd')
|
||||||
if not haveldd then
|
local haveexe = fs.access(fullpathexe)
|
||||||
|
if not haveldd or not haveexe then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local libs = exec("/usr/bin/ldd " .. fullpathexe)
|
local libs = exec(string.format("/usr/bin/ldd %s", shellquote(fullpathexe)))
|
||||||
if not libs then
|
if not libs then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,126 +15,164 @@ Class can be instantiated by calling them. All parameters will be passed
|
||||||
to the __init__ function of this class - if such a function exists.
|
to the __init__ function of this class - if such a function exists.
|
||||||
The __init__ function must be used to set any object parameters that are not shared
|
The __init__ function must be used to set any object parameters that are not shared
|
||||||
with other objects of this class. Any return values will be ignored.
|
with other objects of this class. Any return values will be ignored.
|
||||||
@class function
|
|
||||||
@name class
|
@class function
|
||||||
@param base The base class to inherit from (optional)
|
@name class
|
||||||
@return A class object
|
@param base The base class to inherit from (optional)
|
||||||
@see instanceof
|
@return A class object
|
||||||
@see clone
|
@see instanceof
|
||||||
|
@see clone
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Test whether the given object is an instance of the given class.
|
Test whether the given object is an instance of the given class.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name instanceof
|
@name instanceof
|
||||||
@param object Object instance
|
@param object Object instance
|
||||||
@param class Class object to test against
|
@param class Class object to test against
|
||||||
@return Boolean indicating whether the object is an instance
|
@return Boolean indicating whether the object is an instance
|
||||||
@see class
|
@see class
|
||||||
@see clone
|
@see clone
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Create a new or get an already existing thread local store associated with
|
Create a new or get an already existing thread local store associated with
|
||||||
|
the current active coroutine.
|
||||||
|
|
||||||
the current active coroutine. A thread local store is private a table object
|
A thread local store is private a table object
|
||||||
whose values can't be accessed from outside of the running coroutine.
|
whose values can't be accessed from outside of the running coroutine.
|
||||||
@class function
|
|
||||||
@name threadlocal
|
@class function
|
||||||
@return Table value representing the corresponding thread local store
|
@name threadlocal
|
||||||
|
@return Table value representing the corresponding thread local store
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Write given object to stderr.
|
Write given object to stderr.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name perror
|
@name perror
|
||||||
@param obj Value to write to stderr
|
@param obj Value to write to stderr
|
||||||
@return Boolean indicating whether the write operation was successful
|
@return Boolean indicating whether the write operation was successful
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Recursively dumps a table to stdout, useful for testing and debugging.
|
Recursively dumps a table to stdout, useful for testing and debugging.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name dumptable
|
@name dumptable
|
||||||
@param t Table value to dump
|
@param t Table value to dump
|
||||||
@param maxdepth Maximum depth
|
@param maxdepth Maximum depth
|
||||||
@return Always nil
|
@return Always nil
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Create valid XML PCDATA from given string.
|
Create valid XML PCDATA from given string.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name pcdata
|
@name pcdata
|
||||||
@param value String value containing the data to escape
|
@param value String value containing the data to escape
|
||||||
@return String value containing the escaped data
|
@return String value containing the escaped data
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Decode an URL-encoded string - optionally decoding the "+" sign to space.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urldecode
|
||||||
|
@param str Input string in x-www-urlencoded format
|
||||||
|
@param decode_plus Decode "+" signs to spaces if true (optional)
|
||||||
|
@return The decoded string
|
||||||
|
@see urlencode
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
URL-encode given string.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name urlencode
|
||||||
|
@param str String to encode
|
||||||
|
@return String containing the encoded data
|
||||||
|
@see urldecode
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Strip HTML tags from given string.
|
Strip HTML tags from given string.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name striptags
|
@name striptags
|
||||||
@param value String containing the HTML text
|
@param value String containing the HTML text
|
||||||
@return String with HTML tags stripped of
|
@return String with HTML tags stripped of
|
||||||
|
]]
|
||||||
|
|
||||||
|
---[[
|
||||||
|
Safely quote value for use in shell commands.
|
||||||
|
|
||||||
|
@class function
|
||||||
|
@name shellquote
|
||||||
|
@param value String containing the value to quote
|
||||||
|
@return Single-quote enclosed string with embedded quotes escaped
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Splits given string on a defined separator sequence and return a table
|
Splits given string on a defined separator sequence and return a table
|
||||||
|
containing the resulting substrings.
|
||||||
|
|
||||||
containing the resulting substrings. The optional max parameter specifies
|
The optional max parameter specifies the number of bytes to process,
|
||||||
the number of bytes to process, regardless of the actual length of the given
|
regardless of the actual length of the given string. The optional last
|
||||||
string. The optional last parameter, regex, specifies whether the separator
|
parameter, regex, specifies whether the separator sequence is
|
||||||
sequence is interpreted as regular expression.
|
nterpreted as regular expression.
|
||||||
@class function
|
|
||||||
@name split
|
@class function
|
||||||
@param str String value containing the data to split up
|
@name split
|
||||||
@param pat String with separator pattern (optional, defaults to "\n")
|
@param str String value containing the data to split up
|
||||||
@param max Maximum times to split (optional)
|
@param pat String with separator pattern (optional, defaults to "\n")
|
||||||
@param regex Boolean indicating whether to interpret the separator
|
@param max Maximum times to split (optional)
|
||||||
|
@param regex Boolean indicating whether to interpret the separator
|
||||||
-- pattern as regular expression (optional, default is false)
|
-- pattern as regular expression (optional, default is false)
|
||||||
@return Table containing the resulting substrings
|
@return Table containing the resulting substrings
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Remove leading and trailing whitespace from given string value.
|
Remove leading and trailing whitespace from given string value.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name trim
|
@name trim
|
||||||
@param str String value containing whitespace padded data
|
@param str String value containing whitespace padded data
|
||||||
@return String value with leading and trailing space removed
|
@return String value with leading and trailing space removed
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Count the occurrences of given substring in given string.
|
Count the occurrences of given substring in given string.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name cmatch
|
@name cmatch
|
||||||
@param str String to search in
|
@param str String to search in
|
||||||
@param pattern String containing pattern to find
|
@param pattern String containing pattern to find
|
||||||
@return Number of found occurrences
|
@return Number of found occurrences
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return a matching iterator for the given value. The iterator will return
|
Return a matching iterator for the given value.
|
||||||
|
|
||||||
one token per invocation, the tokens are separated by whitespace. If the
|
The iterator will return one token per invocation, the tokens are separated by
|
||||||
input value is a table, it is transformed into a string first. A nil value
|
whitespace. If the input value is a table, it is transformed into a string first.
|
||||||
will result in a valid interator which aborts with the first invocation.
|
A nil value will result in a valid interator which aborts with the first invocation.
|
||||||
@class function
|
|
||||||
@name imatch
|
@class function
|
||||||
@param val The value to scan (table, string or nil)
|
@name imatch
|
||||||
@return Iterator which returns one token per call
|
@param val The value to scan (table, string or nil)
|
||||||
|
@return Iterator which returns one token per call
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Parse certain units from the given string and return the canonical integer
|
Parse certain units from the given string and return the canonical integer
|
||||||
|
value or 0 if the unit is unknown.
|
||||||
|
|
||||||
value or 0 if the unit is unknown. Upper- or lower case is irrelevant.
|
Upper- or lower case is irrelevant.
|
||||||
Recognized units are:
|
Recognized units are:
|
||||||
|
|
||||||
-- o "y" - one year (60*60*24*366)
|
-- o "y" - one year (60*60*24*366)
|
||||||
o "m" - one month (60*60*24*31)
|
o "m" - one month (60*60*24*31)
|
||||||
o "w" - one week (60*60*24*7)
|
o "w" - one week (60*60*24*7)
|
||||||
|
@ -147,232 +185,229 @@ Recognized units are:
|
||||||
o "kib" - one si kilobyte (1000)
|
o "kib" - one si kilobyte (1000)
|
||||||
o "mib" - one si megabyte (1000*1000)
|
o "mib" - one si megabyte (1000*1000)
|
||||||
o "gib" - one si gigabyte (1000*1000*1000)
|
o "gib" - one si gigabyte (1000*1000*1000)
|
||||||
@class function
|
|
||||||
@name parse_units
|
@class function
|
||||||
@param ustr String containing a numerical value with trailing unit
|
@name parse_units
|
||||||
@return Number containing the canonical value
|
@param ustr String containing a numerical value with trailing unit
|
||||||
|
@return Number containing the canonical value
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Appends numerically indexed tables or single objects to a given table.
|
Appends numerically indexed tables or single objects to a given table.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name append
|
@name append
|
||||||
@param src Target table
|
@param src Target table
|
||||||
@param ... Objects to insert
|
@param ... Objects to insert
|
||||||
@return Target table
|
@return Target table
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Combines two or more numerically indexed tables and single objects into one table.
|
Combines two or more numerically indexed tables and single objects into one table.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name combine
|
@name combine
|
||||||
@param tbl1 Table value to combine
|
@param tbl1 Table value to combine
|
||||||
@param tbl2 Table value to combine
|
@param tbl2 Table value to combine
|
||||||
@param ... More tables to combine
|
@param ... More tables to combine
|
||||||
@return Table value containing all values of given tables
|
@return Table value containing all values of given tables
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Checks whether the given table contains the given value.
|
Checks whether the given table contains the given value.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name contains
|
@name contains
|
||||||
@param table Table value
|
@param table Table value
|
||||||
@param value Value to search within the given table
|
@param value Value to search within the given table
|
||||||
@return number indicating the first index at which the given value occurs
|
@return Number indicating the first index at which the given value occurs
|
||||||
-- within table or false.
|
-- within table or false.
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Update values in given table with the values from the second given table.
|
Update values in given table with the values from the second given table.
|
||||||
|
|
||||||
Both table are - in fact - merged together.
|
Both table are - in fact - merged together.
|
||||||
@class function
|
|
||||||
@name update
|
@class function
|
||||||
|
@name update
|
||||||
@param t Table which should be updated
|
@param t Table which should be updated
|
||||||
@param updates Table containing the values to update
|
@param updates Table containing the values to update
|
||||||
@return Always nil
|
@return Always nil
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Retrieve all keys of given associative table.
|
Retrieve all keys of given associative table.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name keys
|
@name keys
|
||||||
@param t Table to extract keys from
|
@param t Table to extract keys from
|
||||||
@return Sorted table containing the keys
|
@return Sorted table containing the keys
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Clones the given object and return it's copy.
|
Clones the given object and return it's copy.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name clone
|
@name clone
|
||||||
@param object Table value to clone
|
@param object Table value to clone
|
||||||
@param deep Boolean indicating whether to do recursive cloning
|
@param deep Boolean indicating whether to do recursive cloning
|
||||||
@return Cloned table value
|
@return Cloned table value
|
||||||
]]
|
|
||||||
|
|
||||||
---[[
|
|
||||||
Create a dynamic table which automatically creates subtables.
|
|
||||||
|
|
||||||
@class function
|
|
||||||
@name dtable
|
|
||||||
@return Dynamic Table
|
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Recursively serialize given data to lua code, suitable for restoring
|
Recursively serialize given data to lua code, suitable for restoring
|
||||||
|
|
||||||
with loadstring().
|
with loadstring().
|
||||||
@class function
|
|
||||||
@name serialize_data
|
@class function
|
||||||
@param val Value containing the data to serialize
|
@name serialize_data
|
||||||
@return String value containing the serialized code
|
@param val Value containing the data to serialize
|
||||||
@see restore_data
|
@return String value containing the serialized code
|
||||||
@see get_bytecode
|
@see restore_data
|
||||||
|
@see get_bytecode
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Restore data previously serialized with serialize_data().
|
Restore data previously serialized with serialize_data().
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name restore_data
|
@name restore_data
|
||||||
@param str String containing the data to restore
|
@param str String containing the data to restore
|
||||||
@return Value containing the restored data structure
|
@return Value containing the restored data structure
|
||||||
@see serialize_data
|
@see serialize_data
|
||||||
@see get_bytecode
|
@see get_bytecode
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return the current runtime bytecode of the given data. The byte code
|
Return the current runtime bytecode of the given data. The byte code
|
||||||
|
|
||||||
will be stripped before it is returned.
|
will be stripped before it is returned.
|
||||||
@class function
|
|
||||||
@name get_bytecode
|
@class function
|
||||||
@param val Value to return as bytecode
|
@name get_bytecode
|
||||||
@return String value containing the bytecode of the given data
|
@param val Value to return as bytecode
|
||||||
|
@return String value containing the bytecode of the given data
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Strips unnescessary lua bytecode from given string. Information like line
|
Strips unnescessary lua bytecode from given string.
|
||||||
|
|
||||||
numbers and debugging numbers will be discarded. Original version by
|
Information like line numbers and debugging numbers will be discarded.
|
||||||
Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
|
Original version by Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
|
||||||
@class function
|
|
||||||
@name strip_bytecode
|
@class function
|
||||||
@param code String value containing the original lua byte code
|
@name strip_bytecode
|
||||||
@return String value containing the stripped lua byte code
|
@param code String value containing the original lua byte code
|
||||||
|
@return String value containing the stripped lua byte code
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return a key, value iterator which returns the values sorted according to
|
Return a key, value iterator which returns the values sorted according to
|
||||||
|
|
||||||
the provided callback function.
|
the provided callback function.
|
||||||
@class function
|
|
||||||
@name spairs
|
@class function
|
||||||
@param t The table to iterate
|
@name spairs
|
||||||
@param f A callback function to decide the order of elements
|
@param t The table to iterate
|
||||||
@return Function value containing the corresponding iterator
|
@param f A callback function to decide the order of elements
|
||||||
|
@return Function value containing the corresponding iterator
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return a key, value iterator for the given table.
|
Return a key, value iterator for the given table.
|
||||||
|
|
||||||
The table pairs are sorted by key.
|
The table pairs are sorted by key.
|
||||||
@class function
|
|
||||||
@name kspairs
|
@class function
|
||||||
@param t The table to iterate
|
@name kspairs
|
||||||
@return Function value containing the corresponding iterator
|
@param t The table to iterate
|
||||||
|
@return Function value containing the corresponding iterator
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return a key, value iterator for the given table.
|
Return a key, value iterator for the given table.
|
||||||
|
|
||||||
The table pairs are sorted by value.
|
The table pairs are sorted by value.
|
||||||
@class function
|
|
||||||
@name vspairs
|
@class function
|
||||||
@param t The table to iterate
|
@name vspairs
|
||||||
@return Function value containing the corresponding iterator
|
@param t The table to iterate
|
||||||
|
@return Function value containing the corresponding iterator
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Test whether the current system is operating in big endian mode.
|
Test whether the current system is operating in big endian mode.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name bigendian
|
@name bigendian
|
||||||
@return Boolean value indicating whether system is big endian
|
@return Boolean value indicating whether system is big endian
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Execute given commandline and gather stdout.
|
Execute given commandline and gather stdout.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name exec
|
@name exec
|
||||||
@param command String containing command to execute
|
@param command String containing command to execute
|
||||||
@return String containing the command's stdout
|
@return String containing the command's stdout
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Return a line-buffered iterator over the output of given command.
|
Return a line-buffered iterator over the output of given command.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name execi
|
@name execi
|
||||||
@param command String containing the command to execute
|
@param command String containing the command to execute
|
||||||
@return Iterator
|
@return Iterator
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Issue an ubus call.
|
Issue an ubus call.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name ubus
|
@name ubus
|
||||||
@param object String containing the ubus object to call
|
@param object String containing the ubus object to call
|
||||||
@param method String containing the ubus method to call
|
@param method String containing the ubus method to call
|
||||||
@param values Table containing the values to pass
|
@param values Table containing the values to pass
|
||||||
@return Table containin the ubus result
|
@return Table containin the ubus result
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Convert data structure to JSON
|
Convert data structure to JSON
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name serialize_json
|
@name serialize_json
|
||||||
@param data The data to serialize
|
@param data The data to serialize
|
||||||
@param writer A function to write a chunk of JSON data (optional)
|
@param writer A function to write a chunk of JSON data (optional)
|
||||||
@return String containing the JSON if called without write callback
|
@return String containing the JSON if called without write callback
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
Returns the absolute path to LuCI base directory.
|
Returns the absolute path to LuCI base directory.
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name libpath
|
@name libpath
|
||||||
@return String containing the directory path
|
@return String containing the directory path
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
|
This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name coxpcall
|
@name coxpcall
|
||||||
@param f Lua function to be called protected
|
@param f Lua function to be called protected
|
||||||
@param err Custom error handler
|
@param err Custom error handler
|
||||||
@param ... Parameters passed to the function
|
@param ... Parameters passed to the function
|
||||||
@return A boolean whether the function call succeeded and the return
|
@return A boolean whether the function call succeeded and the return
|
||||||
-- values of either the function or the error handler
|
-- values of either the function or the error handler
|
||||||
]]
|
]]
|
||||||
|
|
||||||
---[[
|
---[[
|
||||||
This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
|
This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
|
||||||
|
|
||||||
@class function
|
@class function
|
||||||
@name copcall
|
@name copcall
|
||||||
@param f Lua function to be called protected
|
@param f Lua function to be called protected
|
||||||
@param ... Parameters passed to the function
|
@param ... Parameters passed to the function
|
||||||
@return A boolean whether the function call succeeded and the returns
|
@return A boolean whether the function call succeeded and the returns
|
||||||
-- values of the function or the error object
|
-- values of the function or the error object
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
<%+cbi/valueheader%>
|
<%+cbi/valueheader%>
|
||||||
<input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
|
<input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
cbi_init()
|
||||||
cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=url('admin/filebrowser')%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
|
cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=url('admin/filebrowser')%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
|
||||||
</script>
|
</script>
|
||||||
<%+cbi/valuefooter%>
|
<%+cbi/valuefooter%>
|
||||||
|
|
|
@ -22,9 +22,9 @@
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
function callback(path) {
|
function callback(path) {
|
||||||
if( window.opener ) {
|
if( window.opener ) {
|
||||||
var input = window.opener.document.getElementById('<%=luci.http.formvalue('field')%>');
|
var input = window.opener.document.getElementById(decodeURIComponent('<%=luci.http.urlencode(luci.http.formvalue('field'))%>'));
|
||||||
if( input ) {
|
if( input ) {
|
||||||
input.value = path;
|
input.value = decodeURIComponent(path);
|
||||||
window.close();
|
window.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,33 +48,44 @@
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local filepath = table.concat( path, '/' )
|
local filestat = nixio.fs.stat(table.concat(path, '/'))
|
||||||
local filestat = nixio.fs.stat( filepath )
|
local baseurl = { 'admin', 'filebrowser' }
|
||||||
local baseurl = luci.dispatcher.build_url('admin', 'filebrowser')
|
|
||||||
|
|
||||||
if filestat and filestat.type == "reg" then
|
if filestat and filestat.type == "reg" then
|
||||||
table.remove( path, #path )
|
path[#path] = ''
|
||||||
filepath = table.concat( path, '/' ) .. '/'
|
elseif not (filestat and filestat.type == "dir") then
|
||||||
elseif not ( filestat and filestat.type == "dir" ) then
|
path = { '', '' }
|
||||||
path = { '' }
|
|
||||||
filepath = '/'
|
|
||||||
else
|
else
|
||||||
filepath = filepath .. '/'
|
path[#path+1] = ''
|
||||||
end
|
end
|
||||||
|
|
||||||
local entries = nixio.util.consume((nixio.fs.dir(filepath)))
|
filepath = table.concat(path, '/')
|
||||||
|
|
||||||
|
local entries = {}
|
||||||
|
local _, e
|
||||||
|
for _, e in luci.util.vspairs(nixio.util.consume((nixio.fs.dir(filepath)))) do
|
||||||
|
local p = filepath .. e
|
||||||
|
local s = nixio.fs.stat(p)
|
||||||
|
if s then
|
||||||
|
entries[#entries+1] = {
|
||||||
|
name = e,
|
||||||
|
path = p,
|
||||||
|
type = s.type
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
-%>
|
-%>
|
||||||
<div id="path">
|
<div id="path">
|
||||||
Location:
|
Location:
|
||||||
<% for i, dir in ipairs(path) do %>
|
<% for i, dir in ipairs(path) do %>
|
||||||
<% if i == 1 then %>
|
<% if i == 1 then %>
|
||||||
<a href="<%=baseurl%>?field=<%=field%>">(root)</a>
|
<a href="<%=url(unpack(baseurl))%>?field=<%=luci.http.urlencode(field)%>">(root)</a>
|
||||||
<% elseif next(path, i) then %>
|
<% elseif next(path, i) then %>
|
||||||
<% baseurl = baseurl .. '/' .. dir %>
|
<% baseurl[#baseurl+1] = luci.http.urlencode(dir) %>
|
||||||
/ <a href="<%=baseurl%>?field=<%=field%>"><%=dir%></a>
|
/ <a href="<%=url(unpack(baseurl))%>?field=<%=luci.http.urlencode(field)%>"><%=pcdata(dir)%></a>
|
||||||
<% else %>
|
<% else %>
|
||||||
<% baseurl = baseurl .. '/' .. dir %>
|
<% baseurl[#baseurl+1] = luci.http.urlencode(dir) %>
|
||||||
/ <%=dir%>
|
/ <%=pcdata(dir)%>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -83,23 +94,17 @@
|
||||||
|
|
||||||
<div id="listing">
|
<div id="listing">
|
||||||
<ul>
|
<ul>
|
||||||
<% for _, e in luci.util.vspairs(entries) do
|
<% for _, e in ipairs(entries) do if e.type == 'dir' then -%>
|
||||||
local stat = nixio.fs.stat(filepath..e)
|
|
||||||
if stat and stat.type == 'dir' then
|
|
||||||
-%>
|
|
||||||
<li class="dir">
|
<li class="dir">
|
||||||
<img src="<%=resource%>/cbi/folder.gif" alt="<%:Directory%>" />
|
<img src="<%=resource%>/cbi/folder.gif" alt="<%:Directory%>" />
|
||||||
<a href="<%=baseurl%>/<%=e%>?field=<%=field%>"><%=e%>/</a>
|
<a href="<%=url(unpack(baseurl))%>/<%=luci.http.urlencode(e.name)%>?field=<%=luci.http.urlencode(field)%>"><%=pcdata(e.name)%>/</a>
|
||||||
</li>
|
</li>
|
||||||
<% end end -%>
|
<% end end -%>
|
||||||
|
|
||||||
<% for _, e in luci.util.vspairs(entries) do
|
<% for _, e in ipairs(entries) do if e.type ~= 'dir' then -%>
|
||||||
local stat = nixio.fs.stat(filepath..e)
|
|
||||||
if stat and stat.type ~= 'dir' then
|
|
||||||
-%>
|
|
||||||
<li class="file">
|
<li class="file">
|
||||||
<img src="<%=resource%>/cbi/file.gif" alt="<%:File%>" />
|
<img src="<%=resource%>/cbi/file.gif" alt="<%:File%>" />
|
||||||
<a href="#" onclick="callback('<%=filepath..e%>')"><%=e%></a>
|
<a href="#" onclick="callback('<%=luci.http.urlencode(e.path)%>')"><%=pcdata(e.name)%></a>
|
||||||
</li>
|
</li>
|
||||||
<% end end -%>
|
<% end end -%>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<%- if pageaction then -%>
|
<%- if pageaction then -%>
|
||||||
<div class="cbi-page-actions">
|
<div class="cbi-page-actions">
|
||||||
<% if redirect then %>
|
<% if redirect and not flow.hidebackbtn then %>
|
||||||
<div style="float:left">
|
<div style="float:left">
|
||||||
<input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
|
<input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -52,7 +52,8 @@
|
||||||
<%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
|
<%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
|
||||||
" />
|
" />
|
||||||
<% end %>
|
<% end %>
|
||||||
<script type="text/javascript">cbi_d_update();</script>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<script type="text/javascript">cbi_init();</script>
|
||||||
|
|
|
@ -35,7 +35,7 @@ end
|
||||||
<%- else -%>
|
<%- else -%>
|
||||||
<th> </th>
|
<th> </th>
|
||||||
<%- end -%>
|
<%- end -%>
|
||||||
<%- end -%>
|
<%- count = count +1; end -%>
|
||||||
<%- for i, k in pairs(self.children) do if not k.optional then -%>
|
<%- for i, k in pairs(self.children) do if not k.optional then -%>
|
||||||
<th class="cbi-section-table-cell"<%=width(k)%>>
|
<th class="cbi-section-table-cell"<%=width(k)%>>
|
||||||
<%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
|
<%- if k.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=k.titleref%>"><%- end -%>
|
||||||
|
@ -44,7 +44,7 @@ end
|
||||||
</th>
|
</th>
|
||||||
<%- count = count + 1; end; end; if self.sortable then -%>
|
<%- count = count + 1; end; end; if self.sortable then -%>
|
||||||
<th class="cbi-section-table-cell"><%:Sort%></th>
|
<th class="cbi-section-table-cell"><%:Sort%></th>
|
||||||
<%- end; if self.extedit or self.addremove then -%>
|
<%- count = count + 1; end; if self.extedit or self.addremove then -%>
|
||||||
<th class="cbi-section-table-cell"> </th>
|
<th class="cbi-section-table-cell"> </th>
|
||||||
<%- count = count + 1; end -%>
|
<%- count = count + 1; end -%>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -7,5 +7,5 @@
|
||||||
<%+header%>
|
<%+header%>
|
||||||
<h2 name="content">404 <%:Not Found%></h2>
|
<h2 name="content">404 <%:Not Found%></h2>
|
||||||
<p><%:Sorry, the object you requested was not found.%></p>
|
<p><%:Sorry, the object you requested was not found.%></p>
|
||||||
<tt><%:Unable to dispatch%>: <%=luci.http.request.env.PATH_INFO%></tt>
|
<tt><%:Unable to dispatch%>: <%=url(unpack(luci.dispatcher.context.request))%></tt>
|
||||||
<%+footer%>
|
<%+footer%>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<%+header%>
|
<%+header%>
|
||||||
|
|
||||||
<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
|
<form method="post" action="<%=pcdata(FULL_REQUEST_URI)%>">
|
||||||
<%- if fuser then %>
|
<%- if fuser then %>
|
||||||
<div class="errorbox"><%:Invalid username and/or password! Please try again.%></div>
|
<div class="errorbox"><%:Invalid username and/or password! Please try again.%></div>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|
|
@ -743,6 +743,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1012,6 +1017,11 @@ msgstr "Emergència"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Habilita"
|
msgstr "Habilita"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Habilita l'<abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Habilita l'<abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1069,6 +1079,9 @@ msgstr "Activa/Desactiva"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Habilitat"
|
msgstr "Habilitat"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2154,6 +2167,9 @@ msgstr "Avís"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "D'acord"
|
msgstr "D'acord"
|
||||||
|
|
||||||
|
@ -2913,6 +2929,9 @@ msgstr "Mida"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "Mida (.ipk)"
|
msgstr "Mida (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Salta"
|
msgstr "Salta"
|
||||||
|
|
||||||
|
@ -3305,7 +3324,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3526,7 +3545,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -737,6 +737,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1012,6 +1017,11 @@ msgstr "Záchrana"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Povolit"
|
msgstr "Povolit"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Povolit <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Povolit <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1069,6 +1079,9 @@ msgstr "Povolit/Zakázat"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Povoleno"
|
msgstr "Povoleno"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2162,6 +2175,9 @@ msgstr "Oznámení"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2939,6 +2955,9 @@ msgstr "Velikost"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Přeskočit"
|
msgstr "Přeskočit"
|
||||||
|
|
||||||
|
@ -3347,7 +3366,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3566,7 +3585,7 @@ msgstr "Použít směrovací tabulku"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -763,6 +763,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "Eigene Repositories"
|
msgstr "Eigene Repositories"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1038,6 +1043,11 @@ msgstr "Notfall"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Aktivieren"
|
msgstr "Aktivieren"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> aktivieren"
|
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> aktivieren"
|
||||||
|
|
||||||
|
@ -1096,6 +1106,9 @@ msgstr "Aktivieren/Deaktivieren"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Aktiviert"
|
msgstr "Aktiviert"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2228,6 +2241,9 @@ msgstr "Notiz"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "DNS-Auflösung"
|
msgstr "DNS-Auflösung"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -3039,6 +3055,9 @@ msgstr "Größe"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "Größe (.ipk)"
|
msgstr "Größe (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Überspringen"
|
msgstr "Überspringen"
|
||||||
|
|
||||||
|
@ -3475,15 +3494,15 @@ msgid ""
|
||||||
"This is the content of /etc/rc.local. Insert your own commands here (in "
|
"This is the content of /etc/rc.local. Insert your own commands here (in "
|
||||||
"front of 'exit 0') to execute them at the end of the boot process."
|
"front of 'exit 0') to execute them at the end of the boot process."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dies ist der Inhalt von /etc.rc.local. Hier kann man eigene Befehle einfügen "
|
"Dies ist der Inhalt von /etc/rc.local. Hier kann man eigene Befehle einfügen "
|
||||||
"(vor 'exit 0'), die dann am Ende des Bootvorgangs ausgeführt werden."
|
"(vor 'exit 0'), die dann am Ende des Bootvorgangs ausgeführt werden."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dies ist die lokale, vom Broker zugewiesene IPv6-Adresse, sie endet "
|
"Dies ist die lokale, vom Broker zugewiesene IPv6-Adresse, sie endet "
|
||||||
"üblicherweise mit <code>:2</code>"
|
"üblicherweise mit <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3703,7 +3722,7 @@ msgstr "Benutze Routing-Tabelle"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -746,6 +746,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1024,6 +1029,11 @@ msgstr "Έκτακτη ανάγκη"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Ενεργοποίηση"
|
msgstr "Ενεργοποίηση"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Ενεργοποίηση <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Ενεργοποίηση <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1081,6 +1091,9 @@ msgstr "Ενεργοποίηση/Απενεργοποίηση"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Ενεργοποιημένο"
|
msgstr "Ενεργοποιημένο"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2170,6 +2183,9 @@ msgstr "Επισήμανση"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "Εντάξει"
|
msgstr "Εντάξει"
|
||||||
|
|
||||||
|
@ -2931,6 +2947,9 @@ msgstr "Μέγεθος"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Παράκαμψη"
|
msgstr "Παράκαμψη"
|
||||||
|
|
||||||
|
@ -3307,7 +3326,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3522,7 +3541,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -733,6 +733,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1003,6 +1008,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1060,6 +1070,9 @@ msgstr "Enable/Disable"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Enabled"
|
msgstr "Enabled"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2137,6 +2150,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2895,6 +2911,9 @@ msgstr "Size"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Skip"
|
msgstr "Skip"
|
||||||
|
|
||||||
|
@ -3267,7 +3286,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3479,7 +3498,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -742,6 +742,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1018,6 +1023,11 @@ msgstr "Emergencia"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Activar"
|
msgstr "Activar"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Activar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Activar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1075,6 +1085,9 @@ msgstr "Activar/Desactivar"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Activado"
|
msgstr "Activado"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2176,6 +2189,9 @@ msgstr "Aviso"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "NSLookup"
|
msgstr "NSLookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "Aceptar"
|
msgstr "Aceptar"
|
||||||
|
|
||||||
|
@ -2952,6 +2968,9 @@ msgstr "Tamaño"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Saltar"
|
msgstr "Saltar"
|
||||||
|
|
||||||
|
@ -3372,10 +3391,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Esta es la dirección de punto final asignada por el broker del túnel, suele "
|
"Esta es la dirección de punto final asignada por el broker del túnel, suele "
|
||||||
"terminar con <code>:2</code>"
|
"terminar con <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3591,7 +3610,7 @@ msgstr "Usar tabla de rutas"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -749,6 +749,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1028,6 +1033,11 @@ msgstr "Urgence"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Activer"
|
msgstr "Activer"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Activer le protocole <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Activer le protocole <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1085,6 +1095,9 @@ msgstr "Activer/Désactiver"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Activé"
|
msgstr "Activé"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2190,6 +2203,9 @@ msgstr "Note"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2966,6 +2982,9 @@ msgstr "Taille"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Passer au suivant"
|
msgstr "Passer au suivant"
|
||||||
|
|
||||||
|
@ -3387,10 +3406,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Il s'agit de l'adresse de l'extrémité locale attribuée par le fournisseur de "
|
"Il s'agit de l'adresse de l'extrémité locale attribuée par le fournisseur de "
|
||||||
"tunnels, elle se termine habituellement avec <code>:2</code>"
|
"tunnels, elle se termine habituellement avec <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3610,7 +3629,7 @@ msgstr "Utiliser la table de routage"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -726,6 +726,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -988,6 +993,11 @@ msgstr "מצב חרום"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "אפשר"
|
msgstr "אפשר"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "אפשר <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "אפשר <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1045,6 +1055,9 @@ msgstr ""
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "אפשר"
|
msgstr "אפשר"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2110,6 +2123,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2862,6 +2878,9 @@ msgstr ""
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3228,7 +3247,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3437,7 +3456,7 @@ msgstr "השתמש בטבלת ניתוב"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -744,6 +744,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1021,6 +1026,11 @@ msgstr "Vészhelyzet"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Engedélyezés"
|
msgstr "Engedélyezés"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> engedélyezése"
|
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> engedélyezése"
|
||||||
|
|
||||||
|
@ -1078,6 +1088,9 @@ msgstr "Engedélyezés/Letiltás"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Engedélyezve"
|
msgstr "Engedélyezve"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2179,6 +2192,9 @@ msgstr "Megjegyzés"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2957,6 +2973,9 @@ msgstr "Méret"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Ugrás"
|
msgstr "Ugrás"
|
||||||
|
|
||||||
|
@ -3375,10 +3394,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ez az alagút közvetítő (tunnel broker) által megadott helyi végpont címe, "
|
"Ez az alagút közvetítő (tunnel broker) által megadott helyi végpont címe, "
|
||||||
"általában így végződik: <code>:2</code>"
|
"általában így végződik: <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3597,7 +3616,7 @@ msgstr "Útválasztó tábla használata"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -749,6 +749,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1024,6 +1029,11 @@ msgstr "Emergenza"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Abilita"
|
msgstr "Abilita"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Abilita <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Abilita <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1081,6 +1091,9 @@ msgstr "Abilita/Disabilita"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Abilitato"
|
msgstr "Abilitato"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2179,6 +2192,9 @@ msgstr "Notifica"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2941,6 +2957,9 @@ msgstr "Dimensione"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Salta"
|
msgstr "Salta"
|
||||||
|
|
||||||
|
@ -3335,7 +3354,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3554,7 +3573,7 @@ msgstr "Utilizzare tabella di instradamento"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -3,18 +3,18 @@ msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
|
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
|
||||||
"PO-Revision-Date: 2017-10-20 13:54+0900\n"
|
"PO-Revision-Date: 2018-05-03 00:23+0900\n"
|
||||||
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
|
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
"X-Generator: Poedit 2.0.4\n"
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
|
||||||
msgid "%.1f dB"
|
msgid "%.1f dB"
|
||||||
msgstr ""
|
msgstr "%.1f dB"
|
||||||
|
|
||||||
msgid "%s is untagged in multiple VLANs!"
|
msgid "%s is untagged in multiple VLANs!"
|
||||||
msgstr "%s は複数のVLANにUntaggedしています!"
|
msgstr "%s は複数のVLANにUntaggedしています!"
|
||||||
|
@ -137,7 +137,7 @@ msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
|
||||||
msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-アドレス"
|
msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-アドレス"
|
||||||
|
|
||||||
msgid "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
|
msgid "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
|
||||||
msgstr ""
|
msgstr "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
|
"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
|
||||||
|
@ -251,6 +251,8 @@ msgstr "追加"
|
||||||
|
|
||||||
msgid "Add local domain suffix to names served from hosts files"
|
msgid "Add local domain suffix to names served from hosts files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"hosts ファイルにより解決される名前にローカルドメイン サフィックスを付加しま"
|
||||||
|
"す。"
|
||||||
|
|
||||||
msgid "Add new interface..."
|
msgid "Add new interface..."
|
||||||
msgstr "インターフェースの新規作成..."
|
msgstr "インターフェースの新規作成..."
|
||||||
|
@ -750,6 +752,13 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "カスタム フィード"
|
msgstr "カスタム フィード"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
"カスタム ファイル(証明書, スクリプト)がシステムに残るかもしれません。これを"
|
||||||
|
"防ぐには、まず最初に factory-reset を行います。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -953,7 +962,7 @@ msgid "Domain whitelist"
|
||||||
msgstr "ドメイン ホワイトリスト"
|
msgstr "ドメイン ホワイトリスト"
|
||||||
|
|
||||||
msgid "Don't Fragment"
|
msgid "Don't Fragment"
|
||||||
msgstr ""
|
msgstr "非フラグメント化"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
|
"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
|
||||||
|
@ -1024,6 +1033,13 @@ msgstr "緊急"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "有効"
|
msgstr "有効"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
"<abbr title=\"Internet Group Management Protocol\">IGMP</abbr> スヌーピングの"
|
||||||
|
"有効化"
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr>を有効にする"
|
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr>を有効にする"
|
||||||
|
|
||||||
|
@ -1067,7 +1083,7 @@ msgid "Enable mirroring of outgoing packets"
|
||||||
msgstr "送信パケットのミラーリングを有効化"
|
msgstr "送信パケットのミラーリングを有効化"
|
||||||
|
|
||||||
msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
|
msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
|
||||||
msgstr ""
|
msgstr "カプセル化されたパケットの DF (Don't Fragment) フラグを有効にします。"
|
||||||
|
|
||||||
msgid "Enable this mount"
|
msgid "Enable this mount"
|
||||||
msgstr "マウント設定を有効にする"
|
msgstr "マウント設定を有効にする"
|
||||||
|
@ -1081,6 +1097,9 @@ msgstr "有効/無効"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "有効"
|
msgstr "有効"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr "ブリッジの IGMP スヌーピングを有効にします"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -1254,7 +1273,7 @@ msgid "Force use of NAT-T"
|
||||||
msgstr "NAT-Tの強制使用"
|
msgstr "NAT-Tの強制使用"
|
||||||
|
|
||||||
msgid "Form token mismatch"
|
msgid "Form token mismatch"
|
||||||
msgstr ""
|
msgstr "フォーム トークンの不一致"
|
||||||
|
|
||||||
msgid "Forward DHCP traffic"
|
msgid "Forward DHCP traffic"
|
||||||
msgstr "DHCPトラフィックを転送する"
|
msgstr "DHCPトラフィックを転送する"
|
||||||
|
@ -1598,6 +1617,8 @@ msgstr "インストール"
|
||||||
|
|
||||||
msgid "Install iputils-traceroute6 for IPv6 traceroute"
|
msgid "Install iputils-traceroute6 for IPv6 traceroute"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"IPv6 の traceroute を使用するには、 iputils-traceroute6 をインストールしま"
|
||||||
|
"す。"
|
||||||
|
|
||||||
msgid "Install package %q"
|
msgid "Install package %q"
|
||||||
msgstr "%q パッケージをインストールします"
|
msgstr "%q パッケージをインストールします"
|
||||||
|
@ -1661,7 +1682,7 @@ msgstr ""
|
||||||
"ユーザー名かパスワード、もしくは両方が不正です!もう一度入力してください。"
|
"ユーザー名かパスワード、もしくは両方が不正です!もう一度入力してください。"
|
||||||
|
|
||||||
msgid "Isolate Clients"
|
msgid "Isolate Clients"
|
||||||
msgstr ""
|
msgstr "クライアント間の分離"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"It appears that you are trying to flash an image that does not fit into the "
|
"It appears that you are trying to flash an image that does not fit into the "
|
||||||
|
@ -1756,6 +1777,8 @@ msgstr "割り当て数"
|
||||||
|
|
||||||
msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
|
msgid "Limit DNS service to subnets interfaces on which we are serving DNS."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"DNS サービスを、現在 DNS を提供しているサブネットのインターフェースに限定しま"
|
||||||
|
"す。"
|
||||||
|
|
||||||
msgid "Limit listening to these interfaces, and loopback."
|
msgid "Limit listening to these interfaces, and loopback."
|
||||||
msgstr "待ち受けをこれらのインターフェースとループバックに制限します。"
|
msgstr "待ち受けをこれらのインターフェースとループバックに制限します。"
|
||||||
|
@ -1840,7 +1863,7 @@ msgid "Local IPv6 address"
|
||||||
msgstr "ローカル IPv6 アドレス"
|
msgstr "ローカル IPv6 アドレス"
|
||||||
|
|
||||||
msgid "Local Service Only"
|
msgid "Local Service Only"
|
||||||
msgstr ""
|
msgstr "ローカルサービスのみ"
|
||||||
|
|
||||||
msgid "Local Startup"
|
msgid "Local Startup"
|
||||||
msgstr "ローカル スタートアップ"
|
msgstr "ローカル スタートアップ"
|
||||||
|
@ -1855,6 +1878,8 @@ msgid ""
|
||||||
"Local domain specification. Names matching this domain are never forwarded "
|
"Local domain specification. Names matching this domain are never forwarded "
|
||||||
"and are resolved from DHCP or hosts files only"
|
"and are resolved from DHCP or hosts files only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"ローカル ドメインの定義です。このドメインに一致する名前は転送が行われず、 "
|
||||||
|
"DHCP または hosts ファイルのみにより解決されます。"
|
||||||
|
|
||||||
msgid "Local domain suffix appended to DHCP names and hosts file entries"
|
msgid "Local domain suffix appended to DHCP names and hosts file entries"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2178,6 +2203,11 @@ msgstr "注意"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
"キャッシュされる DNS エントリーの数です。(最大 10000 件。 0の場合はキャッ"
|
||||||
|
"シュしません)"
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2394,7 +2424,7 @@ msgid "Packets"
|
||||||
msgstr "パケット"
|
msgstr "パケット"
|
||||||
|
|
||||||
msgid "Part of zone %q"
|
msgid "Part of zone %q"
|
||||||
msgstr "ゾーン %qの一部"
|
msgstr "ゾーン %q の一部"
|
||||||
|
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "パスワード"
|
msgstr "パスワード"
|
||||||
|
@ -2962,6 +2992,9 @@ msgstr "サイズ"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "サイズ (.ipk)"
|
msgstr "サイズ (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr "DNS クエリ キャッシュのサイズ"
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "スキップ"
|
msgstr "スキップ"
|
||||||
|
|
||||||
|
@ -3085,10 +3118,10 @@ msgid "Submit"
|
||||||
msgstr "送信"
|
msgstr "送信"
|
||||||
|
|
||||||
msgid "Suppress logging"
|
msgid "Suppress logging"
|
||||||
msgstr ""
|
msgstr "ログの抑制"
|
||||||
|
|
||||||
msgid "Suppress logging of the routine operation of these protocols"
|
msgid "Suppress logging of the routine operation of these protocols"
|
||||||
msgstr ""
|
msgstr "これらのプロトコルのルーチン的操作についてのログを抑制します。"
|
||||||
|
|
||||||
msgid "Swap"
|
msgid "Swap"
|
||||||
msgstr "スワップ"
|
msgstr "スワップ"
|
||||||
|
@ -3110,7 +3143,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Switch Port Mask"
|
msgid "Switch Port Mask"
|
||||||
msgstr ""
|
msgstr "スイッチポート マスク"
|
||||||
|
|
||||||
msgid "Switch VLAN"
|
msgid "Switch VLAN"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -3338,13 +3371,16 @@ msgstr ""
|
||||||
"サービスを有効にするために、管理者パスワードを設定してください。"
|
"サービスを有効にするために、管理者パスワードを設定してください。"
|
||||||
|
|
||||||
msgid "This IPv4 address of the relay"
|
msgid "This IPv4 address of the relay"
|
||||||
msgstr ""
|
msgstr "リレーの IPv4 アドレス"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This file may contain lines like 'server=/domain/1.2.3.4' or "
|
"This file may contain lines like 'server=/domain/1.2.3.4' or "
|
||||||
"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
|
"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
|
||||||
"Name System\">DNS</abbr> servers."
|
"Name System\">DNS</abbr> servers."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"このファイルは、特定ドメイン用、または上位 <abbr title=\"Domain Name System"
|
||||||
|
"\">DNS</abbr> サーバーのための 'server=/domain/1.2.3.4' や 'server=1.2.3.4' "
|
||||||
|
"というような行を含めることができます。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is a list of shell glob patterns for matching files and directories to "
|
"This is a list of shell glob patterns for matching files and directories to "
|
||||||
|
@ -3369,17 +3405,17 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"プロバイダからアサインされた、ローカルのエンドポイント アドレスです。通常、"
|
"プロバイダからアサインされた、ローカルのエンドポイント アドレスです。通常、"
|
||||||
"<code>:2</code>が終端に設定されます。"
|
"<code>...:2/64</code>が終端に設定されます。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
"abbr> in the local network"
|
"abbr> in the local network"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ローカル ネットワーク内のみの <abbr title=\"Dynamic Host Configuration "
|
"これはローカル ネットワーク内のみの <abbr title=\"Dynamic Host Configuration "
|
||||||
"Protocol\">DHCP</abbr>として使用する"
|
"Protocol\">DHCP</abbr> です。"
|
||||||
|
|
||||||
msgid "This is the plain username for logging into the account"
|
msgid "This is the plain username for logging into the account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -3591,7 +3627,7 @@ msgstr "ルーティング テーブルの使用"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
@ -3946,24 +3982,3 @@ msgstr "はい"
|
||||||
|
|
||||||
msgid "« Back"
|
msgid "« Back"
|
||||||
msgstr "« 戻る"
|
msgstr "« 戻る"
|
||||||
|
|
||||||
#~ msgid "Action"
|
|
||||||
#~ msgstr "動作"
|
|
||||||
|
|
||||||
#~ msgid "Buttons"
|
|
||||||
#~ msgstr "ボタン"
|
|
||||||
|
|
||||||
#~ msgid "Handler"
|
|
||||||
#~ msgstr "ハンドラ"
|
|
||||||
|
|
||||||
#~ msgid "Maximum hold time"
|
|
||||||
#~ msgstr "最大保持時間"
|
|
||||||
|
|
||||||
#~ msgid "Minimum hold time"
|
|
||||||
#~ msgstr "最短保持時間"
|
|
||||||
|
|
||||||
#~ msgid "Path to executable which handles the button event"
|
|
||||||
#~ msgstr "ボタンイベントをハンドルする実行ファイルのパス"
|
|
||||||
|
|
||||||
#~ msgid "This page allows the configuration of custom button actions"
|
|
||||||
#~ msgstr "このページでは、ボタンの動作を変更することができます。"
|
|
||||||
|
|
|
@ -731,6 +731,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "Custom feed 들"
|
msgstr "Custom feed 들"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1001,6 +1006,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "활성화"
|
msgstr "활성화"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> 활성화"
|
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> 활성화"
|
||||||
|
|
||||||
|
@ -1058,6 +1068,9 @@ msgstr "활성/비활성"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "활성화됨"
|
msgstr "활성화됨"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2128,6 +2141,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2890,6 +2906,9 @@ msgstr "Size"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "크기 (.ipk)"
|
msgstr "크기 (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3270,7 +3289,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3484,7 +3503,7 @@ msgstr "Routing table 사용"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -711,6 +711,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -973,6 +978,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Mengaktifkan <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Mengaktifkan <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1030,6 +1040,9 @@ msgstr ""
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2108,6 +2121,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "Baik"
|
msgstr "Baik"
|
||||||
|
|
||||||
|
@ -2864,6 +2880,9 @@ msgstr "Saiz"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Skip"
|
msgstr "Skip"
|
||||||
|
|
||||||
|
@ -3238,7 +3257,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3452,7 +3471,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -733,6 +733,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1008,6 +1013,11 @@ msgstr "Krisesituasjon"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Aktiver"
|
msgstr "Aktiver"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Aktiver <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Aktiver <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1065,6 +1075,9 @@ msgstr "Aktiver/Deaktiver"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Aktivert"
|
msgstr "Aktivert"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2153,6 +2166,9 @@ msgstr "Merk"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2930,6 +2946,9 @@ msgstr "Størrelse"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Gå videre"
|
msgstr "Gå videre"
|
||||||
|
|
||||||
|
@ -3343,10 +3362,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dette er den lokale endepunkt adressen som ble tildelt av tunnel 'broker', "
|
"Dette er den lokale endepunkt adressen som ble tildelt av tunnel 'broker', "
|
||||||
"adressen ender vanligvis med <code>:2</code>"
|
"adressen ender vanligvis med <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3562,7 +3581,7 @@ msgstr "Bruk rutingtabellen"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -752,6 +752,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
# Spacji zabrało i napisy się skleiły
|
# Spacji zabrało i napisy się skleiły
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
|
@ -1034,6 +1039,11 @@ msgstr "Zagrożenie"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Włącz"
|
msgstr "Włącz"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Włącz <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Włącz <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1091,6 +1101,9 @@ msgstr "Wlącz/Wyłącz"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Włączony"
|
msgstr "Włączony"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2198,6 +2211,9 @@ msgstr "Spostrzeżenie"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2978,6 +2994,9 @@ msgstr "Rozmiar"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Pomiń"
|
msgstr "Pomiń"
|
||||||
|
|
||||||
|
@ -3400,10 +3419,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"To jest lokalny adres końcowy przypisany przez tunnel broker'a, zwykle "
|
"To jest lokalny adres końcowy przypisany przez tunnel broker'a, zwykle "
|
||||||
"kończący się z <code>:2</code>"
|
"kończący się z <code>...:2/64</code>"
|
||||||
|
|
||||||
# w tłumaczeniu pojawiła się spacja po DHCP</abbr> co powoduje niepoprawne wyświetlanie się strony z lang PL
|
# w tłumaczeniu pojawiła się spacja po DHCP</abbr> co powoduje niepoprawne wyświetlanie się strony z lang PL
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3622,7 +3641,7 @@ msgstr "Użyj tabeli routingu"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -786,6 +786,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "Fontes de pacotes customizadas"
|
msgstr "Fontes de pacotes customizadas"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1070,6 +1075,11 @@ msgstr "Emergência"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Ativar"
|
msgstr "Ativar"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1127,6 +1137,9 @@ msgstr "Ativar/Desativar"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Ativado"
|
msgstr "Ativado"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2279,6 +2292,9 @@ msgstr "Aviso"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -3084,6 +3100,9 @@ msgstr "Tamanho"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "Tamanho (.ipk)"
|
msgstr "Tamanho (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Pular"
|
msgstr "Pular"
|
||||||
|
|
||||||
|
@ -3519,10 +3538,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Este é o endereço da ponta local designado pelo agente de túnel. normalmente "
|
"Este é o endereço da ponta local designado pelo agente de túnel. normalmente "
|
||||||
"ele termina com <code>:2</code>"
|
"ele termina com <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3745,7 +3764,7 @@ msgstr "Use a tabela de roteamento"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -746,6 +746,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1024,6 +1029,11 @@ msgstr "Emergência"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Ativar"
|
msgstr "Ativar"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1081,6 +1091,9 @@ msgstr "Ativar/Desativar"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Ativado"
|
msgstr "Ativado"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2177,6 +2190,9 @@ msgstr "Reparo"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2948,6 +2964,9 @@ msgstr "Tamanho"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Saltar"
|
msgstr "Saltar"
|
||||||
|
|
||||||
|
@ -3347,7 +3366,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3560,7 +3579,7 @@ msgstr "Usar tabela de roteamento"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -721,6 +721,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -979,6 +984,11 @@ msgstr "Urgenta"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Activeaza"
|
msgstr "Activeaza"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Activeaza <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Activeaza <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1036,6 +1046,9 @@ msgstr "Activeaza/Dezactiveaza"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Activat"
|
msgstr "Activat"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2107,6 +2120,9 @@ msgstr "Notificare"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2858,6 +2874,9 @@ msgstr "Marime"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3220,7 +3239,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3428,7 +3447,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -777,6 +777,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "Список custom-ных feed-ов"
|
msgstr "Список custom-ных feed-ов"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1055,6 +1060,11 @@ msgstr "Чрезвычайная ситуация"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Включить"
|
msgstr "Включить"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Включить <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Включить <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1112,6 +1122,9 @@ msgstr "Включить/выключить"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Включено"
|
msgstr "Включено"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2235,6 +2248,9 @@ msgstr "Заметка"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "DNS-запрос"
|
msgstr "DNS-запрос"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -3043,6 +3059,9 @@ msgstr "Размер"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "Размер (.ipk)"
|
msgstr "Размер (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Пропустить"
|
msgstr "Пропустить"
|
||||||
|
|
||||||
|
@ -3471,10 +3490,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Это локальный адрес, назначенный туннельным брокером, обычно заканчивается "
|
"Это локальный адрес, назначенный туннельным брокером, обычно заканчивается "
|
||||||
"на <code>:2</code>."
|
"на <code>...:2/64</code>."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3693,7 +3712,7 @@ msgstr "Использовать таблицу маршрутизации"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -704,6 +704,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -960,6 +965,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1017,6 +1027,9 @@ msgstr ""
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2082,6 +2095,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2830,6 +2846,9 @@ msgstr ""
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3190,7 +3209,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3398,7 +3417,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -718,6 +718,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "Anpassade flöden"
|
msgstr "Anpassade flöden"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -980,6 +985,11 @@ msgstr "Nödsituation"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Aktivera"
|
msgstr "Aktivera"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Aktivera <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Aktivera <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1037,6 +1047,9 @@ msgstr "Aktivera/Inaktivera"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Aktiverad"
|
msgstr "Aktiverad"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2103,6 +2116,9 @@ msgstr "Avisering"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2853,6 +2869,9 @@ msgstr "Storlek"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "Storlek (.ipk)"
|
msgstr "Storlek (.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Hoppa över"
|
msgstr "Hoppa över"
|
||||||
|
|
||||||
|
@ -3215,7 +3234,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3425,7 +3444,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -697,6 +697,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -953,6 +958,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1010,6 +1020,9 @@ msgstr ""
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2075,6 +2088,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2823,6 +2839,9 @@ msgstr ""
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3183,7 +3202,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3391,7 +3410,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -717,6 +717,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -973,6 +978,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1030,6 +1040,9 @@ msgstr ""
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2095,6 +2108,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2843,6 +2859,9 @@ msgstr ""
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3203,7 +3222,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3411,7 +3430,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -755,6 +755,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -1034,6 +1039,11 @@ msgstr "Аварійний"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Увімкнути"
|
msgstr "Увімкнути"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1091,6 +1101,9 @@ msgstr "Увімкнено/Вимкнено"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Увімкнено"
|
msgstr "Увімкнено"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2191,6 +2204,9 @@ msgstr "Попередження"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "DNS-запит"
|
msgstr "DNS-запит"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
|
@ -2973,6 +2989,9 @@ msgstr "Розмір"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "Пропустити"
|
msgstr "Пропустити"
|
||||||
|
|
||||||
|
@ -3391,10 +3410,10 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Це локальна адреса кінцевої точки, присвоєна тунельним брокером, зазвичай "
|
"Це локальна адреса кінцевої точки, присвоєна тунельним брокером, зазвичай "
|
||||||
"закінчується на <code>:2</code>"
|
"закінчується на <code>...:2/64</code>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3614,7 +3633,7 @@ msgstr "Використовувати таблицю маршрутизації
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -711,6 +711,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -978,6 +983,11 @@ msgstr ""
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "Kích hoạt <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "Kích hoạt <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1035,6 +1045,9 @@ msgstr "Cho kích hoạt/ Vô hiệu hóa"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2112,6 +2125,9 @@ msgstr ""
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK "
|
msgstr "OK "
|
||||||
|
|
||||||
|
@ -2870,6 +2886,9 @@ msgstr "Dung lượng "
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3240,7 +3259,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -3453,7 +3472,7 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -720,6 +720,12 @@ msgstr "自定义软件源地址,例如:私有的软件源。此文件在系
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr "自定义软件源"
|
msgstr "自定义软件源"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
"自定义文件(证书、脚本)会保留在系统上。若无需保留,请先执行恢复出厂设置。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -987,6 +993,11 @@ msgstr "紧急"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "启用"
|
msgstr "启用"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "开启 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "开启 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1044,6 +1055,9 @@ msgstr "启用/禁用"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "启用"
|
msgstr "启用"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2127,6 +2141,9 @@ msgstr "注意"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "Nslookup"
|
msgstr "Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr "缓存的 DNS 条目数量(最大 10000,0 表示不缓存)"
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "确认"
|
msgstr "确认"
|
||||||
|
|
||||||
|
@ -2900,6 +2917,9 @@ msgstr "大小"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr "大小(.ipk)"
|
msgstr "大小(.ipk)"
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr "DNS 查询缓存的大小"
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "跳过"
|
msgstr "跳过"
|
||||||
|
|
||||||
|
@ -3283,8 +3303,8 @@ msgstr "启动脚本插入到 'exit 0' 之前即可随系统启动运行。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr "隧道代理分配的本地终端地址,通常以 <code>:2</code> 结尾"
|
msgstr "隧道代理分配的本地终端地址,通常以 <code>...:2/64</code> 结尾"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3495,7 +3515,7 @@ msgstr "使用路由表"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -722,6 +722,11 @@ msgstr ""
|
||||||
msgid "Custom feeds"
|
msgid "Custom feeds"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Custom files (certificates, scripts) may remain on the system. To prevent "
|
||||||
|
"this, perform a factory-reset first."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
|
||||||
"\">LED</abbr>s if possible."
|
"\">LED</abbr>s if possible."
|
||||||
|
@ -990,6 +995,11 @@ msgstr "緊急"
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "啟用"
|
msgstr "啟用"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
|
||||||
|
"snooping"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
msgstr "啟用 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
msgstr "啟用 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
|
||||||
|
|
||||||
|
@ -1047,6 +1057,9 @@ msgstr "啟用/關閉"
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "啟用"
|
msgstr "啟用"
|
||||||
|
|
||||||
|
msgid "Enables IGMP snooping on this bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enables fast roaming among access points that belong to the same Mobility "
|
"Enables fast roaming among access points that belong to the same Mobility "
|
||||||
"Domain"
|
"Domain"
|
||||||
|
@ -2119,6 +2132,9 @@ msgstr "通知"
|
||||||
msgid "Nslookup"
|
msgid "Nslookup"
|
||||||
msgstr "DNS偵錯Nslookup"
|
msgstr "DNS偵錯Nslookup"
|
||||||
|
|
||||||
|
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "行"
|
msgstr "行"
|
||||||
|
|
||||||
|
@ -2883,6 +2899,9 @@ msgstr "大小"
|
||||||
msgid "Size (.ipk)"
|
msgid "Size (.ipk)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Size of DNS query cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr "跳過"
|
msgstr "跳過"
|
||||||
|
|
||||||
|
@ -3275,8 +3294,8 @@ msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
"This is the local endpoint address assigned by the tunnel broker, it usually "
|
||||||
"ends with <code>:2</code>"
|
"ends with <code>...:2/64</code>"
|
||||||
msgstr "這是由通道代理人指定的本地終端位址, 通常用 <code>:2</code>結尾."
|
msgstr "這是由通道代理人指定的本地終端位址, 通常用 <code>...:2/64</code>結尾."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
|
||||||
|
@ -3487,7 +3506,7 @@ msgstr "使用路由表"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
|
||||||
"em> indentifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
"em> identifies the host, the <em>IPv4-Address</em> specifies the fixed "
|
||||||
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
"address to use, and the <em>Hostname</em> is assigned as a symbolic name to "
|
||||||
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
"the requesting host. The optional <em>Lease time</em> can be used to set non-"
|
||||||
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
"standard host-specific lease time, e.g. 12h, 3d or infinite."
|
||||||
|
|
|
@ -36,6 +36,7 @@ config qos
|
||||||
|
|
||||||
config system
|
config system
|
||||||
option init led
|
option init led
|
||||||
|
option exec '/etc/init.d/log reload'
|
||||||
list affects luci_statistics
|
list affects luci_statistics
|
||||||
list affects dhcp
|
list affects dhcp
|
||||||
|
|
||||||
|
|
11
luci-base/root/usr/share/rpcd/acl.d/luci-base.json
Normal file
11
luci-base/root/usr/share/rpcd/acl.d/luci-base.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"uci-access": {
|
||||||
|
"description": "Grant uci write access to all configurations",
|
||||||
|
"read": {
|
||||||
|
"uci": [ "*" ]
|
||||||
|
},
|
||||||
|
"write": {
|
||||||
|
"uci": [ "*" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
luci-base/src/po2lmo
Executable file
BIN
luci-base/src/po2lmo
Executable file
Binary file not shown.
BIN
luci-base/src/po2lmo.o
Normal file
BIN
luci-base/src/po2lmo.o
Normal file
Binary file not shown.
BIN
luci-base/src/template_lmo.o
Normal file
BIN
luci-base/src/template_lmo.o
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue