1
0
Fork 0
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:
Ycarus 2018-05-09 15:20:50 +02:00
parent f7b2096fa2
commit b2999bb6b2
64 changed files with 2089 additions and 2008 deletions

View file

@ -12,8 +12,7 @@ LUCI_TYPE:=mod
LUCI_BASENAME:=base
LUCI_TITLE:=LuCI core libraries
LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc
LUCI_EXTRA_DEPENDS:=libuci-lua (>= 2018-01-01)
LUCI_DEPENDS:=+lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua +luci-lib-jsonc +liblucihttp-lua
PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
PKG_SOURCE_URL:=https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/luasrcdiet

View file

@ -218,12 +218,13 @@ var cbi_validators = {
((ipv4only == 1) && cbi_validators.ip4addr.apply(this));
},
'hostname': function()
'hostname': function(strict)
{
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(/[^0-9.]/)));
this.match(/[^0-9.]/))) &&
(!strict || !this.match(/^_/));
return false;
},

View file

@ -39,7 +39,7 @@ XHR = function()
this._xmlHttp.abort();
}
this.get = function(url,data,callback)
this.get = function(url,data,callback,timeout)
{
this.reinit();
@ -56,6 +56,9 @@ XHR = function()
xhr.open('GET', url, true);
if (!isNaN(timeout))
xhr.timeout = timeout;
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4) {
@ -76,7 +79,7 @@ XHR = function()
xhr.send(null);
}
this.post = function(url,data,callback)
this.post = function(url,data,callback,timeout)
{
this.reinit();
@ -90,6 +93,10 @@ XHR = function()
}
xhr.open('POST', url, true);
if (!isNaN(timeout))
xhr.timeout = timeout;
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send(code);
}
@ -168,7 +175,7 @@ XHR.get = function(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)
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])
{
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._q.push({
var e = {
interval: interval,
callback: callback,
url: url,
data: data,
xhr: new XHR()
});
};
XHR._q.push(e);
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()

View file

@ -199,13 +199,13 @@ function macaddr(val)
return ip.checkmac(val) and true or false
end
function hostname(val)
function hostname(val, strict)
if val and (#val < 254) and (
val:match("^[a-zA-Z_]+$") or
(val:match("^[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*[a-zA-Z0-9]$") and
val:match("[^0-9%.]"))
) then
return true
return (not strict or not val:match("^_"))
end
return false
end

View file

@ -75,11 +75,16 @@ function error404(message)
http.status(404, "Not Found")
message = message or "Not Found"
require("luci.template")
if not util.copcall(luci.template.render, "error404") then
local function render()
local template = require "luci.template"
template.render("error404")
end
if not util.copcall(render) then
http.prepare_content("text/plain")
http.write(message)
end
return false
end
@ -113,7 +118,8 @@ function httpdispatch(request, prefix)
end
end
for node in pathinfo:gmatch("[^/]+") do
local node
for node in pathinfo:gmatch("[^/%z]+") do
r[#r+1] = node
end
@ -136,8 +142,7 @@ local function require_post_security(target)
if (type(required_val) == "string" and
request_val ~= required_val) or
(required_val == true and
(request_val == nil or request_val == ""))
(required_val == true and request_val == nil)
then
return false
end
@ -346,15 +351,23 @@ function dispatch(request)
ifattr = function(...) return _ifattr(...) end;
attr = function(...) return _ifattr(true, ...) end;
url = build_url;
}, {__index=function(table, key)
}, {__index=function(tbl, key)
if key == "controller" then
return build_url()
elseif key == "REQUEST_URI" then
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
return ctx.authtoken
else
return rawget(table, key) or _G[key]
return rawget(tbl, key) or _G[key]
end
end})
end
@ -429,6 +442,13 @@ function dispatch(request)
ctx.authuser = sdat.username
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 not test_post_security(c) then
return
@ -650,6 +670,23 @@ function node(...)
return c
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)
if #path == 0 then
return context.tree
@ -791,7 +828,16 @@ local function _cbi(self, ...)
local state = nil
local i, res
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
local cstate = res:parse()
if cstate and (not state or cstate < state) then
@ -884,7 +930,7 @@ end
function cbi(model, config)
return {
type = "cbi",
post = { ["cbi.submit"] = "1" },
post = { ["cbi.submit"] = true },
config = config,
model = model,
target = _cbi
@ -912,6 +958,7 @@ local function _form(self, ...)
local maps = luci.cbi.load(self.model, ...)
local state = nil
local i, res
for i, res in ipairs(maps) do
local cstate = res:parse()
if cstate and (not state or cstate < state) then
@ -930,7 +977,7 @@ end
function form(model)
return {
type = "cbi",
post = { ["cbi.submit"] = "1" },
post = { ["cbi.submit"] = true },
model = model,
target = _form
}

View file

@ -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
enabling the node.
@class function
@name get
@param ... Virtual path
@ -133,6 +133,15 @@ Fetch or create a new dispatching 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

View file

@ -1,18 +1,21 @@
-- 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.
local ltn12 = require "luci.ltn12"
local protocol = require "luci.http.protocol"
local util = require "luci.util"
local string = require "string"
local coroutine = require "coroutine"
local table = require "table"
local lhttp = require "lucihttp"
local nixio = require "nixio"
local ltn12 = require "luci.ltn12"
local ipairs, pairs, next, type, tostring, error =
ipairs, pairs, next, type, tostring, error
local table, ipairs, pairs, type, tostring, tonumber, error =
table, ipairs, pairs, type, tostring, tonumber, error
module "luci.http"
HTTP_MAX_CONTENT = 1024*8 -- 8 kB maximum content size
context = util.threadlocal()
Request = util.class()
@ -28,7 +31,7 @@ function Request.__init__(self, env, sourcein, sinkerr)
self.message = {
env = env,
headers = {},
params = protocol.urldecode_params(env.QUERY_STRING or ""),
params = urldecode_params(env.QUERY_STRING or ""),
}
self.parsed_input = false
@ -73,10 +76,7 @@ function Request.content(self)
end
function Request.getcookie(self, name)
local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";")
local p = ";" .. name .. "=(.-);"
local i, j, value = c:find(p)
return value and urldecode(value)
return lhttp.header_attribute("cookie; " .. (self:getenv("HTTP_COOKIE") or ""), name)
end
function Request.getenv(self, name)
@ -90,40 +90,34 @@ end
function Request.setfilehandler(self, callback)
self.filehandler = callback
-- If input has already been parsed then any files are either in temporary files
-- or are in self.message.params[key]
if self.parsed_input then
for param, value in pairs(self.message.params) do
repeat
-- We're only interested in files
if (not value["file"]) then break end
-- If we were able to write to temporary file
if (value["fd"]) then
fd = value["fd"]
local eof = false
repeat
filedata = fd:read(1024)
if (filedata:len() < 1024) then
eof = true
end
callback({ name=value["name"], file=value["file"] }, filedata, eof)
until (eof)
fd:close()
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)
if not self.parsed_input then
return
end
-- If input has already been parsed then uploads are stored as unlinked
-- temporary files pointed to by open file handles in the parameter
-- value table. Loop all params, and invoke the file callback for any
-- param with an open file handle.
local name, value
for name, value in pairs(self.message.params) do
if type(value) == "table" then
while value.fd do
local data = value.fd:read(1024)
local eof = (not data or data == "")
callback(value, data, eof)
if eof then
value.fd:close()
value.fd = nil
end
end
until true
end
end
end
function Request._parse_input(self)
protocol.parse_message_body(
parse_message_body(
self.input,
self.message,
self.filehandler
@ -254,23 +248,307 @@ function redirect(url)
end
function build_querystring(q)
local s = { "?" }
local s, n, k, v = {}, 1, nil, nil
for k, v in pairs(q) do
if #s > 1 then s[#s+1] = "&" end
s[#s+1] = urldecode(k)
s[#s+1] = "="
s[#s+1] = urldecode(v)
s[n+0] = (n == 1) and "?" or "&"
s[n+1] = util.urlencode(k)
s[n+2] = "="
s[n+3] = util.urlencode(v)
n = n + 4
end
return table.concat(s, "")
end
urldecode = protocol.urldecode
urldecode = util.urldecode
urlencode = protocol.urlencode
urlencode = util.urlencode
function write_json(x)
util.serialize_json(x, write)
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

View file

@ -6,25 +6,24 @@ module "luci.http"
---[[
Close the HTTP-Connection.
@class function
@name close
@class function
@name close
]]
---[[
Return the request content if the request was of unknown type.
@class function
@name content
@return HTTP request body
@return HTTP request body length
@class function
@name content
@return HTTP request body
@return HTTP request body length
]]
---[[
Get a certain HTTP input value or a table of all input values.
@class function
@name formvalue
@class function
@name formvalue
@param name Name of the GET or POST variable to fetch
@param noparse Don't parse POST data before getting the 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.
@class function
@name formvaluetable
@class function
@name formvaluetable
@param prefix 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.
@class function
@name getcookie
@class function
@name getcookie
@param name Cookie Name
@return String containing cookie data
]]
---[[
Get the value of a certain HTTP environment variable
or the environment table itself.
@class function
@name getenv
@class function
@name getenv
@param name Environment variable
@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.
@class function
@name setfilehandler
@class function
@name setfilehandler
@param callback Handler function
]]
---[[
Send a HTTP-Header.
@class function
@name header
@param key Header key
@param value Header value
@class function
@name header
@param key Header key
@param value Header value
]]
---[[
Set the mime type of following content data.
@class function
@name prepare_content
@param mime Mimetype of following content
@class function
@name prepare_content
@param mime Mimetype of following content
]]
---[[
Get the RAW HTTP input source
@class function
@name source
@return HTTP LTN12 source
@class function
@name source
@return HTTP LTN12 source
]]
---[[
Set the HTTP status code and status message.
@class function
@name status
@class function
@name status
@param code Status code
@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.
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 src_err Error object from source (optional)
@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.
@class function
@name splice
@param fp File descriptor
@param size Bytes to splice (optional)
@class function
@name splice
@param fp File descriptor
@param size Bytes to splice (optional)
]]
---[[
Redirects the client to a new URL and closes the connection.
@class function
@name redirect
@param url Target URL
@class function
@name redirect
@param url Target URL
]]
---[[
Create a querystring out of a table of key - value pairs.
@class function
@name build_querystring
@param table Query string source table
@class function
@name build_querystring
@param table Query string source table
@return Encoded HTTP query string
]]
---[[
Return the URL-decoded equivalent of a string.
@class function
@name urldecode
@param str URL-encoded string
@param no_plus Don't decode + to " "
@return URL-decoded string
@see urlencode
@see urlencode
]]
---[[
Return the URL-encoded equivalent of a string.
@class function
@name urlencode
@param str Source string
@return URL-encoded string
@see urldecode
@see urldecode
]]
---[[
Send the given data as JSON encoded string.
@class function
@name write_json
@class function
@name write_json
@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
]]

View file

@ -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",
}

View file

@ -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
]]

View file

@ -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

View file

@ -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
]]

View file

@ -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

View file

@ -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
]]

View file

@ -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

View file

@ -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
]]

View file

@ -20,12 +20,14 @@ module "luci.model.ipkg"
-- Internal action function
local function _action(cmd, ...)
local pkg = ""
local cmdline = { ipkg, cmd }
local k, v
for k, v in pairs({...}) do
pkg = pkg .. " '" .. v:gsub("'", "") .. "'"
cmdline[#cmdline+1] = util.shellquote(v)
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 e = fs.readfile("/tmp/opkg.stderr")
local o = fs.readfile("/tmp/opkg.stdout")
@ -74,17 +76,17 @@ local function _parselist(rawdata)
end
-- Internal lookup function
local function _lookup(act, pkg)
local cmd = ipkg .. " " .. act
local function _lookup(cmd, pkg)
local cmdline = { ipkg, cmd }
if pkg then
cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'"
cmdline[#cmdline+1] = util.shellquote(pkg)
end
-- OPKG sometimes kills the whole machine because it sucks
-- Therefore we have to use a sucky approach too and use
-- tmpfiles instead of directly reading the output
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))
os.remove(tmpfile)
@ -123,9 +125,12 @@ end
-- List helper
local function _list(action, pat, cb)
local fd = io.popen(ipkg .. " " .. action ..
(pat and (" '%s'" % pat:gsub("'", "")) or ""))
local cmdline = { ipkg, action }
if pat then
cmdline[#cmdline+1] = util.shellquote(pat)
end
local fd = io.popen(table.concat(cmdline, " "))
if fd then
local name, version, sz, desc
while true do

View file

@ -629,7 +629,7 @@ function get_interface(self, i)
if _interfaces[i] or _wifi_iface(i) then
return interface(i)
else
local netid = _wifi_netid_by_netname(i)
local netid = _wifi_netid_by_sid(i)
return netid and interface(netid)
end
end

View file

@ -2,13 +2,12 @@
-- Licensed to the public under the Apache License 2.0.
local os = require "os"
local uci = require "uci"
local util = require "luci.util"
local table = require "table"
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 type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
@ -20,151 +19,436 @@ local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
-- reloaded.
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()
return cursor(nil, "/var/state")
local function call(cmd, args)
if type(args) == "table" and session_id then
args.ubus_rpc_session = session_id
end
return util.ubus("uci", cmd, args)
end
inst = cursor()
inst_state = cursor_state()
function cursor()
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)
if command then
return { "/sbin/luci-reload", unpack(configlist) }
else
return os.execute("/sbin/luci-reload %s >/dev/null 2>&1"
% table.concat(configlist, " "))
% util.shellquote(table.concat(configlist, " ")))
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.
function Cursor._affected(self, configlist)
configlist = type(configlist) == "table" and configlist or {configlist}
local c = cursor()
c:load("ucitrack")
function _affected(self, configlist)
configlist = type(configlist) == "table" and configlist or { configlist }
-- Resolve dependencies
local reloadlist = {}
local reloadlist = { }
local function _resolve_deps(name)
local reload = {name}
local deps = {}
local reload = { name }
local deps = { }
c:foreach("ucitrack", name,
self:foreach("ucitrack", name,
function(section)
if section.affects then
for i, aff in ipairs(section.affects) do
@ -173,7 +457,9 @@ function Cursor._affected(self, configlist)
end
end)
local i, dep
for i, dep in ipairs(deps) do
local j, add
for j, add in ipairs(_resolve_deps(dep)) do
reload[#reload+1] = add
end
@ -183,7 +469,9 @@ function Cursor._affected(self, configlist)
end
-- Collect initscripts
local j, config
for j, config in ipairs(configlist) do
local i, e
for i, e in ipairs(_resolve_deps(config)) do
if not util.contains(reloadlist, e) then
reloadlist[#reloadlist+1] = e
@ -193,44 +481,3 @@ function Cursor._affected(self, configlist)
return reloadlist
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

View file

@ -14,224 +14,226 @@ module "luci.model.uci"
---[[
Create a new UCI-Cursor.
@class function
@name cursor
@return UCI-Cursor
@class function
@name cursor
@return UCI-Cursor
]]
---[[
Create a new Cursor initialized to the state directory.
@class function
@name cursor_state
@return UCI cursor
@class function
@name cursor_state
@return UCI cursor
]]
---[[
Applies UCI configuration changes
@class function
@name Cursor.apply
@param configlist List of UCI configurations
@param command Don't apply only return the command
@class function
@name Cursor.apply
@param configlist List of UCI configurations
@param command Don't apply only return the command
]]
---[[
Delete all sections of a given type that match certain criteria.
@class function
@name Cursor.delete_all
@class function
@name Cursor.delete_all
@param config UCI config
@param type UCI section type
@param comparator Function that will be called for each section and
returns a boolean whether to delete the current section (optional)
@param comparator Function that will be called for each section and returns
a boolean whether to delete the current section (optional)
]]
---[[
Create a new section and initialize it with data.
@class function
@name Cursor.section
@param config UCI config
@param type UCI section type
@param name UCI section name (optional)
@param values Table of key - value pairs to initialize the section with
@return Name of created section
@class function
@name Cursor.section
@param config UCI config
@param type UCI section type
@param name UCI section name (optional)
@param values Table of key - value pairs to initialize the section with
@return Name of created section
]]
---[[
Updated the data of a section using data from a table.
@class function
@name Cursor.tset
@param config UCI config
@param section UCI section name (optional)
@param values Table of key - value pairs to update the section with
@class function
@name Cursor.tset
@param config UCI config
@param section UCI section name (optional)
@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.
@class function
@name Cursor.get_bool
@param config UCI config
@param section UCI section name
@param option UCI option
@return Boolean
@class function
@name Cursor.get_bool
@param config UCI config
@param section UCI section name
@param option UCI option
@return Boolean
]]
---[[
Get an option or list and return values as table.
@class function
@name Cursor.get_list
@param config UCI config
@param section UCI section name
@param option UCI option
@return table. If the option was not found, you will simply get
-- an empty table.
@class function
@name Cursor.get_list
@param config UCI config
@param section UCI section name
@param option UCI option
@return table. If the option was not found, you will simply get an empty
table.
]]
---[[
Get the given option from the first section with the given type.
@class function
@name Cursor.get_first
@param config UCI config
@param type UCI section type
@param option UCI option (optional)
@param default Default value (optional)
@return UCI value
@class function
@name Cursor.get_first
@param config UCI config
@param type UCI section type
@param option UCI option (optional)
@param default Default value (optional)
@return UCI value
]]
---[[
Set given values as list. Setting a list option to an empty list
has the same effect as deleting the option.
@class function
@name Cursor.set_list
@param config UCI config
@param section UCI section name
@param option UCI option
@param value value or table. Raw values will become a single item table.
@return Boolean whether operation succeeded
@class function
@name Cursor.set_list
@param config UCI config
@param section UCI section name
@param option UCI option
@param value Value or table. Non-table values will be set as single
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
do so as well.
@class function
@name Cursor.substate
@return UCI state cursor tied to the parent cursor
The sub-state is tied to the parent curser, means it the parent unloads or
loads configs, the sub state will do so as well.
@class function
@name Cursor.substate
@return UCI state cursor tied to the parent cursor
]]
---[[
Add an anonymous section.
@class function
@name Cursor.add
@param config UCI config
@param type UCI section type
@return Name of created section
@class function
@name Cursor.add
@param config UCI config
@param type UCI section type
@return Name of created section
]]
---[[
Get a table of saved but uncommitted changes.
@class function
@name Cursor.changes
@param config UCI config
@return Table of changes
@see Cursor.save
@class function
@name Cursor.changes
@param config UCI config
@return Table of changes
@see Cursor.save
]]
---[[
Commit saved changes.
@class function
@name Cursor.commit
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.revert
@see Cursor.save
@class function
@name Cursor.commit
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.revert
@see Cursor.save
]]
---[[
Deletes a section or an option.
@class function
@name Cursor.delete
@param config UCI config
@param section UCI section name
@param option UCI option (optional)
@return Boolean whether operation succeeded
@class function
@name Cursor.delete
@param config UCI config
@param section UCI section name
@param option UCI option (optional)
@return Boolean whether operation succeeded
]]
---[[
Call a function for every section of a certain type.
@class function
@name Cursor.foreach
@param config UCI config
@param type UCI section type
@param callback Function to be called
@return Boolean whether operation succeeded
@class function
@name Cursor.foreach
@param config UCI config
@param type UCI section type
@param callback Function to be called
@return Boolean whether operation succeeded
]]
---[[
Get a section type or an option
@class function
@name Cursor.get
@param config UCI config
@param section UCI section name
@param option UCI option (optional)
@return UCI value
@class function
@name Cursor.get
@param config UCI config
@param section UCI section name
@param option UCI option (optional)
@return UCI value
]]
---[[
Get all sections of a config or all values of a section.
@class function
@name Cursor.get_all
@param config UCI config
@param section UCI section name (optional)
@return Table of UCI sections or table of UCI values
@class function
@name Cursor.get_all
@param config UCI config
@param section UCI section name (optional)
@return Table of UCI sections or table of UCI values
]]
---[[
Manually load a config.
@class function
@name Cursor.load
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.save
@see Cursor.unload
@class function
@name Cursor.load
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.save
@see Cursor.unload
]]
---[[
Revert saved but uncommitted changes.
@class function
@name Cursor.revert
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.commit
@see Cursor.save
@class function
@name Cursor.revert
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.commit
@see Cursor.save
]]
---[[
Saves changes made to a config to make them committable.
@class function
@name Cursor.save
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.load
@see Cursor.unload
@class function
@name Cursor.save
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.load
@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
`optionvalue` then the value of the specified option is set to the given value.
@class function
@name Cursor.set
@param config UCI config
@param section UCI section name
@param option UCI option or UCI section type
@class function
@name Cursor.set
@param config UCI config
@param section UCI section name
@param option UCI option or UCI section type
@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.
@class function
@name Cursor.get_confdir
@return Configuration directory
@class function
@name Cursor.get_confdir
@return Configuration directory
]]
---[[
Get the directory for uncomitted changes.
@class function
@name Cursor.get_savedir
@return Save directory
@class function
@name Cursor.get_savedir
@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.
@class function
@name Cursor.set_confdir
@class function
@name Cursor.set_confdir
@param directory UCI configuration directory
@return Boolean whether operation succeeded
@return Boolean whether operation succeeded
]]
---[[
Set the directory for uncommited changes.
@class function
@name Cursor.set_savedir
@class function
@name Cursor.set_savedir
@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.
@class function
@name Cursor.unload
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.load
@see Cursor.save
@class function
@name Cursor.unload
@param config UCI config
@return Boolean whether operation succeeded
@see Cursor.load
@see Cursor.save
]]

View file

@ -87,10 +87,10 @@ end
function httpget(url, stream, target)
if not target then
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
return os.execute("wget -qO '%s' '%s'" %
{target:gsub("'", ""), url:gsub("'", "")})
return os.execute("wget -qO %s %s" %
{luci.util.shellquote(target), luci.util.shellquote(url)})
end
end
@ -443,18 +443,11 @@ function user.checkpasswd(username, pass)
end
function user.setpasswd(username, password)
if password then
password = password:gsub("'", [['"'"']])
end
if username then
username = username:gsub("'", [['"'"']])
end
return os.execute(
"(echo '" .. password .. "'; sleep 1; echo '" .. password .. "') | " ..
"passwd '" .. username .. "' >/dev/null 2>&1"
)
return os.execute("(echo %s; sleep 1; echo %s) | passwd %s >/dev/null 2>&1" %{
luci.util.shellquote(password),
luci.util.shellquote(password),
luci.util.shellquote(username)
})
end

View file

@ -202,7 +202,7 @@ TZ = {
{ 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' },
{ 'America/Yakutat', 'AKST9AKDT,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/DumontDUrville', '<+10>-10' },
{ 'Antarctica/Macquarie', '<+11>-11' },
@ -239,8 +239,8 @@ TZ = {
{ 'Asia/Dubai', '<+04>-4' },
{ 'Asia/Dushanbe', '<+05>-5' },
{ '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/Hebron', '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.4.6/1,M10.5.6/1' },
{ 'Asia/Ho Chi Minh', '<+07>-7' },
{ 'Asia/Hong Kong', 'HKT-8' },
{ 'Asia/Hovd', '<+07>-7' },

View file

@ -187,7 +187,9 @@ function switch_status(devs)
local switches = { }
for dev in devs:gmatch("[^%s,]+") do
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
local l
repeat

View file

@ -10,6 +10,7 @@ local string = require "string"
local coroutine = require "coroutine"
local tparser = require "luci.template.parser"
local json = require "luci.jsonc"
local lhttp = require "lucihttp"
local _ubus = require "ubus"
local _ubus_connection = nil
@ -160,10 +161,33 @@ function pcdata(value)
return value and tparser.pcdata(tostring(value))
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)
return value and tparser.striptags(tostring(value))
end
function shellquote(value)
return string.format("'%s'", string.gsub(value or "", "'", "'\\''"))
end
-- for bash, ash and similar shells single-quoted strings are taken
-- literally except for single quotes (which terminate the string)
-- (and the exception noted below for dash (-) at the start of a
@ -383,16 +407,6 @@ function clone(object, deep)
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.
function _serialize_table(t, seen)
assert(not seen[t], "Recursion detected.")
@ -617,6 +631,20 @@ function execl(command)
return data
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)
if not _ubus_connection then
_ubus_connection = _ubus.connect()
@ -627,7 +655,8 @@ function ubus(object, method, data)
if type(data) ~= "table" then
data = { }
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
return _ubus_connection:signatures(object)
else
@ -652,10 +681,11 @@ end
function checklib(fullpathexe, wantedlib)
local fs = require "nixio.fs"
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
end
local libs = exec("/usr/bin/ldd " .. fullpathexe)
local libs = exec(string.format("/usr/bin/ldd %s", shellquote(fullpathexe)))
if not libs then
return false
end

View file

@ -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.
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.
@class function
@name class
@param base The base class to inherit from (optional)
@return A class object
@see instanceof
@see clone
@class function
@name class
@param base The base class to inherit from (optional)
@return A class object
@see instanceof
@see clone
]]
---[[
Test whether the given object is an instance of the given class.
@class function
@name instanceof
@param object Object instance
@class function
@name instanceof
@param object Object instance
@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 clone
]]
---[[
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.
@class function
@name threadlocal
@return Table value representing the corresponding thread local store
@class function
@name threadlocal
@return Table value representing the corresponding thread local store
]]
---[[
Write given object to stderr.
@class function
@name perror
@param obj Value to write to stderr
@return Boolean indicating whether the write operation was successful
@class function
@name perror
@param obj Value to write to stderr
@return Boolean indicating whether the write operation was successful
]]
---[[
Recursively dumps a table to stdout, useful for testing and debugging.
@class function
@name dumptable
@param t Table value to dump
@param maxdepth Maximum depth
@return Always nil
@class function
@name dumptable
@param t Table value to dump
@param maxdepth Maximum depth
@return Always nil
]]
---[[
Create valid XML PCDATA from given string.
@class function
@name pcdata
@param value String value containing the data to escape
@return String value containing the escaped data
@class function
@name pcdata
@param value String value containing the data to escape
@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.
@class function
@name striptags
@param value String containing the HTML text
@return String with HTML tags stripped of
@class function
@name striptags
@param value String containing the HTML text
@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
containing the resulting substrings.
containing the resulting substrings. The optional max parameter specifies
the number of bytes to process, regardless of the actual length of the given
string. The optional last parameter, regex, specifies whether the separator
sequence is interpreted as regular expression.
@class function
@name split
@param str String value containing the data to split up
@param pat String with separator pattern (optional, defaults to "\n")
@param max Maximum times to split (optional)
@param regex Boolean indicating whether to interpret the separator
The optional max parameter specifies the number of bytes to process,
regardless of the actual length of the given string. The optional last
parameter, regex, specifies whether the separator sequence is
nterpreted as regular expression.
@class function
@name split
@param str String value containing the data to split up
@param pat String with separator pattern (optional, defaults to "\n")
@param max Maximum times to split (optional)
@param regex Boolean indicating whether to interpret the separator
-- 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.
@class function
@name trim
@param str String value containing whitespace padded data
@return String value with leading and trailing space removed
@class function
@name trim
@param str String value containing whitespace padded data
@return String value with leading and trailing space removed
]]
---[[
Count the occurrences of given substring in given string.
@class function
@name cmatch
@param str String to search in
@param pattern String containing pattern to find
@return Number of found occurrences
@class function
@name cmatch
@param str String to search in
@param pattern String containing pattern to find
@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
input value is a table, it is transformed into a string first. A nil value
will result in a valid interator which aborts with the first invocation.
@class function
@name imatch
@param val The value to scan (table, string or nil)
@return Iterator which returns one token per call
The iterator will return one token per invocation, the tokens are separated by
whitespace. If the input value is a table, it is transformed into a string first.
A nil value will result in a valid interator which aborts with the first invocation.
@class function
@name imatch
@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
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:
-- o "y" - one year (60*60*24*366)
o "m" - one month (60*60*24*31)
o "w" - one week (60*60*24*7)
@ -147,232 +185,229 @@ Recognized units are:
o "kib" - one si kilobyte (1000)
o "mib" - one si megabyte (1000*1000)
o "gib" - one si gigabyte (1000*1000*1000)
@class function
@name parse_units
@param ustr String containing a numerical value with trailing unit
@return Number containing the canonical value
@class function
@name parse_units
@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.
@class function
@name append
@param src Target table
@param ... Objects to insert
@return Target table
@class function
@name append
@param src Target table
@param ... Objects to insert
@return Target table
]]
---[[
Combines two or more numerically indexed tables and single objects into one table.
@class function
@name combine
@param tbl1 Table value to combine
@param tbl2 Table value to combine
@param ... More tables to combine
@return Table value containing all values of given tables
@class function
@name combine
@param tbl1 Table value to combine
@param tbl2 Table value to combine
@param ... More tables to combine
@return Table value containing all values of given tables
]]
---[[
Checks whether the given table contains the given value.
@class function
@name contains
@param table Table value
@param value Value to search within the given table
@return number indicating the first index at which the given value occurs
-- within table or false.
@class function
@name contains
@param table Table value
@param value Value to search within the given table
@return Number indicating the first index at which the given value occurs
-- within table or false.
]]
---[[
Update values in given table with the values from the second given table.
Both table are - in fact - merged together.
@class function
@name update
@class function
@name update
@param t Table which should be updated
@param updates Table containing the values to update
@return Always nil
@param updates Table containing the values to update
@return Always nil
]]
---[[
Retrieve all keys of given associative table.
@class function
@name keys
@param t Table to extract keys from
@return Sorted table containing the keys
@class function
@name keys
@param t Table to extract keys from
@return Sorted table containing the keys
]]
---[[
Clones the given object and return it's copy.
@class function
@name clone
@param object Table value to clone
@param deep Boolean indicating whether to do recursive cloning
@return Cloned table value
]]
---[[
Create a dynamic table which automatically creates subtables.
@class function
@name dtable
@return Dynamic Table
@class function
@name clone
@param object Table value to clone
@param deep Boolean indicating whether to do recursive cloning
@return Cloned table value
]]
---[[
Recursively serialize given data to lua code, suitable for restoring
with loadstring().
@class function
@name serialize_data
@param val Value containing the data to serialize
@return String value containing the serialized code
@see restore_data
@see get_bytecode
@class function
@name serialize_data
@param val Value containing the data to serialize
@return String value containing the serialized code
@see restore_data
@see get_bytecode
]]
---[[
Restore data previously serialized with serialize_data().
@class function
@name restore_data
@param str String containing the data to restore
@return Value containing the restored data structure
@see serialize_data
@see get_bytecode
@class function
@name restore_data
@param str String containing the data to restore
@return Value containing the restored data structure
@see serialize_data
@see get_bytecode
]]
---[[
Return the current runtime bytecode of the given data. The byte code
will be stripped before it is returned.
@class function
@name get_bytecode
@param val Value to return as bytecode
@return String value containing the bytecode of the given data
@class function
@name get_bytecode
@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
Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
@class function
@name strip_bytecode
@param code String value containing the original lua byte code
@return String value containing the stripped lua byte code
Information like line numbers and debugging numbers will be discarded.
Original version by Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
@class function
@name strip_bytecode
@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
the provided callback function.
@class function
@name spairs
@param t The table to iterate
@param f A callback function to decide the order of elements
@return Function value containing the corresponding iterator
@class function
@name spairs
@param t The table to iterate
@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.
The table pairs are sorted by key.
@class function
@name kspairs
@param t The table to iterate
@return Function value containing the corresponding iterator
@class function
@name kspairs
@param t The table to iterate
@return Function value containing the corresponding iterator
]]
---[[
Return a key, value iterator for the given table.
The table pairs are sorted by value.
@class function
@name vspairs
@param t The table to iterate
@return Function value containing the corresponding iterator
@class function
@name vspairs
@param t The table to iterate
@return Function value containing the corresponding iterator
]]
---[[
Test whether the current system is operating in big endian mode.
@class function
@name bigendian
@return Boolean value indicating whether system is big endian
@class function
@name bigendian
@return Boolean value indicating whether system is big endian
]]
---[[
Execute given commandline and gather stdout.
@class function
@name exec
@param command String containing command to execute
@return String containing the command's stdout
@class function
@name exec
@param command String containing command to execute
@return String containing the command's stdout
]]
---[[
Return a line-buffered iterator over the output of given command.
@class function
@name execi
@param command String containing the command to execute
@return Iterator
@class function
@name execi
@param command String containing the command to execute
@return Iterator
]]
---[[
Issue an ubus call.
@class function
@name ubus
@class function
@name ubus
@param object String containing the ubus object to call
@param method String containing the ubus method to call
@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
@class function
@name serialize_json
@param data The data to serialize
@param writer A function to write a chunk of JSON data (optional)
@return String containing the JSON if called without write callback
@class function
@name serialize_json
@param data The data to serialize
@param writer A function to write a chunk of JSON data (optional)
@return String containing the JSON if called without write callback
]]
---[[
Returns the absolute path to LuCI base directory.
@class function
@name libpath
@return String containing the directory path
@class function
@name libpath
@return String containing the directory path
]]
---[[
This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
@class function
@name coxpcall
@param f Lua function to be called protected
@param err Custom error handler
@param ... Parameters passed to the function
@return A boolean whether the function call succeeded and the return
-- values of either the function or the error handler
@class function
@name coxpcall
@param f Lua function to be called protected
@param err Custom error handler
@param ... Parameters passed to the function
@return A boolean whether the function call succeeded and the return
-- values of either the function or the error handler
]]
---[[
This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
@class function
@name copcall
@param f Lua function to be called protected
@param ... Parameters passed to the function
@return A boolean whether the function call succeeded and the returns
-- values of the function or the error object
@class function
@name copcall
@param f Lua function to be called protected
@param ... Parameters passed to the function
@return A boolean whether the function call succeeded and the returns
-- values of the function or the error object
]]

View file

@ -2,6 +2,7 @@
<%+cbi/valueheader%>
<input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
<script type="text/javascript">
cbi_init()
cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=url('admin/filebrowser')%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
</script>
<%+cbi/valuefooter%>

View file

@ -22,9 +22,9 @@
<script type="text/javascript">
function callback(path) {
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 ) {
input.value = path;
input.value = decodeURIComponent(path);
window.close();
}
}
@ -48,33 +48,44 @@
end
end
local filepath = table.concat( path, '/' )
local filestat = nixio.fs.stat( filepath )
local baseurl = luci.dispatcher.build_url('admin', 'filebrowser')
local filestat = nixio.fs.stat(table.concat(path, '/'))
local baseurl = { 'admin', 'filebrowser' }
if filestat and filestat.type == "reg" then
table.remove( path, #path )
filepath = table.concat( path, '/' ) .. '/'
elseif not ( filestat and filestat.type == "dir" ) then
path = { '' }
filepath = '/'
path[#path] = ''
elseif not (filestat and filestat.type == "dir") then
path = { '', '' }
else
filepath = filepath .. '/'
path[#path+1] = ''
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:
<% for i, dir in ipairs(path) do %>
<% 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 %>
<% baseurl = baseurl .. '/' .. dir %>
/ <a href="<%=baseurl%>?field=<%=field%>"><%=dir%></a>
<% baseurl[#baseurl+1] = luci.http.urlencode(dir) %>
/ <a href="<%=url(unpack(baseurl))%>?field=<%=luci.http.urlencode(field)%>"><%=pcdata(dir)%></a>
<% else %>
<% baseurl = baseurl .. '/' .. dir %>
/ <%=dir%>
<% baseurl[#baseurl+1] = luci.http.urlencode(dir) %>
/ <%=pcdata(dir)%>
<% end %>
<% end %>
</div>
@ -83,23 +94,17 @@
<div id="listing">
<ul>
<% for _, e in luci.util.vspairs(entries) do
local stat = nixio.fs.stat(filepath..e)
if stat and stat.type == 'dir' then
-%>
<% for _, e in ipairs(entries) do if e.type == 'dir' then -%>
<li class="dir">
<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>
<% end end -%>
<% for _, e in luci.util.vspairs(entries) do
local stat = nixio.fs.stat(filepath..e)
if stat and stat.type ~= 'dir' then
-%>
<% for _, e in ipairs(entries) do if e.type ~= 'dir' then -%>
<li class="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>
<% end end -%>
</ul>

View file

@ -1,6 +1,6 @@
<%- if pageaction then -%>
<div class="cbi-page-actions">
<% if redirect then %>
<% if redirect and not flow.hidebackbtn then %>
<div style="float:left">
<input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" />
</div>

View file

@ -52,7 +52,8 @@
<%- if not self.cancel then -%><%-:Cancel-%><%-else-%><%=self.cancel%><%end-%>
" />
<% end %>
<script type="text/javascript">cbi_d_update();</script>
</div>
</form>
<% end %>
<script type="text/javascript">cbi_init();</script>

View file

@ -35,7 +35,7 @@ end
<%- else -%>
<th>&#160;</th>
<%- end -%>
<%- end -%>
<%- count = count +1; end -%>
<%- for i, k in pairs(self.children) do if not k.optional then -%>
<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 -%>
@ -44,7 +44,7 @@ end
</th>
<%- count = count + 1; end; end; if self.sortable then -%>
<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">&#160;</th>
<%- count = count + 1; end -%>
</tr>

View file

@ -7,5 +7,5 @@
<%+header%>
<h2 name="content">404 <%:Not Found%></h2>
<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%>

View file

@ -6,7 +6,7 @@
<%+header%>
<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
<form method="post" action="<%=pcdata(FULL_REQUEST_URI)%>">
<%- if fuser then %>
<div class="errorbox"><%:Invalid username and/or password! Please try again.%></div>
<% end -%>

View file

@ -743,6 +743,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1012,6 +1017,11 @@ msgstr "Emergència"
msgid "Enable"
msgstr "Habilita"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Habilitat"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2154,6 +2167,9 @@ msgstr "Avís"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "D'acord"
@ -2913,6 +2929,9 @@ msgstr "Mida"
msgid "Size (.ipk)"
msgstr "Mida (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Salta"
@ -3305,7 +3324,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3526,7 +3545,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -737,6 +737,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1012,6 +1017,11 @@ msgstr "Záchrana"
msgid "Enable"
msgstr "Povolit"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Povoleno"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2162,6 +2175,9 @@ msgstr "Oznámení"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2939,6 +2955,9 @@ msgstr "Velikost"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Přeskočit"
@ -3347,7 +3366,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3566,7 +3585,7 @@ msgstr "Použít směrovací tabulku"
msgid ""
"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 "
"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."

View file

@ -763,6 +763,11 @@ msgstr ""
msgid "Custom feeds"
msgstr "Eigene Repositories"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1038,6 +1043,11 @@ msgstr "Notfall"
msgid "Enable"
msgstr "Aktivieren"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> aktivieren"
@ -1096,6 +1106,9 @@ msgstr "Aktivieren/Deaktivieren"
msgid "Enabled"
msgstr "Aktiviert"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2228,6 +2241,9 @@ msgstr "Notiz"
msgid "Nslookup"
msgstr "DNS-Auflösung"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -3039,6 +3055,9 @@ msgstr "Größe"
msgid "Size (.ipk)"
msgstr "Größe (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Überspringen"
@ -3475,15 +3494,15 @@ msgid ""
"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."
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."
msgid ""
"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 ""
"Dies ist die lokale, vom Broker zugewiesene IPv6-Adresse, sie endet "
"üblicherweise mit <code>:2</code>"
"üblicherweise mit <code>...:2/64</code>"
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3703,7 +3722,7 @@ msgstr "Benutze Routing-Tabelle"
msgid ""
"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 "
"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."

View file

@ -746,6 +746,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1024,6 +1029,11 @@ msgstr "Έκτακτη ανάγκη"
msgid "Enable"
msgstr "Ενεργοποίηση"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "Ενεργοποίηση <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1081,6 +1091,9 @@ msgstr "Ενεργοποίηση/Απενεργοποίηση"
msgid "Enabled"
msgstr "Ενεργοποιημένο"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2170,6 +2183,9 @@ msgstr "Επισήμανση"
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "Εντάξει"
@ -2931,6 +2947,9 @@ msgstr "Μέγεθος"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Παράκαμψη"
@ -3307,7 +3326,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3522,7 +3541,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -733,6 +733,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1003,6 +1008,11 @@ msgstr ""
msgid "Enable"
msgstr ""
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "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"
msgstr "Enabled"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2137,6 +2150,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2895,6 +2911,9 @@ msgstr "Size"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Skip"
@ -3267,7 +3286,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3479,7 +3498,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -742,6 +742,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1018,6 +1023,11 @@ msgstr "Emergencia"
msgid "Enable"
msgstr "Activar"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Activado"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2176,6 +2189,9 @@ msgstr "Aviso"
msgid "Nslookup"
msgstr "NSLookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "Aceptar"
@ -2952,6 +2968,9 @@ msgstr "Tamaño"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Saltar"
@ -3372,10 +3391,10 @@ msgstr ""
msgid ""
"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 ""
"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 ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3591,7 +3610,7 @@ msgstr "Usar tabla de rutas"
msgid ""
"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 "
"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."

View file

@ -749,6 +749,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1028,6 +1033,11 @@ msgstr "Urgence"
msgid "Enable"
msgstr "Activer"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Activé"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2190,6 +2203,9 @@ msgstr "Note"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2966,6 +2982,9 @@ msgstr "Taille"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Passer au suivant"
@ -3387,10 +3406,10 @@ msgstr ""
msgid ""
"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 ""
"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 ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3610,7 +3629,7 @@ msgstr "Utiliser la table de routage"
msgid ""
"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 "
"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."

View file

@ -726,6 +726,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -988,6 +993,11 @@ msgstr "מצב חרום"
msgid "Enable"
msgstr "אפשר"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "אפשר <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1045,6 +1055,9 @@ msgstr ""
msgid "Enabled"
msgstr "אפשר"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2110,6 +2123,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr ""
@ -2862,6 +2878,9 @@ msgstr ""
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3228,7 +3247,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3437,7 +3456,7 @@ msgstr "השתמש בטבלת ניתוב"
msgid ""
"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 "
"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."

View file

@ -744,6 +744,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1021,6 +1026,11 @@ msgstr "Vészhelyzet"
msgid "Enable"
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>"
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> engedélyezése"
@ -1078,6 +1088,9 @@ msgstr "Engedélyezés/Letiltás"
msgid "Enabled"
msgstr "Engedélyezve"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2179,6 +2192,9 @@ msgstr "Megjegyzés"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2957,6 +2973,9 @@ msgstr "Méret"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Ugrás"
@ -3375,10 +3394,10 @@ msgstr ""
msgid ""
"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 ""
"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 ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3597,7 +3616,7 @@ msgstr "Útválasztó tábla használata"
msgid ""
"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 "
"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."

View file

@ -749,6 +749,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1024,6 +1029,11 @@ msgstr "Emergenza"
msgid "Enable"
msgstr "Abilita"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Abilitato"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2179,6 +2192,9 @@ msgstr "Notifica"
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2941,6 +2957,9 @@ msgstr "Dimensione"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Salta"
@ -3335,7 +3354,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3554,7 +3573,7 @@ msgstr "Utilizzare tabella di instradamento"
msgid ""
"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 "
"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."

View file

@ -3,18 +3,18 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \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"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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"
msgid "%.1f dB"
msgstr ""
msgstr "%.1f dB"
msgid "%s is untagged in multiple VLANs!"
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>-アドレス"
msgid "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
msgstr ""
msgstr "<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"
msgid ""
"<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"
msgstr ""
"hosts ファイルにより解決される名前にローカルドメイン サフィックスを付加しま"
"す。"
msgid "Add new interface..."
msgstr "インターフェースの新規作成..."
@ -750,6 +752,13 @@ msgstr ""
msgid "Custom feeds"
msgstr "カスタム フィード"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
"カスタム ファイル(証明書, スクリプト)がシステムに残るかもしれません。これを"
"防ぐには、まず最初に factory-reset を行います。"
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -953,7 +962,7 @@ msgid "Domain whitelist"
msgstr "ドメイン ホワイトリスト"
msgid "Don't Fragment"
msgstr ""
msgstr "非フラグメント化"
msgid ""
"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
@ -1024,6 +1033,13 @@ msgstr "緊急"
msgid "Enable"
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>"
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr>を有効にする"
@ -1067,7 +1083,7 @@ msgid "Enable mirroring of outgoing packets"
msgstr "送信パケットのミラーリングを有効化"
msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets."
msgstr ""
msgstr "カプセル化されたパケットの DF (Don't Fragment) フラグを有効にします。"
msgid "Enable this mount"
msgstr "マウント設定を有効にする"
@ -1081,6 +1097,9 @@ msgstr "有効/無効"
msgid "Enabled"
msgstr "有効"
msgid "Enables IGMP snooping on this bridge"
msgstr "ブリッジの IGMP スヌーピングを有効にします"
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -1254,7 +1273,7 @@ msgid "Force use of NAT-T"
msgstr "NAT-Tの強制使用"
msgid "Form token mismatch"
msgstr ""
msgstr "フォーム トークンの不一致"
msgid "Forward DHCP traffic"
msgstr "DHCPトラフィックを転送する"
@ -1598,6 +1617,8 @@ msgstr "インストール"
msgid "Install iputils-traceroute6 for IPv6 traceroute"
msgstr ""
"IPv6 の traceroute を使用するには、 iputils-traceroute6 をインストールしま"
"す。"
msgid "Install package %q"
msgstr "%q パッケージをインストールします"
@ -1661,7 +1682,7 @@ msgstr ""
"ユーザー名かパスワード、もしくは両方が不正です!もう一度入力してください。"
msgid "Isolate Clients"
msgstr ""
msgstr "クライアント間の分離"
msgid ""
"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."
msgstr ""
"DNS サービスを、現在 DNS を提供しているサブネットのインターフェースに限定しま"
"す。"
msgid "Limit listening to these interfaces, and loopback."
msgstr "待ち受けをこれらのインターフェースとループバックに制限します。"
@ -1840,7 +1863,7 @@ msgid "Local IPv6 address"
msgstr "ローカル IPv6 アドレス"
msgid "Local Service Only"
msgstr ""
msgstr "ローカルサービスのみ"
msgid "Local Startup"
msgstr "ローカル スタートアップ"
@ -1855,6 +1878,8 @@ msgid ""
"Local domain specification. Names matching this domain are never forwarded "
"and are resolved from DHCP or hosts files only"
msgstr ""
"ローカル ドメインの定義です。このドメインに一致する名前は転送が行われず、 "
"DHCP または hosts ファイルのみにより解決されます。"
msgid "Local domain suffix appended to DHCP names and hosts file entries"
msgstr ""
@ -2178,6 +2203,11 @@ msgstr "注意"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
"キャッシュされる DNS エントリーの数です。(最大 10000 件。 0の場合はキャッ"
"シュしません)"
msgid "OK"
msgstr "OK"
@ -2394,7 +2424,7 @@ msgid "Packets"
msgstr "パケット"
msgid "Part of zone %q"
msgstr "ゾーン %qの一部"
msgstr "ゾーン %q の一部"
msgid "Password"
msgstr "パスワード"
@ -2962,6 +2992,9 @@ msgstr "サイズ"
msgid "Size (.ipk)"
msgstr "サイズ (.ipk)"
msgid "Size of DNS query cache"
msgstr "DNS クエリ キャッシュのサイズ"
msgid "Skip"
msgstr "スキップ"
@ -3085,10 +3118,10 @@ msgid "Submit"
msgstr "送信"
msgid "Suppress logging"
msgstr ""
msgstr "ログの抑制"
msgid "Suppress logging of the routine operation of these protocols"
msgstr ""
msgstr "これらのプロトコルのルーチン的操作についてのログを抑制します。"
msgid "Swap"
msgstr "スワップ"
@ -3110,7 +3143,7 @@ msgid ""
msgstr ""
msgid "Switch Port Mask"
msgstr ""
msgstr "スイッチポート マスク"
msgid "Switch VLAN"
msgstr ""
@ -3338,13 +3371,16 @@ msgstr ""
"サービスを有効にするために、管理者パスワードを設定してください。"
msgid "This IPv4 address of the relay"
msgstr ""
msgstr "リレーの IPv4 アドレス"
msgid ""
"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 "
"Name System\">DNS</abbr> servers."
msgstr ""
"このファイルは、特定ドメイン用、または上位 <abbr title=\"Domain Name System"
"\">DNS</abbr> サーバーのための 'server=/domain/1.2.3.4' や 'server=1.2.3.4' "
"というような行を含めることができます。"
msgid ""
"This is a list of shell glob patterns for matching files and directories to "
@ -3369,17 +3405,17 @@ msgstr ""
msgid ""
"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>が終端に設定されます。"
"<code>...:2/64</code>が終端に設定されます。"
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
"abbr> in the local network"
msgstr ""
"ローカル ネットワーク内のみの <abbr title=\"Dynamic Host Configuration "
"Protocol\">DHCP</abbr>として使用する"
"これはローカル ネットワーク内のみの <abbr title=\"Dynamic Host Configuration "
"Protocol\">DHCP</abbr> です。"
msgid "This is the plain username for logging into the account"
msgstr ""
@ -3591,7 +3627,7 @@ msgstr "ルーティング テーブルの使用"
msgid ""
"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 "
"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."
@ -3946,24 +3982,3 @@ msgstr "はい"
msgid "« Back"
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 "このページでは、ボタンの動作を変更することができます。"

View file

@ -731,6 +731,11 @@ msgstr ""
msgid "Custom feeds"
msgstr "Custom feed 들"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1001,6 +1006,11 @@ msgstr ""
msgid "Enable"
msgstr "활성화"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> 활성화"
@ -1058,6 +1068,9 @@ msgstr "활성/비활성"
msgid "Enabled"
msgstr "활성화됨"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2128,6 +2141,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr ""
@ -2890,6 +2906,9 @@ msgstr "Size"
msgid "Size (.ipk)"
msgstr "크기 (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3270,7 +3289,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3484,7 +3503,7 @@ msgstr "Routing table 사용"
msgid ""
"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 "
"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."

View file

@ -711,6 +711,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -973,6 +978,11 @@ msgstr ""
msgid "Enable"
msgstr ""
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "Mengaktifkan <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1030,6 +1040,9 @@ msgstr ""
msgid "Enabled"
msgstr ""
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2108,6 +2121,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "Baik"
@ -2864,6 +2880,9 @@ msgstr "Saiz"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Skip"
@ -3238,7 +3257,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3452,7 +3471,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -733,6 +733,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1008,6 +1013,11 @@ msgstr "Krisesituasjon"
msgid "Enable"
msgstr "Aktiver"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Aktivert"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2153,6 +2166,9 @@ msgstr "Merk"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2930,6 +2946,9 @@ msgstr "Størrelse"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Gå videre"
@ -3343,10 +3362,10 @@ msgstr ""
msgid ""
"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 ""
"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 ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3562,7 +3581,7 @@ msgstr "Bruk rutingtabellen"
msgid ""
"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 "
"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."

View file

@ -752,6 +752,11 @@ msgstr ""
msgid "Custom feeds"
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
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
@ -1034,6 +1039,11 @@ msgstr "Zagrożenie"
msgid "Enable"
msgstr "Włącz"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Włączony"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2198,6 +2211,9 @@ msgstr "Spostrzeżenie"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2978,6 +2994,9 @@ msgstr "Rozmiar"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Pomiń"
@ -3400,10 +3419,10 @@ msgstr ""
msgid ""
"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 ""
"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
msgid ""
@ -3622,7 +3641,7 @@ msgstr "Użyj tabeli routingu"
msgid ""
"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 "
"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."

View file

@ -786,6 +786,11 @@ msgstr ""
msgid "Custom feeds"
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 ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1070,6 +1075,11 @@ msgstr "Emergência"
msgid "Enable"
msgstr "Ativar"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Ativado"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2279,6 +2292,9 @@ msgstr "Aviso"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -3084,6 +3100,9 @@ msgstr "Tamanho"
msgid "Size (.ipk)"
msgstr "Tamanho (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Pular"
@ -3519,10 +3538,10 @@ msgstr ""
msgid ""
"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 ""
"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 ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3745,7 +3764,7 @@ msgstr "Use a tabela de roteamento"
msgid ""
"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 "
"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."

View file

@ -746,6 +746,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1024,6 +1029,11 @@ msgstr "Emergência"
msgid "Enable"
msgstr "Ativar"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Ativado"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2177,6 +2190,9 @@ msgstr "Reparo"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2948,6 +2964,9 @@ msgstr "Tamanho"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Saltar"
@ -3347,7 +3366,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3560,7 +3579,7 @@ msgstr "Usar tabela de roteamento"
msgid ""
"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 "
"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."

View file

@ -721,6 +721,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -979,6 +984,11 @@ msgstr "Urgenta"
msgid "Enable"
msgstr "Activeaza"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Activat"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2107,6 +2120,9 @@ msgstr "Notificare"
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2858,6 +2874,9 @@ msgstr "Marime"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3220,7 +3239,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3428,7 +3447,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -777,6 +777,11 @@ msgstr ""
msgid "Custom feeds"
msgstr "Список custom-ных feed-ов"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1055,6 +1060,11 @@ msgstr "Чрезвычайная ситуация"
msgid "Enable"
msgstr "Включить"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "Включить <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1112,6 +1122,9 @@ msgstr "Включить/выключить"
msgid "Enabled"
msgstr "Включено"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2235,6 +2248,9 @@ msgstr "Заметка"
msgid "Nslookup"
msgstr "DNS-запрос"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -3043,6 +3059,9 @@ msgstr "Размер"
msgid "Size (.ipk)"
msgstr "Размер (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Пропустить"
@ -3471,10 +3490,10 @@ msgstr ""
msgid ""
"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>."
"на <code>...:2/64</code>."
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3693,7 +3712,7 @@ msgstr "Использовать таблицу маршрутизации"
msgid ""
"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 "
"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."

View file

@ -704,6 +704,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -960,6 +965,11 @@ msgstr ""
msgid "Enable"
msgstr ""
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr ""
@ -1017,6 +1027,9 @@ msgstr ""
msgid "Enabled"
msgstr ""
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2082,6 +2095,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr ""
@ -2830,6 +2846,9 @@ msgstr ""
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3190,7 +3209,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3398,7 +3417,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -718,6 +718,11 @@ msgstr ""
msgid "Custom feeds"
msgstr "Anpassade flöden"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -980,6 +985,11 @@ msgstr "Nödsituation"
msgid "Enable"
msgstr "Aktivera"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr "Aktiverad"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2103,6 +2116,9 @@ msgstr "Avisering"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2853,6 +2869,9 @@ msgstr "Storlek"
msgid "Size (.ipk)"
msgstr "Storlek (.ipk)"
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Hoppa över"
@ -3215,7 +3234,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3425,7 +3444,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -697,6 +697,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -953,6 +958,11 @@ msgstr ""
msgid "Enable"
msgstr ""
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr ""
@ -1010,6 +1020,9 @@ msgstr ""
msgid "Enabled"
msgstr ""
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2075,6 +2088,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr ""
@ -2823,6 +2839,9 @@ msgstr ""
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3183,7 +3202,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3391,7 +3410,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -717,6 +717,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -973,6 +978,11 @@ msgstr ""
msgid "Enable"
msgstr ""
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr ""
@ -1030,6 +1040,9 @@ msgstr ""
msgid "Enabled"
msgstr ""
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2095,6 +2108,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr ""
@ -2843,6 +2859,9 @@ msgstr ""
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3203,7 +3222,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3411,7 +3430,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -755,6 +755,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -1034,6 +1039,11 @@ msgstr "Аварійний"
msgid "Enable"
msgstr "Увімкнути"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1091,6 +1101,9 @@ msgstr "Увімкнено/Вимкнено"
msgid "Enabled"
msgstr "Увімкнено"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2191,6 +2204,9 @@ msgstr "Попередження"
msgid "Nslookup"
msgstr "DNS-запит"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK"
@ -2973,6 +2989,9 @@ msgstr "Розмір"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "Пропустити"
@ -3391,10 +3410,10 @@ msgstr ""
msgid ""
"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>"
"закінчується на <code>...:2/64</code>"
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3614,7 +3633,7 @@ msgstr "Використовувати таблицю маршрутизації
msgid ""
"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 "
"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."

View file

@ -711,6 +711,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -978,6 +983,11 @@ msgstr ""
msgid "Enable"
msgstr ""
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <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"
msgstr ""
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2112,6 +2125,9 @@ msgstr ""
msgid "Nslookup"
msgstr ""
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "OK "
@ -2870,6 +2886,9 @@ msgstr "Dung lượng "
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr ""
@ -3240,7 +3259,7 @@ msgstr ""
msgid ""
"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 ""
msgid ""
@ -3453,7 +3472,7 @@ msgstr ""
msgid ""
"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 "
"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."

View file

@ -720,6 +720,12 @@ msgstr "自定义软件源地址,例如:私有的软件源。此文件在系
msgid "Custom feeds"
msgstr "自定义软件源"
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
"自定义文件(证书、脚本)会保留在系统上。若无需保留,请先执行恢复出厂设置。"
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -987,6 +993,11 @@ msgstr "紧急"
msgid "Enable"
msgstr "启用"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "开启 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1044,6 +1055,9 @@ msgstr "启用/禁用"
msgid "Enabled"
msgstr "启用"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2127,6 +2141,9 @@ msgstr "注意"
msgid "Nslookup"
msgstr "Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr "缓存的 DNS 条目数量(最大 100000 表示不缓存)"
msgid "OK"
msgstr "确认"
@ -2900,6 +2917,9 @@ msgstr "大小"
msgid "Size (.ipk)"
msgstr "大小(.ipk"
msgid "Size of DNS query cache"
msgstr "DNS 查询缓存的大小"
msgid "Skip"
msgstr "跳过"
@ -3283,8 +3303,8 @@ msgstr "启动脚本插入到 'exit 0' 之前即可随系统启动运行。"
msgid ""
"This is the local endpoint address assigned by the tunnel broker, it usually "
"ends with <code>:2</code>"
msgstr "隧道代理分配的本地终端地址,通常以 <code>:2</code> 结尾"
"ends with <code>...:2/64</code>"
msgstr "隧道代理分配的本地终端地址,通常以 <code>...:2/64</code> 结尾"
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3495,7 +3515,7 @@ msgstr "使用路由表"
msgid ""
"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 "
"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."

View file

@ -722,6 +722,11 @@ msgstr ""
msgid "Custom feeds"
msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
msgstr ""
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
@ -990,6 +995,11 @@ msgstr "緊急"
msgid "Enable"
msgstr "啟用"
msgid ""
"Enable <abbr title=\"Internet Group Management Protocol\">IGMP</abbr> "
"snooping"
msgstr ""
msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgstr "啟用 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
@ -1047,6 +1057,9 @@ msgstr "啟用/關閉"
msgid "Enabled"
msgstr "啟用"
msgid "Enables IGMP snooping on this bridge"
msgstr ""
msgid ""
"Enables fast roaming among access points that belong to the same Mobility "
"Domain"
@ -2119,6 +2132,9 @@ msgstr "通知"
msgid "Nslookup"
msgstr "DNS偵錯Nslookup"
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
msgstr ""
msgid "OK"
msgstr "行"
@ -2883,6 +2899,9 @@ msgstr "大小"
msgid "Size (.ipk)"
msgstr ""
msgid "Size of DNS query cache"
msgstr ""
msgid "Skip"
msgstr "跳過"
@ -3275,8 +3294,8 @@ msgstr ""
msgid ""
"This is the local endpoint address assigned by the tunnel broker, it usually "
"ends with <code>:2</code>"
msgstr "這是由通道代理人指定的本地終端位址, 通常用 <code>:2</code>結尾."
"ends with <code>...:2/64</code>"
msgstr "這是由通道代理人指定的本地終端位址, 通常用 <code>...:2/64</code>結尾."
msgid ""
"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
@ -3487,7 +3506,7 @@ msgstr "使用路由表"
msgid ""
"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 "
"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."

View file

@ -36,6 +36,7 @@ config qos
config system
option init led
option exec '/etc/init.d/log reload'
list affects luci_statistics
list affects dhcp

View 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

Binary file not shown.

BIN
luci-base/src/po2lmo.o Normal file

Binary file not shown.

Binary file not shown.