# Contributing Guidelines
-Patches and pull-requests:
+## Patches and Pull requests:
If you want to contribute a change to LuCI, please either send a patch using git send-email
-or open a pull request against the openwrt/luci repository.
+or open a "pull request" against the openwrt/luci repository.
Regardless of whether you send a patch or open a pull request, please try to follow these rules:
-* Have a useful subject prefixed with the component name
- (E.g.: "modules/admin-full: fix wifi channel selection on multiple STA networks")
+* Have a useful subject prefixed with the component name
+ (E.g.: "luci-mod-admin-full: fix wifi channel selection on multiple STA networks")
* Shortly explain the changes made and - if applicable - the reasoning behind them
-* Include Signed-off-by in the comment
+* Include Signed-off-by in the comment
(See <https://dev.openwrt.org/wiki/SubmittingPatches#a10.Signyourwork>)
In case you like to send patches by mail, please use the [LuCI mailinglist](https://lists.subsignal.org/mailman/listinfo/luci)
If you send via the OpenWrt list, include a "[luci]" tag in your subject line.
For general information on patch submission, follow the [OpenWrt patch submission guideline](https://dev.openwrt.org/wiki/SubmittingPatches).
+## Advice on pull requests:
-If you have commit access:
+Pull requests are the easiest way to contribute changes to git repos at Github. They are the preferred contribution method, as they offer a nice way for commenting and amending the proposed changes.
+
+* You need a local "fork" of the Github repo.
+* Use a "feature branch" for your changes. That separates the changes in the pull request from your other changes and makes it easy to edit/amend commits in the pull request. Workflow using "feature_x" as the example:
+ - Update your local git fork to the tip (of the master, usually)
+ - Create the feature branch with `git checkout -b feature_x`
+ - Edit changes and commit them locally
+ - Push them to your Github fork by `git push -u origin feature_x`. That creates the "feature_x" branch at your Github fork and sets it as the remote of this branch
+ - When you now visit Github, you should see a proposal to create a pull request
+
+* If you later need to add new commits to the pull request, you can simply commit the changes to the local branch and then use `git push` to automatically update the pull request.
+
+* If you need to change something in the existing pull request (e.g. to add a missing signed-off-by line to the commit message), you can use `git push -f` to overwrite the original commits. That is easy and safe when using a feature branch. Example workflow:
+ - Checkout the feature branch by `git checkout feature_x`
+ - Edit changes and commit them locally. If you are just updating the commit message in the last commit, you can use `git commit --amend` to do that
+ - If you added several new commits or made other changes that require cleaning up, you can use `git rebase -i HEAD~X` (X = number of commits to edit) to possibly squash some commits
+ - Push the changed commits to Github with `git push -f` to overwrite the original commits in the "feature_x" branch with the new ones. The pull request gets automatically updated
+
+## If you have commit access:
* Do NOT use git push --force.
* Use Pull Requests if you are unsure and to suggest changes to other developers.
-Gaining commit access:
+## Gaining commit access:
* Commit access will be granted to responsible contributors who have made
useful pull requests and / or feedback or patches to this repository or
OpenWrt in general. Please include your request for commit access in your
next pull request or ticket.
-Release Branches:
+## Release Branches:
-* Branches named "luci-X.Y" (e.g. luci-0.12) are release branches.
+* Branches named "for-XX.YY" or "luci-X.Y" (e.g. "for-15.05") are release branches.
* These branches are built with the respective OpenWrt release and are created
during the release stabilisation phase.
* Please ONLY cherry-pick or commit security and bug-fixes to these branches.
+++ /dev/null
-LuCI Installation Instructions
-
-TOC:
-1. Kamikaze Feed
-2. Kamikaze Packages
-
-
-1. Kamikaze Feed
- 1. Change to your OpenWrt buildroot
-
- 2. Add the following line to your OpenWrt feeds.conf:
- src-svn luci http://svn.luci.subsignal.org/luci/trunk/contrib/package
-
- 3. Run ./scripts/feeds update
-
- 4. Run ./scripts/feeds install -a -p luci
-
- 5. Type make menuconfig and you will find luci in the menu "Administration"
-
-
-2. Kamikaze Packages
- 1. cd to the "package" directory of your kamikaze buildroot
-
- 3. Type: ln -s /path/to/luci/contrib/package/* ./
-
- 4. cd to your kamikaze build root and type: make menuconfig
- You will find luci in the menu "Administration"
+++ /dev/null
-include build/config.mk
-
-MODULES = contrib/* applications/* libs/* modules/* themes/* i18n/*
-
-OS:=$(shell uname)
-MODULES:=$(foreach item,$(wildcard $(MODULES)),$(if $(realpath $(wildcard $(item)/Makefile)),$(item)))
-
-export OS
-
-.PHONY: all build gccbuild luabuild clean host gcchost luahost hostcopy hostclean
-
-all: build
-
-build: gccbuild luabuild
-
-gccbuild:
- make -C modules/base CC="cc" CFLAGS="" LDFLAGS="" SDK="$(shell test -f .running-sdk && echo 1)" host-install
- for i in $(MODULES); do \
- make -C$$i SDK="$(shell test -f .running-sdk && echo 1)" compile || { \
- echo "*** Compilation of $$i failed!"; \
- exit 1; \
- }; \
- done
-
-luabuild: i18nbuild
- for i in $(MODULES); do HOST=$(realpath host) \
- SDK="$(shell test -f .running-sdk && echo 1)" make -C$$i luabuild; done
-
-i18nbuild:
- mkdir -p host/lua-po
- ./build/i18n-po2lua.pl ./po host/lua-po
-
-clean:
- rm -f .running-sdk
- rm -rf docs
- make -C modules/base host-clean
- for i in $(MODULES); do make -C$$i clean; done
-
-
-host: build hostcopy
-
-gcchost: gccbuild hostcopy
-
-luahost: luabuild hostcopy
-
-hostcopy:
- mkdir -p host/tmp
- mkdir -p host/var/state
- for i in $(MODULES); do cp -pR $$i/dist/* host/ 2>/dev/null || true; done
- for i in $(MODULES); do cp -pR $$i/hostfiles/* host/ 2>/dev/null || true; done
- rm -f host/luci
- ln -s .$(LUCI_MODULEDIR) host/luci
- rm -rf /tmp/luci-* || true
-
-hostenv: sdk host ucidefaults
-
-sdk:
- touch .running-sdk
-
-ucidefaults:
- build/hostenv.sh $(realpath host) $(LUA_MODULEDIR) $(LUA_LIBRARYDIR) "$(realpath host)/bin/uci-defaults --exclude luci-freifunk-*"
-
-runuhttpd: hostenv
- cp $(realpath build)/luci.cgi $(realpath host)/www/cgi-bin/luci
- build/hostenv.sh $(realpath host) $(LUA_MODULEDIR) $(LUA_LIBRARYDIR) "$(realpath host)/usr/sbin/uhttpd -p 8080 -h $(realpath host)/www -f"
-
-runlua: hostenv
- build/hostenv.sh $(realpath host) $(LUA_MODULEDIR) $(LUA_LIBRARYDIR) "lua -i build/setup.lua"
-
-runshell: hostenv
- build/hostenv.sh $(realpath host) $(LUA_MODULEDIR) $(LUA_LIBRARYDIR) $$SHELL
-
-hostclean: clean
- rm -rf host
-
-apidocs: hostenv
- build/hostenv.sh $(realpath host) $(LUA_MODULEDIR) $(LUA_LIBRARYDIR) "build/makedocs.sh host/luci/ docs"
-
-nixiodocs: hostenv
- build/hostenv.sh $(realpath host) $(LUA_MODULEDIR) $(LUA_LIBRARYDIR) "build/makedocs.sh libs/nixio/ nixiodocs"
-
-po: host
- for L in $${LANGUAGE:-$$(find i18n/ -path 'i18n/*/luasrc/i18n/*' -name 'default.*.lua' | \
- sed -e 's!.*/default\.\(.*\)\.lua!\1!')}; do \
- build/i18n-lua2po.pl . $(realpath host)/po $$L; \
- done
-
-run:
- # make run is deprecated #
- # Please use: #
- # #
- # To run LuCI WebUI using uhttpd #
- # make runuhttpd #
- # #
- # To start a shell in the LuCI environment #
- # make runshell #
- # #
- # To run Lua CLI in the LuCI environment #
- # make runlua #
## Usage
-This feed is enabled by default. To install all its package definitions, run:
+This feed is enabled by default. Your feeds.conf.default (or feeds.conf) should contain a line like:
+```
+src-git luci https://github.com/openwrt/luci.git
+```
+
+To install all its package definitions, run:
```
./scripts/feeds update luci
./scripts/feeds install -a -p luci
```
+## API Reference
+
+You can browse the generated API documentation [directly on Github](http://htmlpreview.github.io/?http://raw.githubusercontent.com/openwrt/luci/master/documentation/api/index.html).
+
## License
See [LICENSE](LICENSE) file.
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "ahcpd", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/network/ahcpd/status')%>', null,
function(x, st)
{
var tb = document.getElementById('ahcpd_status_table');
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for Asterisk
-LUCI_DEPENDS:=+ahcpd
include ../../luci.mk
%>
-<form method="post" action="<%=luci.dispatcher.build_url("admin", "asterisk", "dialplans")%>" enctype="multipart/form-data">
+<form method="post" action="<%=url('admin/asterisk/dialplans')%>" enctype="multipart/form-data">
<div>
<script type="text/javascript" src="/luci-static/resources/cbi.js"></script>
<input type="hidden" name="cbi.submit" value="1" />
</div>
<div class="cbi-map" id="cbi-asterisk">
- <h2><a id="content" name="content">Outgoing Call Routing</a></h2>
+ <h2 name="content">Outgoing Call Routing</h2>
<div class="cbi-map-descr">
Here you can manage your dial plans which are used to route outgoing calls from your local extensions.<br /><br />
Related tasks:<br />
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans/zones')%>" class="cbi-title-ref">Manage dialzones</a> |
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/voicemail/mailboxes')%>" class="cbi-title-ref">Manage voicemail boxes</a> |
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/meetme/rooms')%>" class="cbi-title-ref">Manage meetme rooms</a>
+ <a href="<%=url('admin/asterisk/dialplans/zones')%>" class="cbi-title-ref">Manage dialzones</a> |
+ <a href="<%=url('admin/asterisk/voicemail/mailboxes')%>" class="cbi-title-ref">Manage voicemail boxes</a> |
+ <a href="<%=url('admin/asterisk/meetme/rooms')%>" class="cbi-title-ref">Manage meetme rooms</a>
</div>
<!-- tblsection -->
<fieldset class="cbi-section" id="cbi-asterisk-sip">
<big>Dialplan <em><%=plan.name%></em></big>
</th>
<td>
- <a href="<%=luci.dispatcher.build_url('admin', 'asterisk', 'dialplans')%>?delplan=<%=plan.name%>">
+ <a href="<%=url('admin/asterisk/dialplans')%>?delplan=<%=plan.name%>">
<img style="border:none" alt="Remove this dialplan" title="Remove this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</td>
</p>
</td>
<td style="width:5%" class="cbi-value-field">
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans/out', zone.name)%>">
+ <a href="<%=url('admin/asterisk/dialplans/out', zone.name)%>">
<img style="border:none" alt="Edit dialzone" title="Edit dialzone" src="/luci-static/resources/cbi/edit.gif" />
</a>
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
+ <a href="<%=url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</td>
</p>
</td>
<td style="width:5%" class="cbi-value-field">
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/voicemail/mailboxes')%>">
+ <a href="<%=url('admin/asterisk/voicemail/mailboxes')%>">
<img style="border:none" alt="Manage mailboxes ..." title="Manage mailboxes ..." src="/luci-static/resources/cbi/edit.gif" />
</a>
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
+ <a href="<%=url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</td>
</p>
</td>
<td style="width:5%" class="cbi-value-field">
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/meetme/rooms')%>">
+ <a href="<%=url('admin/asterisk/meetme/rooms')%>">
<img style="border:none" alt="Manage conferences ..." title="Manage conferences ..." src="/luci-static/resources/cbi/edit.gif" />
</a>
- <a href="<%=luci.dispatcher.build_url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
+ <a href="<%=url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</td>
%>
-<form method="post" action="<%=luci.dispatcher.build_url("admin", "asterisk", "dialplans", "zones")%>" enctype="multipart/form-data">
+<form method="post" action="<%=url('admin/asterisk/dialplans/zones')%>" enctype="multipart/form-data">
<div>
<script type="text/javascript" src="/luci-static/resources/cbi.js"></script>
<input type="hidden" name="cbi.submit" value="1" />
</div>
<div class="cbi-map" id="cbi-asterisk">
- <h2><a id="content" name="content">Dial Zone Management</a></h2>
+ <h2 name="content">Dial Zone Management</h2>
<div class="cbi-map-descr">
- <a href="<%=luci.dispatcher.build_url("admin/asterisk/dialplans")%>" class="cbi-title-ref">Back to dialplan overview</a><br /><br />
+ <a href="<%=url("admin/asterisk/dialplans")%>" class="cbi-title-ref">Back to dialplan overview</a><br /><br />
Here you can manage your dial zones. The zones are used to route outgoing calls to the destination.
Each zone groups multiple trunks and number matches to represent a logical destination. Zones can
also be used to enforce certain dial restrictions on selected extensions.
<%=rule.description or rule.name%>
</td>
<td style="text-align:left" class="cbi-value-field">
- <a href="<%=luci.dispatcher.build_url('admin', 'asterisk', 'dialplans', 'out', rule.name)%>">
+ <a href="<%=url('admin/asterisk/dialplans/out', rule.name)%>">
<img style="border:none" alt="Edit entry" title="Edit entry" src="/luci-static/resources/cbi/edit.gif" />
</a>
- <a href="<%=luci.dispatcher.build_url('admin', 'asterisk', 'dialplans', 'zones')%>?delzone=<%=rule.name%>">
+ <a href="<%=url('admin/asterisk/dialplans/zones')%>?delzone=<%=rule.name%>">
<img style="border:none" alt="Delete entry" title="Delete entry" src="/luci-static/resources/cbi/remove.gif" />
</a>
</td>
legend.parentNode.style.display = 'block';
legend.style.display = 'inline';
- stxhr.get('<%=luci.dispatcher.build_url("admin", "system", "commands", "run")%>/' + id + (args ? '/' + args : ''), null,
+ stxhr.get('<%=url('admin/system/commands/run')%>/' + id + (args ? '/' + args : ''), null,
function(x, st)
{
if (st)
if (field)
args = encodeURIComponent(field.value);
- location.href = '<%=luci.dispatcher.build_url("admin", "system", "commands", "download")%>/' + id + (args ? '/' + args : '');
+ location.href = '<%=url('admin/system/commands/download')%>/' + id + (args ? '/' + args : '');
}
function command_link(id)
<form method="get" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
<div class="cbi-map">
- <h2><a id="content" name="content"><%:Custom Commands%></a></h2>
+ <h2 name="content"><%:Custom Commands%></h2>
<fieldset class="cbi-section">
<% local _, command; for _, command in ipairs(commands) do %>
{hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), nil ).leaf = true
entry( {"admin", "services", "ddns", "global"}, cbi("ddns/global"), nil ).leaf = true
entry( {"admin", "services", "ddns", "logview"}, call("logread") ).leaf = true
- entry( {"admin", "services", "ddns", "startstop"}, call("startstop") ).leaf = true
+ entry( {"admin", "services", "ddns", "startstop"}, post("startstop") ).leaf = true
entry( {"admin", "services", "ddns", "status"}, call("status") ).leaf = true
end
-- cbi-map definition -- #######################################################
m = Map("ddns")
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
- translate("Dynamic DNS")
+m.title = [[<a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
+ translate("Dynamic DNS") .. [[</a>]]
m.description = translate("Dynamic DNS allows that your router can be reached with " ..
"a fixed hostname while having a dynamically changing " ..
-- cbi-map definition -- #######################################################
local m = Map("ddns")
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]]
- .. translate("Dynamic DNS")
+m.title = [[<a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]]
+ .. translate("Dynamic DNS") .. [[</a>]]
m.description = translate("Dynamic DNS allows that your router can be reached with " ..
"a fixed hostname while having a dynamically changing IP address.")
-- cbi-map definition -- #######################################################
m = Map("ddns")
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
- translate("Dynamic DNS")
+m.title = [[<a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
+ translate("Dynamic DNS") .. [[</a>]]
m.description = translate("Dynamic DNS allows that your router can be reached with " ..
"a fixed hostname while having a dynamically changing " ..
-- cbi-map definition -- #######################################################
m = Map("ddns")
--- first need to close <a> from cbi map template our <a> closed by template
-m.title = [[</a><a href="javascript:alert(']]
+m.title = [[<a href="javascript:alert(']]
.. translate("Version Information")
.. [[\n\nluci-app-ddns]]
.. [[\n\t]] .. translate("Version") .. [[:\t]] .. DDNS.ipkg_ver_installed("luci-app-ddns")
.. [[\n\t]] .. translate("Version") .. [[:\t]] .. DDNS.ipkg_ver_installed("ddns-scripts")
.. [[\n\n]]
.. [[')">]]
- .. translate("Dynamic DNS")
+ .. translate("Dynamic DNS") .. [[</a>]]
m.description = translate("Dynamic DNS allows that your router can be reached with " ..
"a fixed hostname while having a dynamically changing " ..
var txt = document.getElementById("cbid.ddns." + section + "._logview.txt"); // TextArea
if ( !txt ) { return; } // security check
- XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "logview")%>/' + section, null,
+ XHR.get('<%=url('admin/services/ddns/logview')%>/' + section, null,
function(x) {
if (x.responseText == "_nodata_")
txt.value = "<%:File not found or empty%>";
// do start/stop
var btnXHR = new XHR();
- btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "startstop")%>/' + section + '/' + cbx.checked, null,
+ btnXHR.post('<%=url('admin/services/ddns/startstop')%>/' + section + '/' + cbx.checked, { token: '<%=token%>' },
function(x, data) {
if (x.responseText == "_uncommitted_") {
// we need a trick to display Ampersand "&" in stead of "&" or "&"
}
// force to immediate show status on page load (not waiting for XHR.poll)
- XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+ XHR.get('<%=url('admin/services/ddns/status')%>', null,
function(x, data) {
if (data) { _data2elements(data); }
}
// define only ONE XHR.poll in a page because if one is running it blocks the other one
// optimum is to define on Map or Section Level from here you can reach all elements
// we need update every 15 seconds only
- XHR.poll(15, '<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+ XHR.poll(15, '<%=url('admin/services/ddns/status')%>', null,
function(x, data) {
if (data) { _data2elements(data); }
}
}
// force to immediate show status (not waiting for XHR.poll)
- XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+ XHR.get('<%=url('admin/services/ddns/status')%>', null,
function(x, data) {
if (data) { _data2elements(x, data); }
}
);
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "ddns", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/services/ddns/status')%>', null,
function(x, data) {
if (data) { _data2elements(x, data); }
}
//]]></script>
<fieldset class="cbi-section" id="ddns_status_section">
- <legend><a href="<%=luci.dispatcher.build_url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
+ <legend><a href="<%=url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend>
<table class="cbi-section-table" id="ddns_status_table">
<tr class="cbi-section-table-titles">
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.7.5\n"
+msgid "&"
+msgstr ""
+
msgid "-- custom --"
msgstr "-- 自定义 --"
msgid "Basic Settings"
msgstr "基础设置"
-msgid "Below a list of configuration tips for your system to run Dynamic DNS updates without limitations"
+msgid ""
+"Below a list of configuration tips for your system to run Dynamic DNS "
+"updates without limitations"
msgstr "以下是一个能够让你的系统不受限制地进行动态DNS更新的设置贴士."
-msgid "Below is a list of configured DDNS configurations and their current state."
+msgid ""
+"Below is a list of configured DDNS configurations and their current state."
msgstr "一下是当前已经配置好的DDNS设置项列表以及它们的当前状态."
msgid "Bind Network"
msgid "Binding to a specific network not supported"
msgstr "不支持绑定到一个指定的网络"
-msgid "BusyBox's nslookup and Wget do not support to specify the IP version to use for communication with DDNS Provider."
+msgid ""
+"BusyBox's nslookup and Wget do not support to specify the IP version to use "
+"for communication with DDNS Provider."
msgstr "与DDNS供应商通讯时BusyBox的nslookup和Wget不支持设置特定的IP协议版本."
-msgid "BusyBox's nslookup does not support to specify to use TCP instead of default UDP when requesting DNS server"
+msgid ""
+"BusyBox's nslookup does not support to specify to use TCP instead of default "
+"UDP when requesting DNS server"
msgstr "BusyBox的nslookup不支持使用TCP协议代替UDP协议请求DNS记录"
msgid "Casual users should not change this setting"
msgid "Configuration"
msgstr "设置"
-msgid "Configure here the details for all Dynamic DNS services including this LuCI application."
+msgid ""
+"Configure here the details for all Dynamic DNS services including this LuCI "
+"application."
msgstr "在这里修改动态DNS服务的详细配置"
msgid "Configure here the details for selected Dynamic DNS service."
msgid "Current setting"
msgstr "当前设置"
-msgid "Currently DDNS updates are not started at boot or on interface events.<br />This is the default if you run DDNS scripts by yourself (i.e. via cron with force_interval set to '0')"
-msgstr "现在,DDNS更新在开机或者接口动作时不会被触发<br />如果你手工运行DDNS脚本的话(例如使用cron时把force_interval设置为0),这是默认设置."
+msgid ""
+"Currently DDNS updates are not started at boot or on interface events.<br /"
+">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
+"force_interval set to '0')"
+msgstr ""
+"现在,DDNS更新在开机或者接口动作时不会被触发<br />如果你手工运行DDNS脚本的话"
+"(例如使用cron时把force_interval设置为0),这是默认设置."
-msgid "Currently DDNS updates are not started at boot or on interface events.<br />You can start/stop each configuration here. It will run until next reboot."
-msgstr "现在,DDNS更新在开机或者接口动作时不会被触发<br />你可以在这里开始/停止每一个设置的条目.它在下次重启之前一直有效."
+msgid ""
+"Currently DDNS updates are not started at boot or on interface events.<br /"
+">You can start/stop each configuration here. It will run until next reboot."
+msgstr ""
+"现在,DDNS更新在开机或者接口动作时不会被触发<br />你可以在这里开始/停止每一个"
+"设置的条目.它在下次重启之前一直有效."
msgid "Custom update script to be used for updating your DDNS Provider."
msgstr "用来更新动态DNS的自定义脚本"
msgid "Defines the network to read systems IPv6-Address from"
msgstr "设定用来读取系统IPv6地址的网络"
-msgid "Defines the source to read systems IPv4-Address from, that will be send to the DDNS provider"
+msgid ""
+"Defines the source to read systems IPv4-Address from, that will be send to "
+"the DDNS provider"
msgstr "设定IPv4地址的来源.这将会被发送给DDNS提供商"
-msgid "Defines the source to read systems IPv6-Address from, that will be send to the DDNS provider"
+msgid ""
+"Defines the source to read systems IPv6-Address from, that will be send to "
+"the DDNS provider"
msgstr "设定IPv6地址的来源.这将会被发送给DDNS提供商"
msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
msgid "Directory contains Log files for each running section"
msgstr "保存每一个运行中的设置的运行日志的目录"
-msgid "Directory contains PID and other status information for each running section"
+msgid ""
+"Directory contains PID and other status information for each running section"
msgstr "保存每个运行中的设置的PID以及其它状态信息的目录"
msgid "Disabled"
msgid "Dynamic DNS"
msgstr "动态DNS"
-msgid "Dynamic DNS allows that your router can be reached with a fixed hostname while having a dynamically changing IP address."
+msgid ""
+"Dynamic DNS allows that your router can be reached with a fixed hostname "
+"while having a dynamically changing IP address."
msgstr "动态DNS允许为拥有动态IP的主机配置一个固定的可访问域名."
msgid "Enable secure communication with DDNS provider"
msgid "File not found or empty"
msgstr "文件未找到或为空"
-msgid "Follow this link<br />You will find more hints to optimize your system to run DDNS scripts with all options"
-msgstr "打开这个链接<br />你将会得到更多关于如何通过所有设置项优化你的系统以运行DDNS脚本的提示."
+msgid ""
+"Follow this link<br />You will find more hints to optimize your system to "
+"run DDNS scripts with all options"
+msgstr ""
+"打开这个链接<br />你将会得到更多关于如何通过所有设置项优化你的系统以运行DDNS"
+"脚本的提示."
msgid "For detailed information about parameter settings look here."
msgstr "请看这里获得关于参数设置的详细信息"
msgid "Format: IP or FQDN"
msgstr "格式:IP或者FQDN"
-msgid "GNU Wget will use the IP of given network, cURL will use the physical interface."
+msgid ""
+"GNU Wget will use the IP of given network, cURL will use the physical "
+"interface."
msgstr "GNU Wget将会使用给定的网络的IP地址,而cURL将会使用物理接口"
msgid "Global Settings"
msgid "IPv6 address must be given in square brackets"
msgstr "IPv6地址必须填写在中括号(\"[ ]\")内"
-msgid "IPv6 is currently not (fully) supported by this system<br />Please follow the instructions on OpenWrt's homepage to enable IPv6 support<br />or update your system to the latest OpenWrt Release"
-msgstr "当前系统暂时不能(完整地)支持IPv6<br />请查看OpenWrt首页的介绍以启用IPv6支持<br />或者更新你的系统到最新OpenWrt版本"
+msgid ""
+"IPv6 is currently not (fully) supported by this system<br />Please follow "
+"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
+"your system to the latest OpenWrt Release"
+msgstr ""
+"当前系统暂时不能(完整地)支持IPv6<br />请查看OpenWrt首页的介绍以启用IPv6支持"
+"<br />或者更新你的系统到最新OpenWrt版本"
msgid "IPv6 not supported"
msgstr "IPv6不被支持"
msgid "If both cURL and GNU Wget are installed, Wget is used by default."
msgstr "如果cURL和GNU Wget同时被安装,那么Wget将会被优先使用."
-msgid "If this service section is disabled it could not be started.<br />Neither from LuCI interface nor from console"
-msgstr "如果服务配置被禁用那么它将不能被启动.<br />无论是通过LuCI页面或者是通过终端."
+msgid ""
+"If this service section is disabled it could not be started.<br />Neither "
+"from LuCI interface nor from console"
+msgstr ""
+"如果服务配置被禁用那么它将不能被启动.<br />无论是通过LuCI页面或者是通过终端."
-msgid "If you want to send updates for IPv4 and IPv6 you need to define two separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
-msgstr "如果你需要同时更新IPv4和IPv6地址,你需要单独添加两个配置项(例如'myddns_ipv4'和'myddns_ipv6')"
+msgid ""
+"If you want to send updates for IPv4 and IPv6 you need to define two "
+"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
+msgstr ""
+"如果你需要同时更新IPv4和IPv6地址,你需要单独添加两个配置项(例"
+"如'myddns_ipv4'和'myddns_ipv6')"
-msgid "In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
+msgid ""
+"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
msgstr "OpenWrt中,cURL/libcurl的某些版本编译时没有启用代理服务器支持"
msgid "Info"
msgid "Interface"
msgstr "接口"
-msgid "Interval to check for changed IP<br />Values below 5 minutes == 300 seconds are not supported"
+msgid ""
+"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
+"are not supported"
msgstr "检查IP是否改变的时间隔<br />不支持低于5分钟(300秒)的数值."
-msgid "Interval to force updates send to DDNS Provider<br />Setting this parameter to 0 will force the script to only run once<br />Values lower 'Check Interval' except '0' are not supported"
-msgstr "强制向提供商更新DDNS的时间周期<br />把这个参数设置为0将会让脚本仅执行一次<br />不支持低于\"检查时间周期\"的数值(除了0)."
+msgid ""
+"Interval to force updates send to DDNS Provider<br />Setting this parameter "
+"to 0 will force the script to only run once<br />Values lower 'Check "
+"Interval' except '0' are not supported"
+msgstr ""
+"强制向提供商更新DDNS的时间周期<br />把这个参数设置为0将会让脚本仅执行一次"
+"<br />不支持低于\"检查时间周期\"的数值(除了0)."
msgid "It is NOT recommended for casual users to change settings on this page."
msgstr "强烈不建议初次使用的用户修改本页设定."
msgid "Log to syslog"
msgstr "把日志记录到系统日志"
-msgid "Neither GNU Wget with SSL nor cURL installed to select a network to use for communication."
+msgid ""
+"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
+"communication."
msgstr "包含SSL支持的GNU Wget或者cURL均未被安装.无法选择一个网络用于通信."
-msgid "Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS protocol."
+msgid ""
+"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
+"protocol."
msgstr "包含SSL支持的GNU Wget或者cURL均未被安装.无法使用HTTPS更新DDNS"
msgid "Network"
msgid "Stopped"
msgstr "已停止"
-msgid "The currently installed 'ddns-scripts' package did not support all available settings."
+msgid ""
+"The currently installed 'ddns-scripts' package did not support all available "
+"settings."
msgstr "当前已安装的'ddns-scripts'软件包暂不支持所有可用设置项"
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr "没有已经配置好的服务项"
msgid "Unknown error"
msgstr "未知错误"
-msgid "Update URL to be used for updating your DDNS Provider.<br />Follow instructions you will find on their WEB page."
-msgstr "DDNS提供商用于更新DDNS的URL<br />跟随教程你将会在它们的网站上提供这个URL."
+msgid ""
+"Update URL to be used for updating your DDNS Provider.<br />Follow "
+"instructions you will find on their WEB page."
+msgstr ""
+"DDNS提供商用于更新DDNS的URL<br />跟随教程你将会在它们的网站上提供这个URL."
msgid "Update error"
msgstr "更新错误"
msgid "Warning"
msgstr "等待"
-msgid "Writes detailed messages to log file. File will be truncated automatically."
+msgid ""
+"Writes detailed messages to log file. File will be truncated automatically."
msgstr "向日志中写入详细信息.文件将会被自动减小."
-msgid "Writes log messages to syslog. Critical Errors will always be written to syslog."
+msgid ""
+"Writes log messages to syslog. Critical Errors will always be written to "
+"syslog."
msgstr "把日志写入系统日志.无论是否启用这项,错误信息总是会被写入系统日志"
msgid "You should install BIND host package for DNS requests."
"settings."
msgstr ""
+msgid "The default setting of '0' will retry infinite."
+msgstr ""
+
msgid "There is no service configured."
msgstr ""
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+<h2 name="content"><%:Diagnostics%></h2>
<p><%:The entries in the menu allow you to perform diagnostic tests on your system to aid in troubleshooting.%></p>
<p><%:The diagnostics available under this menu depend on what modules you have installed on your device.%></p>
<%+footer%>
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+<h2 name="content"><%:Diagnostics%></h2>
<p><%:With this menu you can configure network diagnostics, such as network device scans and ping tests.%></p>
<p><%:The diagnostics available under this menu depend on what modules you have installed on your device.%></p>
<%+footer%>
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Diagnostics Tools (Device Info)
-LUCI_DEPENDS:=+luci-app-diag-core +smap +netdiscover +mac-to-devinfo +httping +smap-to-devinfo +netdiscover-to-devinfo
+LUCI_DEPENDS:=+luci-app-diag-core +smap +netdiscover +mac-to-devinfo +httping +smap-to-devinfo +netdiscover-to-devinfo @BROKEN
include ../../luci.mk
--- Copyright 2014 Álvaro Fernández Rojas <noltari@gmail.com>
+-- Copyright 2014-2015 Álvaro Fernández Rojas <noltari@gmail.com>
-- Licensed to the public under the Apache License 2.0.
m = Map("dump1090", "dump1090", translate("dump1090 is a Mode S decoder specifically designed for RTLSDR devices, here you can configure the settings."))
enable.disabled="1"
enable.default = "1"
enable.rmempty = false
+
respawn=s:option(Flag, "respawn", translate("Respawn"))
respawn.default = false
ifile.rmempty = true
ifile.datatype = "file"
+iformat=s:option(ListValue, "iformat", translate("Sample format for data file"))
+iformat:value("", translate("Default"))
+iformat:value("UC8")
+iformat:value("SC16")
+iformat:value("SC16Q11")
+
+throttle=s:option(Flag, "throttle", translate("When reading from a file play back in realtime, not at max speed"))
+throttle.default = false
+
raw=s:option(Flag, "raw", translate("Show only messages hex values"))
raw.default = false
net_bo_port.rmempty = true
net_bo_port.datatype = "port"
+net_fatsv_port=s:option(Value, "net_fatsv_port", translate("FlightAware TSV output port"))
+net_fatsv_port.rmempty = true
+net_fatsv_port.datatype = "port"
+
net_ro_size=s:option(Value, "net_ro_size", translate("TCP raw output minimum size"))
net_ro_size.rmempty = true
net_ro_size.datatype = "uinteger"
-net_ro_rate=s:option(Value, "net_ro_rate", translate("TCP raw output memory flush rate"))
-net_ro_rate.rmempty = true
-net_ro_rate.datatype = "uinteger"
+net_ro_interval=s:option(Value, "net_ro_interval", translate("TCP raw output memory flush rate in seconds"))
+net_ro_interval.rmempty = true
+net_ro_interval.datatype = "uinteger"
net_heartbeat=s:option(Value, "net_heartbeat", translate("TCP heartbeat rate in seconds"))
net_heartbeat.rmempty = true
net_buffer.rmempty = true
net_buffer.datatype = "uinteger"
+net_verbatim=s:option(Flag, "net_verbatim", translate("Do not apply CRC corrections to messages we forward"))
+net_verbatim.default = false
+
+forward_mlat=s:option(Flag, "forward_mlat", translate("Allow forwarding of received mlat results to output ports"))
+forward_mlat.default = false
+
lat=s:option(Value, "lat", translate("Reference/receiver latitude for surface posn"))
lat.rmempty = true
-lat.datatype = "integer"
+lat.datatype = "float"
lon=s:option(Value, "lon", translate("Reference/receiver longitude for surface posn"))
lon.rmempty = true
-lon.datatype = "integer"
+lon.datatype = "float"
+
+max_range=s:option(Value, "max_range", translate("Absolute maximum range for position decoding"))
+max_range.rmempty = true
+max_range.datatype = "uinteger"
fix=s:option(Flag, "fix", translate("Enable single-bits error correction using CRC"))
fix.default = false
stats=s:option(Flag, "stats", translate("Print stats at exit"))
stats.default = false
+stats_range=s:option(Flag, "stats_range", translate("Collect/show range histogram"))
+stats_range.default = false
+
stats_every=s:option(Value, "stats_every", translate("Show and reset stats every seconds"))
stats_every.rmempty = true
stats_every.datatype = "uinteger"
metric=s:option(Flag, "metric", translate("Use metric units"))
metric.default = false
-snip=s:option(Flag, "snip", translate("Strip IQ file removing samples"))
+snip=s:option(Value, "snip", translate("Strip IQ file removing samples"))
snip.rmempty = true
snip.datatype = "uinteger"
-debug_mode=s:option(Flag, "debug", translate("Debug mode flags"))
+debug_mode=s:option(Value, "debug", translate("Debug mode flags"))
debug_mode.rmempty = true
-ppm=s:option(Flag, "ppm", translate("Set receiver error in parts per million"))
+ppm=s:option(Value, "ppm", translate("Set receiver error in parts per million"))
ppm.rmempty = true
ppm.datatype = "uinteger"
+html_dir=s:option(Value, "html_dir", translate("Base directory for the internal HTTP server"))
+html_dir.rmempty = true
+html_dir.datatype = "directory"
+
+write_json=s:option(Value, "write_json", translate("Periodically write json output to a directory"))
+write_json.rmempty = true
+write_json.datatype = "directory"
+
+write_json_every=s:option(Flag, "write_json_every", translate("Write json output every t seconds"))
+write_json_every.rmempty = true
+write_json_every.datatype = "uinteger"
+
+json_location_accuracy=s:option(ListValue, "json_location_accuracy", translate("Accuracy of receiver location in json metadata"))
+json_location_accuracy:value("", translate("Default"))
+json_location_accuracy:value("0", "No location")
+json_location_accuracy:value("1", "Approximate")
+json_location_accuracy:value("2", "Exact")
+
+oversample=s:option(Flag, "oversample", translate("Use the 2.4MHz demodulator"))
+oversample.default = false
+
+dcfilter=s:option(Flag, "dcfilter", translate("Apply a 1Hz DC filter to input data"))
+dcfilter.default = false
+
+measure_noise=s:option(Flag, "measure_noise", translate("Measure noise power"))
+measure_noise.default = false
+
return m
name = s:taboption("general", Value, "name", translate("Name"))
name.optional = false
name.forcewrite = true
-name.datatype = "uciname"
+name.datatype = "and(uciname,maxlength(11))"
function name.write(self, section, value)
if zone:name() ~= value then
msgstr "Ogranicz maskaradę do wskazanych sieci docelowych"
msgid "Restrict Masquerading to given source subnets"
-msgstr "Ogranicz maskaradÄ\99 do wskazanych sieci żródłowych"
+msgstr "Ogranicz maskaradÄ\99 do wskazanych sieci źródłowych"
# Wstawiłem rodzinę gdyż gdzieś wcześniej było tak opisane ale klasa pasuje mi tu bardziej.
# Obsy - niestety ale "rodzina". W gui dotyczy to wyboru IPv4/IPv6, więc "rodzina" a nie klasa.
"Rewrite matched traffic to the given source port. May be left empty to only "
"rewrite the IP address."
msgstr ""
-"Przepisz dopasowany ruch do danego portu żródłowego. Można zostawić puste "
+"Przepisz dopasowany ruch do danego portu źródłowego. Można zostawić puste "
"aby przepisać tylko adres IP"
msgid "Rewrite to source %s"
msgstr "Źródłowy adres MAC"
msgid "Source NAT"
-msgstr "NAT żródłowy"
+msgstr "NAT źródłowy"
# http://www.digipedia.pl/def/doc/id/677604507/name/SNAT/
msgid ""
"multiple WAN addresses to internal subnets."
msgstr ""
"SNAT używany jest wtedy, gdy zmieniane są adresy pakietów połączenia "
-"wychodzÄ\85cego, czyli pakiety żródłowe. Wykonywany jest zawsze po routowaniu "
+"wychodzÄ\85cego, czyli pakiety źródłowe. Wykonywany jest zawsze po routowaniu "
"(POSTROUTING), a więc w chwili, gdy pakiety są gotowe opuścić host. "
"IPmasquerading jest formą SNAT."
legend.parentNode.style.display = 'block';
legend.style.display = 'inline';
- stxhr.get('<%=luci.dispatcher.build_url("freifunk", "status")%>/diag_' + tool + protocol + '/' + addr, null,
+ stxhr.get('<%=url('freifunk/status')%>/diag_' + tool + protocol + '/' + addr, null,
function(x)
{
if (x.responseText)
<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
<div class="cbi-map">
- <h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+ <h2 name="content"><%:Diagnostics%></h2>
<fieldset class="cbi-section">
<legend><%:Network Utilities%></legend>
<div id="<%=name%>" style="width:<%=width%>;float:left">
<h2><%=title%></h2>
<div id="form_<%=name%>">
- <form name="searchform" id="search_<%=name%>" action="<%=luci.dispatcher.build_url('freifunk', 'search_redirect')%>">
+ <form name="searchform" id="search_<%=name%>" action="<%=url('freifunk/search_redirect')%>">
<input type="text" name="searchterms" style="margin-bottom:15px; width: 90%"><br />
<%
local checked = " checked"
s.anonymous=true
s.dynamic=true
s:option(Value, "MAX_SPA_PACKET_AGE", "MAX_SPA_PACKET_AGE", translate("Maximum age in seconds that an SPA packet will be accepted. defaults to 120 seconds"))
+s:option(Value, "PCAP_INTF", "PCAP_INTF", translate("Specify the ethernet interface on which fwknopd will sniff packets."))
+s:option(Value, "ENABLE_IPT_FORWARDING", "ENABLE_IPT_FORWARDING", translate("Allow SPA clients to request access to services through an iptables firewall instead of just to it."))
s:option(DummyValue, "note2", translate("Enter custom fwknopd.conf variables below:"))
return m
+++ /dev/null
-msgid ""
-msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
-"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2015-05-12 21:03-0500\n"
-"Last-Translator: Jonathan Bennett <JBennett@incomsystems.biz>\n"
-"Language-Team: English\n"
-"Language: en\n"
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgid "Base 64 key"
-msgstr "Base 64 key"
-
-msgid ""
-"Define a set of ports and protocols (tcp or udp) that will be opened if a "
-"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
-"to honor any proto/port request specified in the SPA data (unless of it "
-"matches any “RESTRICT_PORTS” entries). Multiple entries are comma-separated."
-msgstr ""
-"Define a set of ports and protocols (tcp or udp) that will be opened if a "
-"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
-"to honor any proto/port request specified in the SPA data (unless of it "
-"matches any “RESTRICT_PORTS” entries). Multiple entries are comma-separated."
-
-msgid ""
-"Define the length of time access will be granted by fwknopd through the "
-"firewall after a valid knock sequence from a source IP address. If "
-"“FW_ACCESS_TIMEOUT” is not set then the default timeout of 30 seconds will "
-"automatically be set."
-msgstr ""
-"Define the length of time access will be granted by fwknopd through the "
-"firewall after a valid knock sequence from a source IP address. If "
-"“FW_ACCESS_TIMEOUT” is not set then the default timeout of 30 seconds will "
-"automatically be set."
-
-msgid ""
-"Define the symmetric key used for decrypting an incoming SPA packet that is "
-"encrypted by the fwknop client with Rijndael."
-msgstr ""
-"Define the symmetric key used for decrypting an incoming SPA packet that is "
-"encrypted by the fwknop client with Rijndael."
-
-msgid "Enable Uci/Luci control"
-msgstr "Enable Uci/Luci control"
-
-msgid "Enable config overwrite"
-msgstr "Enable config overwrite"
-
-msgid "Enter custom access.conf variables below:"
-msgstr "Enter custom access.conf variables below:"
-
-msgid "Enter custom fwknopd.conf variables below:"
-msgstr "Enter custom fwknopd.conf variables below:"
-
-msgid "Firewall Knock Daemon"
-msgstr "Firewall Knock Daemon"
-
-msgid "Firewall Knock Operator"
-msgstr "Firewall Knock Operator"
-
-msgid ""
-"Force all SPA packets to contain a real IP address within the encrypted "
-"data. This makes it impossible to use the -s command line argument on the "
-"fwknop client command line, so either -R has to be used to automatically "
-"resolve the external address (if the client behind a NAT) or the client must "
-"know the external IP and set it via the -a argument."
-msgstr ""
-"Force all SPA packets to contain a real IP address within the encrypted "
-"data. This makes it impossible to use the -s command line argument on the "
-"fwknop client command line, so either -R has to be used to automatically "
-"resolve the external address (if the client behind a NAT) or the client must "
-"know the external IP and set it via the -a argument."
-
-msgid ""
-"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
-"seconds"
-msgstr ""
-"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
-"seconds"
-
-msgid "Normal Key"
-msgstr "Normal Key"
-
-msgid "The base64 hmac key"
-msgstr "The base64 hmac key"
-
-msgid "Use ANY for any source ip"
-msgstr "Use ANY for any source ip"
-
-msgid ""
-"When unchecked, the config files in /etc/fwknopd will be used as is, "
-"ignoring any settings here."
-msgstr ""
-"When unchecked, the config files in /etc/fwknopd will be used as is, "
-"ignoring any settings here."
-
-msgid "access.conf stanzas"
-msgstr "access.conf stanzas"
-
-msgid "fwknopd.conf config options"
-msgstr "fwknopd.conf config options"
--- /dev/null
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: 2015-05-12 21:03-0500\n"
+"Last-Translator: Jonathan Bennett <JBennett@incomsystems.biz>\n"
+"Language-Team: English\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid ""
+"Allow SPA clients to request access to services through an iptables firewall "
+"instead of just to it."
+msgstr ""
+"Allow SPA clients to request access to services through an iptables firewall "
+"instead of just to it."
+
+msgid "Base 64 key"
+msgstr "Base 64 key"
+
+msgid ""
+"Define a set of ports and protocols (tcp or udp) that will be opened if a "
+"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
+"to honor any proto/port request specified in the SPA data (unless of it "
+"matches any “RESTRICT_PORTS” entries). Multiple entries are comma-separated."
+msgstr ""
+"Define a set of ports and protocols (tcp or udp) that will be opened if a "
+"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
+"to honor any proto/port request specified in the SPA data (unless of it "
+"matches any “RESTRICT_PORTS” entries). Multiple entries are comma-separated."
+
+msgid ""
+"Define the length of time access will be granted by fwknopd through the "
+"firewall after a valid knock sequence from a source IP address. If "
+"“FW_ACCESS_TIMEOUT” is not set then the default timeout of 30 seconds will "
+"automatically be set."
+msgstr ""
+"Define the length of time access will be granted by fwknopd through the "
+"firewall after a valid knock sequence from a source IP address. If "
+"“FW_ACCESS_TIMEOUT” is not set then the default timeout of 30 seconds will "
+"automatically be set."
+
+msgid ""
+"Define the symmetric key used for decrypting an incoming SPA packet that is "
+"encrypted by the fwknop client with Rijndael."
+msgstr ""
+"Define the symmetric key used for decrypting an incoming SPA packet that is "
+"encrypted by the fwknop client with Rijndael."
+
+msgid "Enable Uci/Luci control"
+msgstr "Enable Uci/Luci control"
+
+msgid "Enable config overwrite"
+msgstr "Enable config overwrite"
+
+msgid "Enter custom access.conf variables below:"
+msgstr "Enter custom access.conf variables below:"
+
+msgid "Enter custom fwknopd.conf variables below:"
+msgstr "Enter custom fwknopd.conf variables below:"
+
+msgid "Firewall Knock Daemon"
+msgstr "Firewall Knock Daemon"
+
+msgid "Firewall Knock Operator"
+msgstr "Firewall Knock Operator"
+
+msgid ""
+"Force all SPA packets to contain a real IP address within the encrypted "
+"data. This makes it impossible to use the -s command line argument on the "
+"fwknop client command line, so either -R has to be used to automatically "
+"resolve the external address (if the client behind a NAT) or the client must "
+"know the external IP and set it via the -a argument."
+msgstr ""
+"Force all SPA packets to contain a real IP address within the encrypted "
+"data. This makes it impossible to use the -s command line argument on the "
+"fwknop client command line, so either -R has to be used to automatically "
+"resolve the external address (if the client behind a NAT) or the client must "
+"know the external IP and set it via the -a argument."
+
+msgid ""
+"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
+"seconds"
+msgstr ""
+"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
+"seconds"
+
+msgid "Normal Key"
+msgstr "Normal Key"
+
+msgid "Specify the ethernet interface on which fwknopd will sniff packets."
+msgstr "Specify the ethernet interface on which fwknopd will sniff packets."
+
+msgid "The base64 hmac key"
+msgstr "The base64 hmac key"
+
+msgid "Use ANY for any source ip"
+msgstr "Use ANY for any source ip"
+
+msgid ""
+"When unchecked, the config files in /etc/fwknopd will be used as is, "
+"ignoring any settings here."
+msgstr ""
+"When unchecked, the config files in /etc/fwknopd will be used as is, "
+"ignoring any settings here."
+
+msgid "access.conf stanzas"
+msgstr "access.conf stanzas"
+
+msgid "fwknopd.conf config options"
+msgstr "fwknopd.conf config options"
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
+msgid ""
+"Allow SPA clients to request access to services through an iptables firewall "
+"instead of just to it."
+msgstr ""
+
msgid "Base 64 key"
msgstr ""
msgid "Normal Key"
msgstr ""
+msgid "Specify the ethernet interface on which fwknopd will sniff packets."
+msgstr ""
+
msgid "The base64 hmac key"
msgstr ""
#!/bin/sh
#-- Copyright 2015 Jonathan Bennett <jbennett@incomsystems.biz>
#-- Licensed to the public under the GNU General Public License v2.
+. /lib/functions/network.sh
uci batch <<EOF
add ucitrack fwknopd
commit ucitrack
EOF
+uci delete fwknopd.@access[0].KEY
+uci delete fwknopd.@access[0].HMAC_KEY
uci set fwknopd.@access[0].keytype='Base 64 key'
uci set fwknopd.@access[0].hkeytype='Base 64 key'
uci set fwknopd.@access[0].KEY_BASE64=`fwknopd --key-gen | awk '/^KEY/ {print $2;}'`
uci set fwknopd.@access[0].HMAC_KEY_BASE64=`fwknopd --key-gen | awk '/^HMAC/ {print $2;}'`
+uci set fwknopd.@config[0].ENABLE_IPT_FORWARDING='y'
+
uci commit fwknopd
rm -f /tmp/luci-indexcache
exit 0
<script type="text/javascript">//<![CDATA[
-XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "telephony", "status")%>', null,
+XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
function(x, st)
{
var tb = document.getElementById('telephony_status_table');
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin/services/minidlna_status")%>', null,
+ XHR.poll(5, '<%=url("admin/services/minidlna_status")%>', null,
function(x, st)
{
var tb = document.getElementById('minidlna_status');
--- General settings ---
-section_gen = m:section(TypedSection, "mjpg-streamer", "General")
+section_gen = m:section(TypedSection, "mjpg-streamer", translate("General"))
section_gen.addremove=false
section_gen.anonymous=true
-enabled = section_gen:option(Flag, "enabled", "Enabled", "Enable MJPG-streamer")
+enabled = section_gen:option(Flag, "enabled", translate("Enabled"), translate("Enable MJPG-streamer"))
-input = section_gen:option(ListValue, "input", "Input plugin")
+input = section_gen:option(ListValue, "input", translate("Input plugin"))
input:depends("enabled", "1")
input:value("uvc", "UVC")
---input:value("file", "File")
input.optional = false
-output = section_gen:option(ListValue, "output", "Output plugin")
+output = section_gen:option(ListValue, "output", translate("Output plugin"))
output:depends("enabled", "1")
output:value("http", "HTTP")
output:value("file", "File")
--- Plugin settings ---
-s = m:section(TypedSection, "mjpg-streamer", "Plugin settings")
+s = m:section(TypedSection, "mjpg-streamer", translate("Plugin settings"))
s.addremove=false
s.anonymous=true
msgid "Drop frames smaller then this limit"
msgstr ""
+msgid "Enable MJPG-streamer"
+msgstr ""
+
msgid "Enable YUYV format"
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Exceed"
msgstr ""
msgid "Frames per second"
msgstr ""
+msgid "General"
+msgstr ""
+
msgid "HTTP output"
msgstr ""
+msgid "Input plugin"
+msgstr ""
+
msgid "Interval between saving pictures"
msgstr ""
msgid "On"
msgstr ""
+msgid "Output plugin"
+msgstr ""
+
msgid "Password"
msgstr ""
+msgid "Plugin settings"
+msgstr ""
+
msgid "Port"
msgstr ""
--- /dev/null
+msgid ""
+msgstr ""
+"Project-Id-Version: luci-app-mjpg-streamer\n"
+"POT-Creation-Date: 2015-06-11 21:11+0100\n"
+"PO-Revision-Date: 2015-06-11 21:11+0100\n"
+"Last-Translator: maz-1 <ohmygod19993 at gmail dotcom>\n"
+"Language-Team: \n"
+"Language: zh-cn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+msgid "Allow ringbuffer to exceed limit by this amount"
+msgstr "允许环形缓冲区最多超过这个数值"
+
+msgid "Ask for username and password on connect"
+msgstr "连接时询问用户名和密码"
+
+msgid "Authentication required"
+msgstr "需要验证"
+
+msgid "Auto"
+msgstr "自动"
+
+msgid "Automatic disabling of MJPEG mode"
+msgstr "自动禁用MJPEG模式"
+
+msgid "Blink"
+msgstr "闪烁"
+
+msgid "Check to save the stream to an mjpeg file"
+msgstr "勾选以保存视频流至一个mjpeg文件"
+
+msgid "Command to run"
+msgstr "运行的命令"
+
+msgid "Device"
+msgstr "设备"
+
+msgid "Do not initalize dynctrls of Linux-UVC driver"
+msgstr "不要初始化Linux-UVC驱动的dynctrls"
+
+msgid "Don't initalize dynctrls"
+msgstr "不要初始化dynctrls"
+
+msgid "Drop frames smaller then this limit"
+msgstr "丢弃小于该尺寸限制的帧"
+
+msgid "Enable MJPG-streamer"
+msgstr "启用MJPG-streamer"
+
+msgid "Enable YUYV format"
+msgstr "启用YUYV格式"
+
+msgid "Enabled"
+msgstr "启用"
+
+msgid "Exceed"
+msgstr "超出"
+
+msgid ""
+"Execute command after saving picture. Mjpg-streamer parse the filename as "
+"first parameter to your script."
+msgstr "保存图片后执行命令。文件名将作为第一个参数传递给命令。"
+
+msgid "File input"
+msgstr "文件输入"
+
+msgid "File output"
+msgstr "文件输出"
+
+msgid "Folder"
+msgstr "文件夹"
+
+msgid "Folder that contains webpages"
+msgstr "保存网页的文件夹"
+
+msgid "Frames per second"
+msgstr "帧每秒"
+
+msgid "General"
+msgstr "一般设置"
+
+msgid "HTTP output"
+msgstr "HTTP输出"
+
+msgid "Input plugin"
+msgstr "输入插件"
+
+msgid "Interval between saving pictures"
+msgstr "图片保存时间间隔"
+
+msgid "JPEG compression quality"
+msgstr "JPEG压缩品质"
+
+msgid "Led control"
+msgstr "LED控制"
+
+msgid "MJPG-streamer"
+msgstr "MJPG-streamer"
+
+msgid "Max. number of pictures to hold"
+msgstr "保存的图片数量上限"
+
+msgid "Mjpeg output"
+msgstr "Mjpeg输出"
+
+msgid "Off"
+msgstr "关"
+
+msgid "On"
+msgstr "开"
+
+msgid "Output plugin"
+msgstr "输出插件"
+
+msgid "Password"
+msgstr "密码"
+
+msgid "Plugin settings"
+msgstr "插件设置"
+
+msgid "Port"
+msgstr "端口"
+
+msgid "Resolution"
+msgstr "分辨率"
+
+msgid "Ring buffer size"
+msgstr "环形缓冲区大小"
+
+msgid "Set folder to save pictures"
+msgstr "图片保存位置"
+
+msgid "Set the inteval in millisecond"
+msgstr "设置时间间隔(毫秒)"
+
+msgid ""
+"Set the minimum size if the webcam produces small-sized garbage frames. May "
+"happen under low light conditions"
+msgstr "设置无用帧的最小尺寸。当光照不足时可能出现无用帧。"
+
+msgid ""
+"Set the quality in percent. This setting activates YUYV format, disables "
+"MJPEG"
+msgstr "设置品质(百分比)。此设置会开启YUYV格式输出,关闭MJPEG输出。"
+
+msgid "TCP port for this HTTP server"
+msgstr "HTTP服务监听的TCP端口"
+
+msgid "UVC input"
+msgstr "UVC输入"
+
+msgid "Username"
+msgstr "用户名"
+
+msgid "WWW folder"
+msgstr "WWW文件夹"
+
+msgid ""
+"mjpg streamer is a streaming application for Linux-UVC compatible webcams"
+msgstr "mjpg streamer是一个视频流程序,用于兼容Linux-UVC的摄像头。"
include $(TOPDIR)/rules.mk
-LUCI_TITLE:=LuCI Support for the OpenWrt MultiWAN agent
-LUCI_DEPENDS:=+multiwan
+LUCI_TITLE:=LuCI Support for the OpenWrt MultiWAN agent (obsoleted by mwan3)
+LUCI_DEPENDS:=+multiwan @BROKEN
include ../../luci.mk
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "multiwan", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/network/multiwan/status')%>', null,
function(x, st)
{
var tx = document.getElementById('multiwan_status_text');
msgstr "Interfaces WAN"
msgid "WAN Uplink"
-msgstr "Enalce saliente WAN"
+msgstr "Enlace saliente WAN"
msgid "all"
msgstr "todos"
call("ocserv_status")).leaf = true
entry({"admin", "services", "ocserv", "disconnect"},
- call("ocserv_disconnect")).leaf = true
+ post("ocserv_disconnect")).leaf = true
end
if not ln then break end
local id, user, group, vpn_ip, ip, device, time, cipher, status =
- ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*")
+ ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%(%)%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*")
if id then
fwd[#fwd+1] = {
id = id,
o:value("plain")
o:value("PAM")
-o = s:taboption("general", Value, "zone", translate("Firewall Zone"),
- translate("The firewall zone that the VPN clients will be set to"))
-o.nocreate = true
-o.default = "lan"
-o.template = "cbi/firewall_zonelist"
-
s:taboption("general", Value, "port", translate("Port"),
translate("The same UDP and TCP ports will be used"))
s:taboption("general", Value, "max_clients", translate("Max clients"))
translate("Enable support for CISCO AnyConnect clients"))
cisco.default = "1"
-ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Network-Address"))
-ipaddr.datatype = "ip4addr"
-ipaddr.default = "192.168.100.1"
-
-nm = s:taboption("general", Value, "netmask", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
-nm.datatype = "ip4addr"
-nm.default = "255.255.255.0"
-nm:value("255.255.255.0")
-nm:value("255.255.0.0")
-nm:value("255.0.0.0")
-
-if has_ipv6 then
- ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Network-Address"), translate("<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: address/prefix"))
- ip6addr.datatype = "ip6addr"
-end
-
tmpl = s:taboption("template", Value, "_tmpl",
translate("Edit the template that is used for generating the ocserv configuration."))
return nixio.fs.readfile("/etc/ocserv/ca.pem")
end
+--[[Networking options]]--
+
+local parp = s:taboption("general", Flag, "proxy_arp", translate("Enable proxy arp"),
+ translate("Provide addresses to clients from a subnet of LAN; if enabled the network below must be a subnet of LAN. Note that the first address of the specified subnet will be reserved by ocserv, so it should not be in use. If you have a network in LAN covering 192.168.1.0/24 use 192.168.1.192/26 to reserve the upper 62 addresses."))
+parp.default = "0"
+
+ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Network-Address"),
+ translate("The IPv4 subnet address to provide to clients; this should be some private network different than the LAN addresses unless proxy ARP is enabled. Leave empty to attempt auto-configuration."))
+ipaddr.datatype = "ip4addr"
+ipaddr.default = "192.168.100.1"
+
+nm = s:taboption("general", Value, "netmask", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"),
+ translate("The mask of the subnet above."))
+nm.datatype = "ip4addr"
+nm.default = "255.255.255.0"
+nm:value("255.255.255.0")
+nm:value("255.255.0.0")
+nm:value("255.0.0.0")
+
+if has_ipv6 then
+ ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Network-Address"), translate("<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: address/prefix"),
+ translate("The IPv6 subnet address to provide to clients; leave empty to attempt auto-configuration."))
+ ip6addr.datatype = "ip6addr"
+end
+
+
--[[DNS]]--
s = m:section(TypedSection, "dns", translate("DNS servers"),
- translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4"))
+ translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4. Typically you should include the address of this device"))
s.anonymous = true
s.addremove = true
s.template = "cbi/tblsection"
if not ln then break end
local id, user, group, vpn_ip, ip, device, time, cipher, status =
- ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*")
+ ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%(%)%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*")
if id then
table.insert(lusers, {id, user, group, vpn_ip, ip, device, time, cipher, status})
end
<script type="text/javascript">//<![CDATA[
function ocserv_disconnect(idx) {
- XHR.get('<%=luci.dispatcher.build_url("admin", "services", "ocserv", "disconnect")%>/' + idx, null,
+ (new XHR()).post('<%=url('admin/services/ocserv/disconnect')%>/' + idx, { token: '<%=token%>' },
function(x)
{
var tb = document.getElementById('ocserv_status_table');
);
}
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "ocserv", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/services/ocserv/status')%>', null,
function(x, st)
{
var tb = document.getElementById('ocserv_status_table');
- <h2><a id="content" name="content"><%:Services%></a></h2>
+ <h2 name="content"><%:Services%></h2>
<fieldset class="cbi-section">
<legend><%:Internal services%></legend>
include $(TOPDIR)/rules.mk
LUCI_TITLE:=OLSR configuration and status module
-LUCI_DEPENDS:=+olsrd +olsrd-mod-jsoninfo +luci-lib-luaneightbl
+LUCI_DEPENDS:=+olsrd +olsrd-mod-jsoninfo +luci-lib-luaneightbl +luci-lib-json
include ../../luci.mk
function action_json()
local http = require "luci.http"
local utl = require "luci.util"
- local uci = require "luci.model.uci".cursor_state()
+ local uci = require "luci.model.uci".cursor()
local jsonreq4
local jsonreq6
- jsonreq4 = utl.exec("echo /status | nc 127.0.0.1 9090")
- jsonreq6 = utl.exec("echo /status | nc ::1 9090")
+ local v4_port = uci:get("olsrd", "olsrd_jsoninfo", "port") or 9090
+ local v6_port = uci:get("olsrd6", "olsrd_jsoninfo", "port") or 9090
+
+ jsonreq4 = utl.exec("(echo /status | nc 127.0.0.1 " .. v4_port .. ") 2>/dev/null" )
+ jsonreq6 = utl.exec("(echo /status | nc ::1 " .. v6_port .. ") 2>/dev/null")
http.prepare_content("application/json")
if not jsonreq4 or jsonreq4 == "" then
jsonreq4 = "{}"
local IpVersion = uci:get_first("olsrd", "olsrd","IpVersion")
local jsonreq4 = ""
local jsonreq6 = ""
- jsonreq4 = utl.exec("echo /" .. otable .. " | nc 127.0.0.1 9090")
- jsonreq6 = utl.exec("echo /" .. otable .. " | nc ::1 9090")
+ local v4_port = uci:get("olsrd", "olsrd_jsoninfo", "port") or 9090
+ local v6_port = uci:get("olsrd6", "olsrd_jsoninfo", "port") or 9090
+
+ jsonreq4 = utl.exec("(echo /" .. otable .. " | nc 127.0.0.1 " .. v4_port .. ") 2>/dev/null")
+ jsonreq6 = utl.exec("(echo /" .. otable .. " | nc ::1 " .. v6_port .. ") 2>/dev/null")
local jsondata4 = {}
local jsondata6 = {}
local data4 = {}
-%>
<%+header%>
-<h2><a id="content" name="content"><%:OLSR Daemon%></a></h2>
+<h2 name="content"><%:OLSR Daemon%></h2>
<p class="error"><%:Unable to connect to the OLSR daemon!%></p>
<p><%:Make sure that OLSRd is running, the "jsoninfo" plugin is loaded, configured on port 9090 and accepts connections from "127.0.0.1".%></p>
<%+footer%>
);
//]]></script>
-<h2><a id="content" name="content"><%:Active host net announcements%></a></h2>
+<h2 name="content"><%:Active host net announcements%></h2>
<div id="togglebuttons"></div>
<fieldset class="cbi-section">
<%+header%>
-<h2><a id="content" name="content"><%:Interfaces%></a></h2>
+<h2 name="content"><%:Interfaces%></h2>
<div id="togglebuttons"></div>
%>
<%+header%>
-<h2><a id="content" name="content"><%:Active MID announcements%></a></h2>
+<h2 name="content"><%:Active MID announcements%></h2>
<div id="togglebuttons"></div>
<fieldset class="cbi-section">
//]]></script>
-<h2><a id="content" name="content"><%:OLSR connections%></a></h2>
+<h2 name="content"><%:OLSR connections%></h2>
<div id="togglebuttons"></div>
-%>
<%
-local ipv = luci.model.uci.cursor():get_first("olsrd", "olsrd", "IpVersion", "4")
+
+has_ipv4_conf = luci.model.uci.cursor():get_first("olsrd", "olsrd", "IpVersion")
+has_ipv6_conf = luci.model.uci.cursor():get_first("olsrd6", "olsrd", "IpVersion")
function write_conf(conf, file)
local fs = require "nixio.fs"
conf = luci.http.formvalue()
-if conf.openwrt then
+if conf.openwrt_v4 then
write_conf("/etc/config/olsrd", "olsrd")
return false
end
-if conf.conf_v4 then
- write_conf("/var/etc/olsrd.conf.ipv4", "olsrd.conf.ipv4")
+if conf.openwrt_v6 then
+ write_conf("/etc/config/olsrd6", "olsrd6")
return false
end
-if conf.conf_v6 then
- write_conf("/var/etc/olsrd.conf.ipv6", "olsrd.conf.ipv6")
+if conf.conf_v4 then
+ write_conf("/var/etc/olsrd.conf", "olsrd.conf")
return false
end
-if conf.conf then
- write_conf("/var/etc/olsrd.conf", "olsrd.conf")
+if conf.conf_v6 then
+ write_conf("/var/etc/olsrd6.conf", "olsrd6.conf")
return false
end
<div id="error" class="error"></div>
-<h2><a id="content" name="content">OLSR <%:Overview%></a></h2>
+<h2 name="content">OLSR <%:Overview%></h2>
<fieldset class="cbi-section">
<legend><%:Network%></legend>
<span id="version">-<span>
</td></tr>
<tr><td width="33%"><%:Download Config%></td><td>
- <a href="<%=REQUEST_URI%>?openwrt">OpenWrt</a>,
- <% if ipv == "6and4" then %>
- <a href="<%=REQUEST_URI%>?conf_v4">OLSRD IPv4</a>,
- <a href="<%=REQUEST_URI%>?conf_v6">OLSRD IPv6</a>
- <% else %>
- <a href="<%=REQUEST_URI%>?conf">OLSRD</a>
- <% end %>
+ <% if has_ipv4_conf then %>
+ <a href="<%=REQUEST_URI%>?openwrt_v4">OpenWrt (IPv4)</a>,
+ <% end %>
+ <% if has_ipv6_conf then %>
+ <a href="<%=REQUEST_URI%>?openwrt_v6">OpenWrt (IPv6)</a>,
+ <% end %>
+ <% if has_ipv4_conf then %>
+ <a href="<%=REQUEST_URI%>?conf_v4">OLSRD (IPv4)</a>,
+ <% end %>
+ <% if has_ipv6_conf then %>
+ <a href="<%=REQUEST_URI%>?conf_v6">OLSRD (IPv6)</a>
+ <% end %>
</td></tr>
</table>
</fieldset>
-<h2><a id="content" name="content"><%:Known OLSR routes%></a></h2>
+<h2 name="content"><%:Known OLSR routes%></h2>
<div id="togglebuttons"></div>
<%+header%>
-<h2><a id="content" name="content"><%:SmartGW announcements%></a></h2>
+<h2 name="content"><%:SmartGW announcements%></h2>
<div id="togglebuttons"></div>
%>
<%+header%>
-<h2><a id="content" name="content"><%:Active OLSR nodes%></a></h2>
+<h2 name="content"><%:Active OLSR nodes%></h2>
<div id="togglebuttons"></div>
{ Flag, "client_disconnect", 0, translate("Run script cmd on client disconnection") },
{ Value, "learn_address", "/usr/bin/ovpn-learnaddress", translate("Executed in server mode whenever an IPv4 address/route or MAC address is added to OpenVPN's internal routing table") },
{ Value, "auth_user_pass_verify", "/usr/bin/ovpn-userpass via-env", translate("Executed in server mode on new client connections, when the client is still untrusted") },
- { ListValue, "script_security", { 0, 1, 2, 3 }, translate("Policy level over usage of external programs and scripts"), {mode="server" } },
+ { ListValue, "script_security", { 0, 1, 2, 3 }, translate("Policy level over usage of external programs and scripts") },
} },
{ "Networking", {
<fieldset class="cbi-section">
<legend>
- <a href="<%=luci.dispatcher.build_url("admin", "services", "openvpn")%>"><%:Overview%></a> »
+ <a href="<%=url('admin/services/openvpn')%>"><%:Overview%></a> »
<%=luci.i18n.translatef("Instance \"%s\"", self.instance)%>
</legend>
<% if self.mode == "basic" then %>
- <a href="<%=luci.dispatcher.build_url("admin", "services", "openvpn", "advanced", self.instance, "Service")%>"><%:Switch to advanced configuration »%></a>
+ <a href="<%=url('admin/services/openvpn/advanced', self.instance, "Service")%>"><%:Switch to advanced configuration »%></a>
<% else %>
- <a href="<%=luci.dispatcher.build_url("admin", "services", "openvpn", "basic", self.instance)%>"><%:« Switch to basic configuration%></a>
+ <a href="<%=url('admin/services/openvpn/basic', self.instance)%>"><%:« Switch to basic configuration%></a>
<hr style="margin:0.5em 0" />
<%:Configuration category%>:
<% for i, c in ipairs(self.categories) do %>
<%+header%>
<div class="cbi-map">
- <h2><a id="content" name="content"><%:Polipo Status%></a></h2>
+ <h2 name="content"><%:Polipo Status%></h2>
<div class="cbi-section">
<iframe id="sf" src="http://<%=luci.http.getenv('SERVER_NAME')%>:<%=port%>/polipo/" style="width:100%; height:350px; border:none"></iframe>
</div>
# Version == major.minor.patch
# increase "minor" on new functionality and "patch" on patches/optimization
-PKG_VERSION:=1.0.3
+PKG_VERSION:=1.0.5
# Release == build
# increase on changes of translation files
function index()
entry( {"admin", "services", "privoxy"}, cbi("privoxy"), _("Privoxy WEB proxy"), 59)
entry( {"admin", "services", "privoxy", "logview"}, call("logread") ).leaf = true
- entry( {"admin", "services", "privoxy", "startstop"}, call("startstop") ).leaf = true
+ entry( {"admin", "services", "privoxy", "startstop"}, post("startstop") ).leaf = true
entry( {"admin", "services", "privoxy", "status"}, call("get_pid") ).leaf = true
end
-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
function ipkg_ver_compare(ver1, comp, ver2)
- if not ver1 or not (#ver1 > 0)
- or not ver2 or not (#ver2 > 0)
+ if not ver1 or not ver2
or not comp or not (#comp > 0) then return nil end
-- correct compare string
if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do
local s1 = av1[i] or ""
local s2 = av2[i] or ""
- local n1 = tonumber(s1)
- local n2 = tonumber(s2)
-
- -- one numeric and other empty string then set other to 0
- if n1 and not n2 and (not s2 or #s2 == 0) then n2 = 0 end
- if n2 and not n1 and (not s1 or #s1 == 0) then n1 = 0 end
-
- local nc = (n1 and n2) -- numeric compare
-
- if nc then
- -- first "not equal" found return true
- if comp == "~=" and (n1 ~= n2) then return true end
- -- first "lower" found return true
- if (comp == "<" or comp == "<=") and (n1 < n2) then return true end
- -- first "greater" found return true
- if (comp == ">" or comp == ">=") and (n1 > n2) then return true end
- -- not equal then return false
- if (n1 ~= n2) then return false end
- else
- if comp == "~=" and (s1 ~= s2) then return true end
- if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
- if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
- if (s1 ~= s2) then return false end
- end
+
+ -- first "not equal" found return true
+ if comp == "~=" and (s1 ~= s2) then return true end
+ -- first "lower" found return true
+ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
+ -- first "greater" found return true
+ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
+ -- not equal then return false
+ if (s1 ~= s2) then return false end
end
- -- all equal then true
- return true
+
+ -- all equal and not compare greater or lower then true
+ return not (comp == "<" or comp == ">")
end
-- read version information for given package if installed
local VERINST = CTRL.ipkg_ver_installed("privoxy")
local VEROK = CTRL.ipkg_ver_compare(VERINST,">=",CTRL.PRIVOXY_MIN)
-local TITLE = [[</a><a href="javascript:alert(']]
+local TITLE = [[<a href="javascript:alert(']]
.. translate("Version Information")
.. [[\n\nluci-app-privoxy]]
.. [[\n\t]] .. translate("Version") .. [[:\t]]
.. [[\n\n]]
.. [[')">]]
.. translate("Privoxy WEB proxy")
+ .. [[</a>]]
local DESC = translate("Privoxy is a non-caching web proxy with advanced filtering "
.. "capabilities for enhancing privacy, modifying web page data and HTTP headers, "
local f = SimpleForm("_no_config")
f.title = TITLE
f.description = DESC
+ f.embedded = true
f.submit = false
f.reset = false
var txt = document.getElementById("cbid.privoxy.privoxy._logview.txt"); // TextArea
if ( !txt ) { return; } // security check
var lvXHR = new XHR();
- lvXHR.get('<%=luci.dispatcher.build_url("admin", "services", "privoxy", "logview")%>', null,
+ lvXHR.get('<%=url('admin/services/privoxy/logview')%>', null,
function(x) {
if (x.responseText == "_nodata_")
txt.value = "<%:File not found or empty%>";
function onclick_startstop(id) {
// do start/stop
var btnXHR = new XHR();
- btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "privoxy", "startstop")%>', null,
+ btnXHR.post('<%=url('admin/services/privoxy/startstop')%>', { token: '<%=token%>' },
function(x) { _data2elements(x); }
);
}
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "privoxy", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/services/privoxy/status')%>', null,
function(x, data) { _data2elements(x); }
);
--- /dev/null
+msgid ""\r
+msgstr ""\r
+"Project-Id-Version: luci-app-privoxy\n"\r
+"POT-Creation-Date: 2015-06-10 20:16+0100\n"\r
+"PO-Revision-Date: 2015-06-10 20:16+0100\n"\r
+"Last-Translator: maz-1 <ohmygod19993 at gmail dotcom>\n"\r
+"Language-Team: \n"\r
+"Language: zh-cn\n"\r
+"MIME-Version: 1.0\n"\r
+"Content-Type: text/plain; charset=UTF-8\n"\r
+"Content-Transfer-Encoding: 8bit\n"\r
+"X-Generator: Poedit 1.5.4\n"\r
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"\r
+"X-Poedit-SourceCharset: UTF-8\n"\r
+\r
+msgid ""\r
+"A URL to be displayed in the error page that users will see if access to an "\r
+"untrusted page is denied."\r
+msgstr ""\r
+"当用户试图访问不受信任的页面时,错误页面所显示的URL。"\r
+\r
+\r
+msgid ""\r
+"A URL to documentation about the local Privoxy setup, configuration or "\r
+"policies."\r
+msgstr ""\r
+"指向Privoxy安装、设置和规则说明文档的URL"\r
+\r
+\r
+msgid "A directory where Privoxy can create temporary files."\r
+msgstr "Privoxy存放临时文件的目录。"\r
+\r
+msgid "Access Control"\r
+msgstr "访问控制"\r
+\r
+msgid "Actions that are applied to all sites and maybe overruled later on."\r
+msgstr ""\r
+"作用在所有站点上的规则,可能被后面的规则覆盖。"\r
+\r
+\r
+msgid "An alternative directory where the templates are loaded from."\r
+msgstr "可选的目录,放在里面的模板会被加载。"\r
+\r
+msgid "An email address to reach the Privoxy administrator."\r
+msgstr "用于联系privoxy管理员的邮箱地址。"\r
+\r
+msgid ""\r
+"Assumed server-side keep-alive timeout (in seconds) if not specified by the "\r
+"server."\r
+msgstr ""\r
+"当服务端没有指定超时时间时假定的超时时间(单位秒)。"\r
+\r
+msgid "CGI user interface"\r
+msgstr "CGI用户界面"\r
+\r
+msgid "Common Log Format"\r
+msgstr "通用日志格式"\r
+\r
+msgid ""\r
+"Configure here the routing of HTTP requests through a chain of multiple "\r
+"proxies. Note that parent proxies can severely decrease your privacy level. "\r
+"Also specified here are SOCKS proxies."\r
+msgstr ""\r
+"在这里设置http请求所经过的多重代理链。"\r
+"注意父级代理可能严重降低你的隐私安全度。"\r
+"在这里还可以设置SOCKS代理。"\r
+\r
+msgid "Debug GIF de-animation"\r
+msgstr "GIF动画日志"\r
+\r
+msgid "Debug force feature"\r
+msgstr "force feature日志"\r
+\r
+msgid "Debug redirects"\r
+msgstr "重定向日志"\r
+\r
+msgid "Debug regular expression filters"\r
+msgstr "正则表达式日志"\r
+\r
+msgid "Directory does not exist!"\r
+msgstr "目录不存在!"\r
+\r
+msgid "Disabled == Transparent Proxy Mode"\r
+msgstr "禁用 == 透明代理模式"\r
+\r
+msgid "Enable proxy authentication forwarding"\r
+msgstr "允许转发代理认证"\r
+\r
+msgid ""\r
+"Enable/Disable autostart of Privoxy on system startup and interface events"\r
+msgstr ""\r
+"开启/关闭Privoxy在系统启动或者设置界面更改时自动启动。"\r
+\r
+msgid "Enable/Disable filtering when Privoxy starts."\r
+msgstr "Privoxy启动时开启/关闭过滤。"\r
+\r
+msgid "Enabled"\r
+msgstr "已开启"\r
+\r
+msgid ""\r
+"Enabling this option is NOT recommended if there is no parent proxy that "\r
+"requires authentication!"\r
+msgstr ""\r
+"父级代理不需要认证时不推荐开启这个选项!"\r
+\r
+msgid "File '%s' not found inside Configuration Directory"\r
+msgstr "文件 '%s' 没有在设置目录中找到!"\r
+\r
+msgid "File not found or empty"\r
+msgstr "文件不存在或为空"\r
+\r
+msgid "Files and Directories"\r
+msgstr "文件和目录"\r
+\r
+msgid "For help use link at the relevant option"\r
+msgstr ""\r
+"在相应选项下的连接可获取帮助。"\r
+\r
+msgid "Forwarding"\r
+msgstr "转发"\r
+\r
+msgid ""\r
+"If enabled, Privoxy hides the 'go there anyway' link. The user obviously "\r
+"should not be able to bypass any blocks."\r
+msgstr ""\r
+"如果启用,Privoxy会隐藏'go there anyway'链接。用户显然不应能绕过屏蔽。"\r
+\r
+msgid ""\r
+"If you intend to operate Privoxy for more users than just yourself, it might "\r
+"be a good idea to let them know how to reach you, what you block and why you "\r
+"do that, your policies, etc."\r
+msgstr ""\r
+"如果除了你还有其他用户通过privoxy连接,让他们知道如何联系你、什么内容被屏蔽了、"\r
+"你为什么要这么做、你所制定的规范等等是一个好主意。"\r
+\r
+msgid "Invalid email address"\r
+msgstr "邮箱地址无效"\r
+\r
+msgid "It is NOT recommended for the casual user."\r
+msgstr "不推荐新手使用。"\r
+\r
+msgid "Local Set-up"\r
+msgstr "本地设置"\r
+\r
+msgid "Location of the Privoxy User Manual."\r
+msgstr "Privoxy用户手册位置"\r
+\r
+msgid "Log File Viewer"\r
+msgstr "日志查看器"\r
+\r
+msgid "Log all data read from the network"\r
+msgstr "记录所有从网络接收的数据"\r
+\r
+msgid "Log all data written to the network"\r
+msgstr "记录所有发送给网络的数据"\r
+\r
+msgid "Log the applying actions"\r
+msgstr "记录被应用的规则"\r
+\r
+msgid ""\r
+"Log the destination for each request Privoxy let through. See also 'Debug "\r
+"1024'."\r
+msgstr ""\r
+"记录Privoxy所允许的所有请求。另请参考'Debug 1024'。"\r
+\r
+msgid ""\r
+"Log the destination for requests Privoxy didn't let through, and the reason "\r
+"why."\r
+msgstr ""\r
+"记录被Privoxy拒绝的请求目标以及拒绝原因。"\r
+\r
+msgid "Logging"\r
+msgstr "日志"\r
+\r
+msgid "Main actions file"\r
+msgstr "主要规则文件"\r
+\r
+msgid "Mandatory Input: No Data given!"\r
+msgstr "必需选项: 没有设置数据!"\r
+\r
+msgid "Mandatory Input: No Directory given!"\r
+msgstr "必需选项: 没有设置目录!"\r
+\r
+msgid "Mandatory Input: No File given!"\r
+msgstr "必需选项: 没有设置文件!"\r
+\r
+msgid "Mandatory Input: No Port given!"\r
+msgstr "必需选项: 没有设置端口!"\r
+\r
+msgid "Mandatory Input: No files given!"\r
+msgstr "必需选项: 没有设置文件!"\r
+\r
+msgid "Mandatory Input: No valid IPv4 address or host given!"\r
+msgstr ""\r
+"必需选项: 没有设置有效的IPV4地址或者主机!"\r
+\r
+msgid "Mandatory Input: No valid IPv6 address given!"\r
+msgstr "必需选项: 没有设置有效的IPV6地址!"\r
+\r
+msgid "Mandatory Input: No valid Port given!"\r
+msgstr "必需选项: 没有设置有效的端口!"\r
+\r
+msgid "Maximum number of client connections that will be served."\r
+msgstr "客户端数量上限。"\r
+\r
+msgid "Maximum size (in KB) of the buffer for content filtering."\r
+msgstr "内容过滤的最大缓冲(单位KB)。"\r
+\r
+msgid "Miscellaneous"\r
+msgstr "杂项"\r
+\r
+msgid "No trailing '/', please."\r
+msgstr "路径结尾不要加'/' ."\r
+\r
+msgid "Non-fatal errors - *we highly recommended enabling this*"\r
+msgstr ""\r
+"非致命性错误 - * 建议开启 *"\r
+\r
+msgid ""\r
+"Number of seconds after which a socket times out if no data is received."\r
+msgstr ""\r
+"socket连接未收到数据的超时时间。"\r
+\r
+msgid ""\r
+"Number of seconds after which an open connection will no longer be reused."\r
+msgstr ""\r
+"一个开放的连接不再重复使用的超时时间。"\r
+\r
+msgid ""\r
+"Only when using 'external filters', Privoxy has to create temporary files."\r
+msgstr ""\r
+"只有使用外置规则时,privoxy才需要创建临时文件。"\r
+\r
+msgid "Please press [Read] button"\r
+msgstr "请点击[读取]按钮"\r
+\r
+msgid "Please read Privoxy manual for details!"\r
+msgstr "请阅读Privoxy手册以了解详情!"\r
+\r
+msgid "Please update to the current version!"\r
+msgstr "请升级到当前版本!"\r
+\r
+msgid "Privoxy WEB proxy"\r
+msgstr "Privoxy 网络代理"\r
+\r
+msgid ""\r
+"Privoxy can (and normally does) use a number of other files for additional "\r
+"configuration, help and logging. This section of the configuration file "\r
+"tells Privoxy where to find those other files."\r
+msgstr ""\r
+"Privoxy可以使用其他一些文件用于附加设置,帮助和日志。这个区域用来告诉Privoxy从哪里找到这些文件。"\r
+\r
+msgid ""\r
+"Privoxy is a non-caching web proxy with advanced filtering capabilities for "\r
+"enhancing privacy, modifying web page data and HTTP headers, controlling "\r
+"access, and removing ads and other obnoxious Internet junk."\r
+msgstr ""\r
+"Privoxy是一个无缓存的网络代理,具有高级过滤功能,能够修改网页数据和HTTP头,控制访问,移除广告等。"\r
+\r
+msgid "Read / Reread log file"\r
+msgstr "读取/刷新日志文件"\r
+\r
+msgid "Show I/O status"\r
+msgstr "显示 I/O 状态"\r
+\r
+msgid "Show each connection status"\r
+msgstr "显示每个连接的状态"\r
+\r
+msgid "Show header parsing"\r
+msgstr "Show header parsing"\r
+\r
+msgid "Software update required"\r
+msgstr "需要升级软件"\r
+\r
+msgid "Start"\r
+msgstr "启动"\r
+\r
+msgid "Start / Stop"\r
+msgstr "启动 / 停止"\r
+\r
+msgid "Start/Stop Privoxy WEB Proxy"\r
+msgstr "启动/停止 Privoxy 网络代理"\r
+\r
+msgid "Startup banner and warnings."\r
+msgstr "启动标语和警告。"\r
+\r
+msgid "Syntax:"\r
+msgstr "格式:"\r
+\r
+msgid "Syntax: Client header names delimited by spaces."\r
+msgstr "格式: Client header names delimited by spaces."\r
+\r
+msgid "Syntax: target_pattern http_parent[:port]"\r
+msgstr "格式: target_pattern http_parent[:port]"\r
+\r
+msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]"\r
+msgstr "格式: target_pattern socks_proxy[:port] http_parent[:port]"\r
+\r
+msgid ""\r
+"The actions file(s) to use. Multiple actionsfile lines are permitted, and "\r
+"are in fact recommended!"\r
+msgstr ""\r
+"所使用的规则文件。允许并且推荐使用多个规则文件。"\r
+\r
+msgid ""\r
+"The address and TCP port on which Privoxy will listen for client requests."\r
+msgstr ""\r
+"Privoxy接收客户端请求时监听的地址和TCP端口。"\r
+\r
+msgid ""\r
+"The compression level that is passed to the zlib library when compressing "\r
+"buffered content."\r
+msgstr ""\r
+"使用zlib压缩缓冲内容时的压缩级别。"\r
+\r
+msgid ""\r
+"The currently installed 'privoxy' package is not supported by LuCI "\r
+"application."\r
+msgstr ""\r
+"目前安装的privoxy版本不被luci支持。"\r
+\r
+msgid ""\r
+"The directory where all logging takes place (i.e. where the logfile is "\r
+"located)."\r
+msgstr "所有日志所在的目录。"\r
+\r
+msgid "The directory where the other configuration files are located."\r
+msgstr "其他设置文件所在的目录。"\r
+\r
+msgid ""\r
+"The filter files contain content modification rules that use regular "\r
+"expressions."\r
+msgstr ""\r
+"过滤文件包含了使用正则表达式编写的内容修改规则"\r
+\r
+msgid "The hostname shown on the CGI pages."\r
+msgstr "CGI页面显示的主机名。"\r
+\r
+msgid "The log file to use. File name, relative to log directory."\r
+msgstr ""\r
+"日志文件名称,与日志路径相对。"\r
+\r
+msgid "The order in which client headers are sorted before forwarding them."\r
+msgstr ""\r
+"转发数据前,client headers的排序。"\r
+\r
+msgid ""\r
+"The status code Privoxy returns for pages blocked with +handle-as-empty-"\r
+"document."\r
+msgstr ""\r
+"当页面因为handle-as-empty-document规则被阻止时返回的状态码(选上为200 OK,不选上为403 Forbidden)"\r
+\r
+msgid ""\r
+"The trust mechanism is an experimental feature for building white-lists and "\r
+"should be used with care."\r
+msgstr ""\r
+"信任机制是一个实验性的白名单特性,使用时应小心。"\r
+\r
+msgid ""\r
+"The value of this option only matters if the experimental trust mechanism "\r
+"has been activated."\r
+msgstr ""\r
+"只有开启了信任机制时这个选项的值才有效"\r
+\r
+msgid ""\r
+"This option is only there for debugging purposes. It will drastically reduce "\r
+"performance."\r
+msgstr ""\r
+"这个选项仅用于调试,开启后会极大地降低性能。"\r
+\r
+msgid ""\r
+"This option will be removed in future releases as it has been obsoleted by "\r
+"the more general header taggers."\r
+msgstr "这个选项在以后的版本中将被移除,因为它被header taggers所取代了。"\r
+\r
+msgid ""\r
+"This tab controls the security-relevant aspects of Privoxy's configuration."\r
+msgstr ""\r
+"这个标签用于设置与安全相关的Privoxy选项。"\r
+\r
+msgid ""\r
+"Through which SOCKS proxy (and optionally to which parent HTTP proxy) "\r
+"specific requests should be routed."\r
+msgstr ""\r
+"指定的请求应该通过哪一个SOCKS代理(并且通过哪一个HTTP父代理,可选)"\r
+\r
+msgid "To which parent HTTP proxy specific requests should be routed."\r
+msgstr ""\r
+"请求应转发至哪一个父级HTTP代理。"\r
+\r
+msgid "User customizations"\r
+msgstr "用户自定义"\r
+\r
+msgid "Value is not a number"\r
+msgstr "输入值不是数字"\r
+\r
+msgid "Value not between 0 and 9"\r
+msgstr "输入值不在0和9之间。"\r
+\r
+msgid "Value not between 1 and 4096"\r
+msgstr "输入值不在1和4096之间"\r
+\r
+msgid "Value not greater 0 or empty"\r
+msgstr "输入值为空或者不是大于零。"\r
+\r
+msgid "Value range 1 to 4096, no entry defaults to 4096"\r
+msgstr "输入值为1到4096,默认为4096"\r
+\r
+msgid "Version"\r
+msgstr "版本"\r
+\r
+msgid "Version Information"\r
+msgstr "版本信息"\r
+\r
+msgid "Whether intercepted requests should be treated as valid."\r
+msgstr "被拦截的请求是否应被当作有效的。"\r
+\r
+msgid ""\r
+"Whether or not Privoxy recognizes special HTTP headers to change toggle "\r
+"state."\r
+msgstr ""\r
+"Privoxy是否识别特殊的HTTP头以切换状态。"\r
+\r
+msgid "Whether or not buffered content is compressed before delivery."\r
+msgstr ""\r
+"缓冲内容在传递之前是否压缩。"\r
+\r
+msgid ""\r
+"Whether or not outgoing connections that have been kept alive should be "\r
+"shared between different incoming connections."\r
+msgstr ""\r
+"持久出站连接是否应在不同的入站连接之间共享。"\r
+\r
+msgid "Whether or not pipelined requests should be served."\r
+msgstr "是否处理管道化的请求。"\r
+\r
+msgid "Whether or not proxy authentication through Privoxy should work."\r
+msgstr "是否可以通过Privoxy进行代理验证。"\r
+\r
+msgid "Whether or not the web-based actions file editor may be used."\r
+msgstr "是否使用基于网页的规则编辑器。"\r
+\r
+msgid "Whether or not the web-based toggle feature may be used."\r
+msgstr "是否启用基于网页的切换功能。"\r
+\r
+msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected."\r
+msgstr "访问Privoxy CGI页面的请求是否可以被拦截或重定向。"\r
+\r
+\r
+msgid ""\r
+"Whether the CGI interface should stay compatible with broken HTTP clients."\r
+msgstr ""\r
+"CGI界面是否应兼容过时的HTTP客户端。"\r
+\r
+msgid "Whether to run only one server thread."\r
+msgstr "是否只运行一个服务线程。"\r
+\r
+msgid "Who can access what."\r
+msgstr "谁可以访问什么。"\r
+\r
+msgid "installed"\r
+msgstr "已安装"\r
+\r
+msgid "or higher"\r
+msgstr "或更高"\r
+\r
+msgid "required"\r
+msgstr "需要"\r
dsth:value("", translate("all"))
wa.cbi_add_knownips(dsth)
-l7 = s:option(ListValue, "layer7", translate("Service"))
-l7.rmempty = true
-l7:value("", translate("all"))
-
-local pats = io.popen("find /etc/l7-protocols/ -type f -name '*.pat'")
-if pats then
- local l
- while true do
- l = pats:read("*l")
- if not l then break end
-
- l = l:match("([^/]+)%.pat$")
- if l then
- l7:value(l)
- end
- end
- pats:close()
-end
-
p = s:option(Value, "proto", translate("Protocol"))
p:value("", translate("all"))
p:value("tcp", "TCP")
msgid "Quality of Service"
msgstr "Qualitat de Servei"
-msgid "Service"
-msgstr "Servei"
-
msgid "Source host"
msgstr "Host d'origen"
msgid "priority"
msgstr "prioritat"
+#~ msgid "Service"
+#~ msgstr "Servei"
+
#~ msgid "Downlink"
#~ msgstr "Enllaç de baixada"
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "Služba"
-
msgid "Source host"
msgstr "Zdrojová adresa"
msgid "priority"
msgstr "nejvyšší priorita (malé rámce)"
+#~ msgid "Service"
+#~ msgstr "Služba"
+
#~ msgid "Downlink"
#~ msgstr "Stahování"
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "Dienst"
-
msgid "Source host"
msgstr "Quelladresse"
msgid "priority"
msgstr "Priorität"
+#~ msgid "Service"
+#~ msgstr "Dienst"
+
#~ msgid "Downlink"
#~ msgstr "Downlink"
msgid "Quality of Service"
msgstr "Ποιότητα Υπηρεσίας"
-msgid "Service"
-msgstr "Υπηρεσία"
-
#, fuzzy
msgid "Source host"
msgstr "Διεύθυνση πηγής"
msgid "priority"
msgstr "προτεραιότητα"
+#~ msgid "Service"
+#~ msgstr "Υπηρεσία"
+
#, fuzzy
#~ msgid "Downlink"
#~ msgstr "Ταχύτητα κατεβάσματος"
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "Service"
-
msgid "Source host"
msgstr "Source host"
msgid "priority"
msgstr "priority"
+
+#~ msgid "Service"
+#~ msgstr "Service"
msgid "Quality of Service"
msgstr "Calidad de Servicio"
-msgid "Service"
-msgstr "Servicio"
-
msgid "Source host"
msgstr "Máquina origen"
msgid "priority"
msgstr "prioritario"
+#~ msgid "Service"
+#~ msgstr "Servicio"
+
#~ msgid "Downlink"
#~ msgstr "Enlace de bajada"
msgid "Quality of Service"
msgstr "Qualité de service"
-msgid "Service"
-msgstr "Service"
-
msgid "Source host"
msgstr "Hôte source"
msgid "priority"
msgstr "prioritaire"
+#~ msgid "Service"
+#~ msgstr "Service"
+
#~ msgid "qos_connbytes"
#~ msgstr "qos_connbytes"
msgid "Quality of Service"
msgstr ""
-msgid "Service"
-msgstr ""
-
msgid "Source host"
msgstr ""
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "Szolgáltatás"
-
msgid "Source host"
msgstr "Forrás gép"
msgid "priority"
msgstr "prioritás"
+#~ msgid "Service"
+#~ msgstr "Szolgáltatás"
+
#~ msgid "Downlink"
#~ msgstr "Downlink"
msgid "Quality of Service"
msgstr "Qualità del Servizio"
-msgid "Service"
-msgstr "Servizi"
-
msgid "Source host"
msgstr "Host sorgente"
msgid "priority"
msgstr "priorità"
+#~ msgid "Service"
+#~ msgstr "Servizi"
+
#~ msgid "Downlink"
#~ msgstr "Collegamento discendente"
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "サービス"
-
msgid "Source host"
msgstr "送信元ホスト"
msgid "priority"
msgstr "最優先"
+
+#~ msgid "Service"
+#~ msgstr "サービス"
msgid "Quality of Service"
msgstr ""
-msgid "Service"
-msgstr ""
-
msgid "Source host"
msgstr ""
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "Service"
-
msgid "Source host"
msgstr "Kilde vert"
msgid "priority"
msgstr "prioritet"
+#~ msgid "Service"
+#~ msgstr "Service"
+
#~ msgid "Downlink"
#~ msgstr "Nedlinje"
msgid "Quality of Service"
msgstr "Jakość usługi (ang. Quality of Service)"
-msgid "Service"
-msgstr "Usługa"
-
msgid "Source host"
msgstr "Host źródłowy"
msgid "priority"
msgstr "priorytetowy"
+#~ msgid "Service"
+#~ msgstr "Usługa"
+
#~ msgid "Downlink"
#~ msgstr "Ruch przychodzący"
msgid "Quality of Service"
msgstr "Qualidade de Serviço"
-msgid "Service"
-msgstr "Serviço"
-
msgid "Source host"
msgstr "Endereço de origem"
msgid "priority"
msgstr "prioritário"
+#~ msgid "Service"
+#~ msgstr "Serviço"
+
#~ msgid "Downlink"
#~ msgstr "Link para download"
msgid "Quality of Service"
msgstr "Qualidade de Serviço"
-msgid "Service"
-msgstr "Serviço"
-
msgid "Source host"
msgstr "Host de origem"
msgid "priority"
msgstr "prioridade"
+#~ msgid "Service"
+#~ msgstr "Serviço"
+
#~ msgid "Downlink"
#~ msgstr "Link para download"
msgid "Quality of Service"
msgstr "Quality of Service"
-msgid "Service"
-msgstr "Serviciu"
-
msgid "Source host"
msgstr ""
msgid "priority"
msgstr "ridicata"
+#~ msgid "Service"
+#~ msgstr "Serviciu"
+
#~ msgid "Internet Connection"
#~ msgstr "Conexiune internet"
msgid "Quality of Service"
msgstr "Качество обслуживания (QoS)"
-msgid "Service"
-msgstr "Служба"
-
msgid "Source host"
msgstr "Хост источника"
msgid "priority"
msgstr "приоритетный"
+#~ msgid "Service"
+#~ msgstr "Служба"
+
#~ msgid "Downlink"
#~ msgstr "Нисходящий канал"
msgid "Quality of Service"
msgstr ""
-msgid "Service"
-msgstr ""
-
msgid "Source host"
msgstr ""
msgid "Quality of Service"
msgstr ""
-msgid "Service"
-msgstr ""
-
msgid "Source host"
msgstr ""
msgid "Quality of Service"
msgstr ""
-msgid "Service"
-msgstr ""
-
msgid "Source host"
msgstr ""
msgid "Quality of Service"
msgstr ""
-msgid "Service"
-msgstr ""
-
msgid "Source host"
msgstr ""
msgid "Quality of Service"
msgstr "Якість обслуговування (QoS)"
-msgid "Service"
-msgstr "Сервіс"
-
msgid "Source host"
msgstr "Вихідний вузол"
msgid "priority"
msgstr "пріоритетний"
+#~ msgid "Service"
+#~ msgstr "Сервіс"
+
#~ msgid "Downlink"
#~ msgstr "Низхідний канал"
msgid "Quality of Service"
msgstr "Chất lượng dịch vụ "
-msgid "Service"
-msgstr ""
-
#, fuzzy
msgid "Source host"
msgstr "Địa chỉ nguồn"
msgid "Quality of Service"
msgstr "QOS服务"
-msgid "Service"
-msgstr "服务"
-
msgid "Source host"
msgstr "源主机"
msgid "priority"
msgstr "最高"
+#~ msgid "Service"
+#~ msgstr "服务"
+
#~ msgid "Downlink"
#~ msgstr "下行"
msgid "Quality of Service"
msgstr "連線品質服務"
-msgid "Service"
-msgstr "服務"
-
msgid "Source host"
msgstr "來源主機"
msgid "priority"
msgstr "優先權"
+#~ msgid "Service"
+#~ msgstr "服務"
+
#~ msgid "Downlink"
#~ msgstr "下載"
# Version == major.minor.patch
# increase "minor" on new functionality and "patch" on patches/optimization
-PKG_VERSION:=1.0.0
+PKG_VERSION:=1.0.2
# Release == build
# increase on changes of translation files
entry( {"admin", "services", "radicale"}, alias("admin", "services", "radicale", "edit"), _("CalDAV/CardDAV"), 58)
entry( {"admin", "services", "radicale", "edit"}, cbi("radicale") ).leaf = true
entry( {"admin", "services", "radicale", "logview"}, call("_logread") ).leaf = true
- entry( {"admin", "services", "radicale", "startstop"}, call("_startstop") ).leaf = true
+ entry( {"admin", "services", "radicale", "startstop"}, post("_startstop") ).leaf = true
entry( {"admin", "services", "radicale", "status"}, call("_status") ).leaf = true
end
end
function app_title_main()
- return [[</a><a href="javascript:alert(']]
+ return [[<a href="javascript:alert(']]
.. I18N.translate("Version Information")
.. [[\n\n]] .. luci_app_name()
.. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
.. [[\n\n]]
.. [[')">]]
.. I18N.translate("Radicale CalDAV/CardDAV Server")
+ .. [[</a>]]
end
function app_title_back()
- return [[</a><a href="]]
+ return [[<a href="]]
.. DISP.build_url("admin", "services", "radicale")
.. [[">]]
.. I18N.translate("Radicale CalDAV/CardDAV Server")
+ .. [[</a>]]
end
function app_description()
return I18N.translate("The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) server solution.") .. [[<br />]]
-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
function ipkg_ver_compare(ver1, comp, ver2)
- if not ver1 or not (#ver1 > 0)
- or not ver2 or not (#ver2 > 0)
+ if not ver1 or not ver2
or not comp or not (#comp > 0) then return nil end
-- correct compare string
if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do
local s1 = av1[i] or ""
local s2 = av2[i] or ""
- local n1 = tonumber(s1)
- local n2 = tonumber(s2)
-
- -- one numeric and other empty string then set other to 0
- if n1 and not n2 and (not s2 or #s2 == 0) then n2 = 0 end
- if n2 and not n1 and (not s1 or #s1 == 0) then n1 = 0 end
-
- local nc = (n1 and n2) -- numeric compare
-
- if nc then
- -- first "not equal" found return true
- if comp == "~=" and (n1 ~= n2) then return true end
- -- first "lower" found return true
- if (comp == "<" or comp == "<=") and (n1 < n2) then return true end
- -- first "greater" found return true
- if (comp == ">" or comp == ">=") and (n1 > n2) then return true end
- -- not equal then return false
- if (n1 ~= n2) then return false end
- else
- if comp == "~=" and (s1 ~= s2) then return true end
- if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
- if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
- if (s1 ~= s2) then return false end
- end
+
+ -- first "not equal" found return true
+ if comp == "~=" and (s1 ~= s2) then return true end
+ -- first "lower" found return true
+ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
+ -- first "greater" found return true
+ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
+ -- not equal then return false
+ if (s1 ~= s2) then return false end
end
- -- all equal then true
- return true
+
+ -- all equal and not compare greater or lower then true
+ return not (comp == "<" or comp == ">")
end
-- read version information for given package if installed
function onclick_startstop(id) {
// do start/stop
var btnXHR = new XHR();
- btnXHR.get('<%=luci.dispatcher.build_url("admin", "services", "radicale", "startstop")%>', null,
+ btnXHR.post('<%=url('admin/services/radicale/startstop')%>', { token: '<%=token%>' },
function(x) { _data2elements(x); }
);
}
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "radicale", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/services/radicale/status')%>', null,
function(x, data) { _data2elements(x); }
);
--- /dev/null
+#
+# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI Support for Shadowsocks-libev
+LUCI_DEPENDS:=
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
--- /dev/null
+-- Copyright 2015 Jian Chang <aa65535@live.com>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.controller.shadowsocks-libev", package.seeall)
+
+function index()
+ if not nixio.fs.access("/etc/config/shadowsocks-libev") then
+ return
+ end
+
+ entry({"admin", "services", "shadowsocks-libev"}, cbi("shadowsocks-libev"), _("ShadowSocks-libev"), 74).dependent = true
+end
--- /dev/null
+-- Copyright 2015 Jian Chang <aa65535@live.com>
+-- Licensed to the public under the Apache License 2.0.
+
+local m, s, o, e, a
+
+if luci.sys.call("pidof ss-redir >/dev/null") == 0 then
+ m = Map("shadowsocks-libev", translate("ShadowSocks-libev"), translate("ShadowSocks-libev is running"))
+else
+ m = Map("shadowsocks-libev", translate("ShadowSocks-libev"), translate("ShadowSocks-libev is not running"))
+end
+
+e = {
+ "table",
+ "rc4",
+ "rc4-md5",
+ "aes-128-cfb",
+ "aes-192-cfb",
+ "aes-256-cfb",
+ "bf-cfb",
+ "camellia-128-cfb",
+ "camellia-192-cfb",
+ "camellia-256-cfb",
+ "cast5-cfb",
+ "des-cfb",
+ "idea-cfb",
+ "rc2-cfb",
+ "seed-cfb",
+ "salsa20",
+ "chacha20",
+}
+
+-- Global Setting
+s = m:section(TypedSection, "shadowsocks-libev", translate("Global Setting"))
+s.anonymous = true
+
+o = s:option(Flag, "enable", translate("Enable"))
+o.default = 1
+o.rmempty = false
+
+o = s:option(Value, "server", translate("Server Address"))
+o.datatype = "ipaddr"
+o.rmempty = false
+
+o = s:option(Value, "server_port", translate("Server Port"))
+o.datatype = "port"
+o.rmempty = false
+
+o = s:option(Value, "local_port", translate("Local Port"))
+o.datatype = "port"
+o.default = 1080
+o.rmempty = false
+
+o = s:option(Value, "timeout", translate("Connection Timeout"))
+o.datatype = "uinteger"
+o.default = 60
+o.rmempty = false
+
+o = s:option(Value, "password", translate("Password"))
+o.password = true
+o.rmempty = false
+
+o = s:option(ListValue, "encrypt_method", translate("Encrypt Method"))
+for i,v in ipairs(e) do
+ o:value(v)
+end
+o.rmempty = false
+
+o = s:option(Value, "ignore_list", translate("Ignore List"))
+o:value("/dev/null", translate("Disabled"))
+o.default = "/dev/null"
+o.rmempty = false
+
+-- UDP Relay
+s = m:section(TypedSection, "shadowsocks-libev", translate("UDP Relay"))
+s.anonymous = true
+
+o = s:option(ListValue, "udp_mode", translate("Relay Mode"))
+o:value("0", translate("Disabled"))
+o:value("1", translate("Enabled"))
+o:value("2", translate("Custom"))
+o.default = 0
+o.rmempty = false
+
+o = s:option(Value, "udp_server", translate("Server Address"))
+o.datatype = "ipaddr"
+o:depends("udp_mode", 2)
+
+o = s:option(Value, "udp_server_port", translate("Server Port"))
+o.datatype = "port"
+o:depends("udp_mode", 2)
+
+o = s:option(Value, "udp_local_port", translate("Local Port"))
+o.datatype = "port"
+o.default = 1081
+o:depends("udp_mode", 2)
+
+o = s:option(Value, "udp_timeout", translate("Connection Timeout"))
+o.datatype = "uinteger"
+o.default = 60
+o:depends("udp_mode", 2)
+
+o = s:option(Value, "udp_password", translate("Password"))
+o.password = true
+o:depends("udp_mode", 2)
+
+o = s:option(ListValue, "udp_encrypt_method", translate("Encrypt Method"))
+for i,v in ipairs(e) do
+ o:value(v)
+end
+o:depends("udp_mode", 2)
+
+-- UDP Forward
+s = m:section(TypedSection, "shadowsocks-libev", translate("UDP Forward"))
+s.anonymous = true
+
+o = s:option(Flag, "tunnel_enable", translate("Enable"))
+o.default = 1
+o.rmempty = false
+
+o = s:option(Value, "tunnel_port", translate("UDP Local Port"))
+o.datatype = "port"
+o.default = 5300
+
+o = s:option(Value, "tunnel_forward", translate("Forwarding Tunnel"))
+o.default = "8.8.4.4:53"
+
+-- Access Control
+s = m:section(TypedSection, "shadowsocks-libev", translate("Access Control"))
+s.anonymous = true
+
+s:tab("lan_ac", translate("LAN"))
+
+o = s:taboption("lan_ac", ListValue, "lan_ac_mode", translate("Access Control"))
+o:value("0", translate("Disabled"))
+o:value("1", translate("Allow listed only"))
+o:value("2", translate("Allow all except listed"))
+o.default = 0
+o.rmempty = false
+
+a = luci.sys.net.arptable() or {}
+
+o = s:taboption("lan_ac", DynamicList, "lan_ac_ip", translate("LAN IP List"))
+o.datatype = "ipaddr"
+for i,v in ipairs(a) do
+ o:value(v["IP address"])
+end
+
+s:tab("wan_ac", translate("WAN"))
+
+o = s:taboption("wan_ac", DynamicList, "wan_bp_ip", translate("Bypassed IP"))
+o.datatype = "ip4addr"
+
+o = s:taboption("wan_ac", DynamicList, "wan_fw_ip", translate("Forwarded IP"))
+o.datatype = "ip4addr"
+
+return m
--- /dev/null
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Access Control"
+msgstr ""
+
+msgid "Allow all except listed"
+msgstr ""
+
+msgid "Allow listed only"
+msgstr ""
+
+msgid "Bypassed IP"
+msgstr ""
+
+msgid "Connection Timeout"
+msgstr ""
+
+msgid "Custom"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Enable"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "Encrypt Method"
+msgstr ""
+
+msgid "Forwarded IP"
+msgstr ""
+
+msgid "Forwarding Tunnel"
+msgstr ""
+
+msgid "Global Setting"
+msgstr ""
+
+msgid "Ignore List"
+msgstr ""
+
+msgid "LAN"
+msgstr ""
+
+msgid "LAN IP List"
+msgstr ""
+
+msgid "Local Port"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Relay Mode"
+msgstr ""
+
+msgid "Server Address"
+msgstr ""
+
+msgid "Server Port"
+msgstr ""
+
+msgid "ShadowSocks-libev"
+msgstr ""
+
+msgid "ShadowSocks-libev is not running"
+msgstr ""
+
+msgid "ShadowSocks-libev is running"
+msgstr ""
+
+msgid "UDP Forward"
+msgstr ""
+
+msgid "UDP Local Port"
+msgstr ""
+
+msgid "UDP Relay"
+msgstr ""
+
+msgid "WAN"
+msgstr ""
--- /dev/null
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-11-12 14:12+0800\n"
+"PO-Revision-Date: 2015-07-02 14:26+0800\n"
+"Last-Translator: Jian Chang <aa65535@live.com>\n"
+"Language: zh_CN\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: Pootle 2.0.6\n"
+
+msgid "Access Control"
+msgstr "访问控制"
+
+msgid "Allow all except listed"
+msgstr "仅允许列表外"
+
+msgid "Allow listed only"
+msgstr "仅允许列表内"
+
+msgid "Bypassed IP"
+msgstr "被忽略的IP"
+
+msgid "Connection Timeout"
+msgstr "连接超时"
+
+msgid "Custom"
+msgstr "自定义"
+
+msgid "Disabled"
+msgstr "已禁用"
+
+msgid "Enable"
+msgstr "启用"
+
+msgid "Enabled"
+msgstr "已启用"
+
+msgid "Encrypt Method"
+msgstr "加密方式"
+
+msgid "Forwarded IP"
+msgstr "走代理的IP"
+
+msgid "Forwarding Tunnel"
+msgstr "UDP转发地址"
+
+msgid "Global Setting"
+msgstr "全局设置"
+
+msgid "Ignore List"
+msgstr "忽略列表"
+
+msgid "LAN"
+msgstr ""
+
+msgid "LAN IP List"
+msgstr "内网IP列表"
+
+msgid "Local Port"
+msgstr "本地端口"
+
+msgid "Password"
+msgstr "密码"
+
+msgid "Relay Mode"
+msgstr "中继模式"
+
+msgid "Server Address"
+msgstr "服务器地址"
+
+msgid "Server Port"
+msgstr "服务器端口"
+
+msgid "ShadowSocks-libev"
+msgstr "ShadowSocks-libev"
+
+msgid "ShadowSocks-libev is not running"
+msgstr "ShadowSocks-libev 未运行"
+
+msgid "ShadowSocks-libev is running"
+msgstr "ShadowSocks-libev 运行中"
+
+msgid "UDP Forward"
+msgstr "UDP转发"
+
+msgid "UDP Local Port"
+msgstr "UDP本地端口"
+
+msgid "UDP Relay"
+msgstr "UDP中继"
+
+msgid "WAN"
+msgstr ""
--- /dev/null
+#!/bin/sh
+
+uci -q batch <<-EOF >/dev/null
+ delete ucitrack.@shadowsocks-libev[-1]
+ add ucitrack shadowsocks-libev
+ set ucitrack.@shadowsocks-libev[-1].init=shadowsocks-libev
+ commit ucitrack
+EOF
+
+rm -f /tmp/luci-indexcache
+exit 0
#!/bin/sh
$(uci -q get luci_splash.general.redirect_url) || {
- set -x
touch /var/state/luci_splash_locations
touch /etc/config/luci_splash_locations
MAC=$(grep "$REMOTE_HOST" /proc/net/arp | awk '{print $4}')
uci -P /var/state set luci_splash_locations.${MAC//:/}=redirect
uci -P /var/state set luci_splash_locations.${MAC//:/}.location="http://${HTTP_HOST}${REQUEST_URI}"
- set +x
}
echo -en "Cache-Control: no-cache, max-age=0, no-store, must-revalidate\r\n"
node("splash", "splash").target = template("splash_splash/splash")
node("splash", "blocked").target = template("splash/blocked")
- entry({"admin", "status", "splash"}, call("action_status_admin"), _("Client-Splash"))
+ entry({"admin", "status", "splash"}, post("action_status_admin"), _("Client-Splash"))
local page = node("splash", "publicstatus")
page.target = call("action_status_public")
<div id="cbi-splash-leases" class="cbi-map">
- <h2><a id="content" name="content"><%:Client-Splash%></a></h2>
+ <h2 name="content"><%:Client-Splash%></h2>
<fieldset id="cbi-table-table" class="cbi-section">
<legend><%:Active Clients%></legend>
<div class="cbi-section-node">
- <% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><% end %>
+ <% if is_admin then %><form action="<%=REQUEST_URI%>" method="post"><input type="hidden" name="token" value="<%=token%>" /><% end %>
<table class="cbi-section-table">
<thead>
<tr class="cbi-section-table-titles">
<%+header%>
-<h2><a id="content" name="content"><%:Blocked%></a></h2>
+<h2 name="content"><%:Blocked%></h2>
<p><%:Your access to this network has been blocked, most likely because you did something that our rules explicitly forbid.%></p>
<p><%:To ask for the reason why you have been blocked or ask for access again you can try to contact the owner of this access point:%> <a href="<%=contacturl%>"><%:Contact%></a></p>
<% else %>
- <h2><a id="content" name="content"><%:Welcome%></a></h2>
+ <h2 name="content"><%:Welcome%></h2>
<p><%:You are now connected to the free wireless mesh network%> <a href="<%=homepage%>"><%=community%></a>.
<%:Please note that we are not an internet service provider but an experimental community network.%></p>
local labels = {
s_output = _("Output plugins"),
- s_system = _("System plugins"),
+ s_general = _("General plugins"),
s_network = _("Network plugins"),
conntrack = _("Conntrack"),
disk = _("Disk Usage"),
dns = _("DNS"),
email = _("Email"),
+ entropy = _("Entropy"),
exec = _("Exec"),
interface = _("Interfaces"),
iptables = _("Firewall"),
network = _("Network"),
nut = _("UPS"),
olsrd = _("OLSRd"),
+ openvpn = _("OpenVPN"),
ping = _("Ping"),
processes = _("Processes"),
rrdtool = _("RRDTool"),
+ sensors = _("Sensors"),
splash_leases = _("Splash Leases"),
tcpconns = _("TCP Connections"),
unixsock = _("UnixSock"),
-- our collectd menu
local collectd_menu = {
output = { "csv", "network", "rrdtool", "unixsock" },
- system = { "cpu", "df", "disk", "email", "exec", "irq", "load", "memory", "nut", "processes", "uptime" },
- network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "ping", "splash_leases", "tcpconns", "iwinfo" }
+ general = { "cpu", "df", "disk", "email", "entropy", "exec", "irq", "load", "memory", "nut", "processes", "sensors", "uptime" },
+ network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "openvpn", "ping", "splash_leases", "tcpconns", "iwinfo" }
}
-- create toplevel menu nodes
local st = entry({"admin", "statistics"}, template("admin_statistics/index"), _("Statistics"), 80)
st.index = true
- entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Collectd"), 10).subindex = true
+ entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Setup"), 20).subindex = true
-- populate collectd plugin menu
end
-- output views
- local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 80)
+ local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 10)
page.setuser = "nobody"
page.setgroup = "nogroup"
if #instances == 0 then
--instances = { graph.tree:plugin_instances( plugin )[1] }
instances = graph.tree:plugin_instances( plugin )
- is_index = true
+ is_index = (#instances > 1)
-- index instance requested
elseif instances[1] == "-" then
--- /dev/null
+-- Copyright 2015 Hannu Nyman <hannu.nyman@iki.fi>
+-- Licensed to the public under the Apache License 2.0.
+
+m = Map("luci_statistics",
+ translate("Entropy Plugin Configuration"),
+ translate("The entropy plugin collects statistics about the available entropy."))
+
+s = m:section( NamedSection, "collectd_entropy", "luci_statistics" )
+
+enable = s:option( Flag, "enable", translate("Enable this plugin") )
+enable.default = 0
+
+return m
+
translate(
"The network plugin provides network based communication between " ..
"different collectd instances. Collectd can operate both in client " ..
- "and server mode. In client mode locally collected date is " ..
+ "and server mode. In client mode locally collected data is " ..
"transferred to a collectd server instance, in server mode the " ..
"local instance receives data from other hosts."
))
--- /dev/null
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+require "luci.sys"
+
+local m, s, o
+
+
+m = Map("luci_statistics",
+ translate("OpenVPN Plugin Configuration"),
+ translate("The OpenVPN plugin gathers information about the current vpn connection status."))
+
+s = m:section( NamedSection, "collectd_openvpn", "luci_statistics" )
+
+
+o = s:option( Flag, "enable", translate("Enable this plugin") )
+o.default = "0"
+
+
+o = s:option(Flag, "CollectIndividualUsers", translate("Generate a separate graph for each logged user"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(Flag, "CollectUserCount", translate("Aggregate number of connected users"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(Flag, "CollectCompression", translate("Gather compression statistics"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(Flag, "ImprovedNamingSchema", translate("Use improved naming schema"))
+o.default = "0"
+o.rmempty = true
+o:depends("enable", 1)
+
+
+o = s:option(DynamicList, "StatusFile", translate("OpenVPN status files"))
+o.rmempty = true
+o:depends("enable", 1)
+
+local status_files = nixio.fs.glob("/var/run/openvpn.*.status")
+if status_files then
+ local status_file
+ for status_file in status_files do
+ o:value(status_file)
+ end
+end
+
+return m
--- /dev/null
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+require "luci.sys"
+
+local m, s, o
+local sensor_types = {
+ ["12v"] = "voltage",
+ ["2.0v"] = "voltage",
+ ["2.5v"] = "voltage",
+ ["3.3v"] = "voltage",
+ ["5.0v"] = "voltage",
+ ["5v"] = "voltage",
+ ["ain1"] = "voltage",
+ ["ain2"] = "voltage",
+ ["cpu_temp"] = "temperature",
+ ["fan1"] = "fanspeed",
+ ["fan2"] = "fanspeed",
+ ["fan3"] = "fanspeed",
+ ["fan4"] = "fanspeed",
+ ["fan5"] = "fanspeed",
+ ["fan6"] = "fanspeed",
+ ["fan7"] = "fanspeed",
+ ["in0"] = "voltage",
+ ["in10"] = "voltage",
+ ["in2"] = "voltage",
+ ["in3"] = "voltage",
+ ["in4"] = "voltage",
+ ["in5"] = "voltage",
+ ["in6"] = "voltage",
+ ["in7"] = "voltage",
+ ["in8"] = "voltage",
+ ["in9"] = "voltage",
+ ["power1"] = "power",
+ ["remote_temp"] = "temperature",
+ ["temp1"] = "temperature",
+ ["temp2"] = "temperature",
+ ["temp3"] = "temperature",
+ ["temp4"] = "temperature",
+ ["temp5"] = "temperature",
+ ["temp6"] = "temperature",
+ ["temp7"] = "temperature",
+ ["temp"] = "temperature",
+ ["vccp1"] = "voltage",
+ ["vccp2"] = "voltage",
+ ["vdd"] = "voltage",
+ ["vid1"] = "voltage",
+ ["vid2"] = "voltage",
+ ["vid3"] = "voltage",
+ ["vid4"] = "voltage",
+ ["vid5"] = "voltage",
+ ["vid"] = "voltage",
+ ["vin1"] = "voltage",
+ ["vin2"] = "voltage",
+ ["vin3"] = "voltage",
+ ["vin4"] = "voltage",
+ ["volt12"] = "voltage",
+ ["volt5"] = "voltage",
+ ["voltbatt"] = "voltage",
+ ["vrm"] = "voltage"
+
+}
+
+
+m = Map("luci_statistics",
+ translate("Sensors Plugin Configuration"),
+ translate("The sensors plugin uses the Linux Sensors framework to gather environmental statistics."))
+
+s = m:section( NamedSection, "collectd_sensors", "luci_statistics" )
+
+
+o = s:option( Flag, "enable", translate("Enable this plugin") )
+o.default = 0
+
+
+o = s:option(Flag, "__all", translate("Monitor all sensors"))
+o:depends("enable", 1)
+o.default = 1
+o.write = function() end
+o.cfgvalue = function(self, sid)
+ local v = self.map:get(sid, "Sensor")
+ if v == nil or (type(v) == "table" and #v == 0) or (type(v) == "string" and #v == 0) then
+ return "1"
+ end
+end
+
+
+o = s:option(MultiValue, "Sensor", translate("Sensor list"), translate("Hold Ctrl to select multiple items or to deselect entries."))
+o:depends({enable = 1, __all = "" })
+o.widget = "select"
+o.rmempty = true
+o.size = 0
+
+local sensorcli = io.popen("/usr/sbin/sensors -u -A")
+if sensorcli then
+ local bus, sensor
+
+ while true do
+ local ln = sensorcli:read("*ln")
+ if not ln then
+ break
+ elseif ln:match("^[%w-]+$") then
+ bus = ln
+ elseif ln:match("^[%w-]+:$") then
+ sensor = ln:sub(0, -2):lower()
+ if bus and sensor_types[sensor] then
+ o:value("%s/%s-%s" %{ bus, sensor_types[sensor], sensor })
+ o.size = o.size + 1
+ end
+ elseif ln == "" then
+ bus = nil
+ sensor = nil
+ end
+ end
+
+ sensorcli:close()
+end
+
+
+o = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
+o.default = 0
+o.rmempty = true
+o:depends({ enable = 1, __all = "" })
+
+return m
return str
end
-function Instance._translate( self, key, alt )
- local val = self.i18n.string(key)
- if val ~= key then
- return val
- else
- return alt
- end
-end
-
function Instance.title( self, plugin, pinst, dtype, dinst, user_title )
local title = user_title or
function Instance.ds( self, source )
- local label = source.title or self:_translate(
- string.format( "stat_ds_%s_%s_%s", source.type, source.instance, source.ds ),
- self:_translate(
- string.format( "stat_ds_%s_%s", source.type, source.instance ),
- self:_translate(
- string.format( "stat_ds_label_%s__%s", source.type, source.ds ),
- self:_translate(
- string.format( "stat_ds_%s", source.type ),
- source.type .. "_" .. source.instance:gsub("[^%w]","_") .. "_" .. source.ds
- )
- )
- )
- )
+ local label = source.title or
+ "dt=%s/di=%s/ds=%s" % {
+ (source.type and #source.type > 0) and source.type or "(nil)",
+ (source.instance and #source.instance > 0) and source.instance or "(nil)",
+ (source.ds and #source.ds > 0) and source.ds or "(nil)"
+ }
return self:_subst( label, {
dtype = source.type,
dinst = source.instance,
dsrc = source.ds
- } )
+ } ):gsub(":", "\\:")
end
transform_rpn = dopts.transform_rpn or "0,+",
noarea = dopts.noarea or false,
title = dopts.title or nil,
+ weight = dopts.weight or nil,
ds = dsource,
type = dtype,
instance = dinst,
_ti ( _args, "-X" )
_ti ( _args, opts.units_exponent )
end
+ if opts.alt_autoscale then
+ _ti ( _args, "-A" )
+ end
+ if opts.alt_autoscale_max then
+ _ti ( _args, "-M" )
+ end
-- store additional rrd options
if opts.rrdopts then
for i, o in ipairs(opts.rrdopts) do _ti( _args, o ) end
end
+ -- sort sources
+ table.sort(_sources, function(a, b)
+ local x = a.weight or a.index or 0
+ local y = b.weight or b.index or 0
+ return x < y
+ end)
-- create DEF statements for each instance
for i, source in ipairs(_sources) do
vlabel = "Count",
number_format = "%5.0lf",
data = {
+ -- collectd 5.5+: specify "" to exclude "max" instance
+ instances = {
+ conntrack = { "" }
+ },
sources = {
conntrack = { "value" }
},
return {
title = "%H: Processor usage on core #%pi",
y_min = "0",
+ alt_autoscale_max = true,
vlabel = "Percent",
number_format = "%5.1lf%%",
data = {
instances = {
- cpu = { "idle", "user", "system", "nice" }
+ cpu = { "user", "nice", "system", "softirq", "interrupt" }
},
options = {
- cpu_idle = { color = "ffffff" },
- cpu_nice = { color = "00e000" },
- cpu_user = { color = "0000ff" },
- cpu_wait = { color = "ffb000" },
- cpu_system = { color = "ff0000" },
- cpu_softirq = { color = "ff00ff" },
- cpu_interrupt = { color = "a000a0" },
- cpu_steal = { color = "000000" }
+ cpu_idle = { color = "ffffff", title = "Idle" },
+ cpu_nice = { color = "00e000", title = "Nice" },
+ cpu_user = { color = "0000ff", title = "User" },
+ cpu_wait = { color = "ffb000", title = "Wait" },
+ cpu_system = { color = "ff0000", title = "System" },
+ cpu_softirq = { color = "ff00ff", title = "Softirq" },
+ cpu_interrupt = { color = "a000a0", title = "Interrupt" },
+ cpu_steal = { color = "000000", title = "Steal" }
}
}
}
--- /dev/null
+-- Copyright 2015 Hannu Nyman <hannu.nyman@iki.fi>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.entropy", package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance, dtype )
+
+ return {
+ title = "%H: Available entropy",
+ vlabel = "bits",
+ number_format = "%4.0lf",
+ data = {
+ types = { "entropy" },
+ options = { entropy = { title = "Entropy %di" } }
+ }
+ }
+
+end
+
options = {
-- processed packets (tx DS)
if_packets__tx = {
+ weight = 1,
overlay = true, -- don't summarize
total = true, -- report total amount of bytes
color = "00ff00", -- processed tx is green
- title = "Processed (tx)"
+ title = "Processed (TX)"
},
-- processed packets (rx DS)
if_packets__rx = {
+ weight = 2,
overlay = true, -- don't summarize
flip = true, -- flip rx line
total = true, -- report total amount of bytes
color = "0000ff", -- processed rx is blue
- title = "Processed (rx)"
+ title = "Processed (RX)"
},
-- packet errors (tx DS)
if_errors__tx = {
+ weight = 0,
overlay = true, -- don't summarize
total = true, -- report total amount of packets
color = "ff5500", -- tx errors are orange
- title = "Errors (tx)"
+ title = "Errors (TX)"
},
-- packet errors (rx DS)
if_errors__rx = {
+ weight = 3,
overlay = true, -- don't summarize
flip = true, -- flip rx line
total = true, -- report total amount of packets
color = "ff0000", -- rx errors are red
- title = "Errors (rx)"
+ title = "Errors (RX)"
}
}
}
local stations = {
title = "%H: Associated stations on %pi",
vlabel = "Stations",
+ y_min = "0",
+ alt_autoscale_max = true,
number_format = "%3.0lf",
data = {
types = { "stations" },
title = "%H: Memory usage",
vlabel = "MB",
number_format = "%5.1lf%s",
+ y_min = "0",
+ alt_autoscale_max = true,
data = {
instances = {
memory = { "free", "buffered", "cached", "used" }
-- special options for single data lines
options = {
if_octets__tx = {
+ title = "Bytes (TX)",
total = true, -- report total amount of bytes
color = "00ff00" -- tx is green
},
if_octets__rx = {
+ title = "Bytes (RX)",
flip = true, -- flip rx line
total = true, -- report total amount of bytes
color = "0000ff" -- rx is blue
options = {
-- processed packets (tx DS)
if_packets__tx = {
+ weight = 2,
+ title = "Total (TX)",
overlay = true, -- don't summarize
total = true, -- report total amount of bytes
color = "00ff00" -- processed tx is green
-- processed packets (rx DS)
if_packets__rx = {
+ weight = 3,
+ title = "Total (RX)",
overlay = true, -- don't summarize
flip = true, -- flip rx line
total = true, -- report total amount of bytes
-- dropped packets (tx DS)
if_dropped__tx = {
+ weight = 1,
+ title = "Dropped (TX)",
overlay = true, -- don't summarize
total = true, -- report total amount of bytes
color = "660055" -- dropped tx is ... dunno ;)
-- dropped packets (rx DS)
if_dropped__rx = {
+ weight = 4,
+ title = "Dropped (RX)",
overlay = true, -- don't summarize
flip = true, -- flip rx line
total = true, -- report total amount of bytes
- color = "440066" -- dropped rx is violett
+ color = "ff00ff" -- dropped rx is violett
},
-- packet errors (tx DS)
if_errors__tx = {
+ weight = 0,
+ title = "Errors (TX)",
overlay = true, -- don't summarize
total = true, -- report total amount of packets
color = "ff5500" -- tx errors are orange
-- packet errors (rx DS)
if_errors__rx = {
+ weight = 5,
+ title = "Errors (RX)",
overlay = true, -- don't summarize
flip = true, -- flip rx line
total = true, -- report total amount of packets
options = {
-- multicast packets
if_multicast = {
+ title = "Packets",
total = true, -- report total amount of packets
color = "0000ff" -- multicast is blue
}
options = {
-- collision rate
if_collisions = {
+ title = "Collisions",
total = true, -- report total amount of packets
color = "ff0000" -- collsions are red
}
},
-- special options for single data lines
- options = { -- XXX: fixme (define colors...)
- if_tx_errors = {
- total = true
- },
-
- if_rx_errors = {
- flip = true,
- total = true
- }
+ options = {
+ if_tx_errors_aborted_value = { total = true, color = "ffff00", title = "Aborted (TX)" },
+ if_tx_errors_carrier_value = { total = true, color = "ffcc00", title = "Carrier (TX)" },
+ if_tx_errors_fifo_value = { total = true, color = "ff9900", title = "Fifo (TX)" },
+ if_tx_errors_heartbeat_value = { total = true, color = "ff6600", title = "Heartbeat (TX)" },
+ if_tx_errors_window_value = { total = true, color = "ff3300", title = "Window (TX)" },
+
+ if_rx_errors_length_value = { flip = true, total = true, color = "ff0000", title = "Length (RX)" },
+ if_rx_errors_missed_value = { flip = true, total = true, color = "ff0033", title = "Missed (RX)" },
+ if_rx_errors_over_value = { flip = true, total = true, color = "ff0066", title = "Over (RX)" },
+ if_rx_errors_crc_value = { flip = true, total = true, color = "ff0099", title = "CRC (RX)" },
+ if_rx_errors_fifo_value = { flip = true, total = true, color = "ff00cc", title = "Fifo (RX)" },
+ if_rx_errors_frame_value = { flip = true, total = true, color = "ff00ff", title = "Frame (RX)" }
}
}
}
y_max = "100",
number_format = "%5.1lf%%",
data = {
- sources = {
- percent = { "percent" }
- },
instances = {
percent = "charge"
},
vlabel = "Minutes",
number_format = "%.1lfm",
data = {
- sources = {
- timeleft = { "timeleft" }
- },
instances = {
timeleft = { "battery" }
},
--- /dev/null
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.openvpn", package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance )
+ local inst = plugin_instance:gsub("^openvpn%.(.+)%.status$", "%1")
+
+ return {
+ {
+ title = "%%H: OpenVPN \"%s\" - Traffic" % inst,
+ vlabel = "Bytes/s",
+ data = {
+ instances = {
+ if_octets = { "traffic", "overhead" }
+ },
+ sources = {
+ if_octets = { "tx", "rx" }
+ },
+ options = {
+ if_octets_traffic_tx = { weight = 0, title = "Bytes (TX)", total = true, color = "00ff00" },
+ if_octets_overhead_tx = { weight = 1, title = "Overhead (TX)", total = true, color = "ff9900" },
+ if_octets_overhead_rx = { weight = 2, title = "Overhead (RX)", total = true, flip = true, color = "ff00ff" },
+ if_octets_traffic_rx = { weight = 3, title = "Bytes (RX)", total = true, flip = true, color = "0000ff" }
+ }
+ }
+ },
+
+ {
+ title = "%%H: OpenVPN \"%s\" - Compression" % inst,
+ vlabel = "Bytes/s",
+ data = {
+ instances = {
+ compression = { "data_out", "data_in" }
+ },
+ sources = {
+ compression = { "uncompressed", "compressed" }
+ },
+ options = {
+ compression_data_out_uncompressed = { weight = 0, title = "Uncompressed (TX)", total = true, color = "00ff00" },
+ compression_data_out_compressed = { weight = 1, title = "Compressed (TX)", total = true, color = "008800" },
+ compression_data_in_compressed = { weight = 2, title = "Compressed (RX)", total = true, flip = true, color = "000088" },
+ compression_data_in_uncompressed = { weight = 3, title = "Uncompressed (RX)", total = true, flip = true, color = "0000ff" }
+ }
+ }
+ }
+ }
+end
function rrdargs( graph, plugin, plugin_instance, dtype )
return {
-- Ping roundtrip time
- { title = "%H: ICMP Round Trip Time", vlabel = "ms",
- number_format = "%5.1lf ms", data = {
+ { title = "%H: ICMP Round Trip Time",
+ vlabel = "ms",
+ number_format = "%5.1lf ms",
+ data = {
sources = { ping = { "value" } },
- options = { ping__ping = { noarea = true, title = "%di" } }
+ options = { ping__value = {
+ noarea = true, overlay = true, title = "%di" } }
} },
-- Ping droprate
- { title = "%H: ICMP Drop Rate", vlabel = "%",
- number_format = "%5.2lf %%", data = {
+ { title = "%H: ICMP Drop Rate",
+ vlabel = "%",
+ number_format = "%5.2lf %%",
+ data = {
types = { "ping_droprate" },
- options = { ping_droprate = { title = "%di" } }
+ options = { ping_droprate = {
+ noarea = true, overlay = true, title = "%di" } }
} },
-- Ping standard deviation
- { title = "%H: ICMP Standard Deviation", vlabel = "ms",
- number_format = "%5.2lf ms", data = {
+ { title = "%H: ICMP Standard Deviation",
+ vlabel = "ms",
+ number_format = "%5.2lf ms",
+ data = {
types = { "ping_stddev" },
- options = { ping_stddev = { title = "%di" } }
+ options = { ping_stddev = {
+ noarea = true, overlay = true, title = "%di" } }
} },
}
end
--- /dev/null
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.sensors", package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance )
+ return {
+ {
+ per_instance = true,
+ title = "%H: %pi - %di",
+ vlabel = "\176C",
+ number_format = "%4.1lf\176C",
+ data = {
+ types = { "temperature" },
+ options = {
+ temperature__value = {
+ color = "ff0000",
+ title = "Temperature"
+ }
+ }
+ }
+ }
+ }
+end
<%+header%>
-<h2><a id="content" name="content"><%:Statistics%></a></h2>
+<h2 name="content"><%:Statistics%></h2>
-<p><%_The statistics package is based on <a href="http://collectd.org/index.shtml">Collectd</a>
-and uses <a href="http://oss.oetiker.ch/rrdtool/">RRD Tool</a> to render diagram images from collected data.%></p>
+<p><%_The statistics package uses <a href="https://collectd.org/">Collectd</a>
+to gather data and <a href="http://oss.oetiker.ch/rrdtool/">RRDtool</a> to
+render diagram images.%></p>
+
+<p><%_You can install additional collectd-mod-* plugins to enable more statistics.%></p>
<%+footer%>
<%+header%>
-<h2><a id="content" name="content"><%:Statistics%></a></h2>
+<h2 name="content"><%:Statistics%></h2>
<form action="" method="get">
<select name="host">
msgid "Add notification command"
msgstr "Afegeix ordre de notificació"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Directori base"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Configuració Collectd"
msgid "Enable this plugin"
msgstr "Activa aquest connector"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Readreçant entre adreces que reben connexions i adreces de servidors"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Gràfics"
"Ací pots definir diversos criteris pels que es seleccionaran les regles "
"iptables monitoritzades ."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Host"
msgid "Monitor all local listen ports"
msgstr "Monitoritza tots els ports locals que reben connexions"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Monitoritza dispositius"
msgid "Only create average RRAs"
msgstr "Crea només RRAs mitjans"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Opcions"
msgid "Seconds"
msgstr "Segons"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Màquina servidor"
msgid "Server port"
msgstr "Port del servidor"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Monitoreig de classe shaping"
msgid "System Load"
msgstr "Càrrega de sistema"
-msgid "System plugins"
-msgstr "Connectors de sistema"
-
msgid "TCP Connections"
msgstr "Connexions TCP"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"es fa servir en conjunció amb Mail::SpamAssassin::Plugin. Plugin::Collectd "
"també es pot utilitzar d'altres maneres."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"El connector de xarxa proporciona comunicacions basades en xarxa entre "
"Això pot inutilitzar el dispositiu!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"El paquet d'estadísitiques està basat en <a href=\"http://collectd.org/index."
-"shtml\">Collectd</a> i utilitza l'eina <a href=\"http://oss.oetiker.ch/"
-"rrdtool/\">RRD</a> per renderitzar imatges de diagrama de les dades "
-"recoliildes."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Fitxer PID usat"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "p.e. br-ff"
msgid "server interfaces"
msgstr "interfícies de servidor"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Connectors de sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "El paquet d'estadísitiques està basat en <a href=\"http://collectd.org/"
+#~ "index.shtml\">Collectd</a> i utilitza l'eina <a href=\"http://oss.oetiker."
+#~ "ch/rrdtool/\">RRD</a> per renderitzar imatges de diagrama de les dades "
+#~ "recoliildes."
+
#~ msgid ""
#~ "The wireless plugin collects statistics about wireless signal strength, "
#~ "noise and quality."
msgid "Add notification command"
msgstr "Přidat příkaz pro upozornění"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Základní adresář"
msgid "CollectTopology"
msgstr "CollectTopology"
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Nastavení Collectd"
msgid "Enable this plugin"
msgstr "Povolit tento plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Grafy"
"Zde můžete definovat různá kritéria, podle kterých budou vybrána sledovaná "
"pravidla iptables."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Hostitel"
msgid "Monitor all local listen ports"
msgstr "Monitorovat všechny naslouchající porty"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Sledovat zařízení"
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Možnosti"
msgid "Seconds"
msgstr "Sekundy"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Hostitel serveru"
msgid "Server port"
msgstr "Port serveru"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr "Zatížení systému"
-msgid "System plugins"
-msgstr "Systémové pluginy"
-
msgid "TCP Connections"
msgstr "TCP spojení"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr "Plugin Conntrack shromažďuje statistiky o počtu sledovaných spojení."
"použití ve spojení s Mail::SpamAssasin::Plugin::Collectd, ale stejně dobře "
"může být využit jinak."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Plugin Network poskytuje síťovou komunikaci mezi různými instancemi daemonu "
"</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Balíček Statistiky je založen na <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> a využívá <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> pro kreslení diagramů z collectd."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Použitý soubor PID (identifikátoru procesu)"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "Nastavení pluginu Wireless Iwinfo"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "např. br-ff"
msgid "server interfaces"
msgstr "rozhraní serveru"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Systémové pluginy"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Balíček Statistiky je založen na <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> a využívá <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> pro kreslení diagramů z collectd."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Instalované síťové pluginy:"
msgid "Add notification command"
msgstr "Benachrichtigungskommando hinzufügen"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Basisverzeichnis"
msgid "CollectTopology"
msgstr "Informationen über die Netzwerktopologie sammeln (CollectTopology)"
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Collectd Einstellungen"
msgid "Enable this plugin"
msgstr "Plugin aktivieren"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Weiterleitung zwischen Listen- und Server-Adressen"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Diagramme"
"Hier werden die Kriterien festgelegt nach welchen die zu überwachenden "
"Firewall-Regeln ausgewählt werden."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Host"
msgid "Monitor all local listen ports"
msgstr "Alle durch lokale Dienste genutzten Ports überwachen"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Geräte überwachen"
msgid "Only create average RRAs"
msgstr "Nur 'average' RRAs erzeugen"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Optionen"
msgid "Seconds"
msgstr "Sekunden"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Server-Host"
msgid "Server port"
msgstr "Server-Port"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Shapingklassen überwachen"
msgid "System Load"
msgstr "Systemlast"
-msgid "System plugins"
-msgstr "Systemplugins"
-
msgid "TCP Connections"
msgstr "TCP-Verbindungen"
"Erweiterung."
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"Plugin ist primär für die Verwendung zusammen mit Mail::SpamAssasin::Plugin::"
"Collectd gedacht, kann aber auch anderweitig verwendet werden."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Das Network-Plugin ermöglicht die netzwerkgestützte Kommunikation zwischen "
"machen, da Systemspeicher für den regulären Betrieb fehlt!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Das Statistik-Paket basiert auf <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> und nutzt <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> um die gesammelten Daten in Diagramme zu rendern."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Pfad zu PID-Datei"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "Wireless-iwinfo Plugin Konfiguration"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "z.B. br-ff"
msgid "server interfaces"
msgstr "Server-Schnittstellen"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Systemplugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Das Statistik-Paket basiert auf <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> und nutzt <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> um die gesammelten Daten in Diagramme zu rendern."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Installierte Netzwerk-Plugins:"
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
#, fuzzy
msgid "Base Directory"
msgstr "Κατάλογος βάσης"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Ρυθμίσεις Collectd"
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Γραφήματα"
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr "Δευτερόλεπτα"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr "Φόρτος Συστήματος"
-msgid "System plugins"
-msgstr "Πρόσθετα συστήματος"
-
msgid "TCP Connections"
msgstr "Συνδέσεις TCP"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Το πακέτο στατιστικών βασίζεται στο <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> και χρησιμοποιεί το <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> για να σχεδιάσει διαγράμματα από τα συλλεγόμενα δεδομένα."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Αρχείο PID σε χρήση"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "π.χ. br-ff"
msgid "server interfaces"
msgstr ""
+
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Πρόσθετα συστήματος"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Το πακέτο στατιστικών βασίζεται στο <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> και χρησιμοποιεί το <a href=\"http://oss.oetiker.ch/"
+#~ "rrdtool/\">RRD Tool</a> για να σχεδιάσει διαγράμματα από τα συλλεγόμενα "
+#~ "δεδομένα."
msgid "Add notification command"
msgstr "Add notification command"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Base Directory"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Collectd Settings"
msgid "Enable this plugin"
msgstr "Enable this plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Forwarding between listen and server addresses"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Graphs"
"Here you can define various criteria by which the monitored iptables rules "
"are selected."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr "Monitor all local listen ports"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Monitor devices"
msgid "Only create average RRAs"
msgstr "Only create average RRAs"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Options"
msgid "Seconds"
msgstr "Seconds"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Server host"
msgid "Server port"
msgstr "Server port"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Shaping class monitoring"
msgid "System Load"
msgstr "System Load"
-msgid "System plugins"
-msgstr "System plugins"
-
msgid "TCP Connections"
msgstr "TCP Connections"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
"be used in other ways as well."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgid ""
"directory. This can render the device unusable!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Used PID file"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "e.g. br-ff"
msgid "server interfaces"
msgstr "server interfaces"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "System plugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+
#~ msgid ""
#~ "The wireless plugin collects statistics about wireless signal strength, "
#~ "noise and quality."
msgid "Add notification command"
msgstr "Añadir comando de notificación"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Directorio Base"
msgid "CollectTopology"
msgstr "Topología"
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Configuración de Collectd"
msgid "Enable this plugin"
msgstr "Activar este plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Retransmitir entre las direcciones de escucha y servidor"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Gráficas"
"Aquí puede definir varios criterios de selección de reglas de iptables "
"monitorizadas."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Máquina"
msgid "Monitor all local listen ports"
msgstr "Monitorizar todos los puertos de escucha locales"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Dispositivos a monitonizar"
msgid "Only create average RRAs"
msgstr "Crear sólo RRAs medias"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Opciones"
msgid "Seconds"
msgstr "Segundos"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Máquina servidor"
msgid "Server port"
msgstr "Puerto servidor"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Monitorización de la clase shaping"
msgid "System Load"
msgstr "Carga del sistema"
-msgid "System plugins"
-msgstr "Plugins del sistema"
-
msgid "TCP Connections"
msgstr "Conexiones TCP"
"txtinfo de OLSRd."
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"utilizado en conjunto con Mail::SpamAssasin::Plugin::Collectd pero puede "
"utilizarse de diferentes formas."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"El plugin \"red\" proporciona comunicación entre diferentes instancias de "
"puede hacer que el dispositivo funcione mal!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"El paquete \"estadísticas\" está basado en <a href=\"http://collectd.org/"
-"index.shtml\">Collectd</a> y utiliza <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> para dibujar gráficos con los datos recogidos."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Archivo PID utilizado"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "Configuración plugin \"Wireless iwinfo\""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "p.e. br-ff"
msgid "server interfaces"
msgstr "interfaces servidores"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Plugins del sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "El paquete \"estadísticas\" está basado en <a href=\"http://collectd.org/"
+#~ "index.shtml\">Collectd</a> y utiliza <a href=\"http://oss.oetiker.ch/"
+#~ "rrdtool/\">RRD Tool</a> para dibujar gráficos con los datos recogidos."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Plugins de red instalados:"
msgid "Add notification command"
msgstr "Ajoute une commande de notification"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Répertoire de base"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Paramètres Collectd"
msgid "Enable this plugin"
msgstr "Activer ce greffon"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Transfert entre les adresses en écoute et du serveur"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Graphiques"
"Vous pouvez définir ici les critères variés pour sélectionner les règles "
"iptables à surveiller."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr "Surveiller tous les ports en écoute locaux"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Périphériques à surveiller"
msgid "Only create average RRAs"
msgstr "Créer seulement des RRAs moyens"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Options"
msgid "Seconds"
msgstr "Secondes"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Hôte du serveur"
msgid "Server port"
msgstr "Port du serveur"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Surveillance liées à la priorité"
msgid "System Load"
msgstr "Charge-système"
-msgid "System plugins"
-msgstr "Greffons liés au système"
-
msgid "TCP Connections"
msgstr "Connexions TCP"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"Ce greffon est d'abord destiné à être utilisé avec Mail::SpamAssasin::"
"Plugin::Collectd mais peut être utilisé d'autres manières également."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Le greffon réseau fournit des communications-réseau entre différentes "
"le matériel inutilisable !</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Ce paquet d'outils statistiques s'appuie sur le logiciel <a href=\"http://"
-"collectd.org/index.shtml\">Collectd</a> et utilise <a href=\"http://oss."
-"oetiker.ch/rrdtool/\">RRD Tool</a> pour calculer les graphes issus des "
-"données collectées."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Fichier PID utilisé"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "p.ex. br-ff"
msgid "server interfaces"
msgstr "Interfaces du serveur"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Greffons liés au système"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Ce paquet d'outils statistiques s'appuie sur le logiciel <a href=\"http://"
+#~ "collectd.org/index.shtml\">Collectd</a> et utilise <a href=\"http://oss."
+#~ "oetiker.ch/rrdtool/\">RRD Tool</a> pour calculer les graphes issus des "
+#~ "données collectées."
+
#~ msgid ""
#~ "The wireless plugin collects statistics about wireless signal strength, "
#~ "noise and quality."
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr "Értesítési parancs hozzáadása"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Alapkönyvtár"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Collectd beállítások"
msgid "Enable this plugin"
msgstr "Bővítmény engedélyezése"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Grafikonok"
"Itt addhatók meg különböző feltételek, amelyek alapján a megfigyelt iptables "
"szabályok kiválasztásra kerülnek."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Gép"
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Eszközök figyelése"
msgid "Only create average RRAs"
msgstr "Csak átlag RRA-k létrehozása"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Lehetőségek"
msgid "Seconds"
msgstr "másodperc"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Kiszolgáló gép"
msgid "Server port"
msgstr "Kiszolgáló port"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr "Rendszerterhelés"
-msgid "System plugins"
-msgstr "Rendszer bővítmények"
-
msgid "TCP Connections"
msgstr "TCP kapcsolatok"
"txttinfo bővítményén keresztül."
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"elsősorban a Mail::SpamAssasin::Plugin::Collectd bővítménnyel együtt történő "
"használatra szolgál, de egyéb módokon is használható."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"A statisztikai csomag a <a href=\"http://collectd.org/index.shtml"
-"\">collectd</a> segédprogramon alapul és az <a href=\"http://oss.oetiker.ch/"
-"rrdtool/\">RRD Tool</a> segédprogramot használja a grafikonok elkészítésére "
-"az összegyűjtött adatokból."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Használt PID fájl"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "iwinfo vezeték nélküli bővítmény beállítása"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "pl. br-ff"
msgid "server interfaces"
msgstr "kiszolgáló interfész"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Rendszer bővítmények"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "A statisztikai csomag a <a href=\"http://collectd.org/index.shtml"
+#~ "\">collectd</a> segédprogramon alapul és az <a href=\"http://oss.oetiker."
+#~ "ch/rrdtool/\">RRD Tool</a> segédprogramot használja a grafikonok "
+#~ "elkészítésére az összegyűjtött adatokból."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Telepített hálózati bővítmények:"
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr "Abilita questo plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "ベース・ディレクトリ"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Collectd 設定"
msgid "Enable this plugin"
msgstr "プラグイン設定を有効にする"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "グラフ"
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr "平均値のRRAsのみ作成する"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "オプション"
msgid "Seconds"
msgstr "秒"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr "システムプラグイン"
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "使用するPIDファイルの保存場所"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "無線LAN iwinfo プラグイン設定"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "server interfaces"
msgstr ""
+
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "システムプラグイン"
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr "Legg til varsling kommando"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Hoved Katalog"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Collectd Innstillinger"
msgid "Enable this plugin"
msgstr "Aktiver denne plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Program"
msgid "Forwarding between listen and server addresses"
msgstr "Videresending mellom lyttende og server adresser"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Grafer"
"are selected."
msgstr "Her kan du definere kriterier for reglene som overvåker iptables."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr "Overvåk alle lokale lyttende porter"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Overvåk enheter"
msgid "Only create average RRAs"
msgstr "Lag kun gjennomsnittlige RRAs"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Alternativer"
msgid "Seconds"
msgstr "Sekunder"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Server vert"
msgid "Server port"
msgstr "Server port"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Shaping class overvåking"
msgid "System Load"
msgstr "System Belastning"
-msgid "System plugins"
-msgstr "System plugins"
-
msgid "TCP Connections"
msgstr "TCP Forbindelser"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"bli brukt i forbindelse med Mail::SpamAssasin::Plugin::Collectd men kan også "
"brukes på andre måter."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Nettverk plugin gir nettverk basert kommunikasjon mellom ulike collectd "
"katalogen (temp). Dette kan gjøre enheten ubrukelig!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Statistikk pakken er basert på <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> og bruker <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> for å tegne diagram bilder fra innsamlede data."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Brukt PID fil"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "f.eks. br-ff"
msgid "server interfaces"
msgstr "Server grensesnitt"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "System plugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Statistikk pakken er basert på <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> og bruker <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> for å tegne diagram bilder fra innsamlede data."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Installerte nettverks plugin:"
msgid "Add notification command"
msgstr "Dodaj komendę powiadamiającą"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Główny katalog"
msgid "CollectTopology"
msgstr "CollectTopology"
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Ustawienia Collectd"
msgid "Enable this plugin"
msgstr "Włącz tę wtyczkę"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Przekazać przez słuchacza na adres serwera"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Wykresy"
"Tutaj można zdefiniować różne kryteria według których wybierane są "
"monitorowane reguły iptables."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Host"
msgid "Monitor all local listen ports"
msgstr "Monitoruj wszystkie lokalne otwarte porty"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Monitoruj urządzenia"
msgid "Only create average RRAs"
msgstr "Twórz tylko średnie archiwa RRA"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Opcje"
msgid "Seconds"
msgstr "Sekundy"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Host serwer"
msgid "Server port"
msgstr "Port serwera"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Shaping Klasa Monitoring"
msgid "System Load"
msgstr "Obciążenie systemu"
-msgid "System plugins"
-msgstr "Wtyczki systemowe"
-
msgid "TCP Connections"
msgstr "Połączenia TCP"
"OLSRd."
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr "Wtyczka Conntrack zbiera statystyki o liczbie śledzonych połączeń."
"with Mail::SpamAssasin::Plugin::Collectd but can be used in other ways as "
"well."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Wtyczka zapewnia podstawową komunikacje między różnymi instancjami collectd. "
"do użytku! </strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Statystyki bazuja na <a href=\"http://collectd.org/index.shtml\">Collectd</"
-"a> oraz wykorzystują <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD Tool</a> "
-"do generowania diagramów i wykresów z zebranych danych."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Używany plik PID"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "Konfiguracja bezprzewodowego pluginu iwinfo"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "np. br-ff"
msgid "server interfaces"
msgstr "interfejsy serwera"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Wtyczki systemowe"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Statystyki bazuja na <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> oraz wykorzystują <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> do generowania diagramów i wykresów z zebranych danych."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Zainstalowane wtyczki sieciowe:"
msgid "Add notification command"
msgstr "Adicionar o comando de notificação"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Diretório Base"
msgid "CollectTopology"
msgstr "Coleção de Topologias"
-msgid "Collectd"
-msgstr "Coletar"
-
msgid "Collectd Settings"
msgstr "Configurações do Coletadas"
msgid "Enable this plugin"
msgstr "Habilitar este plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgstr ""
"Encaminhamento entre o endereço de escuta e os endereços dos servidores"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Gráficos"
"Aqui você pode definir diversos critérios para as regras iptables "
"selecionadas serem monitoradas."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Equipamento"
msgid "Monitor all local listen ports"
msgstr "Monitorar todas as portas locais"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Monitorar dispositivos"
msgid "Only create average RRAs"
msgstr "Somente criar RRAs de média"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Opções"
msgid "Seconds"
msgstr "Segundos"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Endereço do servidor"
msgid "Server port"
msgstr "Porta do servidor"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Monitoramento das Classes de Shaping"
msgid "System Load"
msgstr "Carga do Sistema"
-msgid "System plugins"
-msgstr "Plugins de sistema"
-
msgid "TCP Connections"
msgstr "Conexões TCP"
"txtinfo do OLSRd."
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::"
"Plugin::Collectd mas pode ser utilizado de outras maneiras também."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"O plugin rede fornece informações de rede baseadas na comunicação entre as "
"Isso pode tornar o equipamento inutilizável!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> para renderização das imagens a partir dos dados coletados."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Arquivo PID usado"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "Configuração do Plugin iwinfo da Rede Sem Fio (Wireless)"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "ex: br-ff"
msgid "server interfaces"
msgstr "interfaces do servidor"
+#~ msgid "Collectd"
+#~ msgstr "Coletar"
+
+#~ msgid "System plugins"
+#~ msgstr "Plugins de sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> para renderização das imagens a partir dos dados "
+#~ "coletados."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Plugins de rede instalados:"
msgid "Add notification command"
msgstr "Adicionar o comando de notificação"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Diretório Base"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Configurações do Collectd"
msgid "Enable this plugin"
msgstr "Habilitar este plugin"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Transmissão entre o endereço de escuta e dos servidores"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Gráficos"
"Aqui você pode definir diversos critérios para as regras iptables "
"selecionadas serem monitoradas."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr "Monitorar todas as portas locais"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Monitorar dispositivos"
msgid "Only create average RRAs"
msgstr "Somente criar RRAs de média"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Opções"
msgid "Seconds"
msgstr "Segundos"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "IP/Hostname do servidor"
msgid "Server port"
msgstr "Porta do servidor"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Monitoramento das Classes de Shaping"
msgid "System Load"
msgstr "Carga do Sistema"
-msgid "System plugins"
-msgstr "Plugis de Sistema"
-
msgid "TCP Connections"
msgstr "Conexões TCP"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::"
"Plugin::Collectd mas pode ser utilizado de outras maneiras também."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"O plugin rede fornece informações de rede baseadas na comunicação entre as "
"Isso pode tornar o equipamento inutilizável!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> para renderização das imagens à partir dos dados coletados."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Arquivo PID usado"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "ex. br-ff"
msgid "server interfaces"
msgstr "Interfaces do servidor"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Plugis de Sistema"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> para renderização das imagens à partir dos dados "
+#~ "coletados."
+
#~ msgid ""
#~ "The wireless plugin collects statistics about wireless signal strength, "
#~ "noise and quality."
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Directorul de baza"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Setarile Collectd"
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Grafice"
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr "Secunde"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr "Incarcarea de sistem"
-msgid "System plugins"
-msgstr "Pluginuri de sistem"
-
msgid "TCP Connections"
msgstr "Conexiuni TCP"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Fisierul pentru PID folosit"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "server interfaces"
msgstr ""
+
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Pluginuri de sistem"
msgid "Add notification command"
msgstr "Добавить команду уведомления"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Базовая директория"
msgid "CollectTopology"
msgstr "Сбор информации о топологии (CollectTopology)"
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Настройки Collectd"
msgid "Enable this plugin"
msgstr "Включить этот модуль"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "Перенаправление между локальным адресом и адресом сервера"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Графики"
"Здесь вы можете указать различные критерии, по которым будут выбраны правила "
"для сбора статистики."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "Хост"
msgid "Monitor all local listen ports"
msgstr "Собирать статистику со всех портов, ожидающих соединения"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Собирать статистику с устройств"
msgid "Only create average RRAs"
msgstr "Создавать только средние RRA"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Опции"
msgid "Seconds"
msgstr "Секунды"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Хост сервера"
msgid "Server port"
msgstr "Порт сервера"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Мониторинг классов шейпинга"
msgid "System Load"
msgstr "Загрузка системы"
-msgid "System plugins"
-msgstr "Системные модули"
-
msgid "TCP Connections"
msgstr "TCPConns"
"Модуль OLSRd считывает информацию о узловых сетях с модуля txtinfo OLSRd."
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"модуль предназначен для использования вместе с Mail::SpamAssasin::Plugin::"
"Collectd."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Модуль Network предоставляет возможность сетевого обмена данными между "
"директории. Это, в свою очередь, может привести к отказу устройства!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Данная статистика основана на программе <a href=\"http://collectd.org/index."
-"shtml\">Collectd</a> и использует <a href=\"http://oss.oetiker.ch/rrdtool/"
-"\">RRD Tool</a> для построения диаграмм."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Используемый PID-файл"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "Конфигурация модуля Iwinfo"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "напр. br-ff"
msgid "server interfaces"
msgstr "интерфейсы сервера"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "Системные модули"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Данная статистика основана на программе <a href=\"http://collectd.org/"
+#~ "index.shtml\">Collectd</a> и использует <a href=\"http://oss.oetiker.ch/"
+#~ "rrdtool/\">RRD Tool</a> для построения диаграмм."
+
#~ msgid "Installed network plugins:"
#~ msgstr "Установленные сетевые модули:"
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
msgid "Add notification command"
msgstr "Thêm lệnh thông báo"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "Thư mục Cơ sở"
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Những cài đặt collectd"
msgid "Enable this plugin"
msgstr "Kích hoạt plugin này"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "chuyển tiếp giữa listen và địa chỉ server"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "Graphs"
"Ở đây bạn có thể định nghĩa những tiêu chuẩn khác nhau để monitor iptables "
"rules được chọn."
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr "Monitor tất cả local listen port"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "Monitor devices"
msgid "Only create average RRAs"
msgstr "Chỉ tạo trung bình RRAs"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "Tùy chọn"
msgid "Seconds"
msgstr "Giây"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "Server host"
msgid "Server port"
msgstr "Server port"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "Shaping class monitoring"
msgid "System Load"
msgstr "System Load"
-msgid "System plugins"
-msgstr "System plugins"
-
msgid "TCP Connections"
msgstr "Kết nối TCP"
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"Mail::SpamAssasin::Plugin::Collectd nhưng cũng có thể dùng trong những cách "
"khác."
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"Network plugin cung cấp network dựa trên giao tiếp giữa những collectd "
"sử dụng được</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"Gói thống kê dựa trên <a href=\"http://collectd.org/index.shtml\">Collectd</"
-"a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD Tool</a> vẽ lại "
-"sơ đồ hình ảnh từ dữ liệu thu thập ."
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "Tập tin PID đã sử dụng"
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "e.g. br-ff"
msgid "server interfaces"
msgstr "giao diện server"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "System plugins"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "Gói thống kê dựa trên <a href=\"http://collectd.org/index.shtml"
+#~ "\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
+#~ "Tool</a> vẽ lại sơ đồ hình ảnh từ dữ liệu thu thập ."
+
#~ msgid ""
#~ "The wireless plugin collects statistics about wireless signal strength, "
#~ "noise and quality."
msgid "Add notification command"
msgstr "新增通知命令"
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr "基本目录"
msgid "CollectTopology"
msgstr "收集拓扑"
-msgid "Collectd"
-msgstr "Collectd"
-
msgid "Collectd Settings"
msgstr "Collectd设置"
msgid "Enable this plugin"
msgstr "启用该插件"
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr "Exec"
msgid "Forwarding between listen and server addresses"
msgstr "转发监听服务器和应用服务器之间数据"
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr "图表"
"are selected."
msgstr "在这里,你可以定义各种监控iptables规则临界值。"
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr "主机"
msgid "Monitor all local listen ports"
msgstr "监测所有本地监听端口"
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr "监测设备"
msgid "Only create average RRAs"
msgstr "仅创建平均RRAs"
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr "选项"
msgid "Seconds"
msgstr "秒"
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr "服务器主机"
msgid "Server port"
msgstr "服务器端口"
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr "整形类监控"
msgid "System Load"
msgstr "系统加载"
-msgid "System plugins"
-msgstr "系统插件"
-
msgid "TCP Connections"
msgstr "TCP连接数"
msgstr "OLSRd插件通过txtinfo获取meshed网络信息。"
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr "conntrack插件获取连接数信息。"
"这个插件主要目的是结合使用Mail::SpamAssasin::Pulgin::Collectd,但可以用在其他"
"方面。"
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
"network插件,提供了基于网络的不同Collectd实例。Collectd可以工作在客户端和服务"
"使用!</strong>"
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
-"统计软件包是基于<a href=\"http://collectd.org/index.shtml\">Collectd</a>,并"
-"使用<a href=\"http://oss.oetiker.ch/rrdtool/\">RRD工具</a>来渲染图表,用于收"
-"集数据。"
msgid ""
"The tcpconns plugin collects informations about open tcp connections on "
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr "正在使用的PID文件"
msgid "Wireless iwinfo Plugin Configuration"
msgstr "无线iwinfo插件配置"
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr "例如:br-ff"
msgid "server interfaces"
msgstr "服务器接口"
+#~ msgid "Collectd"
+#~ msgstr "Collectd"
+
+#~ msgid "System plugins"
+#~ msgstr "系统插件"
+
+#~ msgid ""
+#~ "The statistics package is based on <a href=\"http://collectd.org/index."
+#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
+#~ "\">RRD Tool</a> to render diagram images from collected data."
+#~ msgstr ""
+#~ "统计软件包是基于<a href=\"http://collectd.org/index.shtml\">Collectd</a>,"
+#~ "并使用<a href=\"http://oss.oetiker.ch/rrdtool/\">RRD工具</a>来渲染图表,用"
+#~ "于收集数据。"
+
#~ msgid "group name"
#~ msgstr "群名称"
msgid "Add notification command"
msgstr ""
+msgid "Aggregate number of connected users"
+msgstr ""
+
msgid "Base Directory"
msgstr ""
msgid "CollectTopology"
msgstr ""
-msgid "Collectd"
-msgstr ""
-
msgid "Collectd Settings"
msgstr ""
msgid "Enable this plugin"
msgstr ""
+msgid "Entropy"
+msgstr ""
+
+msgid "Entropy Plugin Configuration"
+msgstr ""
+
msgid "Exec"
msgstr ""
msgid "Forwarding between listen and server addresses"
msgstr ""
+msgid "Gather compression statistics"
+msgstr ""
+
+msgid "General plugins"
+msgstr ""
+
+msgid "Generate a separate graph for each logged user"
+msgstr ""
+
msgid "Graphs"
msgstr ""
"are selected."
msgstr ""
+msgid "Hold Ctrl to select multiple items or to deselect entries."
+msgstr ""
+
msgid "Host"
msgstr ""
msgid "Monitor all local listen ports"
msgstr ""
+msgid "Monitor all sensors"
+msgstr ""
+
msgid "Monitor devices"
msgstr ""
msgid "Only create average RRAs"
msgstr ""
+msgid "OpenVPN"
+msgstr ""
+
+msgid "OpenVPN Plugin Configuration"
+msgstr ""
+
+msgid "OpenVPN status files"
+msgstr ""
+
msgid "Options"
msgstr ""
msgid "Seconds"
msgstr ""
+msgid "Sensor list"
+msgstr ""
+
+msgid "Sensors"
+msgstr ""
+
+msgid "Sensors Plugin Configuration"
+msgstr ""
+
msgid "Server host"
msgstr ""
msgid "Server port"
msgstr ""
+msgid "Setup"
+msgstr ""
+
msgid "Shaping class monitoring"
msgstr ""
msgid "System Load"
msgstr ""
-msgid "System plugins"
-msgstr ""
-
msgid "TCP Connections"
msgstr ""
msgstr ""
msgid ""
+"The OpenVPN plugin gathers information about the current vpn connection "
+"status."
+msgstr ""
+
+msgid ""
"The conntrack plugin collects statistics about the number of tracked "
"connections."
msgstr ""
"be used in other ways as well."
msgstr ""
+msgid "The entropy plugin collects statistics about the available entropy."
+msgstr ""
+
msgid ""
"The exec plugin starts external commands to read values from or to notify "
"external processes when certain threshold values have been reached."
msgid ""
"The network plugin provides network based communication between different "
"collectd instances. Collectd can operate both in client and server mode. In "
-"client mode locally collected date is transferred to a collectd server "
+"client mode locally collected data is transferred to a collectd server "
"instance, in server mode the local instance receives data from other hosts."
msgstr ""
msgstr ""
msgid ""
+"The sensors plugin uses the Linux Sensors framework to gather environmental "
+"statistics."
+msgstr ""
+
+msgid ""
"The splash leases plugin uses libuci to collect statistics about splash "
"leases."
msgstr ""
msgid ""
-"The statistics package is based on <a href=\"http://collectd.org/index.shtml"
-"\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
-"Tool</a> to render diagram images from collected data."
+"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
+"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
+"render diagram images."
msgstr ""
msgid ""
msgid "Uptime Plugin Configuration"
msgstr ""
+msgid "Use improved naming schema"
+msgstr ""
+
msgid "Used PID file"
msgstr ""
msgid "Wireless iwinfo Plugin Configuration"
msgstr ""
+msgid ""
+"You can install additional collectd-mod-* plugins to enable more statistics."
+msgstr ""
+
msgid "e.g. br-ff"
msgstr ""
-config 'statistics' 'rrdtool'
- option 'default_timespan' '1hour'
- option 'image_width' '600'
- option 'image_path' '/tmp/rrdimg'
-
-config 'statistics' 'collectd'
- option 'BaseDir' '/var/run/collectd'
- option 'Include' '/etc/collectd/conf.d'
- option 'PIDFile' '/var/run/collectd.pid'
- option 'PluginDir' '/usr/lib/collectd'
- option 'TypesDB' '/usr/share/collectd/types.db'
- option 'Interval' '30'
- option 'ReadThreads' '2'
-
-config 'statistics' 'collectd_ping'
- option 'enable' '0'
- option 'TTL' '127'
- option 'Interval' '30'
- option 'Hosts' '127.0.0.1'
-
-config 'statistics' 'collectd_csv'
- option 'enable' '0'
- option 'StoreRates' '0'
- option 'DataDir' '/tmp'
-
-config 'statistics' 'collectd_df'
- option 'enable' '0'
- option 'Devices' '/dev/mtdblock/4'
- option 'MountPoints' '/jffs'
- option 'FSTypes' 'tmpfs'
- option 'IgnoreSelected' '0'
-
-config 'statistics' 'collectd_disk'
- option 'enable' '0'
- option 'Disks' 'hda1 hdb'
- option 'IgnoreSelected' '0'
-
-config 'statistics' 'collectd_dns'
- option 'enable' '0'
- option 'Interfaces' 'ffdhcp ff br-lan'
- option 'IgnoreSources' '127.0.0.1'
-
-config 'statistics' 'collectd_email'
- option 'enable' '0'
- option 'SocketFile' '/var/run/collectd/email.sock'
- option 'SocketGroup' 'nogroup'
-
-config 'statistics' 'collectd_exec'
- option 'enable' '0'
-
-config 'statistics' 'collectd_interface'
- option 'enable' '1'
- option 'Interfaces' 'br-lan br-ff'
- option 'IgnoreSelected' '0'
-
-config 'statistics' 'collectd_iptables'
- option 'enable' '1'
-
-config 'collectd_iptables_match'
- option 'table' 'nat'
- option 'chain' 'luci_fw_postrouting'
- option 'target' 'MASQUERADE'
- option 'source' '192.168.1.0/24'
- option 'outputif' 'br-ff'
- option 'name' 'Verkehr LAN-Clients'
-
-config 'collectd_iptables_match'
- option 'chain' 'luci_fw_postrouting'
- option 'table' 'nat'
- option 'target' 'MASQUERADE'
- option 'source' '10.61.230.0/24'
- option 'outputif' 'br-ff'
- option 'name' 'Verkehr WLAN-Clients'
-
-config 'statistics' 'collectd_irq'
- option 'enable' '0'
- option 'Irqs' '2 3 4 7'
-
-config 'statistics' 'collectd_load'
- option 'enable' '1'
-
-config 'statistics' 'collectd_logfile'
- option 'enable' '0'
- option 'LogLevel' 'notice'
- option 'File' '/var/log/collectd.log'
- option 'Timestamp' '1'
-
-config 'statistics' 'collectd_netlink'
- option 'enable' '0'
- option 'IgnoreSelected' '0'
- option 'VerboseInterfaces' 'br-lan br-ff'
- option 'QDiscs' 'br-lan br-ff'
-
-config 'statistics' 'collectd_network'
- option 'enable' '0'
-
-config 'statistics' 'collectd_processes'
- option 'enable' '1'
- option 'Processes' 'uhttpd dnsmasq dropbear'
-
-config statistics 'collectd_splash_leases'
- option enable '1'
-
-config 'statistics' 'collectd_tcpconns'
- option 'enable' '1'
- option 'ListeningPorts' '0'
- option 'LocalPorts' '22 80'
-
-config 'statistics' 'collectd_unixsock'
- option 'enable' '0'
- option 'SocketFile' '/var/run/collectd/query.sock'
- option 'SocketGroup' 'nogroup'
-
-config 'statistics' 'collectd_cpu'
- option 'enable' '1'
-
-config 'statistics' 'collectd_rrdtool'
- option 'enable' '1'
- option 'DataDir' '/tmp/rrd'
- option 'RRARows' '100'
- option 'RRASingle' '1'
- option 'RRATimespans' '1hour 1day 1week 1month 1year'
-
-config 'statistics' 'collectd_memory'
- option 'enable' '1'
-
-config 'statistics' 'collectd_conntrack'
- option 'enable' '1'
-
-config 'statistics' 'collectd_olsrd'
- option 'enable' '1'
- option 'Port' '2006'
- option 'Host' '127.0.0.1'
-
-config 'statistics' 'collectd_iwinfo'
- option 'enable' '1'
-
-config 'statistics' 'collectd_nut'
- option 'enable' '0'
- option 'UPS' 'myupsname'
-
-config 'statistics' 'collectd_uptime'
- option 'enable' '1'
+# general settings
+
+config statistics 'collectd'
+ option BaseDir '/var/run/collectd'
+ option Include '/etc/collectd/conf.d'
+ option PIDFile '/var/run/collectd.pid'
+ option PluginDir '/usr/lib/collectd'
+ option TypesDB '/usr/share/collectd/types.db'
+ option Interval '30'
+ option ReadThreads '2'
+
+config statistics 'rrdtool'
+ option default_timespan '1hour'
+ option image_width '600'
+ option image_path '/tmp/rrdimg'
+
+# output plugins
+
+config statistics 'collectd_rrdtool'
+ option enable '1'
+ option DataDir '/tmp/rrd'
+ option RRARows '100'
+ option RRASingle '1'
+ option RRATimespans '1hour 1day 1week 1month 1year'
+
+config statistics 'collectd_csv'
+ option enable '0'
+ option StoreRates '0'
+ option DataDir '/tmp'
+
+config statistics 'collectd_email'
+ option enable '0'
+ option SocketFile '/var/run/collectd/email.sock'
+ option SocketGroup 'nogroup'
+
+config statistics 'collectd_logfile'
+ option enable '0'
+ option LogLevel 'notice'
+ option File '/var/log/collectd.log'
+ option Timestamp '1'
+
+config statistics 'collectd_network'
+ option enable '0'
+
+config statistics 'collectd_unixsock'
+ option enable '0'
+ option SocketFile '/var/run/collectd/query.sock'
+ option SocketGroup 'nogroup'
+
+# input plugins
+
+config statistics 'collectd_conntrack'
+ option enable '0'
+
+config statistics 'collectd_cpu'
+ option enable '0'
+
+config statistics 'collectd_df'
+ option enable '0'
+ option Devices '/dev/mtdblock/4'
+ option MountPoints '/jffs'
+ option FSTypes 'tmpfs'
+ option IgnoreSelected '0'
+
+config statistics 'collectd_disk'
+ option enable '0'
+ option Disks 'hda1 hdb'
+ option IgnoreSelected '0'
+
+config statistics 'collectd_dns'
+ option enable '0'
+ option Interfaces 'br-lan'
+ option IgnoreSources '127.0.0.1'
+
+config statistics 'collectd_entropy'
+ option enable '0'
+
+config statistics 'collectd_exec'
+ option enable '0'
+
+config statistics 'collectd_interface'
+ option enable '1'
+ option Interfaces 'br-lan'
+ option IgnoreSelected '0'
+
+config statistics 'collectd_iptables'
+ option enable '0'
+
+config collectd_iptables_match
+ option table 'nat'
+ option chain 'luci_fw_postrouting'
+ option target 'MASQUERADE'
+ option source '192.168.1.0/24'
+ option outputif 'br-ff'
+ option name 'LAN-Clients traffic'
+
+config collectd_iptables_match
+ option chain 'luci_fw_postrouting'
+ option table 'nat'
+ option target 'MASQUERADE'
+ option source '10.61.230.0/24'
+ option outputif 'br-ff'
+ option name 'WLAN-Clients traffic'
+
+config statistics 'collectd_irq'
+ option enable '0'
+ option Irqs '2 3 4 7'
+
+config statistics 'collectd_iwinfo'
+ option enable '1'
+
+config statistics 'collectd_load'
+ option enable '1'
+
+config statistics 'collectd_memory'
+ option enable '0'
+
+config statistics 'collectd_netlink'
+ option enable '0'
+ option IgnoreSelected '0'
+ option VerboseInterfaces 'br-lan'
+ option QDiscs 'br-lan'
+
+config statistics 'collectd_nut'
+ option enable '0'
+ option UPS 'myupsname'
+
+config statistics 'collectd_olsrd'
+ option enable '0'
+ option Port '2006'
+ option Host '127.0.0.1'
+
+config statistics 'collectd_ping'
+ option enable '0'
+ option TTL '127'
+ option Interval '30'
+ option Hosts '127.0.0.1'
+
+config statistics 'collectd_processes'
+ option enable '0'
+ option Processes 'uhttpd dnsmasq dropbear'
+
+config statistics 'collectd_sensors'
+ option enable '0'
+
+config statistics 'collectd_splash_leases'
+ option enable '0'
+
+config statistics 'collectd_tcpconns'
+ option enable '0'
+ option ListeningPorts '0'
+ option LocalPorts '22 80'
+
+config statistics 'collectd_uptime'
+ option enable '0'
+
start() {
### replace shipped config with symlink
+ mkdir -p /var/etc
if [ ! -L /etc/collectd.conf ]; then
test -f /etc/collectd.conf && mv /etc/collectd.conf /etc/collectd.conf.bak
ln -s /var/etc/collectd.conf /etc/collectd.conf
fi
### create config
- mkdir -p /var/etc
/usr/bin/stat-genconfig > /var/etc/collectd.conf
- ### prepare rrdimg directory
- if [ -f /etc/config/lucid ] && [ -x /etc/init.d/lucid ] && /etc/init.d/lucid enabled && \
- [ "$(uci get luci_statistics.rrdtool.image_path 2>/dev/null)" != "$(uci get lucid.statistics.physical 2>/dev/null)" ]; then
- uci set lucid.statistics.physical=$(uci get luci_statistics.rrdtool.image_path)
- uci commit lucid
- /etc/init.d/lucid restart
- fi
-
### workaround broken permissions on /tmp
chmod 1777 /tmp
}
commit ucitrack
EOF
-# register LuCId virtual path handler
-[ -f /etc/config/lucid ] && \
-uci -q batch <<-EOF >/dev/null
- delete lucid.statistics
-
- set lucid.statistics=DirectoryPublisher
- set lucid.statistics.name='RRDTool Image Cache'
- set lucid.statistics.physical=/tmp/rrdimg
- set lucid.statistics.virtual=/rrdimg
- set lucid.statistics.domain=''
-
- add_list lucid.http.publisher=statistics
- add_list lucid.https.publisher=statistics
-
- commit lucid
-EOF
-
# symlink for busybox httpd
[ -x /usr/sbin/httpd ] && [ ! -h /www/rrdimg ] && \
ln -s /tmp/rrdimg /www/rrdimg
-# restart LuCId service
-[ -x /etc/init.d/lucid ] && /etc/init.d/lucid enabled && /etc/init.d/lucid restart
-
rm -f /tmp/luci-indexcache
exit 0
end
if n:find("(%w+)ses") then
- k = n:gsub("(%w+)ses", "%1s")
+ k = n:gsub("(%w+)ses$", "%1s")
else
- k = n:gsub("(%w+)s", "%1")
+ k = n:gsub("(%w+)s$", "%1")
end
str = str .. _expand( c[n], k, nopad )
{ }
},
+ entropy = {
+ { },
+ { },
+ { }
+ },
+
exec = config_exec,
interface = {
{ }
},
+ openvpn = {
+ { },
+ { "CollectIndividualUsers", "CollectUserCount", "CollectCompression", "ImprovedNamingSchema" },
+ { "StatusFile" }
+ },
+
ping = {
{ "TTL", "Interval" },
{ },
{ "RRATimespans" }
},
+ sensors = {
+ { },
+ { "IgnoreSelected" },
+ { "Sensor" }
+ },
+
splash_leases = {
{ },
{ },
<%+header%>
<div class="cbi-map">
- <h2><a id="content" name="content"><%:Tinyproxy Status%></a></h2>
+ <h2 name="content"><%:Tinyproxy Status%></h2>
<div class="cbi-section">
<iframe src="<%=REQUESTURL%>?frame=1" style="width:100%; height:350px; border:none"></iframe>
</div>
local page
- page = entry({"admin", "services", "upnp"}, cbi("upnp/upnp"), _("UPNP"))
+ page = entry({"admin", "services", "upnp"}, cbi("upnp/upnp"), _("UPnP"))
page.dependent = true
entry({"admin", "services", "upnp", "status"}, call("act_status")).leaf = true
- entry({"admin", "services", "upnp", "delete"}, call("act_delete")).leaf = true
+ entry({"admin", "services", "upnp", "delete"}, post("act_delete")).leaf = true
end
function act_status()
<script type="text/javascript">//<![CDATA[
function upnp_delete_fwd(idx) {
- XHR.get('<%=luci.dispatcher.build_url("admin", "services", "upnp", "delete")%>/' + idx, null,
+ (new XHR()).post('<%=url('admin/services/upnp/delete')%>/' + idx, { token: '<%=token%>' },
function(x)
{
var tb = document.getElementById('upnp_status_table');
);
}
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "upnp", "status")%>', null,
+ XHR.poll(5, '<%=url('admin/services/upnp/status')%>', null,
function(x, st)
{
var tb = document.getElementById('upnp_status_table');
msgid "There are no active redirects."
msgstr "No hi ha redireccions actives."
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr "Nejsou zde žádná aktivní přesměrování"
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr "Es gibt keine aktiven Weiterleitungen."
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPnP"
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "Sin redirecciones activas."
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPnP"
msgid ""
msgid "There are no active redirects."
msgstr "Il n'y a pas de redirections actives."
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "Nincsenek aktív átírányítások."
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr "Non ci sono mappature attive."
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr "有効なリダイレクトはありません。"
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPnP"
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "Det finnes ingen aktive viderekoblinger"
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "Nie ma aktywnych przekierowań"
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPnP"
msgid ""
msgid "There are no active redirects."
msgstr "Não existe redirecionamentos ativos."
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
"<abbr title=\"Universal Plug and Play, Plugue e Use Universal\">UPnP</abbr>"
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "Nu exista redirecturi active."
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr "Активные переадресации отсутствуют."
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPnP"
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "Немає активних переспрямувань"
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPnP"
msgid ""
msgid "There are no active redirects."
msgstr ""
-msgid "UPNP"
+msgid "UPnP"
msgstr ""
msgid ""
msgid "There are no active redirects."
msgstr "没有活动的重定向"
-msgid "UPNP"
-msgstr "UPNP"
+msgid "UPnP"
+msgstr "UPnP"
msgid ""
"UPnP allows clients in the local network to automatically configure the "
msgid "There are no active redirects."
msgstr "目前無作用中的從導"
-msgid "UPNP"
+msgid "UPnP"
msgstr "UPNP通用序列埠協定"
msgid ""
+++ /dev/null
-#!/bin/sh
-
-/etc/init.d/miniupnpd enabled && {
- /etc/init.d/miniupnpd stop
- /etc/init.d/miniupnpd disable
-}
-
-rm -f /tmp/luci-indexcache
-exit 0
--
if iface then
style = style:gsub("[^%w]", "")
- iface = iface:gsub("[^%w%.%-]", "")
+ iface = iface:gsub("[^%w%.%-%_]", "")
luci.http.prepare_content("image/png")
<%+header%>
-<h2><a id="content" name="content"><%:VnStat Graphs%></a></h2>
+<h2 name="content"><%:VnStat Graphs%></h2>
<form action="" method="get">
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Voice Software (Core)
-LUCI_DEPENDS:=
+LUCI_DEPENDS:=@BROKEN
include ../../luci.mk
-%>
<%+header%>
-<h2><a id="content" name="content">Voice</a></h2>
+<h2 name="content">Voice</h2>
<p>Here you can control OpenWRT voice-related settings and see
voice-related information from OpenWRT</p>
<p>In particular Asterisk configuration and information is displayed
-%>
<%+header%>
-<h2><a id="content" name="content">Phones</a></h2>
+<h2 name="content">Phones</h2>
<p>Here you can control phone configuration and information in OpenWRT</p>
<p>You can control the setup of phone clients and servers and see
information such as diagnostics related to phone devices from this menu.
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Voice Software (Diagnostics)
-LUCI_DEPENDS:=+luci-app-diag-devinfo
+LUCI_DEPENDS:=+luci-app-diag-devinfo @BROKEN
include ../../luci.mk
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+<h2 name="content"><%:Diagnostics%></h2>
<p><%:Under this menu are options that allow you to configure and perform tests on the voice operations of your system. These are known as diagnostics.%></p>
<p><%:The diagnostics available on your device depend on the modules that you have installed.%></p>
<%+footer%>
exit 1
}
+outdir=$(readlink -f "$1")
+
+mkdir -p "$outdir" || {
+ echo "Unable to mkdir '$outdir'" >&2
+ exit 1
+}
+
(
cd "$topdir/build/luadoc/"
find "$topdir/libs/" "$topdir/modules/" -type f -name '*.lua' -or -name '*.luadoc' | \
- xargs grep -l '@return' | xargs ./doc.lua --no-files -d "$1"
+ xargs grep -l '@return' | xargs ./doc.lua --no-files -d "$outdir"
)
+++ /dev/null
-include ../../build/config.mk
-include ../../build/module.mk
\ No newline at end of file
+++ /dev/null
-LuaSrcDiet License
-------------------
-
-LuaSrcDiet is licensed under the terms of the MIT license reproduced
-below. This means that LuaSrcDiet is free software and can be used for
-both academic and commercial purposes at absolutely no cost.
-
-Parts of LuaSrcDiet is based on Lua 5 code. See COPYRIGHT_Lua51
-(Lua 5.1.3) for Lua 5 license information.
-
-For details and rationale, see http://www.lua.org/license.html .
-
-===============================================================================
-
-Copyright (C) 2005-2008 Kein-Hong Man <khman@users.sf.net>
-Lua 5.1.3 Copyright (C) 1994-2008 Lua.org, PUC-Rio.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-===============================================================================
-
-(end of COPYRIGHT)
+++ /dev/null
-#!/usr/bin/env lua
---[[--------------------------------------------------------------------
-
- LuaSrcDiet
- Compresses Lua source code by removing unnecessary characters.
- For Lua 5.1.x source code.
-
- Copyright (c) 2008 Kein-Hong Man <khman@users.sf.net>
- The COPYRIGHT file describes the conditions
- under which this software may be distributed.
-
- See the ChangeLog for more information.
-
-----------------------------------------------------------------------]]
-
---[[--------------------------------------------------------------------
--- NOTES:
--- * Remember to update version and date information below (MSG_TITLE)
--- * TODO: to implement pcall() to properly handle lexer etc. errors
--- * TODO: verify token stream or double-check binary chunk?
--- * TODO: need some automatic testing for a semblance of sanity
--- * TODO: the plugin module is highly experimental and unstable
-----------------------------------------------------------------------]]
-
--- standard libraries, functions
-local string = string
-local math = math
-local table = table
-local require = require
-local print = print
-local sub = string.sub
-local gmatch = string.gmatch
-
--- support modules
-local llex = require "llex"
-local lparser = require "lparser"
-local optlex = require "optlex"
-local optparser = require "optparser"
-local plugin
-
---[[--------------------------------------------------------------------
--- messages and textual data
-----------------------------------------------------------------------]]
-
-local MSG_TITLE = [[
-LuaSrcDiet: Puts your Lua 5.1 source code on a diet
-Version 0.11.2 (20080608) Copyright (c) 2005-2008 Kein-Hong Man
-The COPYRIGHT file describes the conditions under which this
-software may be distributed.
-]]
-
-local MSG_USAGE = [[
-usage: LuaSrcDiet [options] [filenames]
-
-example:
- >LuaSrcDiet myscript.lua -o myscript_.lua
-
-options:
- -v, --version prints version information
- -h, --help prints usage information
- -o <file> specify file name to write output
- -s <suffix> suffix for output files (default '_')
- --keep <msg> keep block comment with <msg> inside
- --plugin <module> run <module> in plugin/ directory
- - stop handling arguments
-
- (optimization levels)
- --none all optimizations off (normalizes EOLs only)
- --basic lexer-based optimizations only
- --maximum maximize reduction of source
-
- (informational)
- --quiet process files quietly
- --read-only read file and print token stats only
- --dump-lexer dump raw tokens from lexer to stdout
- --dump-parser dump variable tracking tables from parser
- --details extra info (strings, numbers, locals)
-
-features (to disable, insert 'no' prefix like --noopt-comments):
-%s
-default settings:
-%s]]
-
-------------------------------------------------------------------------
--- optimization options, for ease of switching on and off
--- * positive to enable optimization, negative (no) to disable
--- * these options should follow --opt-* and --noopt-* style for now
-------------------------------------------------------------------------
-
-local OPTION = [[
---opt-comments,'remove comments and block comments'
---opt-whitespace,'remove whitespace excluding EOLs'
---opt-emptylines,'remove empty lines'
---opt-eols,'all above, plus remove unnecessary EOLs'
---opt-strings,'optimize strings and long strings'
---opt-numbers,'optimize numbers'
---opt-locals,'optimize local variable names'
---opt-entropy,'tries to reduce symbol entropy of locals'
-]]
-
--- preset configuration
-local DEFAULT_CONFIG = [[
- --opt-comments --opt-whitespace --opt-emptylines
- --opt-numbers --opt-locals
-]]
--- override configurations: MUST explicitly enable/disable everything
-local BASIC_CONFIG = [[
- --opt-comments --opt-whitespace --opt-emptylines
- --noopt-eols --noopt-strings --noopt-numbers
- --noopt-locals
-]]
-local MAXIMUM_CONFIG = [[
- --opt-comments --opt-whitespace --opt-emptylines
- --opt-eols --opt-strings --opt-numbers
- --opt-locals --opt-entropy
-]]
-local NONE_CONFIG = [[
- --noopt-comments --noopt-whitespace --noopt-emptylines
- --noopt-eols --noopt-strings --noopt-numbers
- --noopt-locals
-]]
-
-local DEFAULT_SUFFIX = "_" -- default suffix for file renaming
-local PLUGIN_SUFFIX = "plugin/" -- relative location of plugins
-
---[[--------------------------------------------------------------------
--- startup and initialize option list handling
-----------------------------------------------------------------------]]
-
--- simple error message handler; change to error if traceback wanted
-local function die(msg)
- print("LuaSrcDiet: "..msg); os.exit()
-end
---die = error--DEBUG
-
-if not string.match(_VERSION, "5.1", 1, 1) then -- sanity check
- die("requires Lua 5.1 to run")
-end
-
-------------------------------------------------------------------------
--- prepares text for list of optimizations, prepare lookup table
-------------------------------------------------------------------------
-
-local MSG_OPTIONS = ""
-do
- local WIDTH = 24
- local o = {}
- for op, desc in gmatch(OPTION, "%s*([^,]+),'([^']+)'") do
- local msg = " "..op
- msg = msg..string.rep(" ", WIDTH - #msg)..desc.."\n"
- MSG_OPTIONS = MSG_OPTIONS..msg
- o[op] = true
- o["--no"..sub(op, 3)] = true
- end
- OPTION = o -- replace OPTION with lookup table
-end
-
-MSG_USAGE = string.format(MSG_USAGE, MSG_OPTIONS, DEFAULT_CONFIG)
-
-------------------------------------------------------------------------
--- global variable initialization, option set handling
-------------------------------------------------------------------------
-
-local suffix = DEFAULT_SUFFIX -- file suffix
-local option = {} -- program options
-local stat_c, stat_l -- statistics tables
-
--- function to set option lookup table based on a text list of options
--- note: additional forced settings for --opt-eols is done in optlex.lua
-local function set_options(CONFIG)
- for op in gmatch(CONFIG, "(%-%-%S+)") do
- if sub(op, 3, 4) == "no" and -- handle negative options
- OPTION["--"..sub(op, 5)] then
- option[sub(op, 5)] = false
- else
- option[sub(op, 3)] = true
- end
- end
-end
-
---[[--------------------------------------------------------------------
--- support functions
-----------------------------------------------------------------------]]
-
--- list of token types, parser-significant types are up to TTYPE_GRAMMAR
--- while the rest are not used by parsers; arranged for stats display
-local TTYPES = {
- "TK_KEYWORD", "TK_NAME", "TK_NUMBER", -- grammar
- "TK_STRING", "TK_LSTRING", "TK_OP",
- "TK_EOS",
- "TK_COMMENT", "TK_LCOMMENT", -- non-grammar
- "TK_EOL", "TK_SPACE",
-}
-local TTYPE_GRAMMAR = 7
-
-local EOLTYPES = { -- EOL names for token dump
- ["\n"] = "LF", ["\r"] = "CR",
- ["\n\r"] = "LFCR", ["\r\n"] = "CRLF",
-}
-
-------------------------------------------------------------------------
--- read source code from file
-------------------------------------------------------------------------
-
-local function load_file(fname)
- local INF = io.open(fname, "rb")
- if not INF then die("cannot open \""..fname.."\" for reading") end
- local dat = INF:read("*a")
- if not dat then die("cannot read from \""..fname.."\"") end
- INF:close()
- return dat
-end
-
-------------------------------------------------------------------------
--- save source code to file
-------------------------------------------------------------------------
-
-local function save_file(fname, dat)
- local OUTF = io.open(fname, "wb")
- if not OUTF then die("cannot open \""..fname.."\" for writing") end
- local status = OUTF:write(dat)
- if not status then die("cannot write to \""..fname.."\"") end
- OUTF:close()
-end
-
-------------------------------------------------------------------------
--- functions to deal with statistics
-------------------------------------------------------------------------
-
--- initialize statistics table
-local function stat_init()
- stat_c, stat_l = {}, {}
- for i = 1, #TTYPES do
- local ttype = TTYPES[i]
- stat_c[ttype], stat_l[ttype] = 0, 0
- end
-end
-
--- add a token to statistics table
-local function stat_add(tok, seminfo)
- stat_c[tok] = stat_c[tok] + 1
- stat_l[tok] = stat_l[tok] + #seminfo
-end
-
--- do totals for statistics table, return average table
-local function stat_calc()
- local function avg(c, l) -- safe average function
- if c == 0 then return 0 end
- return l / c
- end
- local stat_a = {}
- local c, l = 0, 0
- for i = 1, TTYPE_GRAMMAR do -- total grammar tokens
- local ttype = TTYPES[i]
- c = c + stat_c[ttype]; l = l + stat_l[ttype]
- end
- stat_c.TOTAL_TOK, stat_l.TOTAL_TOK = c, l
- stat_a.TOTAL_TOK = avg(c, l)
- c, l = 0, 0
- for i = 1, #TTYPES do -- total all tokens
- local ttype = TTYPES[i]
- c = c + stat_c[ttype]; l = l + stat_l[ttype]
- stat_a[ttype] = avg(stat_c[ttype], stat_l[ttype])
- end
- stat_c.TOTAL_ALL, stat_l.TOTAL_ALL = c, l
- stat_a.TOTAL_ALL = avg(c, l)
- return stat_a
-end
-
---[[--------------------------------------------------------------------
--- main tasks
-----------------------------------------------------------------------]]
-
-------------------------------------------------------------------------
--- a simple token dumper, minimal translation of seminfo data
-------------------------------------------------------------------------
-
-local function dump_tokens(srcfl)
- --------------------------------------------------------------------
- -- load file and process source input into tokens
- --------------------------------------------------------------------
- local z = load_file(srcfl)
- llex.init(z)
- llex.llex()
- local toklist, seminfolist = llex.tok, llex.seminfo
- --------------------------------------------------------------------
- -- display output
- --------------------------------------------------------------------
- for i = 1, #toklist do
- local tok, seminfo = toklist[i], seminfolist[i]
- if tok == "TK_OP" and string.byte(seminfo) < 32 then
- seminfo = "(".. string.byte(seminfo)..")"
- elseif tok == "TK_EOL" then
- seminfo = EOLTYPES[seminfo]
- else
- seminfo = "'"..seminfo.."'"
- end
- print(tok.." "..seminfo)
- end--for
-end
-
-----------------------------------------------------------------------
--- parser dump; dump globalinfo and localinfo tables
-----------------------------------------------------------------------
-
-local function dump_parser(srcfl)
- local print = print
- --------------------------------------------------------------------
- -- load file and process source input into tokens
- --------------------------------------------------------------------
- local z = load_file(srcfl)
- llex.init(z)
- llex.llex()
- local toklist, seminfolist, toklnlist
- = llex.tok, llex.seminfo, llex.tokln
- --------------------------------------------------------------------
- -- do parser optimization here
- --------------------------------------------------------------------
- lparser.init(toklist, seminfolist, toklnlist)
- local globalinfo, localinfo = lparser.parser()
- --------------------------------------------------------------------
- -- display output
- --------------------------------------------------------------------
- local hl = string.rep("-", 72)
- print("*** Local/Global Variable Tracker Tables ***")
- print(hl.."\n GLOBALS\n"..hl)
- -- global tables have a list of xref numbers only
- for i = 1, #globalinfo do
- local obj = globalinfo[i]
- local msg = "("..i..") '"..obj.name.."' -> "
- local xref = obj.xref
- for j = 1, #xref do msg = msg..xref[j].." " end
- print(msg)
- end
- -- local tables have xref numbers and a few other special
- -- numbers that are specially named: decl (declaration xref),
- -- act (activation xref), rem (removal xref)
- print(hl.."\n LOCALS (decl=declared act=activated rem=removed)\n"..hl)
- for i = 1, #localinfo do
- local obj = localinfo[i]
- local msg = "("..i..") '"..obj.name.."' decl:"..obj.decl..
- " act:"..obj.act.." rem:"..obj.rem
- if obj.isself then
- msg = msg.." isself"
- end
- msg = msg.." -> "
- local xref = obj.xref
- for j = 1, #xref do msg = msg..xref[j].." " end
- print(msg)
- end
- print(hl.."\n")
-end
-
-------------------------------------------------------------------------
--- reads source file(s) and reports some statistics
-------------------------------------------------------------------------
-
-local function read_only(srcfl)
- local print = print
- --------------------------------------------------------------------
- -- load file and process source input into tokens
- --------------------------------------------------------------------
- local z = load_file(srcfl)
- llex.init(z)
- llex.llex()
- local toklist, seminfolist = llex.tok, llex.seminfo
- print(MSG_TITLE)
- print("Statistics for: "..srcfl.."\n")
- --------------------------------------------------------------------
- -- collect statistics
- --------------------------------------------------------------------
- stat_init()
- for i = 1, #toklist do
- local tok, seminfo = toklist[i], seminfolist[i]
- stat_add(tok, seminfo)
- end--for
- local stat_a = stat_calc()
- --------------------------------------------------------------------
- -- display output
- --------------------------------------------------------------------
- local fmt = string.format
- local function figures(tt)
- return stat_c[tt], stat_l[tt], stat_a[tt]
- end
- local tabf1, tabf2 = "%-16s%8s%8s%10s", "%-16s%8d%8d%10.2f"
- local hl = string.rep("-", 42)
- print(fmt(tabf1, "Lexical", "Input", "Input", "Input"))
- print(fmt(tabf1, "Elements", "Count", "Bytes", "Average"))
- print(hl)
- for i = 1, #TTYPES do
- local ttype = TTYPES[i]
- print(fmt(tabf2, ttype, figures(ttype)))
- if ttype == "TK_EOS" then print(hl) end
- end
- print(hl)
- print(fmt(tabf2, "Total Elements", figures("TOTAL_ALL")))
- print(hl)
- print(fmt(tabf2, "Total Tokens", figures("TOTAL_TOK")))
- print(hl.."\n")
-end
-
-------------------------------------------------------------------------
--- process source file(s), write output and reports some statistics
-------------------------------------------------------------------------
-
-local function process_file(srcfl, destfl)
- local function print(...) -- handle quiet option
- if option.QUIET then return end
- _G.print(...)
- end
- if plugin and plugin.init then -- plugin init
- option.EXIT = false
- plugin.init(option, srcfl, destfl)
- if option.EXIT then return end
- end
- print(MSG_TITLE) -- title message
- --------------------------------------------------------------------
- -- load file and process source input into tokens
- --------------------------------------------------------------------
- local z = load_file(srcfl)
- if plugin and plugin.post_load then -- plugin post-load
- z = plugin.post_load(z) or z
- if option.EXIT then return end
- end
- llex.init(z)
- llex.llex()
- local toklist, seminfolist, toklnlist
- = llex.tok, llex.seminfo, llex.tokln
- if plugin and plugin.post_lex then -- plugin post-lex
- plugin.post_lex(toklist, seminfolist, toklnlist)
- if option.EXIT then return end
- end
- --------------------------------------------------------------------
- -- collect 'before' statistics
- --------------------------------------------------------------------
- stat_init()
- for i = 1, #toklist do
- local tok, seminfo = toklist[i], seminfolist[i]
- stat_add(tok, seminfo)
- end--for
- local stat1_a = stat_calc()
- local stat1_c, stat1_l = stat_c, stat_l
- --------------------------------------------------------------------
- -- do parser optimization here
- --------------------------------------------------------------------
- if option["opt-locals"] then
- optparser.print = print -- hack
- lparser.init(toklist, seminfolist, toklnlist)
- local globalinfo, localinfo = lparser.parser()
- if plugin and plugin.post_parse then -- plugin post-parse
- plugin.post_parse(globalinfo, localinfo)
- if option.EXIT then return end
- end
- optparser.optimize(option, toklist, seminfolist, globalinfo, localinfo)
- if plugin and plugin.post_optparse then -- plugin post-optparse
- plugin.post_optparse()
- if option.EXIT then return end
- end
- end
- --------------------------------------------------------------------
- -- do lexer optimization here, save output file
- --------------------------------------------------------------------
- optlex.print = print -- hack
- toklist, seminfolist, toklnlist
- = optlex.optimize(option, toklist, seminfolist, toklnlist)
- if plugin and plugin.post_optlex then -- plugin post-optlex
- plugin.post_optlex(toklist, seminfolist, toklnlist)
- if option.EXIT then return end
- end
- local dat = table.concat(seminfolist)
- -- depending on options selected, embedded EOLs in long strings and
- -- long comments may not have been translated to \n, tack a warning
- if string.find(dat, "\r\n", 1, 1) or
- string.find(dat, "\n\r", 1, 1) then
- optlex.warn.mixedeol = true
- end
- -- save optimized source stream to output file
- save_file(destfl, dat)
- --------------------------------------------------------------------
- -- collect 'after' statistics
- --------------------------------------------------------------------
- stat_init()
- for i = 1, #toklist do
- local tok, seminfo = toklist[i], seminfolist[i]
- stat_add(tok, seminfo)
- end--for
- local stat_a = stat_calc()
- --------------------------------------------------------------------
- -- display output
- --------------------------------------------------------------------
- print("Statistics for: "..srcfl.." -> "..destfl.."\n")
- local fmt = string.format
- local function figures(tt)
- return stat1_c[tt], stat1_l[tt], stat1_a[tt],
- stat_c[tt], stat_l[tt], stat_a[tt]
- end
- local tabf1, tabf2 = "%-16s%8s%8s%10s%8s%8s%10s",
- "%-16s%8d%8d%10.2f%8d%8d%10.2f"
- local hl = string.rep("-", 68)
- print("*** lexer-based optimizations summary ***\n"..hl)
- print(fmt(tabf1, "Lexical",
- "Input", "Input", "Input",
- "Output", "Output", "Output"))
- print(fmt(tabf1, "Elements",
- "Count", "Bytes", "Average",
- "Count", "Bytes", "Average"))
- print(hl)
- for i = 1, #TTYPES do
- local ttype = TTYPES[i]
- print(fmt(tabf2, ttype, figures(ttype)))
- if ttype == "TK_EOS" then print(hl) end
- end
- print(hl)
- print(fmt(tabf2, "Total Elements", figures("TOTAL_ALL")))
- print(hl)
- print(fmt(tabf2, "Total Tokens", figures("TOTAL_TOK")))
- print(hl)
- --------------------------------------------------------------------
- -- report warning flags from optimizing process
- --------------------------------------------------------------------
- if optlex.warn.lstring then
- print("* WARNING: "..optlex.warn.lstring)
- elseif optlex.warn.mixedeol then
- print("* WARNING: ".."output still contains some CRLF or LFCR line endings")
- end
- print()
-end
-
---[[--------------------------------------------------------------------
--- main functions
-----------------------------------------------------------------------]]
-
-local arg = {...} -- program arguments
-local fspec = {}
-set_options(DEFAULT_CONFIG) -- set to default options at beginning
-
-------------------------------------------------------------------------
--- per-file handling, ship off to tasks
-------------------------------------------------------------------------
-
-local function do_files(fspec)
- for _, srcfl in ipairs(fspec) do
- local destfl
- ------------------------------------------------------------------
- -- find and replace extension for filenames
- ------------------------------------------------------------------
- local extb, exte = string.find(srcfl, "%.[^%.%\\%/]*$")
- local basename, extension = srcfl, ""
- if extb and extb > 1 then
- basename = sub(srcfl, 1, extb - 1)
- extension = sub(srcfl, extb, exte)
- end
- destfl = basename..suffix..extension
- if #fspec == 1 and option.OUTPUT_FILE then
- destfl = option.OUTPUT_FILE
- end
- if srcfl == destfl then
- die("output filename identical to input filename")
- end
- ------------------------------------------------------------------
- -- perform requested operations
- ------------------------------------------------------------------
- if option.DUMP_LEXER then
- dump_tokens(srcfl)
- elseif option.DUMP_PARSER then
- dump_parser(srcfl)
- elseif option.READ_ONLY then
- read_only(srcfl)
- else
- process_file(srcfl, destfl)
- end
- end--for
-end
-
-------------------------------------------------------------------------
--- main function (entry point is after this definition)
-------------------------------------------------------------------------
-
-local function main()
- local argn, i = #arg, 1
- if argn == 0 then
- option.HELP = true
- end
- --------------------------------------------------------------------
- -- handle arguments
- --------------------------------------------------------------------
- while i <= argn do
- local o, p = arg[i], arg[i + 1]
- local dash = string.match(o, "^%-%-?")
- if dash == "-" then -- single-dash options
- if o == "-h" then
- option.HELP = true; break
- elseif o == "-v" then
- option.VERSION = true; break
- elseif o == "-s" then
- if not p then die("-s option needs suffix specification") end
- suffix = p
- i = i + 1
- elseif o == "-o" then
- if not p then die("-o option needs a file name") end
- option.OUTPUT_FILE = p
- i = i + 1
- elseif o == "-" then
- break -- ignore rest of args
- else
- die("unrecognized option "..o)
- end
- elseif dash == "--" then -- double-dash options
- if o == "--help" then
- option.HELP = true; break
- elseif o == "--version" then
- option.VERSION = true; break
- elseif o == "--keep" then
- if not p then die("--keep option needs a string to match for") end
- option.KEEP = p
- i = i + 1
- elseif o == "--plugin" then
- if not p then die("--plugin option needs a module name") end
- if option.PLUGIN then die("only one plugin can be specified") end
- option.PLUGIN = p
- plugin = require(PLUGIN_SUFFIX..p)
- i = i + 1
- elseif o == "--quiet" then
- option.QUIET = true
- elseif o == "--read-only" then
- option.READ_ONLY = true
- elseif o == "--basic" then
- set_options(BASIC_CONFIG)
- elseif o == "--maximum" then
- set_options(MAXIMUM_CONFIG)
- elseif o == "--none" then
- set_options(NONE_CONFIG)
- elseif o == "--dump-lexer" then
- option.DUMP_LEXER = true
- elseif o == "--dump-parser" then
- option.DUMP_PARSER = true
- elseif o == "--details" then
- option.DETAILS = true
- elseif OPTION[o] then -- lookup optimization options
- set_options(o)
- else
- die("unrecognized option "..o)
- end
- else
- fspec[#fspec + 1] = o -- potential filename
- end
- i = i + 1
- end--while
- if option.HELP then
- print(MSG_TITLE..MSG_USAGE); return true
- elseif option.VERSION then
- print(MSG_TITLE); return true
- end
- if #fspec > 0 then
- if #fspec > 1 and option.OUTPUT_FILE then
- die("with -o, only one source file can be specified")
- end
- do_files(fspec)
- return true
- else
- die("nothing to do!")
- end
-end
-
--- entry point -> main() -> do_files()
-if not main() then
- die("Please run with option -h or --help for usage information")
-end
-
--- end of script
+++ /dev/null
---[[--------------------------------------------------------------------
-
- llex.lua: Lua 5.1 lexical analyzer in Lua
- This file is part of LuaSrcDiet, based on Yueliang material.
-
- Copyright (c) 2008 Kein-Hong Man <khman@users.sf.net>
- The COPYRIGHT file describes the conditions
- under which this software may be distributed.
-
- See the ChangeLog for more information.
-
-----------------------------------------------------------------------]]
-
---[[--------------------------------------------------------------------
--- NOTES:
--- * This is a version of the native 5.1.x lexer from Yueliang 0.4.0,
--- with significant modifications to handle LuaSrcDiet's needs:
--- (1) llex.error is an optional error function handler
--- (2) seminfo for strings include their delimiters and no
--- translation operations are performed on them
--- * ADDED shbang handling has been added to support executable scripts
--- * NO localized decimal point replacement magic
--- * NO limit to number of lines
--- * NO support for compatible long strings (LUA_COMPAT_LSTR)
--- * Please read technotes.txt for more technical details.
-----------------------------------------------------------------------]]
-
-local base = _G
-local string = require "string"
-module "llex"
-
-local find = string.find
-local match = string.match
-local sub = string.sub
-
-----------------------------------------------------------------------
--- initialize keyword list, variables
-----------------------------------------------------------------------
-
-local kw = {}
-for v in string.gmatch([[
-and break do else elseif end false for function if in
-local nil not or repeat return then true until while]], "%S+") do
- kw[v] = true
-end
-
--- NOTE: see init() for module variables (externally visible):
--- tok, seminfo, tokln
-
-local z, -- source stream
- sourceid, -- name of source
- I, -- position of lexer
- buff, -- buffer for strings
- ln -- line number
-
-----------------------------------------------------------------------
--- add information to token listing
-----------------------------------------------------------------------
-
-local function addtoken(token, info)
- local i = #tok + 1
- tok[i] = token
- seminfo[i] = info
- tokln[i] = ln
-end
-
-----------------------------------------------------------------------
--- handles line number incrementation and end-of-line characters
-----------------------------------------------------------------------
-
-local function inclinenumber(i, is_tok)
- local sub = sub
- local old = sub(z, i, i)
- i = i + 1 -- skip '\n' or '\r'
- local c = sub(z, i, i)
- if (c == "\n" or c == "\r") and (c ~= old) then
- i = i + 1 -- skip '\n\r' or '\r\n'
- old = old..c
- end
- if is_tok then addtoken("TK_EOL", old) end
- ln = ln + 1
- I = i
- return i
-end
-
-----------------------------------------------------------------------
--- initialize lexer for given source _z and source name _sourceid
-----------------------------------------------------------------------
-
-function init(_z, _sourceid)
- z = _z -- source
- sourceid = _sourceid -- name of source
- I = 1 -- lexer's position in source
- ln = 1 -- line number
- tok = {} -- lexed token list*
- seminfo = {} -- lexed semantic information list*
- tokln = {} -- line numbers for messages*
- -- (*) externally visible thru' module
- --------------------------------------------------------------------
- -- initial processing (shbang handling)
- --------------------------------------------------------------------
- local p, _, q, r = find(z, "^(#[^\r\n]*)(\r?\n?)")
- if p then -- skip first line
- I = I + #q
- addtoken("TK_COMMENT", q)
- if #r > 0 then inclinenumber(I, true) end
- end
-end
-
-----------------------------------------------------------------------
--- returns a chunk name or id, no truncation for long names
-----------------------------------------------------------------------
-
-function chunkid()
- if sourceid and match(sourceid, "^[=@]") then
- return sub(sourceid, 2) -- remove first char
- end
- return "[string]"
-end
-
-----------------------------------------------------------------------
--- formats error message and throws error
--- * a simplified version, does not report what token was responsible
-----------------------------------------------------------------------
-
-function errorline(s, line)
- local e = error or base.error
- e(string.format("%s:%d: %s", chunkid(), line or ln, s))
-end
-local errorline = errorline
-
-------------------------------------------------------------------------
--- count separators ("=") in a long string delimiter
-------------------------------------------------------------------------
-
-local function skip_sep(i)
- local sub = sub
- local s = sub(z, i, i)
- i = i + 1
- local count = #match(z, "=*", i) -- note, take the length
- i = i + count
- I = i
- return (sub(z, i, i) == s) and count or (-count) - 1
-end
-
-----------------------------------------------------------------------
--- reads a long string or long comment
-----------------------------------------------------------------------
-
-local function read_long_string(is_str, sep)
- local i = I + 1 -- skip 2nd '['
- local sub = sub
- local c = sub(z, i, i)
- if c == "\r" or c == "\n" then -- string starts with a newline?
- i = inclinenumber(i) -- skip it
- end
- local j = i
- while true do
- local p, q, r = find(z, "([\r\n%]])", i) -- (long range)
- if not p then
- errorline(is_str and "unfinished long string" or
- "unfinished long comment")
- end
- i = p
- if r == "]" then -- delimiter test
- if skip_sep(i) == sep then
- buff = sub(z, buff, I)
- I = I + 1 -- skip 2nd ']'
- return buff
- end
- i = I
- else -- newline
- buff = buff.."\n"
- i = inclinenumber(i)
- end
- end--while
-end
-
-----------------------------------------------------------------------
--- reads a string
-----------------------------------------------------------------------
-
-local function read_string(del)
- local i = I
- local find = find
- local sub = sub
- while true do
- local p, q, r = find(z, "([\n\r\\\"\'])", i) -- (long range)
- if p then
- if r == "\n" or r == "\r" then
- errorline("unfinished string")
- end
- i = p
- if r == "\\" then -- handle escapes
- i = i + 1
- r = sub(z, i, i)
- if r == "" then break end -- (EOZ error)
- p = find("abfnrtv\n\r", r, 1, true)
- ------------------------------------------------------
- if p then -- special escapes
- if p > 7 then
- i = inclinenumber(i)
- else
- i = i + 1
- end
- ------------------------------------------------------
- elseif find(r, "%D") then -- other non-digits
- i = i + 1
- ------------------------------------------------------
- else -- \xxx sequence
- local p, q, s = find(z, "^(%d%d?%d?)", i)
- i = q + 1
- if s + 1 > 256 then -- UCHAR_MAX
- errorline("escape sequence too large")
- end
- ------------------------------------------------------
- end--if p
- else
- i = i + 1
- if r == del then -- ending delimiter
- I = i
- return sub(z, buff, i - 1) -- return string
- end
- end--if r
- else
- break -- (error)
- end--if p
- end--while
- errorline("unfinished string")
-end
-
-------------------------------------------------------------------------
--- main lexer function
-------------------------------------------------------------------------
-
-function llex()
- local find = find
- local match = match
- while true do--outer
- local i = I
- -- inner loop allows break to be used to nicely section tests
- while true do--inner
- ----------------------------------------------------------------
- local p, _, r = find(z, "^([_%a][_%w]*)", i)
- if p then
- I = i + #r
- if kw[r] then
- addtoken("TK_KEYWORD", r) -- reserved word (keyword)
- else
- addtoken("TK_NAME", r) -- identifier
- end
- break -- (continue)
- end
- ----------------------------------------------------------------
- local p, _, r = find(z, "^(%.?)%d", i)
- if p then -- numeral
- if r == "." then i = i + 1 end
- local _, q, r = find(z, "^%d*[%.%d]*([eE]?)", i)
- i = q + 1
- if #r == 1 then -- optional exponent
- if match(z, "^[%+%-]", i) then -- optional sign
- i = i + 1
- end
- end
- local _, q = find(z, "^[_%w]*", i)
- I = q + 1
- local v = sub(z, p, q) -- string equivalent
- if not base.tonumber(v) then -- handles hex test also
- errorline("malformed number")
- end
- addtoken("TK_NUMBER", v)
- break -- (continue)
- end
- ----------------------------------------------------------------
- local p, q, r, t = find(z, "^((%s)[ \t\v\f]*)", i)
- if p then
- if t == "\n" or t == "\r" then -- newline
- inclinenumber(i, true)
- else
- I = q + 1 -- whitespace
- addtoken("TK_SPACE", r)
- end
- break -- (continue)
- end
- ----------------------------------------------------------------
- local r = match(z, "^%p", i)
- if r then
- buff = i
- local p = find("-[\"\'.=<>~", r, 1, true)
- if p then
- -- two-level if block for punctuation/symbols
- --------------------------------------------------------
- if p <= 2 then
- if p == 1 then -- minus
- local c = match(z, "^%-%-(%[?)", i)
- if c then
- i = i + 2
- local sep = -1
- if c == "[" then
- sep = skip_sep(i)
- end
- if sep >= 0 then -- long comment
- addtoken("TK_LCOMMENT", read_long_string(false, sep))
- else -- short comment
- I = find(z, "[\n\r]", i) or (#z + 1)
- addtoken("TK_COMMENT", sub(z, buff, I - 1))
- end
- break -- (continue)
- end
- -- (fall through for "-")
- else -- [ or long string
- local sep = skip_sep(i)
- if sep >= 0 then
- addtoken("TK_LSTRING", read_long_string(true, sep))
- elseif sep == -1 then
- addtoken("TK_OP", "[")
- else
- errorline("invalid long string delimiter")
- end
- break -- (continue)
- end
- --------------------------------------------------------
- elseif p <= 5 then
- if p < 5 then -- strings
- I = i + 1
- addtoken("TK_STRING", read_string(r))
- break -- (continue)
- end
- r = match(z, "^%.%.?%.?", i) -- .|..|... dots
- -- (fall through)
- --------------------------------------------------------
- else -- relational
- r = match(z, "^%p=?", i)
- -- (fall through)
- end
- end
- I = i + #r
- addtoken("TK_OP", r) -- for other symbols, fall through
- break -- (continue)
- end
- ----------------------------------------------------------------
- local r = sub(z, i, i)
- if r ~= "" then
- I = i + 1
- addtoken("TK_OP", r) -- other single-char tokens
- break
- end
- addtoken("TK_EOS", "") -- end of stream,
- return -- exit here
- ----------------------------------------------------------------
- end--while inner
- end--while outer
-end
-
-return base.getfenv()
+++ /dev/null
---[[--------------------------------------------------------------------
-
- lparser.lua: Lua 5.1 parser in Lua
- This file is part of LuaSrcDiet, based on Yueliang material.
-
- Copyright (c) 2008 Kein-Hong Man <khman@users.sf.net>
- The COPYRIGHT file describes the conditions
- under which this software may be distributed.
-
- See the ChangeLog for more information.
-
-----------------------------------------------------------------------]]
-
---[[--------------------------------------------------------------------
--- NOTES:
--- * This is a version of the native 5.1.x parser from Yueliang 0.4.0,
--- with significant modifications to handle LuaSrcDiet's needs:
--- (1) needs pre-built token tables instead of a module.method
--- (2) lparser.error is an optional error handler (from llex)
--- (3) not full parsing, currently fakes raw/unlexed constants
--- (4) parser() returns globalinfo, localinfo tables
--- * Please read technotes.txt for more technical details.
--- * NO support for 'arg' vararg functions (LUA_COMPAT_VARARG)
--- * A lot of the parser is unused, but might later be useful for
--- full-on parsing and analysis for a few measly bytes saved.
-----------------------------------------------------------------------]]
-
-local base = _G
-local string = require "string"
-module "lparser"
-local _G = base.getfenv()
-
---[[--------------------------------------------------------------------
--- variable and data structure initialization
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- initialization: main variables
-----------------------------------------------------------------------
-
-local toklist, -- grammar-only token tables (token table,
- seminfolist, -- semantic information table, line number
- toklnlist, -- table, cross-reference table)
- xreflist,
- tpos, -- token position
-
- line, -- start line # for error messages
- lastln, -- last line # for ambiguous syntax chk
- tok, seminfo, ln, xref, -- token, semantic info, line
- nameref, -- proper position of <name> token
- fs, -- current function state
- top_fs, -- top-level function state
-
- globalinfo, -- global variable information table
- globallookup, -- global variable name lookup table
- localinfo, -- local variable information table
- ilocalinfo, -- inactive locals (prior to activation)
- ilocalrefs -- corresponding references to activate
-
--- forward references for local functions
-local explist1, expr, block, exp1, body, chunk
-
-----------------------------------------------------------------------
--- initialization: data structures
-----------------------------------------------------------------------
-
-local gmatch = string.gmatch
-
-local block_follow = {} -- lookahead check in chunk(), returnstat()
-for v in gmatch("else elseif end until <eof>", "%S+") do
- block_follow[v] = true
-end
-
-local stat_call = {} -- lookup for calls in stat()
-for v in gmatch("if while do for repeat function local return break", "%S+") do
- stat_call[v] = v.."_stat"
-end
-
-local binopr_left = {} -- binary operators, left priority
-local binopr_right = {} -- binary operators, right priority
-for op, lt, rt in gmatch([[
-{+ 6 6}{- 6 6}{* 7 7}{/ 7 7}{% 7 7}
-{^ 10 9}{.. 5 4}
-{~= 3 3}{== 3 3}
-{< 3 3}{<= 3 3}{> 3 3}{>= 3 3}
-{and 2 2}{or 1 1}
-]], "{(%S+)%s(%d+)%s(%d+)}") do
- binopr_left[op] = lt + 0
- binopr_right[op] = rt + 0
-end
-
-local unopr = { ["not"] = true, ["-"] = true,
- ["#"] = true, } -- unary operators
-local UNARY_PRIORITY = 8 -- priority for unary operators
-
---[[--------------------------------------------------------------------
--- support functions
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- formats error message and throws error (duplicated from llex)
--- * a simplified version, does not report what token was responsible
-----------------------------------------------------------------------
-
-local function errorline(s, line)
- local e = error or base.error
- e(string.format("(source):%d: %s", line or ln, s))
-end
-
-----------------------------------------------------------------------
--- handles incoming token, semantic information pairs
--- * NOTE: 'nextt' is named 'next' originally
-----------------------------------------------------------------------
-
--- reads in next token
-local function nextt()
- lastln = toklnlist[tpos]
- tok, seminfo, ln, xref
- = toklist[tpos], seminfolist[tpos], toklnlist[tpos], xreflist[tpos]
- tpos = tpos + 1
-end
-
--- peek at next token (single lookahead for table constructor)
-local function lookahead()
- return toklist[tpos]
-end
-
-----------------------------------------------------------------------
--- throws a syntax error, or if token expected is not there
-----------------------------------------------------------------------
-
-local function syntaxerror(msg)
- local tok = tok
- if tok ~= "<number>" and tok ~= "<string>" then
- if tok == "<name>" then tok = seminfo end
- tok = "'"..tok.."'"
- end
- errorline(msg.." near "..tok)
-end
-
-local function error_expected(token)
- syntaxerror("'"..token.."' expected")
-end
-
-----------------------------------------------------------------------
--- tests for a token, returns outcome
--- * return value changed to boolean
-----------------------------------------------------------------------
-
-local function testnext(c)
- if tok == c then nextt(); return true end
-end
-
-----------------------------------------------------------------------
--- check for existence of a token, throws error if not found
-----------------------------------------------------------------------
-
-local function check(c)
- if tok ~= c then error_expected(c) end
-end
-
-----------------------------------------------------------------------
--- verify existence of a token, then skip it
-----------------------------------------------------------------------
-
-local function checknext(c)
- check(c); nextt()
-end
-
-----------------------------------------------------------------------
--- throws error if condition not matched
-----------------------------------------------------------------------
-
-local function check_condition(c, msg)
- if not c then syntaxerror(msg) end
-end
-
-----------------------------------------------------------------------
--- verifies token conditions are met or else throw error
-----------------------------------------------------------------------
-
-local function check_match(what, who, where)
- if not testnext(what) then
- if where == ln then
- error_expected(what)
- else
- syntaxerror("'"..what.."' expected (to close '"..who.."' at line "..where..")")
- end
- end
-end
-
-----------------------------------------------------------------------
--- expect that token is a name, return the name
-----------------------------------------------------------------------
-
-local function str_checkname()
- check("<name>")
- local ts = seminfo
- nameref = xref
- nextt()
- return ts
-end
-
-----------------------------------------------------------------------
--- adds given string s in string pool, sets e as VK
-----------------------------------------------------------------------
-
-local function codestring(e, s)
- e.k = "VK"
-end
-
-----------------------------------------------------------------------
--- consume a name token, adds it to string pool
-----------------------------------------------------------------------
-
-local function checkname(e)
- codestring(e, str_checkname())
-end
-
---[[--------------------------------------------------------------------
--- variable (global|local|upvalue) handling
--- * to track locals and globals, we can extend Yueliang's minimal
--- variable management code with little trouble
--- * entry point is singlevar() for variable lookups
--- * lookup tables (bl.locallist) are maintained awkwardly in the basic
--- block data structures, PLUS the function data structure (this is
--- an inelegant hack, since bl is nil for the top level of a function)
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- register a local variable, create local variable object, set in
--- to-activate variable list
--- * used in new_localvarliteral(), parlist(), fornum(), forlist(),
--- localfunc(), localstat()
-----------------------------------------------------------------------
-
-local function new_localvar(name, special)
- local bl = fs.bl
- local locallist
- -- locate locallist in current block object or function root object
- if bl then
- locallist = bl.locallist
- else
- locallist = fs.locallist
- end
- -- build local variable information object and set localinfo
- local id = #localinfo + 1
- localinfo[id] = { -- new local variable object
- name = name, -- local variable name
- xref = { nameref }, -- xref, first value is declaration
- decl = nameref, -- location of declaration, = xref[1]
- }
- if special then -- "self" must be not be changed
- localinfo[id].isself = true
- end
- -- this can override a local with the same name in the same scope
- -- but first, keep it inactive until it gets activated
- local i = #ilocalinfo + 1
- ilocalinfo[i] = id
- ilocalrefs[i] = locallist
-end
-
-----------------------------------------------------------------------
--- actually activate the variables so that they are visible
--- * remember Lua semantics, e.g. RHS is evaluated first, then LHS
--- * used in parlist(), forbody(), localfunc(), localstat(), body()
-----------------------------------------------------------------------
-
-local function adjustlocalvars(nvars)
- local sz = #ilocalinfo
- -- i goes from left to right, in order of local allocation, because
- -- of something like: local a,a,a = 1,2,3 which gives a = 3
- while nvars > 0 do
- nvars = nvars - 1
- local i = sz - nvars
- local id = ilocalinfo[i] -- local's id
- local obj = localinfo[id]
- local name = obj.name -- name of local
- obj.act = xref -- set activation location
- ilocalinfo[i] = nil
- local locallist = ilocalrefs[i] -- ref to lookup table to update
- ilocalrefs[i] = nil
- local existing = locallist[name] -- if existing, remove old first!
- if existing then -- do not overlap, set special
- obj = localinfo[existing] -- form of rem, as -id
- obj.rem = -id
- end
- locallist[name] = id -- activate, now visible to Lua
- end
-end
-
-----------------------------------------------------------------------
--- remove (deactivate) variables in current scope (before scope exits)
--- * zap entire locallist tables since we are not allocating registers
--- * used in leaveblock(), close_func()
-----------------------------------------------------------------------
-
-local function removevars()
- local bl = fs.bl
- local locallist
- -- locate locallist in current block object or function root object
- if bl then
- locallist = bl.locallist
- else
- locallist = fs.locallist
- end
- -- enumerate the local list at current scope and deactivate 'em
- for name, id in base.pairs(locallist) do
- local obj = localinfo[id]
- obj.rem = xref -- set deactivation location
- end
-end
-
-----------------------------------------------------------------------
--- creates a new local variable given a name
--- * skips internal locals (those starting with '('), so internal
--- locals never needs a corresponding adjustlocalvars() call
--- * special is true for "self" which must not be optimized
--- * used in fornum(), forlist(), parlist(), body()
-----------------------------------------------------------------------
-
-local function new_localvarliteral(name, special)
- if string.sub(name, 1, 1) == "(" then -- can skip internal locals
- return
- end
- new_localvar(name, special)
-end
-
-----------------------------------------------------------------------
--- search the local variable namespace of the given fs for a match
--- * returns localinfo index
--- * used only in singlevaraux()
-----------------------------------------------------------------------
-
-local function searchvar(fs, n)
- local bl = fs.bl
- local locallist
- if bl then
- locallist = bl.locallist
- while locallist do
- if locallist[n] then return locallist[n] end -- found
- bl = bl.prev
- locallist = bl and bl.locallist
- end
- end
- locallist = fs.locallist
- return locallist[n] or -1 -- found or not found (-1)
-end
-
-----------------------------------------------------------------------
--- handle locals, globals and upvalues and related processing
--- * search mechanism is recursive, calls itself to search parents
--- * used only in singlevar()
-----------------------------------------------------------------------
-
-local function singlevaraux(fs, n, var)
- if fs == nil then -- no more levels?
- var.k = "VGLOBAL" -- default is global variable
- return "VGLOBAL"
- else
- local v = searchvar(fs, n) -- look up at current level
- if v >= 0 then
- var.k = "VLOCAL"
- var.id = v
- -- codegen may need to deal with upvalue here
- return "VLOCAL"
- else -- not found at current level; try upper one
- if singlevaraux(fs.prev, n, var) == "VGLOBAL" then
- return "VGLOBAL"
- end
- -- else was LOCAL or UPVAL, handle here
- var.k = "VUPVAL" -- upvalue in this level
- return "VUPVAL"
- end--if v
- end--if fs
-end
-
-----------------------------------------------------------------------
--- consume a name token, creates a variable (global|local|upvalue)
--- * used in prefixexp(), funcname()
-----------------------------------------------------------------------
-
-local function singlevar(v)
- local name = str_checkname()
- singlevaraux(fs, name, v)
- ------------------------------------------------------------------
- -- variable tracking
- ------------------------------------------------------------------
- if v.k == "VGLOBAL" then
- -- if global being accessed, keep track of it by creating an object
- local id = globallookup[name]
- if not id then
- id = #globalinfo + 1
- globalinfo[id] = { -- new global variable object
- name = name, -- global variable name
- xref = { nameref }, -- xref, first value is declaration
- }
- globallookup[name] = id -- remember it
- else
- local obj = globalinfo[id].xref
- obj[#obj + 1] = nameref -- add xref
- end
- else
- -- local/upvalue is being accessed, keep track of it
- local id = v.id
- local obj = localinfo[id].xref
- obj[#obj + 1] = nameref -- add xref
- end
-end
-
---[[--------------------------------------------------------------------
--- state management functions with open/close pairs
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- enters a code unit, initializes elements
-----------------------------------------------------------------------
-
-local function enterblock(isbreakable)
- local bl = {} -- per-block state
- bl.isbreakable = isbreakable
- bl.prev = fs.bl
- bl.locallist = {}
- fs.bl = bl
-end
-
-----------------------------------------------------------------------
--- leaves a code unit, close any upvalues
-----------------------------------------------------------------------
-
-local function leaveblock()
- local bl = fs.bl
- removevars()
- fs.bl = bl.prev
-end
-
-----------------------------------------------------------------------
--- opening of a function
--- * top_fs is only for anchoring the top fs, so that parser() can
--- return it to the caller function along with useful output
--- * used in parser() and body()
-----------------------------------------------------------------------
-
-local function open_func()
- local new_fs -- per-function state
- if not fs then -- top_fs is created early
- new_fs = top_fs
- else
- new_fs = {}
- end
- new_fs.prev = fs -- linked list of function states
- new_fs.bl = nil
- new_fs.locallist = {}
- fs = new_fs
-end
-
-----------------------------------------------------------------------
--- closing of a function
--- * used in parser() and body()
-----------------------------------------------------------------------
-
-local function close_func()
- removevars()
- fs = fs.prev
-end
-
---[[--------------------------------------------------------------------
--- other parsing functions
--- * for table constructor, parameter list, argument list
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- parse a function name suffix, for function call specifications
--- * used in primaryexp(), funcname()
-----------------------------------------------------------------------
-
-local function field(v)
- -- field -> ['.' | ':'] NAME
- local key = {}
- nextt() -- skip the dot or colon
- checkname(key)
- v.k = "VINDEXED"
-end
-
-----------------------------------------------------------------------
--- parse a table indexing suffix, for constructors, expressions
--- * used in recfield(), primaryexp()
-----------------------------------------------------------------------
-
-local function yindex(v)
- -- index -> '[' expr ']'
- nextt() -- skip the '['
- expr(v)
- checknext("]")
-end
-
-----------------------------------------------------------------------
--- parse a table record (hash) field
--- * used in constructor()
-----------------------------------------------------------------------
-
-local function recfield(cc)
- -- recfield -> (NAME | '['exp1']') = exp1
- local key, val = {}, {}
- if tok == "<name>" then
- checkname(key)
- else-- tok == '['
- yindex(key)
- end
- checknext("=")
- expr(val)
-end
-
-----------------------------------------------------------------------
--- emit a set list instruction if enough elements (LFIELDS_PER_FLUSH)
--- * note: retained in this skeleton because it modifies cc.v.k
--- * used in constructor()
-----------------------------------------------------------------------
-
-local function closelistfield(cc)
- if cc.v.k == "VVOID" then return end -- there is no list item
- cc.v.k = "VVOID"
-end
-
-----------------------------------------------------------------------
--- parse a table list (array) field
--- * used in constructor()
-----------------------------------------------------------------------
-
-local function listfield(cc)
- expr(cc.v)
-end
-
-----------------------------------------------------------------------
--- parse a table constructor
--- * used in funcargs(), simpleexp()
-----------------------------------------------------------------------
-
-local function constructor(t)
- -- constructor -> '{' [ field { fieldsep field } [ fieldsep ] ] '}'
- -- field -> recfield | listfield
- -- fieldsep -> ',' | ';'
- local line = ln
- local cc = {}
- cc.v = {}
- cc.t = t
- t.k = "VRELOCABLE"
- cc.v.k = "VVOID"
- checknext("{")
- repeat
- if tok == "}" then break end
- -- closelistfield(cc) here
- local c = tok
- if c == "<name>" then -- may be listfields or recfields
- if lookahead() ~= "=" then -- look ahead: expression?
- listfield(cc)
- else
- recfield(cc)
- end
- elseif c == "[" then -- constructor_item -> recfield
- recfield(cc)
- else -- constructor_part -> listfield
- listfield(cc)
- end
- until not testnext(",") and not testnext(";")
- check_match("}", "{", line)
- -- lastlistfield(cc) here
-end
-
-----------------------------------------------------------------------
--- parse the arguments (parameters) of a function declaration
--- * used in body()
-----------------------------------------------------------------------
-
-local function parlist()
- -- parlist -> [ param { ',' param } ]
- local nparams = 0
- if tok ~= ")" then -- is 'parlist' not empty?
- repeat
- local c = tok
- if c == "<name>" then -- param -> NAME
- new_localvar(str_checkname())
- nparams = nparams + 1
- elseif c == "..." then
- nextt()
- fs.is_vararg = true
- else
- syntaxerror("<name> or '...' expected")
- end
- until fs.is_vararg or not testnext(",")
- end--if
- adjustlocalvars(nparams)
-end
-
-----------------------------------------------------------------------
--- parse the parameters of a function call
--- * contrast with parlist(), used in function declarations
--- * used in primaryexp()
-----------------------------------------------------------------------
-
-local function funcargs(f)
- local args = {}
- local line = ln
- local c = tok
- if c == "(" then -- funcargs -> '(' [ explist1 ] ')'
- if line ~= lastln then
- syntaxerror("ambiguous syntax (function call x new statement)")
- end
- nextt()
- if tok == ")" then -- arg list is empty?
- args.k = "VVOID"
- else
- explist1(args)
- end
- check_match(")", "(", line)
- elseif c == "{" then -- funcargs -> constructor
- constructor(args)
- elseif c == "<string>" then -- funcargs -> STRING
- codestring(args, seminfo)
- nextt() -- must use 'seminfo' before 'next'
- else
- syntaxerror("function arguments expected")
- return
- end--if c
- f.k = "VCALL"
-end
-
---[[--------------------------------------------------------------------
--- mostly expression functions
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- parses an expression in parentheses or a single variable
--- * used in primaryexp()
-----------------------------------------------------------------------
-
-local function prefixexp(v)
- -- prefixexp -> NAME | '(' expr ')'
- local c = tok
- if c == "(" then
- local line = ln
- nextt()
- expr(v)
- check_match(")", "(", line)
- elseif c == "<name>" then
- singlevar(v)
- else
- syntaxerror("unexpected symbol")
- end--if c
-end
-
-----------------------------------------------------------------------
--- parses a prefixexp (an expression in parentheses or a single
--- variable) or a function call specification
--- * used in simpleexp(), assignment(), expr_stat()
-----------------------------------------------------------------------
-
-local function primaryexp(v)
- -- primaryexp ->
- -- prefixexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs }
- prefixexp(v)
- while true do
- local c = tok
- if c == "." then -- field
- field(v)
- elseif c == "[" then -- '[' exp1 ']'
- local key = {}
- yindex(key)
- elseif c == ":" then -- ':' NAME funcargs
- local key = {}
- nextt()
- checkname(key)
- funcargs(v)
- elseif c == "(" or c == "<string>" or c == "{" then -- funcargs
- funcargs(v)
- else
- return
- end--if c
- end--while
-end
-
-----------------------------------------------------------------------
--- parses general expression types, constants handled here
--- * used in subexpr()
-----------------------------------------------------------------------
-
-local function simpleexp(v)
- -- simpleexp -> NUMBER | STRING | NIL | TRUE | FALSE | ... |
- -- constructor | FUNCTION body | primaryexp
- local c = tok
- if c == "<number>" then
- v.k = "VKNUM"
- elseif c == "<string>" then
- codestring(v, seminfo)
- elseif c == "nil" then
- v.k = "VNIL"
- elseif c == "true" then
- v.k = "VTRUE"
- elseif c == "false" then
- v.k = "VFALSE"
- elseif c == "..." then -- vararg
- check_condition(fs.is_vararg == true,
- "cannot use '...' outside a vararg function");
- v.k = "VVARARG"
- elseif c == "{" then -- constructor
- constructor(v)
- return
- elseif c == "function" then
- nextt()
- body(v, false, ln)
- return
- else
- primaryexp(v)
- return
- end--if c
- nextt()
-end
-
-------------------------------------------------------------------------
--- Parse subexpressions. Includes handling of unary operators and binary
--- operators. A subexpr is given the rhs priority level of the operator
--- immediately left of it, if any (limit is -1 if none,) and if a binop
--- is found, limit is compared with the lhs priority level of the binop
--- in order to determine which executes first.
--- * recursively called
--- * used in expr()
-------------------------------------------------------------------------
-
-local function subexpr(v, limit)
- -- subexpr -> (simpleexp | unop subexpr) { binop subexpr }
- -- * where 'binop' is any binary operator with a priority
- -- higher than 'limit'
- local op = tok
- local uop = unopr[op]
- if uop then
- nextt()
- subexpr(v, UNARY_PRIORITY)
- else
- simpleexp(v)
- end
- -- expand while operators have priorities higher than 'limit'
- op = tok
- local binop = binopr_left[op]
- while binop and binop > limit do
- local v2 = {}
- nextt()
- -- read sub-expression with higher priority
- local nextop = subexpr(v2, binopr_right[op])
- op = nextop
- binop = binopr_left[op]
- end
- return op -- return first untreated operator
-end
-
-----------------------------------------------------------------------
--- Expression parsing starts here. Function subexpr is entered with the
--- left operator (which is non-existent) priority of -1, which is lower
--- than all actual operators. Expr information is returned in parm v.
--- * used in cond(), explist1(), index(), recfield(), listfield(),
--- prefixexp(), while_stat(), exp1()
-----------------------------------------------------------------------
-
--- this is a forward-referenced local
-function expr(v)
- -- expr -> subexpr
- subexpr(v, 0)
-end
-
---[[--------------------------------------------------------------------
--- third level parsing functions
-----------------------------------------------------------------------]]
-
-------------------------------------------------------------------------
--- parse a variable assignment sequence
--- * recursively called
--- * used in expr_stat()
-------------------------------------------------------------------------
-
-local function assignment(v)
- local e = {}
- local c = v.v.k
- check_condition(c == "VLOCAL" or c == "VUPVAL" or c == "VGLOBAL"
- or c == "VINDEXED", "syntax error")
- if testnext(",") then -- assignment -> ',' primaryexp assignment
- local nv = {} -- expdesc
- nv.v = {}
- primaryexp(nv.v)
- -- lparser.c deals with some register usage conflict here
- assignment(nv)
- else -- assignment -> '=' explist1
- checknext("=")
- explist1(e)
- return -- avoid default
- end
- e.k = "VNONRELOC"
-end
-
-----------------------------------------------------------------------
--- parse a for loop body for both versions of the for loop
--- * used in fornum(), forlist()
-----------------------------------------------------------------------
-
-local function forbody(nvars, isnum)
- -- forbody -> DO block
- checknext("do")
- enterblock(false) -- scope for declared variables
- adjustlocalvars(nvars)
- block()
- leaveblock() -- end of scope for declared variables
-end
-
-----------------------------------------------------------------------
--- parse a numerical for loop, calls forbody()
--- * used in for_stat()
-----------------------------------------------------------------------
-
-local function fornum(varname)
- -- fornum -> NAME = exp1, exp1 [, exp1] DO body
- local line = line
- new_localvarliteral("(for index)")
- new_localvarliteral("(for limit)")
- new_localvarliteral("(for step)")
- new_localvar(varname)
- checknext("=")
- exp1() -- initial value
- checknext(",")
- exp1() -- limit
- if testnext(",") then
- exp1() -- optional step
- else
- -- default step = 1
- end
- forbody(1, true)
-end
-
-----------------------------------------------------------------------
--- parse a generic for loop, calls forbody()
--- * used in for_stat()
-----------------------------------------------------------------------
-
-local function forlist(indexname)
- -- forlist -> NAME {, NAME} IN explist1 DO body
- local e = {}
- -- create control variables
- new_localvarliteral("(for generator)")
- new_localvarliteral("(for state)")
- new_localvarliteral("(for control)")
- -- create declared variables
- new_localvar(indexname)
- local nvars = 1
- while testnext(",") do
- new_localvar(str_checkname())
- nvars = nvars + 1
- end
- checknext("in")
- local line = line
- explist1(e)
- forbody(nvars, false)
-end
-
-----------------------------------------------------------------------
--- parse a function name specification
--- * used in func_stat()
-----------------------------------------------------------------------
-
-local function funcname(v)
- -- funcname -> NAME {field} [':' NAME]
- local needself = false
- singlevar(v)
- while tok == "." do
- field(v)
- end
- if tok == ":" then
- needself = true
- field(v)
- end
- return needself
-end
-
-----------------------------------------------------------------------
--- parse the single expressions needed in numerical for loops
--- * used in fornum()
-----------------------------------------------------------------------
-
--- this is a forward-referenced local
-function exp1()
- -- exp1 -> expr
- local e = {}
- expr(e)
-end
-
-----------------------------------------------------------------------
--- parse condition in a repeat statement or an if control structure
--- * used in repeat_stat(), test_then_block()
-----------------------------------------------------------------------
-
-local function cond()
- -- cond -> expr
- local v = {}
- expr(v) -- read condition
-end
-
-----------------------------------------------------------------------
--- parse part of an if control structure, including the condition
--- * used in if_stat()
-----------------------------------------------------------------------
-
-local function test_then_block()
- -- test_then_block -> [IF | ELSEIF] cond THEN block
- nextt() -- skip IF or ELSEIF
- cond()
- checknext("then")
- block() -- 'then' part
-end
-
-----------------------------------------------------------------------
--- parse a local function statement
--- * used in local_stat()
-----------------------------------------------------------------------
-
-local function localfunc()
- -- localfunc -> NAME body
- local v, b = {}
- new_localvar(str_checkname())
- v.k = "VLOCAL"
- adjustlocalvars(1)
- body(b, false, ln)
-end
-
-----------------------------------------------------------------------
--- parse a local variable declaration statement
--- * used in local_stat()
-----------------------------------------------------------------------
-
-local function localstat()
- -- localstat -> NAME {',' NAME} ['=' explist1]
- local nvars = 0
- local e = {}
- repeat
- new_localvar(str_checkname())
- nvars = nvars + 1
- until not testnext(",")
- if testnext("=") then
- explist1(e)
- else
- e.k = "VVOID"
- end
- adjustlocalvars(nvars)
-end
-
-----------------------------------------------------------------------
--- parse a list of comma-separated expressions
--- * used in return_stat(), localstat(), funcargs(), assignment(),
--- forlist()
-----------------------------------------------------------------------
-
--- this is a forward-referenced local
-function explist1(e)
- -- explist1 -> expr { ',' expr }
- expr(e)
- while testnext(",") do
- expr(e)
- end
-end
-
-----------------------------------------------------------------------
--- parse function declaration body
--- * used in simpleexp(), localfunc(), func_stat()
-----------------------------------------------------------------------
-
--- this is a forward-referenced local
-function body(e, needself, line)
- -- body -> '(' parlist ')' chunk END
- open_func()
- checknext("(")
- if needself then
- new_localvarliteral("self", true)
- adjustlocalvars(1)
- end
- parlist()
- checknext(")")
- chunk()
- check_match("end", "function", line)
- close_func()
-end
-
-----------------------------------------------------------------------
--- parse a code block or unit
--- * used in do_stat(), while_stat(), forbody(), test_then_block(),
--- if_stat()
-----------------------------------------------------------------------
-
--- this is a forward-referenced local
-function block()
- -- block -> chunk
- enterblock(false)
- chunk()
- leaveblock()
-end
-
---[[--------------------------------------------------------------------
--- second level parsing functions, all with '_stat' suffix
--- * since they are called via a table lookup, they cannot be local
--- functions (a lookup table of local functions might be smaller...)
--- * stat() -> *_stat()
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- initial parsing for a for loop, calls fornum() or forlist()
--- * removed 'line' parameter (used to set debug information only)
--- * used in stat()
-----------------------------------------------------------------------
-
-function for_stat()
- -- stat -> for_stat -> FOR (fornum | forlist) END
- local line = line
- enterblock(true) -- scope for loop and control variables
- nextt() -- skip 'for'
- local varname = str_checkname() -- first variable name
- local c = tok
- if c == "=" then
- fornum(varname)
- elseif c == "," or c == "in" then
- forlist(varname)
- else
- syntaxerror("'=' or 'in' expected")
- end
- check_match("end", "for", line)
- leaveblock() -- loop scope (`break' jumps to this point)
-end
-
-----------------------------------------------------------------------
--- parse a while-do control structure, body processed by block()
--- * used in stat()
-----------------------------------------------------------------------
-
-function while_stat()
- -- stat -> while_stat -> WHILE cond DO block END
- local line = line
- nextt() -- skip WHILE
- cond() -- parse condition
- enterblock(true)
- checknext("do")
- block()
- check_match("end", "while", line)
- leaveblock()
-end
-
-----------------------------------------------------------------------
--- parse a repeat-until control structure, body parsed by chunk()
--- * originally, repeatstat() calls breakstat() too if there is an
--- upvalue in the scope block; nothing is actually lexed, it is
--- actually the common code in breakstat() for closing of upvalues
--- * used in stat()
-----------------------------------------------------------------------
-
-function repeat_stat()
- -- stat -> repeat_stat -> REPEAT block UNTIL cond
- local line = line
- enterblock(true) -- loop block
- enterblock(false) -- scope block
- nextt() -- skip REPEAT
- chunk()
- check_match("until", "repeat", line)
- cond()
- -- close upvalues at scope level below
- leaveblock() -- finish scope
- leaveblock() -- finish loop
-end
-
-----------------------------------------------------------------------
--- parse an if control structure
--- * used in stat()
-----------------------------------------------------------------------
-
-function if_stat()
- -- stat -> if_stat -> IF cond THEN block
- -- {ELSEIF cond THEN block} [ELSE block] END
- local line = line
- local v = {}
- test_then_block() -- IF cond THEN block
- while tok == "elseif" do
- test_then_block() -- ELSEIF cond THEN block
- end
- if tok == "else" then
- nextt() -- skip ELSE
- block() -- 'else' part
- end
- check_match("end", "if", line)
-end
-
-----------------------------------------------------------------------
--- parse a return statement
--- * used in stat()
-----------------------------------------------------------------------
-
-function return_stat()
- -- stat -> return_stat -> RETURN explist
- local e = {}
- nextt() -- skip RETURN
- local c = tok
- if block_follow[c] or c == ";" then
- -- return no values
- else
- explist1(e) -- optional return values
- end
-end
-
-----------------------------------------------------------------------
--- parse a break statement
--- * used in stat()
-----------------------------------------------------------------------
-
-function break_stat()
- -- stat -> break_stat -> BREAK
- local bl = fs.bl
- nextt() -- skip BREAK
- while bl and not bl.isbreakable do -- find a breakable block
- bl = bl.prev
- end
- if not bl then
- syntaxerror("no loop to break")
- end
-end
-
-----------------------------------------------------------------------
--- parse a function call with no returns or an assignment statement
--- * the struct with .prev is used for name searching in lparse.c,
--- so it is retained for now; present in assignment() also
--- * used in stat()
-----------------------------------------------------------------------
-
-function expr_stat()
- -- stat -> expr_stat -> func | assignment
- local v = {}
- v.v = {}
- primaryexp(v.v)
- if v.v.k == "VCALL" then -- stat -> func
- -- call statement uses no results
- else -- stat -> assignment
- v.prev = nil
- assignment(v)
- end
-end
-
-----------------------------------------------------------------------
--- parse a function statement
--- * used in stat()
-----------------------------------------------------------------------
-
-function function_stat()
- -- stat -> function_stat -> FUNCTION funcname body
- local line = line
- local v, b = {}, {}
- nextt() -- skip FUNCTION
- local needself = funcname(v)
- body(b, needself, line)
-end
-
-----------------------------------------------------------------------
--- parse a simple block enclosed by a DO..END pair
--- * used in stat()
-----------------------------------------------------------------------
-
-function do_stat()
- -- stat -> do_stat -> DO block END
- local line = line
- nextt() -- skip DO
- block()
- check_match("end", "do", line)
-end
-
-----------------------------------------------------------------------
--- parse a statement starting with LOCAL
--- * used in stat()
-----------------------------------------------------------------------
-
-function local_stat()
- -- stat -> local_stat -> LOCAL FUNCTION localfunc
- -- -> LOCAL localstat
- nextt() -- skip LOCAL
- if testnext("function") then -- local function?
- localfunc()
- else
- localstat()
- end
-end
-
---[[--------------------------------------------------------------------
--- main functions, top level parsing functions
--- * accessible functions are: init(lexer), parser()
--- * [entry] -> parser() -> chunk() -> stat()
-----------------------------------------------------------------------]]
-
-----------------------------------------------------------------------
--- initial parsing for statements, calls '_stat' suffixed functions
--- * used in chunk()
-----------------------------------------------------------------------
-
-local function stat()
- -- stat -> if_stat while_stat do_stat for_stat repeat_stat
- -- function_stat local_stat return_stat break_stat
- -- expr_stat
- line = ln -- may be needed for error messages
- local c = tok
- local fn = stat_call[c]
- -- handles: if while do for repeat function local return break
- if fn then
- _G[fn]()
- -- return or break must be last statement
- if c == "return" or c == "break" then return true end
- else
- expr_stat()
- end
- return false
-end
-
-----------------------------------------------------------------------
--- parse a chunk, which consists of a bunch of statements
--- * used in parser(), body(), block(), repeat_stat()
-----------------------------------------------------------------------
-
--- this is a forward-referenced local
-function chunk()
- -- chunk -> { stat [';'] }
- local islast = false
- while not islast and not block_follow[tok] do
- islast = stat()
- testnext(";")
- end
-end
-
-----------------------------------------------------------------------
--- performs parsing, returns parsed data structure
-----------------------------------------------------------------------
-
-function parser()
- open_func()
- fs.is_vararg = true -- main func. is always vararg
- nextt() -- read first token
- chunk()
- check("<eof>")
- close_func()
- return globalinfo, localinfo
-end
-
-----------------------------------------------------------------------
--- initialization function
-----------------------------------------------------------------------
-
-function init(tokorig, seminfoorig, toklnorig)
- tpos = 1 -- token position
- top_fs = {} -- reset top level function state
- ------------------------------------------------------------------
- -- set up grammar-only token tables; impedance-matching...
- -- note that constants returned by the lexer is source-level, so
- -- for now, fake(!) constant tokens (TK_NUMBER|TK_STRING|TK_LSTRING)
- ------------------------------------------------------------------
- local j = 1
- toklist, seminfolist, toklnlist, xreflist = {}, {}, {}, {}
- for i = 1, #tokorig do
- local tok = tokorig[i]
- local yep = true
- if tok == "TK_KEYWORD" or tok == "TK_OP" then
- tok = seminfoorig[i]
- elseif tok == "TK_NAME" then
- tok = "<name>"
- seminfolist[j] = seminfoorig[i]
- elseif tok == "TK_NUMBER" then
- tok = "<number>"
- seminfolist[j] = 0 -- fake!
- elseif tok == "TK_STRING" or tok == "TK_LSTRING" then
- tok = "<string>"
- seminfolist[j] = "" -- fake!
- elseif tok == "TK_EOS" then
- tok = "<eof>"
- else
- -- non-grammar tokens; ignore them
- yep = false
- end
- if yep then -- set rest of the information
- toklist[j] = tok
- toklnlist[j] = toklnorig[i]
- xreflist[j] = i
- j = j + 1
- end
- end--for
- ------------------------------------------------------------------
- -- initialize data structures for variable tracking
- ------------------------------------------------------------------
- globalinfo, globallookup, localinfo = {}, {}, {}
- ilocalinfo, ilocalrefs = {}, {}
-end
-
-return _G
+++ /dev/null
---[[--------------------------------------------------------------------
-
- optlex.lua: does lexer-based optimizations
- This file is part of LuaSrcDiet.
-
- Copyright (c) 2008 Kein-Hong Man <khman@users.sf.net>
- The COPYRIGHT file describes the conditions
- under which this software may be distributed.
-
- See the ChangeLog for more information.
-
-----------------------------------------------------------------------]]
-
---[[--------------------------------------------------------------------
--- NOTES:
--- * For more lexer-based optimization ideas, see the TODO items or
--- look at technotes.txt.
--- * TODO: general string delimiter conversion optimizer
--- * TODO: (numbers) warn if overly significant digit
-----------------------------------------------------------------------]]
-
-local base = _G
-local string = require "string"
-module "optlex"
-local match = string.match
-local sub = string.sub
-local find = string.find
-local rep = string.rep
-local print
-
-------------------------------------------------------------------------
--- variables and data structures
-------------------------------------------------------------------------
-
--- error function, can override by setting own function into module
-error = base.error
-
-warn = {} -- table for warning flags
-
-local stoks, sinfos, stoklns -- source lists
-
-local is_realtoken = { -- significant (grammar) tokens
- TK_KEYWORD = true,
- TK_NAME = true,
- TK_NUMBER = true,
- TK_STRING = true,
- TK_LSTRING = true,
- TK_OP = true,
- TK_EOS = true,
-}
-local is_faketoken = { -- whitespace (non-grammar) tokens
- TK_COMMENT = true,
- TK_LCOMMENT = true,
- TK_EOL = true,
- TK_SPACE = true,
-}
-
-local opt_details -- for extra information
-
-------------------------------------------------------------------------
--- true if current token is at the start of a line
--- * skips over deleted tokens via recursion
-------------------------------------------------------------------------
-
-local function atlinestart(i)
- local tok = stoks[i - 1]
- if i <= 1 or tok == "TK_EOL" then
- return true
- elseif tok == "" then
- return atlinestart(i - 1)
- end
- return false
-end
-
-------------------------------------------------------------------------
--- true if current token is at the end of a line
--- * skips over deleted tokens via recursion
-------------------------------------------------------------------------
-
-local function atlineend(i)
- local tok = stoks[i + 1]
- if i >= #stoks or tok == "TK_EOL" or tok == "TK_EOS" then
- return true
- elseif tok == "" then
- return atlineend(i + 1)
- end
- return false
-end
-
-------------------------------------------------------------------------
--- counts comment EOLs inside a long comment
--- * in order to keep line numbering, EOLs need to be reinserted
-------------------------------------------------------------------------
-
-local function commenteols(lcomment)
- local sep = #match(lcomment, "^%-%-%[=*%[")
- local z = sub(lcomment, sep + 1, -(sep - 1)) -- remove delims
- local i, c = 1, 0
- while true do
- local p, q, r, s = find(z, "([\r\n])([\r\n]?)", i)
- if not p then break end -- if no matches, done
- i = p + 1
- c = c + 1
- if #s > 0 and r ~= s then -- skip CRLF or LFCR
- i = i + 1
- end
- end
- return c
-end
-
-------------------------------------------------------------------------
--- compares two tokens (i, j) and returns the whitespace required
--- * important! see technotes.txt for more information
--- * only two grammar/real tokens are being considered
--- * if "", no separation is needed
--- * if " ", then at least one whitespace (or EOL) is required
-------------------------------------------------------------------------
-
-local function checkpair(i, j)
- local match = match
- local t1, t2 = stoks[i], stoks[j]
- --------------------------------------------------------------------
- if t1 == "TK_STRING" or t1 == "TK_LSTRING" or
- t2 == "TK_STRING" or t2 == "TK_LSTRING" then
- return ""
- --------------------------------------------------------------------
- elseif t1 == "TK_OP" or t2 == "TK_OP" then
- if (t1 == "TK_OP" and (t2 == "TK_KEYWORD" or t2 == "TK_NAME")) or
- (t2 == "TK_OP" and (t1 == "TK_KEYWORD" or t1 == "TK_NAME")) then
- return ""
- end
- if t1 == "TK_OP" and t2 == "TK_OP" then
- -- for TK_OP/TK_OP pairs, see notes in technotes.txt
- local op, op2 = sinfos[i], sinfos[j]
- if (match(op, "^%.%.?$") and match(op2, "^%.")) or
- (match(op, "^[~=<>]$") and op2 == "=") or
- (op == "[" and (op2 == "[" or op2 == "=")) then
- return " "
- end
- return ""
- end
- -- "TK_OP" + "TK_NUMBER" case
- local op = sinfos[i]
- if t2 == "TK_OP" then op = sinfos[j] end
- if match(op, "^%.%.?%.?$") then
- return " "
- end
- return ""
- --------------------------------------------------------------------
- else-- "TK_KEYWORD" | "TK_NAME" | "TK_NUMBER" then
- return " "
- --------------------------------------------------------------------
- end
-end
-
-------------------------------------------------------------------------
--- repack tokens, removing deletions caused by optimization process
-------------------------------------------------------------------------
-
-local function repack_tokens()
- local dtoks, dinfos, dtoklns = {}, {}, {}
- local j = 1
- for i = 1, #stoks do
- local tok = stoks[i]
- if tok ~= "" then
- dtoks[j], dinfos[j], dtoklns[j] = tok, sinfos[i], stoklns[i]
- j = j + 1
- end
- end
- stoks, sinfos, stoklns = dtoks, dinfos, dtoklns
-end
-
-------------------------------------------------------------------------
--- number optimization
--- * optimization using string formatting functions is one way of doing
--- this, but here, we consider all cases and handle them separately
--- (possibly an idiotic approach...)
--- * scientific notation being generated is not in canonical form, this
--- may or may not be a bad thing, feedback welcome
--- * note: intermediate portions need to fit into a normal number range
--- * optimizations can be divided based on number patterns:
--- * hexadecimal:
--- (1) no need to remove leading zeros, just skip to (2)
--- (2) convert to integer if size equal or smaller
--- * change if equal size -> lose the 'x' to reduce entropy
--- (3) number is then processed as an integer
--- (4) note: does not make 0[xX] consistent
--- * integer:
--- (1) note: includes anything with trailing ".", ".0", ...
--- (2) remove useless fractional part, if present, e.g. 123.000
--- (3) remove leading zeros, e.g. 000123
--- (4) switch to scientific if shorter, e.g. 123000 -> 123e3
--- * with fraction:
--- (1) split into digits dot digits
--- (2) if no integer portion, take as zero (can omit later)
--- (3) handle degenerate .000 case, after which the fractional part
--- must be non-zero (if zero, it's matched as an integer)
--- (4) remove trailing zeros for fractional portion
--- (5) p.q where p > 0 and q > 0 cannot be shortened any more
--- (6) otherwise p == 0 and the form is .q, e.g. .000123
--- (7) if scientific shorter, convert, e.g. .000123 -> 123e-6
--- * scientific:
--- (1) split into (digits dot digits) [eE] ([+-] digits)
--- (2) if significand has ".", shift it out so it becomes an integer
--- (3) if significand is zero, just use zero
--- (4) remove leading zeros for significand
--- (5) shift out trailing zeros for significand
--- (6) examine exponent and determine which format is best:
--- integer, with fraction, scientific
-------------------------------------------------------------------------
-
-local function do_number(i)
- local before = sinfos[i] -- 'before'
- local z = before -- working representation
- local y -- 'after', if better
- --------------------------------------------------------------------
- if match(z, "^0[xX]") then -- hexadecimal number
- local v = base.tostring(base.tonumber(z))
- if #v <= #z then
- z = v -- change to integer, AND continue
- else
- return -- no change; stick to hex
- end
- end
- --------------------------------------------------------------------
- if match(z, "^%d+%.?0*$") then -- integer or has useless frac
- z = match(z, "^(%d+)%.?0*$") -- int portion only
- if z + 0 > 0 then
- z = match(z, "^0*([1-9]%d*)$") -- remove leading zeros
- local v = #match(z, "0*$")
- local nv = base.tostring(v)
- if v > #nv + 1 then -- scientific is shorter
- z = sub(z, 1, #z - v).."e"..nv
- end
- y = z
- else
- y = "0" -- basic zero
- end
- --------------------------------------------------------------------
- elseif not match(z, "[eE]") then -- number with fraction part
- local p, q = match(z, "^(%d*)%.(%d+)$") -- split
- if p == "" then p = 0 end -- int part zero
- if q + 0 == 0 and p == 0 then
- y = "0" -- degenerate .000 case
- else
- -- now, q > 0 holds and p is a number
- local v = #match(q, "0*$") -- remove trailing zeros
- if v > 0 then
- q = sub(q, 1, #q - v)
- end
- -- if p > 0, nothing else we can do to simplify p.q case
- if p + 0 > 0 then
- y = p.."."..q
- else
- y = "."..q -- tentative, e.g. .000123
- local v = #match(q, "^0*") -- # leading spaces
- local w = #q - v -- # significant digits
- local nv = base.tostring(#q)
- -- e.g. compare 123e-6 versus .000123
- if w + 2 + #nv < 1 + #q then
- y = sub(q, -w).."e-"..nv
- end
- end
- end
- --------------------------------------------------------------------
- else -- scientific number
- local sig, ex = match(z, "^([^eE]+)[eE]([%+%-]?%d+)$")
- ex = base.tonumber(ex)
- -- if got ".", shift out fractional portion of significand
- local p, q = match(sig, "^(%d*)%.(%d*)$")
- if p then
- ex = ex - #q
- sig = p..q
- end
- if sig + 0 == 0 then
- y = "0" -- basic zero
- else
- local v = #match(sig, "^0*") -- remove leading zeros
- sig = sub(sig, v + 1)
- v = #match(sig, "0*$") -- shift out trailing zeros
- if v > 0 then
- sig = sub(sig, 1, #sig - v)
- ex = ex + v
- end
- -- examine exponent and determine which format is best
- local nex = base.tostring(ex)
- if ex == 0 then -- it's just an integer
- y = sig
- elseif ex > 0 and (ex <= 1 + #nex) then -- a number
- y = sig..rep("0", ex)
- elseif ex < 0 and (ex >= -#sig) then -- fraction, e.g. .123
- v = #sig + ex
- y = sub(sig, 1, v).."."..sub(sig, v + 1)
- elseif ex < 0 and (#nex >= -ex - #sig) then
- -- e.g. compare 1234e-5 versus .01234
- -- gives: #sig + 1 + #nex >= 1 + (-ex - #sig) + #sig
- -- -> #nex >= -ex - #sig
- v = -ex - #sig
- y = "."..rep("0", v)..sig
- else -- non-canonical scientific representation
- y = sig.."e"..ex
- end
- end--if sig
- end
- --------------------------------------------------------------------
- if y and y ~= sinfos[i] then
- if opt_details then
- print("<number> (line "..stoklns[i]..") "..sinfos[i].." -> "..y)
- opt_details = opt_details + 1
- end
- sinfos[i] = y
- end
-end
-
-------------------------------------------------------------------------
--- string optimization
--- * note: works on well-formed strings only!
--- * optimizations on characters can be summarized as follows:
--- \a\b\f\n\r\t\v -- no change
--- \\ -- no change
--- \"\' -- depends on delim, other can remove \
--- \[\] -- remove \
--- \<char> -- general escape, remove \
--- \<eol> -- normalize the EOL only
--- \ddd -- if \a\b\f\n\r\t\v, change to latter
--- if other < ascii 32, keep ddd but zap leading zeros
--- if >= ascii 32, translate it into the literal, then also
--- do escapes for \\,\",\' cases
--- <other> -- no change
--- * switch delimiters if string becomes shorter
-------------------------------------------------------------------------
-
-local function do_string(I)
- local info = sinfos[I]
- local delim = sub(info, 1, 1) -- delimiter used
- local ndelim = (delim == "'") and '"' or "'" -- opposite " <-> '
- local z = sub(info, 2, -2) -- actual string
- local i = 1
- local c_delim, c_ndelim = 0, 0 -- "/' counts
- --------------------------------------------------------------------
- while i <= #z do
- local c = sub(z, i, i)
- ----------------------------------------------------------------
- if c == "\\" then -- escaped stuff
- local j = i + 1
- local d = sub(z, j, j)
- local p = find("abfnrtv\\\n\r\"\'0123456789", d, 1, true)
- ------------------------------------------------------------
- if not p then -- \<char> -- remove \
- z = sub(z, 1, i - 1)..sub(z, j)
- i = i + 1
- ------------------------------------------------------------
- elseif p <= 8 then -- \a\b\f\n\r\t\v\\
- i = i + 2 -- no change
- ------------------------------------------------------------
- elseif p <= 10 then -- \<eol> -- normalize EOL
- local eol = sub(z, j, j + 1)
- if eol == "\r\n" or eol == "\n\r" then
- z = sub(z, 1, i).."\n"..sub(z, j + 2)
- elseif p == 10 then -- \r case
- z = sub(z, 1, i).."\n"..sub(z, j + 1)
- end
- i = i + 2
- ------------------------------------------------------------
- elseif p <= 12 then -- \"\' -- remove \ for ndelim
- if d == delim then
- c_delim = c_delim + 1
- i = i + 2
- else
- c_ndelim = c_ndelim + 1
- z = sub(z, 1, i - 1)..sub(z, j)
- i = i + 1
- end
- ------------------------------------------------------------
- else -- \ddd -- various steps
- local s = match(z, "^(%d%d?%d?)", j)
- j = i + 1 + #s -- skip to location
- local cv = s + 0
- local cc = string.char(cv)
- local p = find("\a\b\f\n\r\t\v", cc, 1, true)
- if p then -- special escapes
- s = "\\"..sub("abfnrtv", p, p)
- elseif cv < 32 then -- normalized \ddd
- s = "\\"..cv
- elseif cc == delim then -- \<delim>
- s = "\\"..cc
- c_delim = c_delim + 1
- elseif cc == "\\" then -- \\
- s = "\\\\"
- else -- literal character
- s = cc
- if cc == ndelim then
- c_ndelim = c_ndelim + 1
- end
- end
- z = sub(z, 1, i - 1)..s..sub(z, j)
- i = i + #s
- ------------------------------------------------------------
- end--if p
- ----------------------------------------------------------------
- else-- c ~= "\\" -- <other> -- no change
- i = i + 1
- if c == ndelim then -- count ndelim, for switching delimiters
- c_ndelim = c_ndelim + 1
- end
- ----------------------------------------------------------------
- end--if c
- end--while
- --------------------------------------------------------------------
- -- switching delimiters, a long-winded derivation:
- -- (1) delim takes 2+2*c_delim bytes, ndelim takes c_ndelim bytes
- -- (2) delim becomes c_delim bytes, ndelim becomes 2+2*c_ndelim bytes
- -- simplifying the condition (1)>(2) --> c_delim > c_ndelim
- if c_delim > c_ndelim then
- i = 1
- while i <= #z do
- local p, q, r = find(z, "([\'\"])", i)
- if not p then break end
- if r == delim then -- \<delim> -> <delim>
- z = sub(z, 1, p - 2)..sub(z, p)
- i = p
- else-- r == ndelim -- <ndelim> -> \<ndelim>
- z = sub(z, 1, p - 1).."\\"..sub(z, p)
- i = p + 2
- end
- end--while
- delim = ndelim -- actually change delimiters
- end
- --------------------------------------------------------------------
- z = delim..z..delim
- if z ~= sinfos[I] then
- if opt_details then
- print("<string> (line "..stoklns[I]..") "..sinfos[I].." -> "..z)
- opt_details = opt_details + 1
- end
- sinfos[I] = z
- end
-end
-
-------------------------------------------------------------------------
--- long string optimization
--- * note: warning flagged if trailing whitespace found, not trimmed
--- * remove first optional newline
--- * normalize embedded newlines
--- * reduce '=' separators in delimiters if possible
-------------------------------------------------------------------------
-
-local function do_lstring(I)
- local info = sinfos[I]
- local delim1 = match(info, "^%[=*%[") -- cut out delimiters
- local sep = #delim1
- local delim2 = sub(info, -sep, -1)
- local z = sub(info, sep + 1, -(sep + 1)) -- lstring without delims
- local y = ""
- local i = 1
- --------------------------------------------------------------------
- while true do
- local p, q, r, s = find(z, "([\r\n])([\r\n]?)", i)
- -- deal with a single line
- local ln
- if not p then
- ln = sub(z, i)
- elseif p >= i then
- ln = sub(z, i, p - 1)
- end
- if ln ~= "" then
- -- flag a warning if there are trailing spaces, won't optimize!
- if match(ln, "%s+$") then
- warn.lstring = "trailing whitespace in long string near line "..stoklns[I]
- end
- y = y..ln
- end
- if not p then -- done if no more EOLs
- break
- end
- -- deal with line endings, normalize them
- i = p + 1
- if p then
- if #s > 0 and r ~= s then -- skip CRLF or LFCR
- i = i + 1
- end
- -- skip first newline, which can be safely deleted
- if not(i == 1 and i == p) then
- y = y.."\n"
- end
- end
- end--while
- --------------------------------------------------------------------
- -- handle possible deletion of one or more '=' separators
- if sep >= 3 then
- local chk, okay = sep - 1
- -- loop to test ending delimiter with less of '=' down to zero
- while chk >= 2 do
- local delim = "%]"..rep("=", chk - 2).."%]"
- if not match(y, delim) then okay = chk end
- chk = chk - 1
- end
- if okay then -- change delimiters
- sep = rep("=", okay - 2)
- delim1, delim2 = "["..sep.."[", "]"..sep.."]"
- end
- end
- --------------------------------------------------------------------
- sinfos[I] = delim1..y..delim2
-end
-
-------------------------------------------------------------------------
--- long comment optimization
--- * note: does not remove first optional newline
--- * trim trailing whitespace
--- * normalize embedded newlines
--- * reduce '=' separators in delimiters if possible
-------------------------------------------------------------------------
-
-local function do_lcomment(I)
- local info = sinfos[I]
- local delim1 = match(info, "^%-%-%[=*%[") -- cut out delimiters
- local sep = #delim1
- local delim2 = sub(info, -sep, -1)
- local z = sub(info, sep + 1, -(sep - 1)) -- comment without delims
- local y = ""
- local i = 1
- --------------------------------------------------------------------
- while true do
- local p, q, r, s = find(z, "([\r\n])([\r\n]?)", i)
- -- deal with a single line, extract and check trailing whitespace
- local ln
- if not p then
- ln = sub(z, i)
- elseif p >= i then
- ln = sub(z, i, p - 1)
- end
- if ln ~= "" then
- -- trim trailing whitespace if non-empty line
- local ws = match(ln, "%s*$")
- if #ws > 0 then ln = sub(ln, 1, -(ws + 1)) end
- y = y..ln
- end
- if not p then -- done if no more EOLs
- break
- end
- -- deal with line endings, normalize them
- i = p + 1
- if p then
- if #s > 0 and r ~= s then -- skip CRLF or LFCR
- i = i + 1
- end
- y = y.."\n"
- end
- end--while
- --------------------------------------------------------------------
- -- handle possible deletion of one or more '=' separators
- sep = sep - 2
- if sep >= 3 then
- local chk, okay = sep - 1
- -- loop to test ending delimiter with less of '=' down to zero
- while chk >= 2 do
- local delim = "%]"..rep("=", chk - 2).."%]"
- if not match(y, delim) then okay = chk end
- chk = chk - 1
- end
- if okay then -- change delimiters
- sep = rep("=", okay - 2)
- delim1, delim2 = "--["..sep.."[", "]"..sep.."]"
- end
- end
- --------------------------------------------------------------------
- sinfos[I] = delim1..y..delim2
-end
-
-------------------------------------------------------------------------
--- short comment optimization
--- * trim trailing whitespace
-------------------------------------------------------------------------
-
-local function do_comment(i)
- local info = sinfos[i]
- local ws = match(info, "%s*$") -- just look from end of string
- if #ws > 0 then
- info = sub(info, 1, -(ws + 1)) -- trim trailing whitespace
- end
- sinfos[i] = info
-end
-
-------------------------------------------------------------------------
--- returns true if string found in long comment
--- * this is a feature to keep copyright or license texts
-------------------------------------------------------------------------
-
-local function keep_lcomment(opt_keep, info)
- if not opt_keep then return false end -- option not set
- local delim1 = match(info, "^%-%-%[=*%[") -- cut out delimiters
- local sep = #delim1
- local delim2 = sub(info, -sep, -1)
- local z = sub(info, sep + 1, -(sep - 1)) -- comment without delims
- if find(z, opt_keep, 1, true) then -- try to match
- return true
- end
-end
-
-------------------------------------------------------------------------
--- main entry point
--- * currently, lexer processing has 2 passes
--- * processing is done on a line-oriented basis, which is easier to
--- grok due to the next point...
--- * since there are various options that can be enabled or disabled,
--- processing is a little messy or convoluted
-------------------------------------------------------------------------
-
-function optimize(option, toklist, semlist, toklnlist)
- --------------------------------------------------------------------
- -- set option flags
- --------------------------------------------------------------------
- local opt_comments = option["opt-comments"]
- local opt_whitespace = option["opt-whitespace"]
- local opt_emptylines = option["opt-emptylines"]
- local opt_eols = option["opt-eols"]
- local opt_strings = option["opt-strings"]
- local opt_numbers = option["opt-numbers"]
- local opt_keep = option.KEEP
- opt_details = option.DETAILS and 0 -- upvalues for details display
- print = print or base.print
- if opt_eols then -- forced settings, otherwise won't work properly
- opt_comments = true
- opt_whitespace = true
- opt_emptylines = true
- end
- --------------------------------------------------------------------
- -- variable initialization
- --------------------------------------------------------------------
- stoks, sinfos, stoklns -- set source lists
- = toklist, semlist, toklnlist
- local i = 1 -- token position
- local tok, info -- current token
- local prev -- position of last grammar token
- -- on same line (for TK_SPACE stuff)
- --------------------------------------------------------------------
- -- changes a token, info pair
- --------------------------------------------------------------------
- local function settoken(tok, info, I)
- I = I or i
- stoks[I] = tok or ""
- sinfos[I] = info or ""
- end
- --------------------------------------------------------------------
- -- processing loop (PASS 1)
- --------------------------------------------------------------------
- while true do
- tok, info = stoks[i], sinfos[i]
- ----------------------------------------------------------------
- local atstart = atlinestart(i) -- set line begin flag
- if atstart then prev = nil end
- ----------------------------------------------------------------
- if tok == "TK_EOS" then -- end of stream/pass
- break
- ----------------------------------------------------------------
- elseif tok == "TK_KEYWORD" or -- keywords, identifiers,
- tok == "TK_NAME" or -- operators
- tok == "TK_OP" then
- -- TK_KEYWORD and TK_OP can't be optimized without a big
- -- optimization framework; it would be more of an optimizing
- -- compiler, not a source code compressor
- -- TK_NAME that are locals needs parser to analyze/optimize
- prev = i
- ----------------------------------------------------------------
- elseif tok == "TK_NUMBER" then -- numbers
- if opt_numbers then
- do_number(i) -- optimize
- end
- prev = i
- ----------------------------------------------------------------
- elseif tok == "TK_STRING" or -- strings, long strings
- tok == "TK_LSTRING" then
- if opt_strings then
- if tok == "TK_STRING" then
- do_string(i) -- optimize
- else
- do_lstring(i) -- optimize
- end
- end
- prev = i
- ----------------------------------------------------------------
- elseif tok == "TK_COMMENT" then -- short comments
- if opt_comments then
- if i == 1 and sub(info, 1, 1) == "#" then
- -- keep shbang comment, trim whitespace
- do_comment(i)
- else
- -- safe to delete, as a TK_EOL (or TK_EOS) always follows
- settoken() -- remove entirely
- end
- elseif opt_whitespace then -- trim whitespace only
- do_comment(i)
- end
- ----------------------------------------------------------------
- elseif tok == "TK_LCOMMENT" then -- long comments
- if keep_lcomment(opt_keep, info) then
- ------------------------------------------------------------
- -- if --keep, we keep a long comment if <msg> is found;
- -- this is a feature to keep copyright or license texts
- if opt_whitespace then -- trim whitespace only
- do_lcomment(i)
- end
- prev = i
- elseif opt_comments then
- local eols = commenteols(info)
- ------------------------------------------------------------
- -- prepare opt_emptylines case first, if a disposable token
- -- follows, current one is safe to dump, else keep a space;
- -- it is implied that the operation is safe for '-', because
- -- current is a TK_LCOMMENT, and must be separate from a '-'
- if is_faketoken[stoks[i + 1]] then
- settoken() -- remove entirely
- tok = ""
- else
- settoken("TK_SPACE", " ")
- end
- ------------------------------------------------------------
- -- if there are embedded EOLs to keep and opt_emptylines is
- -- disabled, then switch the token into one or more EOLs
- if not opt_emptylines and eols > 0 then
- settoken("TK_EOL", rep("\n", eols))
- end
- ------------------------------------------------------------
- -- if optimizing whitespaces, force reinterpretation of the
- -- token to give a chance for the space to be optimized away
- if opt_whitespace and tok ~= "" then
- i = i - 1 -- to reinterpret
- end
- ------------------------------------------------------------
- else -- disabled case
- if opt_whitespace then -- trim whitespace only
- do_lcomment(i)
- end
- prev = i
- end
- ----------------------------------------------------------------
- elseif tok == "TK_EOL" then -- line endings
- if atstart and opt_emptylines then
- settoken() -- remove entirely
- elseif info == "\r\n" or info == "\n\r" then
- -- normalize the rest of the EOLs for CRLF/LFCR only
- -- (note that TK_LCOMMENT can change into several EOLs)
- settoken("TK_EOL", "\n")
- end
- ----------------------------------------------------------------
- elseif tok == "TK_SPACE" then -- whitespace
- if opt_whitespace then
- if atstart or atlineend(i) then
- -- delete leading and trailing whitespace
- settoken() -- remove entirely
- else
- ------------------------------------------------------------
- -- at this point, since leading whitespace have been removed,
- -- there should be a either a real token or a TK_LCOMMENT
- -- prior to hitting this whitespace; the TK_LCOMMENT case
- -- only happens if opt_comments is disabled; so prev ~= nil
- local ptok = stoks[prev]
- if ptok == "TK_LCOMMENT" then
- -- previous TK_LCOMMENT can abut with anything
- settoken() -- remove entirely
- else
- -- prev must be a grammar token; consecutive TK_SPACE
- -- tokens is impossible when optimizing whitespace
- local ntok = stoks[i + 1]
- if is_faketoken[ntok] then
- -- handle special case where a '-' cannot abut with
- -- either a short comment or a long comment
- if (ntok == "TK_COMMENT" or ntok == "TK_LCOMMENT") and
- ptok == "TK_OP" and sinfos[prev] == "-" then
- -- keep token
- else
- settoken() -- remove entirely
- end
- else--is_realtoken
- -- check a pair of grammar tokens, if can abut, then
- -- delete space token entirely, otherwise keep one space
- local s = checkpair(prev, i + 1)
- if s == "" then
- settoken() -- remove entirely
- else
- settoken("TK_SPACE", " ")
- end
- end
- end
- ------------------------------------------------------------
- end
- end
- ----------------------------------------------------------------
- else
- error("unidentified token encountered")
- end
- ----------------------------------------------------------------
- i = i + 1
- end--while
- repack_tokens()
- --------------------------------------------------------------------
- -- processing loop (PASS 2)
- --------------------------------------------------------------------
- if opt_eols then
- i = 1
- -- aggressive EOL removal only works with most non-grammar tokens
- -- optimized away because it is a rather simple scheme -- basically
- -- it just checks 'real' token pairs around EOLs
- if stoks[1] == "TK_COMMENT" then
- -- first comment still existing must be shbang, skip whole line
- i = 3
- end
- while true do
- tok, info = stoks[i], sinfos[i]
- --------------------------------------------------------------
- if tok == "TK_EOS" then -- end of stream/pass
- break
- --------------------------------------------------------------
- elseif tok == "TK_EOL" then -- consider each TK_EOL
- local t1, t2 = stoks[i - 1], stoks[i + 1]
- if is_realtoken[t1] and is_realtoken[t2] then -- sanity check
- local s = checkpair(i - 1, i + 1)
- if s == "" then
- settoken() -- remove entirely
- end
- end
- end--if tok
- --------------------------------------------------------------
- i = i + 1
- end--while
- repack_tokens()
- end
- --------------------------------------------------------------------
- if opt_details and opt_details > 0 then print() end -- spacing
- return stoks, sinfos, stoklns
-end
+++ /dev/null
---[[--------------------------------------------------------------------
-
- optparser.lua: does parser-based optimizations
- This file is part of LuaSrcDiet.
-
- Copyright (c) 2008 Kein-Hong Man <khman@users.sf.net>
- The COPYRIGHT file describes the conditions
- under which this software may be distributed.
-
- See the ChangeLog for more information.
-
-----------------------------------------------------------------------]]
-
---[[--------------------------------------------------------------------
--- NOTES:
--- * For more parser-based optimization ideas, see the TODO items or
--- look at technotes.txt.
--- * The processing load is quite significant, but since this is an
--- off-line text processor, I believe we can wait a few seconds.
--- * TODO: might process "local a,a,a" wrongly... need tests!
--- * TODO: remove position handling if overlapped locals (rem < 0)
--- needs more study, to check behaviour
--- * TODO: there are probably better ways to do allocation, e.g. by
--- choosing better methods to sort and pick locals...
--- * TODO: we don't need 53*63 two-letter identifiers; we can make
--- do with significantly less depending on how many that are really
--- needed and improve entropy; e.g. 13 needed -> choose 4*4 instead
-----------------------------------------------------------------------]]
-
-local base = _G
-local string = require "string"
-local table = require "table"
-module "optparser"
-
-----------------------------------------------------------------------
--- Letter frequencies for reducing symbol entropy (fixed version)
--- * Might help a wee bit when the output file is compressed
--- * See Wikipedia: http://en.wikipedia.org/wiki/Letter_frequencies
--- * We use letter frequencies according to a Linotype keyboard, plus
--- the underscore, and both lower case and upper case letters.
--- * The arrangement below (LC, underscore, %d, UC) is arbitrary.
--- * This is certainly not optimal, but is quick-and-dirty and the
--- process has no significant overhead
-----------------------------------------------------------------------
-
-local LETTERS = "etaoinshrdlucmfwypvbgkqjxz_ETAOINSHRDLUCMFWYPVBGKQJXZ"
-local ALPHANUM = "etaoinshrdlucmfwypvbgkqjxz_0123456789ETAOINSHRDLUCMFWYPVBGKQJXZ"
-
--- names or identifiers that must be skipped
--- * the first two lines are for keywords
-local SKIP_NAME = {}
-for v in string.gmatch([[
-and break do else elseif end false for function if in
-local nil not or repeat return then true until while
-self]], "%S+") do
- SKIP_NAME[v] = true
-end
-
-------------------------------------------------------------------------
--- variables and data structures
-------------------------------------------------------------------------
-
-local toklist, seminfolist, -- token lists
- globalinfo, localinfo, -- variable information tables
- globaluniq, localuniq, -- unique name tables
- var_new, -- index of new variable names
- varlist -- list of output variables
-
-----------------------------------------------------------------------
--- preprocess information table to get lists of unique names
-----------------------------------------------------------------------
-
-local function preprocess(infotable)
- local uniqtable = {}
- for i = 1, #infotable do -- enumerate info table
- local obj = infotable[i]
- local name = obj.name
- --------------------------------------------------------------------
- if not uniqtable[name] then -- not found, start an entry
- uniqtable[name] = {
- decl = 0, token = 0, size = 0,
- }
- end
- --------------------------------------------------------------------
- local uniq = uniqtable[name] -- count declarations, tokens, size
- uniq.decl = uniq.decl + 1
- local xref = obj.xref
- local xcount = #xref
- uniq.token = uniq.token + xcount
- uniq.size = uniq.size + xcount * #name
- --------------------------------------------------------------------
- if obj.decl then -- if local table, create first,last pairs
- obj.id = i
- obj.xcount = xcount
- if xcount > 1 then -- if ==1, means local never accessed
- obj.first = xref[2]
- obj.last = xref[xcount]
- end
- --------------------------------------------------------------------
- else -- if global table, add a back ref
- uniq.id = i
- end
- --------------------------------------------------------------------
- end--for
- return uniqtable
-end
-
-----------------------------------------------------------------------
--- calculate actual symbol frequencies, in order to reduce entropy
--- * this may help further reduce the size of compressed sources
--- * note that since parsing optimizations is put before lexing
--- optimizations, the frequency table is not exact!
--- * yes, this will miss --keep block comments too...
-----------------------------------------------------------------------
-
-local function recalc_for_entropy(option)
- local byte = string.byte
- local char = string.char
- -- table of token classes to accept in calculating symbol frequency
- local ACCEPT = {
- TK_KEYWORD = true, TK_NAME = true, TK_NUMBER = true,
- TK_STRING = true, TK_LSTRING = true,
- }
- if not option["opt-comments"] then
- ACCEPT.TK_COMMENT = true
- ACCEPT.TK_LCOMMENT = true
- end
- --------------------------------------------------------------------
- -- create a new table and remove any original locals by filtering
- --------------------------------------------------------------------
- local filtered = {}
- for i = 1, #toklist do
- filtered[i] = seminfolist[i]
- end
- for i = 1, #localinfo do -- enumerate local info table
- local obj = localinfo[i]
- local xref = obj.xref
- for j = 1, obj.xcount do
- local p = xref[j]
- filtered[p] = "" -- remove locals
- end
- end
- --------------------------------------------------------------------
- local freq = {} -- reset symbol frequency table
- for i = 0, 255 do freq[i] = 0 end
- for i = 1, #toklist do -- gather symbol frequency
- local tok, info = toklist[i], filtered[i]
- if ACCEPT[tok] then
- for j = 1, #info do
- local c = byte(info, j)
- freq[c] = freq[c] + 1
- end
- end--if
- end--for
- --------------------------------------------------------------------
- -- function to re-sort symbols according to actual frequencies
- --------------------------------------------------------------------
- local function resort(symbols)
- local symlist = {}
- for i = 1, #symbols do -- prepare table to sort
- local c = byte(symbols, i)
- symlist[i] = { c = c, freq = freq[c], }
- end
- table.sort(symlist, -- sort selected symbols
- function(v1, v2)
- return v1.freq > v2.freq
- end
- )
- local charlist = {} -- reconstitute the string
- for i = 1, #symlist do
- charlist[i] = char(symlist[i].c)
- end
- return table.concat(charlist)
- end
- --------------------------------------------------------------------
- LETTERS = resort(LETTERS) -- change letter arrangement
- ALPHANUM = resort(ALPHANUM)
-end
-
-----------------------------------------------------------------------
--- returns a string containing a new local variable name to use, and
--- a flag indicating whether it collides with a global variable
--- * trapping keywords and other names like 'self' is done elsewhere
-----------------------------------------------------------------------
-
-local function new_var_name()
- local var
- local cletters, calphanum = #LETTERS, #ALPHANUM
- local v = var_new
- if v < cletters then -- single char
- v = v + 1
- var = string.sub(LETTERS, v, v)
- else -- longer names
- local range, sz = cletters, 1 -- calculate # chars fit
- repeat
- v = v - range
- range = range * calphanum
- sz = sz + 1
- until range > v
- local n = v % cletters -- left side cycles faster
- v = (v - n) / cletters -- do first char first
- n = n + 1
- var = string.sub(LETTERS, n, n)
- while sz > 1 do
- local m = v % calphanum
- v = (v - m) / calphanum
- m = m + 1
- var = var..string.sub(ALPHANUM, m, m)
- sz = sz - 1
- end
- end
- var_new = var_new + 1
- return var, globaluniq[var] ~= nil
-end
-
-----------------------------------------------------------------------
--- calculate and print some statistics
--- * probably better in main source, put here for now
-----------------------------------------------------------------------
-
-local function stats_summary(globaluniq, localuniq, afteruniq, option)
- local print = print or base.print
- local fmt = string.format
- local opt_details = option.DETAILS
- local uniq_g , uniq_li, uniq_lo, uniq_ti, uniq_to, -- stats needed
- decl_g, decl_li, decl_lo, decl_ti, decl_to,
- token_g, token_li, token_lo, token_ti, token_to,
- size_g, size_li, size_lo, size_ti, size_to
- = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- local function avg(c, l) -- safe average function
- if c == 0 then return 0 end
- return l / c
- end
- --------------------------------------------------------------------
- -- collect statistics (note: globals do not have declarations!)
- --------------------------------------------------------------------
- for name, uniq in base.pairs(globaluniq) do
- uniq_g = uniq_g + 1
- token_g = token_g + uniq.token
- size_g = size_g + uniq.size
- end
- for name, uniq in base.pairs(localuniq) do
- uniq_li = uniq_li + 1
- decl_li = decl_li + uniq.decl
- token_li = token_li + uniq.token
- size_li = size_li + uniq.size
- end
- for name, uniq in base.pairs(afteruniq) do
- uniq_lo = uniq_lo + 1
- decl_lo = decl_lo + uniq.decl
- token_lo = token_lo + uniq.token
- size_lo = size_lo + uniq.size
- end
- uniq_ti = uniq_g + uniq_li
- decl_ti = decl_g + decl_li
- token_ti = token_g + token_li
- size_ti = size_g + size_li
- uniq_to = uniq_g + uniq_lo
- decl_to = decl_g + decl_lo
- token_to = token_g + token_lo
- size_to = size_g + size_lo
- --------------------------------------------------------------------
- -- detailed stats: global list
- --------------------------------------------------------------------
- if opt_details then
- local sorted = {} -- sort table of unique global names by size
- for name, uniq in base.pairs(globaluniq) do
- uniq.name = name
- sorted[#sorted + 1] = uniq
- end
- table.sort(sorted,
- function(v1, v2)
- return v1.size > v2.size
- end
- )
- local tabf1, tabf2 = "%8s%8s%10s %s", "%8d%8d%10.2f %s"
- local hl = string.rep("-", 44)
- print("*** global variable list (sorted by size) ***\n"..hl)
- print(fmt(tabf1, "Token", "Input", "Input", "Global"))
- print(fmt(tabf1, "Count", "Bytes", "Average", "Name"))
- print(hl)
- for i = 1, #sorted do
- local uniq = sorted[i]
- print(fmt(tabf2, uniq.token, uniq.size, avg(uniq.token, uniq.size), uniq.name))
- end
- print(hl)
- print(fmt(tabf2, token_g, size_g, avg(token_g, size_g), "TOTAL"))
- print(hl.."\n")
- --------------------------------------------------------------------
- -- detailed stats: local list
- --------------------------------------------------------------------
- local tabf1, tabf2 = "%8s%8s%8s%10s%8s%10s %s", "%8d%8d%8d%10.2f%8d%10.2f %s"
- local hl = string.rep("-", 70)
- print("*** local variable list (sorted by allocation order) ***\n"..hl)
- print(fmt(tabf1, "Decl.", "Token", "Input", "Input", "Output", "Output", "Global"))
- print(fmt(tabf1, "Count", "Count", "Bytes", "Average", "Bytes", "Average", "Name"))
- print(hl)
- for i = 1, #varlist do -- iterate according to order assigned
- local name = varlist[i]
- local uniq = afteruniq[name]
- local old_t, old_s = 0, 0
- for j = 1, #localinfo do -- find corresponding old names and calculate
- local obj = localinfo[j]
- if obj.name == name then
- old_t = old_t + obj.xcount
- old_s = old_s + obj.xcount * #obj.oldname
- end
- end
- print(fmt(tabf2, uniq.decl, uniq.token, old_s, avg(old_t, old_s),
- uniq.size, avg(uniq.token, uniq.size), name))
- end
- print(hl)
- print(fmt(tabf2, decl_lo, token_lo, size_li, avg(token_li, size_li),
- size_lo, avg(token_lo, size_lo), "TOTAL"))
- print(hl.."\n")
- end--if opt_details
- --------------------------------------------------------------------
- -- display output
- --------------------------------------------------------------------
- local tabf1, tabf2 = "%-16s%8s%8s%8s%8s%10s", "%-16s%8d%8d%8d%8d%10.2f"
- local hl = string.rep("-", 58)
- print("*** local variable optimization summary ***\n"..hl)
- print(fmt(tabf1, "Variable", "Unique", "Decl.", "Token", "Size", "Average"))
- print(fmt(tabf1, "Types", "Names", "Count", "Count", "Bytes", "Bytes"))
- print(hl)
- print(fmt(tabf2, "Global", uniq_g, decl_g, token_g, size_g, avg(token_g, size_g)))
- print(hl)
- print(fmt(tabf2, "Local (in)", uniq_li, decl_li, token_li, size_li, avg(token_li, size_li)))
- print(fmt(tabf2, "TOTAL (in)", uniq_ti, decl_ti, token_ti, size_ti, avg(token_ti, size_ti)))
- print(hl)
- print(fmt(tabf2, "Local (out)", uniq_lo, decl_lo, token_lo, size_lo, avg(token_lo, size_lo)))
- print(fmt(tabf2, "TOTAL (out)", uniq_to, decl_to, token_to, size_to, avg(token_to, size_to)))
- print(hl.."\n")
-end
-
-----------------------------------------------------------------------
--- main entry point
--- * does only local variable optimization for now
-----------------------------------------------------------------------
-
-function optimize(option, _toklist, _seminfolist, _globalinfo, _localinfo)
- -- set tables
- toklist, seminfolist, globalinfo, localinfo
- = _toklist, _seminfolist, _globalinfo, _localinfo
- var_new = 0 -- reset variable name allocator
- varlist = {}
- ------------------------------------------------------------------
- -- preprocess global/local tables, handle entropy reduction
- ------------------------------------------------------------------
- globaluniq = preprocess(globalinfo)
- localuniq = preprocess(localinfo)
- if option["opt-entropy"] then -- for entropy improvement
- recalc_for_entropy(option)
- end
- ------------------------------------------------------------------
- -- build initial declared object table, then sort according to
- -- token count, this might help assign more tokens to more common
- -- variable names such as 'e' thus possibly reducing entropy
- -- * an object knows its localinfo index via its 'id' field
- -- * special handling for "self" special local (parameter) here
- ------------------------------------------------------------------
- local object = {}
- for i = 1, #localinfo do
- object[i] = localinfo[i]
- end
- table.sort(object, -- sort largest first
- function(v1, v2)
- return v1.xcount > v2.xcount
- end
- )
- ------------------------------------------------------------------
- -- the special "self" function parameters must be preserved
- -- * the allocator below will never use "self", so it is safe to
- -- keep those implicit declarations as-is
- ------------------------------------------------------------------
- local temp, j, gotself = {}, 1, false
- for i = 1, #object do
- local obj = object[i]
- if not obj.isself then
- temp[j] = obj
- j = j + 1
- else
- gotself = true
- end
- end
- object = temp
- ------------------------------------------------------------------
- -- a simple first-come first-served heuristic name allocator,
- -- note that this is in no way optimal...
- -- * each object is a local variable declaration plus existence
- -- * the aim is to assign short names to as many tokens as possible,
- -- so the following tries to maximize name reuse
- -- * note that we preserve sort order
- ------------------------------------------------------------------
- local nobject = #object
- while nobject > 0 do
- local varname, gcollide
- repeat
- varname, gcollide = new_var_name() -- collect a variable name
- until not SKIP_NAME[varname] -- skip all special names
- varlist[#varlist + 1] = varname -- keep a list
- local oleft = nobject
- ------------------------------------------------------------------
- -- if variable name collides with an existing global, the name
- -- cannot be used by a local when the name is accessed as a global
- -- during which the local is alive (between 'act' to 'rem'), so
- -- we drop objects that collides with the corresponding global
- ------------------------------------------------------------------
- if gcollide then
- -- find the xref table of the global
- local gref = globalinfo[globaluniq[varname].id].xref
- local ngref = #gref
- -- enumerate for all current objects; all are valid at this point
- for i = 1, nobject do
- local obj = object[i]
- local act, rem = obj.act, obj.rem -- 'live' range of local
- -- if rem < 0, it is a -id to a local that had the same name
- -- so follow rem to extend it; does this make sense?
- while rem < 0 do
- rem = localinfo[-rem].rem
- end
- local drop
- for j = 1, ngref do
- local p = gref[j]
- if p >= act and p <= rem then drop = true end -- in range?
- end
- if drop then
- obj.skip = true
- oleft = oleft - 1
- end
- end--for
- end--if gcollide
- ------------------------------------------------------------------
- -- now the first unassigned local (since it's sorted) will be the
- -- one with the most tokens to rename, so we set this one and then
- -- eliminate all others that collides, then any locals that left
- -- can then reuse the same variable name; this is repeated until
- -- all local declaration that can use this name is assigned
- -- * the criteria for local-local reuse/collision is:
- -- A is the local with a name already assigned
- -- B is the unassigned local under consideration
- -- => anytime A is accessed, it cannot be when B is 'live'
- -- => to speed up things, we have first/last accesses noted
- ------------------------------------------------------------------
- while oleft > 0 do
- local i = 1
- while object[i].skip do -- scan for first object
- i = i + 1
- end
- ------------------------------------------------------------------
- -- first object is free for assignment of the variable name
- -- [first,last] gives the access range for collision checking
- ------------------------------------------------------------------
- oleft = oleft - 1
- local obja = object[i]
- i = i + 1
- obja.newname = varname
- obja.skip = true
- obja.done = true
- local first, last = obja.first, obja.last
- local xref = obja.xref
- ------------------------------------------------------------------
- -- then, scan all the rest and drop those colliding
- -- if A was never accessed then it'll never collide with anything
- -- otherwise trivial skip if:
- -- * B was activated after A's last access (last < act)
- -- * B was removed before A's first access (first > rem)
- -- if not, see detailed skip below...
- ------------------------------------------------------------------
- if first and oleft > 0 then -- must have at least 1 access
- local scanleft = oleft
- while scanleft > 0 do
- while object[i].skip do -- next valid object
- i = i + 1
- end
- scanleft = scanleft - 1
- local objb = object[i]
- i = i + 1
- local act, rem = objb.act, objb.rem -- live range of B
- -- if rem < 0, extend range of rem thru' following local
- while rem < 0 do
- rem = localinfo[-rem].rem
- end
- --------------------------------------------------------
- if not(last < act or first > rem) then -- possible collision
- --------------------------------------------------------
- -- B is activated later than A or at the same statement,
- -- this means for no collision, A cannot be accessed when B
- -- is alive, since B overrides A (or is a peer)
- --------------------------------------------------------
- if act >= obja.act then
- for j = 1, obja.xcount do -- ... then check every access
- local p = xref[j]
- if p >= act and p <= rem then -- A accessed when B live!
- oleft = oleft - 1
- objb.skip = true
- break
- end
- end--for
- --------------------------------------------------------
- -- A is activated later than B, this means for no collision,
- -- A's access is okay since it overrides B, but B's last
- -- access need to be earlier than A's activation time
- --------------------------------------------------------
- else
- if objb.last and objb.last >= obja.act then
- oleft = oleft - 1
- objb.skip = true
- end
- end
- end
- --------------------------------------------------------
- if oleft == 0 then break end
- end
- end--if first
- ------------------------------------------------------------------
- end--while
- ------------------------------------------------------------------
- -- after assigning all possible locals to one variable name, the
- -- unassigned locals/objects have the skip field reset and the table
- -- is compacted, to hopefully reduce iteration time
- ------------------------------------------------------------------
- local temp, j = {}, 1
- for i = 1, nobject do
- local obj = object[i]
- if not obj.done then
- obj.skip = false
- temp[j] = obj
- j = j + 1
- end
- end
- object = temp -- new compacted object table
- nobject = #object -- objects left to process
- ------------------------------------------------------------------
- end--while
- ------------------------------------------------------------------
- -- after assigning all locals with new variable names, we can
- -- patch in the new names, and reprocess to get 'after' stats
- ------------------------------------------------------------------
- for i = 1, #localinfo do -- enumerate all locals
- local obj = localinfo[i]
- local xref = obj.xref
- if obj.newname then -- if got new name, patch it in
- for j = 1, obj.xcount do
- local p = xref[j] -- xrefs indexes the token list
- seminfolist[p] = obj.newname
- end
- obj.name, obj.oldname -- adjust names
- = obj.newname, obj.name
- else
- obj.oldname = obj.name -- for cases like 'self'
- end
- end
- ------------------------------------------------------------------
- -- deal with statistics output
- ------------------------------------------------------------------
- if gotself then -- add 'self' to end of list
- varlist[#varlist + 1] = "self"
- end
- local afteruniq = preprocess(localinfo)
- stats_summary(globaluniq, localuniq, afteruniq, option)
- ------------------------------------------------------------------
-end
option '1' '02:CA:FF:EE:BA:BE'
config 'defaults' 'luci_splash'
- option 'limit_up' '20'
- option 'limit_down' '50'
+ option 'limit_up' '40'
+ option 'limit_down' '120'
+ option 'leasetime' '8'
config widget 'customindex'
option enabled '1'
+++ /dev/null
-config 'community' 'profile'
- option 'name' 'Berlin NordOst'
- option 'homepage' 'http://www.freifunk-bno.de/'
- option 'ssid' 'olsr.freifunk.net'
- option 'mesh_network' '104.0.0.0/8'
- option 'splash_network' '10.104.0.0/16'
- option 'splash_prefix' '27'
- option 'latitude' '52.55010'
- option 'longitude' '13.45889'
- option 'suffix' 'olsr'
- list 'owm_api' 'http://api.openwifimap.net'
- list 'owm_api' 'http://owmapi.pberg.freifunk.net'
- option 'mapserver' 'http://map.pberg.freifunk.net/'
-
-config 'defaults' 'wifi_device'
- option 'channel' '10'
-
-config 'defaults' 'interface'
- option 'netmask' '255.0.0.0'
-
-config 'defaults' 'olsr_interface'
- option 'Ip4Broadcast' '255.255.255.255'
- option 'HelloInterval' '3.0'
- option 'HelloValidityTime' '125.0'
- option 'TcInterval' '2.0'
- option 'TcValidityTime' '500.0'
- option 'MidInterval' '25.0'
- option 'MidValidityTime' '500.0'
- option 'HnaInterval' '10.0'
- option 'HnaValidityTime' '125.0'
-
-config 'defaults' 'olsrd'
- option 'AllowNoInt' 'yes'
- option 'FIBMetric' 'flat'
- option 'Pollrate' '0.025'
- option 'TcRedundancy' '2'
- option 'NatThreshold' '0.75'
- option 'LinkQualityAlgorithm' 'etx_ff'
--- /dev/null
+config 'community' 'profile'
+ option 'name' 'Hameln'
+ option 'homepage' 'http://freifunk-hameln.de'
+ option 'ssid' 'hameln.freifunk.net'
+ option 'suffix' 'ffhm'
+ option 'latitude' '52.1030706'
+ option 'longitude' '9.3514778'
+ option 'mesh_network' '10.31.0.0/16'
+ option 'splash_network' '10.104.0.0/16'
+ option 'splash_prefix' '27'
+ option 'vap' '1'
+ option adhoc_dhcp_when_vap '1'
+
+config 'defaults' 'interface'
+ option 'netmask' '255.255.0.0'
option 'bssid' '02:07:04:08:08:09'
config 'defaults' 'bssidscheme'
- option '13' '02:07:04:08:08:09'
+ option '13' '02:07:04:08:08:09'
+ option '36' '02:36:CA:FF:EE:EE'
+
+config 'defaults' 'ssidscheme'
+ option '13' 'ch13.freifunk.net'
+ option '36' 'ch36.freifunk.net'
#include <math.h>
#include <time.h>
#include <signal.h>
+#include <limits.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
include $(TOPDIR)/rules.mk
PKG_NAME:=meshwizard
-PKG_RELEASE:=0.1.1
+PKG_RELEASE:=0.3.1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
done
}
+# string_contains(string, substring)
+#
+# Returns 0 if the specified string contains the specified substring,
+# otherwise returns 1.
+string_contains() {
+ string="$1"
+ substring="$2"
+ if test "${string#*$substring}" != "$string"
+ then
+ return 0 # $substring is in $string
+ else
+ return 1 # $substring is not in $string
+ fi
+}
+
# Takes 2 arguments
# $1 = text to be displayed in the output for this section
# $2 = section (optional)
a="$(echo $option |cut -d '=' -f1)"
b="$(echo $option |cut -d '=' -f2-)"
b="${b//_/ }"
- uci set $2.$a="$b"
+ string_contains "$a" "_LENGTH" && continue
+ string_contains "$a" "_ITEM" && {
+ # special threatment for lists. use add_list and remove the
+ # item index (_ITEMx).
+ uci add_list $2.${a//_ITEM[0-9]*/}="$b"
+ } || {
+ uci set $2.$a="$b"
+ }
done
}
-# 3 arguements: 1=config name 2=oldname 3=newname
+# 3 arguments: 1=config name 2=oldname 3=newname
section_rename() {
uci -q rename $1.$2=$3 && msg_rename $1.$2 $1.$3 || msg_rename_error $1.$2 $1.$3
}
msg_rename_error() {
echo " \033[1mWarning:\033[0m Could not rename $1 to $2."
}
+
+
+restore_factory_defaults() {
+ echo "+ Restore default config as requested with cleanup=1"
+ cp -f /rom/etc/config/* /etc/config/
+ rm /etc/config/wireless
+ wifi detect > /etc/config/wireless
+ rm /etc/config/network
+ if [ -f /etc/init.d/defconfig ]; then
+ # legacy (AA)
+ /etc/init.d/defconfig start
+ [ -f /rom/etc/uci-defaults/network ] && sh /rom/etc/uci-defaults/network
+ else
+ sh /rom/etc/uci-defaults/02_network
+ fi
+}
+
+is_in_list() {
+ # checks if an item is in a list
+ local list="$1"
+ local item="$2"
+ for word in $list; do
+ [ $word = "$item" ] && return 0
+ done
+ return 1
+}
+
+add_to_list() {
+ local list="$1"
+ local item="$2"
+ is_in_list "$list" "$item" && echo $list
+ if [ -z "$list" ]; then
+ echo "$item"
+ else
+ echo "$list $item"
+ fi
+}
#!/bin/sh
-# This reads the settings we need to have to configure everything
-# Argument $1: community
+# These functions read the settings we need for configuration of the router
-. /lib/functions.sh
-community="$1"
+read_defaults() {
+ # read default values from the 3 relevant config files and export them
+ # into the environment. Later loaded configs overwrite earlier ones. The
+ # The ordering here is from most generic to most specific:
+ # freifunk (most generic defaults)
+ # profile_* (community defaults)
+ # nodes custom config from meshwizard config file
-# reads variables from uci files, parameter $1 is the section
-get_var() {
- uci -q show $1 | cut -d "." -f 2-100 |grep "\." | sed -e 's/^\([A-Za-z0-9_]*\)\./\1_/g' -e 's/=\(.*\)$/="\1"/g'
-}
-
-handle_widgets() {
- widgets="$widgets $1"
-}
-config_load freifunk
-config_foreach handle_widgets widget
-config_load profile_$community
-config_foreach handle_widgets widget
-echo "widgets=$widgets"
+ local community="$1"
-# read default values from /etc/config/freifunk
-for v in system wifi_device wifi_iface interface alias dhcp olsr_interface olsr_interfacedefaults zone_freifunk include $widgets; do
- get_var freifunk.$v
-done
+ config_cb() {
+ local type="$1"
+ local name="$2"
+ local allowed_section_types="widget"
+ local allowed_section_names="
+ system
+ wifi_device
+ wifi_iface
+ interface
+ alias
+ dhcp
+ olsr_interface
+ olsr_interfacedefaults
+ profile
+ zone_freifunk
+ include
+ luci_splash
+ ipv6
+ luci_main
+ contact
+ community
+ wan
+ lan
+ general
+ ipv6
+ qos
+ "
-# now read all values from the selected community profile, will override some values from the defaults before
-for v in system wifi_device wifi_iface interface alias dhcp olsr_interface olsr_interfacedefaults profile zone_freifunk include luci_splash ipv6 $widgets; do
- get_var profile_$community.$v
-done
+ if [ "$type" = "widget" ]; then
+ widgets=$(add_to_list "$widgets" "$name")
+ fi
-# read values from meshwizard
-for v in system luci_main contact community wan lan general ipv6 qos; do
- get_var meshwizard.$v
-done
+ if ([ -n "$name" ] && is_in_list "$allowed_section_names" $name) \
+ || is_in_list "$allowed_section_types" $type ; then
+ option_cb() {
+ local option="$1"
+ local value="$2"
+ export "${CONFIG_SECTION}_${option}"="$value"
+ }
+ else
+ option_cb() { return; }
+ fi
+ }
+ config_load freifunk
+ config_load profile_${community}
+ config_load meshwizard
+ export widgets="$widgets"
+}
uci show meshwizard.netconfig | grep $IBwifi | while read line; do
oldline=$(echo $line | cut -d "=" -f 1)
uci set $oldline=""
- newline=$(echo $line |sed "s/$IBwifi/$syswifi/g")
+ newline=$(echo $line |sed -e "s/$IBwifi/$syswifi/g" -e "s/'//g")
uci set $newline
done
;;
+++ /dev/null
-#!/bin/sh
-# This will restore default "factory" settings before running the meshwizard
-# and is used when cleanup=1
-# Warning: This will reset network settings for wan and lan to defaults too.
-
-echo "+ Restore default config as requested with cleanup=1"
-cp -f /rom/etc/config/* /etc/config/
-rm /etc/config/wireless
-wifi detect > /etc/config/wireless
-rm /etc/config/network
-/etc/init.d/defconfig start
if [ "$supports_vap" = 1 -a "$vap" = 1 ]; then
uci batch <<- EOF
set dhcp.${netrenamed}dhcp="dhcp"
+ set dhcp.${netrenamed}dhcp.ignore="0"
set dhcp.${netrenamed}dhcp.interface="${netrenamed}dhcp"
EOF
set_defaults "dhcp_" dhcp.${netrenamed}dhcp
fi
ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)"
-if [ "$supports_vap" = 0 ] || [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ]; then
+if [ "$supports_vap" = 0 ] || \
+ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \
+ [ "$lan_is_olsr" = "1" -a "$lan_dhcp" = 1 ]; then
uci batch <<- EOF
set dhcp.${netrenamed}ahdhcp="dhcp"
+ set dhcp.${netrenamed}ahdhcp.ignore="0"
set dhcp.${netrenamed}ahdhcp.interface="${netrenamed}ahdhcp"
EOF
fi
. $dir/functions.sh
wan_is_olsr=$(uci -q get meshwizard.netconfig.wan_config)
-lan_is_olsr=$(uci -q get meshwizard.netconfig.lan_config)
config_load firewall
fi
fi
- if [ "$name" == "lan" ] && [ "$lan_is_olsr" == 1 ]; then
+ if [ "$name" == "lan" ] && [ "$lan_is_olsr" == "1" ]; then
uci set firewall.$1.network=' ' && uci_commitverbose "LAN is used for olsr, removed the lan interface from zone lan" firewall
fi
}
fi
-# Rules, Forwardings, advanced config and includes
-
-for config in freifunk profile_$community; do
-
- config_load $config
+# Rules, Forwardings, advanced config and includes from freifunk and
+# profile_$community config files.
+
+add_fw_rules() {
+ config_cb() {
+ local type="$1"
+ local name="$2"
+ local allowed_section_types="advanced include fw_rule fw_forwarding"
+ if is_in_list "$allowed_section_types" $type ; then
+ uci set firewall.${name}="${type/fw_/}"
+ option_cb() {
+ local option="$1"
+ local value="$2"
+ uci set firewall.${CONFIG_SECTION}.${option}="$value"
+ }
+ else
+ option_cb() { return; }
+ fi
+ }
+ config_load freifunk
+ config_load profile_${community}
+}
+add_fw_rules
- for section in advanced include fw_rule fw_forwarding; do
- handle_firewall() {
- local options=$(uci show $config."$1")
- options=$(echo "$options" | sed -e "s/fw_//g" -e "s/^$config/firewall/g")
- for o in $options; do
- uci set $o
- done
- }
- config_foreach handle_firewall $section
- done
-done
# If we use auto-ipv6-dhcp then allow 547/udp on the freifunk zone
if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then
# setup entry in /etc/config/network for a interface
# Argument $1: network interface
-
+
net="$1"
. /lib/functions.sh
. $dir/functions.sh
set network.$netrenamed.netmask="$netmask"
EOF
+if [ "$netrenamed" = "lan" ]; then
+ # remove the bridge if the interface is used for olsr
+ # since this script is only run in this case, no need
+ # to check for lan_proto = "olsr" currently.
+ uci -q delete network.lan.type
+fi
+
# Setup IPv6 for the interface
local ip6addr
if [ "$ipv6_enabled" = 1 ]; then
# Setup alias for $net adhoc interface
- if [ "$supports_vap" = 0 ] || [ "$vap" = 0 ] || [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ]; then
- # vaps are either not supported or enabled or they are supported and enabled
- # but we also want to use DHCP on the adhoc interface
+ if [ "$supports_vap" = 0 ] || \
+ [ "$vap" = 0 ] || \
+ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \
+ [ "$lan_is_olsr" = "1" ]; then
+ # setup an alias interface for the main interface to use as a network for clients
+ # when one of the following conditions is met
+ # * vaps are not supported
+ # * or not enabled
+ # * or they are supported and enabled but we also want to use DHCP on the adhoc interface
+ # * or this is the lan interface and it is used for olsrd (and dhcp is enabled)
uci batch <<- EOF
set network.${netrenamed}ahdhcp=interface
set network.${netrenamed}ahdhcp.ifname="@${netrenamed}"
set network.${netrenamed}ahdhcp.ipaddr="$STARTADHOC"
set network.${netrenamed}ahdhcp.netmask="$NETMASKADHOC"
EOF
+ uci_commitverbose "Setup interface for ${netrenamed}ahdhcp" network
fi
- uci_commitverbose "Setup interface for ${netrenamed}ahdhcp" network
fi
}
setup_jsoninfo() {
- # Setup jsoninfo
+ proto="$1"
uci batch <<- EOF
set $cfg.olsrd_jsoninfo=LoadPlugin
set $cfg.olsrd_jsoninfo.library="olsrd_jsoninfo.so.0.0"
EOF
- uci_commitverbose "Setup olsr jsoninfo plugin" $cfg
+ if [ "$proto" = "6" ]; then
+ uci set $cfg.olsrd_jsoninfo.ipv6only='1'
+ fi
+ uci_commitverbose "Setup olsr jsoninfo plugin" $cfg
}
+setup_txtinfo() {
+ proto="$1"
+ uci batch <<- EOF
+ set $cfg.olsrd_txtinfo=LoadPlugin
+ set $cfg.olsrd_txtinfo.library="olsrd_txtinfo.so.0.1"
+ EOF
+ if [ "$proto" = "6" ]; then
+ uci set $cfg.olsrd_txtinfo.ipv6only='1'
+ fi
+ uci_commitverbose "Setup olsr txtinfo plugin" $cfg
+}
+
for proto in $protocols; do
cfg="olsrd"
setup_nameservice
setup_dyngw_plain
setup_watchdog
- setup_jsoninfo
-
+ setup_jsoninfo $proto
+ setup_txtinfo $proto
done
EOF
}
-if [ "$(uci -q get meshwizard.netconfig.$net\_dhcp)" == 1 ] && [ -n "$dhcprange" ]; then
+if [ "$(uci -q get meshwizard.netconfig.$net\_dhcp)" = 1 ] && [ -n "$dhcprange" ]; then
handle_splash() {
config_get network "$1" network
if [ "$network" == "${netrenamed}dhcp" ]; then
config_foreach handle_splash iface
if [ "$supports_vap" = 1 -a "$vap" = 1 ]; then
- splash_net_add ${netrenamed}dhcp
+ splash_net_add ${netrenamed}dhcp
uci_commitverbose "Setup dhcpsplash for ${netrenamed}dhcp" luci_splash
fi
ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)"
- if [ "$supports_vap" = 0 ] || [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ]; then
- splash_net_add ${netrenamed}ahdhcp
+ if [ "$supports_vap" = 0 ] || \
+ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \
+ [ "$lan_dhcp" = 1 ]; then
+ splash_net_add ${netrenamed}ahdhcp
uci_commitverbose "Setup dhcpsplash for ${netrenamed}ahdhcp" luci_splash
fi
/etc/init.d/luci_splash enable
# You may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-. /lib/functions.sh
-
echo "
-/* Meshwizard 0.2.0 */
+/* Meshwizard 0.3.1 */
"
# config
export dir="/usr/bin/meshwizard"
+
+. /lib/functions.sh
. $dir/functions.sh
+. $dir/helpers/read_defaults.sh
[ -f /proc/net/ipv6_route ] && export has_ipv6=1
# Check which packages we have installed
# Check whether we want to cleanup/restore uci config before setting new options
cleanup=$(uci -q get meshwizard.general.cleanup)
-[ "$cleanup" == 1 ] && $dir/helpers/restore_default_config.sh
+[ "$cleanup" == 1 ] && restore_factory_defaults
# Rename wifi interfaces
$dir/helpers/rename-wifi.sh
+export lan_is_olsr="$(uci -q get meshwizard.netconfig.lan_config)"
+
# Get community
-community=$(uci -q get meshwizard.community.name || uci -q get freifunk.community.name)
+community="$(uci -q get meshwizard.community.name || uci -q get freifunk.community.name)"
[ -z "$community" ] && echo "Error: Community is not set in /etc/config/freifunk, aborting now." && exit 1
export community="$community"
-echo $community
+
+# we need a list of widgets later on. It will be populated in read_defaults.sh
+local widgets=""
# Get a list of networks we need to setup
networks=$(uci show meshwizard.netconfig | grep -v "netconfig=" | sed -e 's/meshwizard.netconfig\.\(.*\)\_.*/\1/' |sort|uniq)
export networks
[ -z "$networks" ] && echo "Error: No networks to setup could be found in /etc/config/meshwizard, aborting now." && exit 1
-# Read default values (first from /etc/config/freifunk, then from /etc/config/profile_$community
-# then /etc/config/meshwizard
-# last will overwrite first
-
-$dir/helpers/read_defaults.sh $community > /tmp/meshwizard.tmp
-while read line; do
- export "${line//\"/}"
-done < /tmp/meshwizard.tmp
+# Read defaults and node config
+read_defaults $community
# Do config
$dir/helpers/initial_config.sh
$dir/helpers/setup_olsrd_interface.sh $net
net_dhcp=$(uci -q get meshwizard.netconfig.${net}_dhcp)
+ export ${net}_dhcp=$net_dhcp
+
+ if [ "$net" = "lan" ] && [ "$lan_is_olsr" = "1" ]; then
+ uci -q set dhcp.lan.ignore="1"
+ uci_commitverbose "Disable DHCP on LAN because it is an olsr interface." dhcp
+ fi
+
if [ "$net_dhcp" == 1 ]; then
$dir/helpers/setup_dhcp.sh $net
fi
+++ /dev/null
-uci-*
-uci.git
-*.tar.gz
-patches/series
+++ /dev/null
-include ../../build/config.mk
-include ../../build/gccconfig.mk
-
-UCI_VERSION = 0.8.0
-#UCI_SITE = http://mirror2.openwrt.org/sources
-#UCI_DIR = uci-$(UCI_VERSION)
-#UCI_FILE = $(UCI_DIR).tar.gz
-#UCI_URL = $(UCI_SITE)/$(UCI_FILE)
-UCI_GITREV = aa3ab8012bfbf793d2884c08ea924545a04e9544
-UCI_SITE = http://nbd.name
-UCI_DIR = uci.git
-UCI_FILE = uci-$(UCI_VERSION)$(UCI_APPEND).tar.gz
-UCI_URL = $(UCI_SITE)/gitweb.cgi?p=uci.git;a=snapshot;h=$(UCI_GITREV)
-UCI_PATCHDIR = patches
-
-all: compile
-
-include ../../build/module.mk
-
-$(UCI_FILE):
- wget -O $@ "$(UCI_URL)" || rm -f $@
-
-$(UCI_DIR)/.prepared: $(UCI_FILE)
- rm -rf $(UCI_DIR)
- tar xvfz $(UCI_FILE)
- (cd $(UCI_PATCHDIR); ls *.patch | sort > series) || true
- [ -f "$(UCI_PATCHDIR)/series" ] && while read patch; do \
- patch -d $(UCI_DIR) -p1 < $(UCI_PATCHDIR)/$$patch; \
- done < $(UCI_PATCHDIR)/series || true
- touch $@
-
-compile: $(UCI_DIR)/.prepared
- $(MAKE) -C $(UCI_DIR) CC=$(CC) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" OS="$(OS)"
- mkdir -p dist/usr/lib dist/usr/bin
- $(MAKE) -C $(UCI_DIR) install DESTDIR=../dist prefix=/usr
- $(MAKE) -C $(UCI_DIR)/lua CC=$(CC) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" OS="$(OS)"
- $(MAKE) -C $(UCI_DIR)/lua install DESTDIR=../../dist luadir=$(LUA_LIBRARYDIR)
-
-compile-all: compile
-
-clean:
- rm -rf $(UCI_PATCHDIR)/series
- rm -rf $(UCI_DIR) $(UCI_FILE)
+++ /dev/null
-#!/bin/sh
-$(dirname $0)/../usr/bin/uci -c $(dirname $0)/../etc/config "$@"
+++ /dev/null
-#!/bin/sh
-for i in $(find $(dirname $0)/../etc/uci-defaults -type f -not -name "$2")
-do
- [ -f $i ] && {
- bash $i; rm $i
- }
-done
+++ /dev/null
-config batmand general
- option interface ath0
- option announce
- option gateway_class
- option originator_interval
- option preferred_gateway
- option routing_class
- option visualisation_srv
- option policy_routing_script
-
+++ /dev/null
-#################################################################
-# In order to enable dynamic dns you need at least one section,
-# and in that seciton the "enabled" option must be set to one
-#
-# Each section represents an update to a different service
-#
-# You specify your domain name, your username and your password
-# with the optins "domain", "username" and "password" respectively
-#
-# Next you need to specify the name of the service you are
-# connecting to "eg. dyndns.org". The format of the update
-# urls for several different dynamic dns services is specified
-# in the /usr/lib/ddns/services file. This list is hardly complete
-# as there are many, many different dynamic dns services. If your
-# service is on the list you can merely specify it with the
-# "service_name" option. Otherwise you will need to determine
-# the format of the url to update with. You can either add an
-# entry to the /usr/lib/ddns/services file or specify this with
-# the "update_url" option.
-#
-# We also need to specify the source of the ip address to associate with
-# your domain. The "ip_source" option can be "network", "interface"
-# or "web", with "network" as the default.
-#
-# If "ip_source" is "network" you specify a network section in your
-# /etc/network config file (e.g. "wan", which is the default) with
-# the "ip_network" option. If you specify "wan", you will update
-# with whatever the ip for your wan is.
-#
-# If "ip_source" is "interface" you specify a hardware interface
-# (e.g. "eth1") and whatever the current ip of this interface is
-# will be associated with the domain when an update is performed.
-#
-# The last possibility is that "ip_source" is "web", which means
-# that in order to obtain our ip address we will connect to a
-# website, and the first valid ip address listed on that page
-# will be assumed to be ours. If you are behind another firewall
-# this is the best option since none of the local networks or
-# interfaces will have the external ip. The website to connect
-# to is specified by the "ip_url" option. You may specify multiple
-# urls in the option, separated by whitespace.
-#
-# Finally we need to specify how often to check whether we need
-# to check whether the ip address has changed (and if so update
-# it) and how often we need to force an update ( many services
-# will expire your domain if you don't connect and do an update
-# every so often). Use the "check_interval" to specify how
-# often to check whether an update is necessary, and the
-# "force_interval" option to specify how often to force an
-# update. Specify the units for these values with the "check_unit"
-# and the "force_unit" options. Units can be "days", "hours",
-# "minutes" or "seconds". The default force_unit is hours and the
-# default check_unit is seconds. The default check_interval is
-# 600 seconds, or ten minutes. The default force_interval is
-# 72 hours or 3 days.
-#
-#
-#########################################################
-
-config service "myddns"
- option enabled "0"
-
- option service_name "dyndns.org"
- option domain "mypersonaldomain.dyndns.org"
- option username "myusername"
- option password "mypassword"
-
- option ip_source "network"
- option ip_network "wan"
-
-
- option force_interval "72"
- option force_unit "hours"
- option check_interval "10"
- option check_unit "minutes"
-
- #option ip_source "interface"
- #option ip_interface "eth0.1"
-
- #option ip_source "web"
- #option ip_url "http://www.whatismyip.com/automation/n09230945.asp"
-
- #option update_url "http://[USERNAME]:[PASSWORD]@members.dyndns.org/nic/update?hostname=[DOMAIN]&myip=[IP]"
-
-
+++ /dev/null
-config dnsmasq
- option domainneeded 1
- option boguspriv 1
- option filterwin2k '0' #enable for dial on demand
- option localise_queries 1
- option local '/lan/'
- option domain 'lan'
- option expandhosts 1
- option nonegcache 0
- option authoritative 1
- option readethers 1
- option leasefile '/tmp/dhcp.leases'
- option resolvfile '/tmp/resolv.conf.auto'
-
-config dhcp
- option interface lan
- option start 100
- option limit 150
- option leasetime 12h
-
-config dhcp
- option interface wan
- option ignore 1
+++ /dev/null
-config dropbear
- option PasswordAuth 'on'
- option Port '22'
+++ /dev/null
-config defaults
- option syn_flood 1
- option input DROP
- option output ACCEPT
- option forward DROP
-
-config zone
- option name lan
- option input ACCEPT
- option output ACCEPT
- option forward DROP
-
-config zone
- option name wan
- option input DROP
- option output ACCEPT
- option forward DROP
- option masq 1
-
-config forwarding
- option src lan
- option dest wan
-
-
-### EXAMPLE CONFIG SECTIONS
-# do not allow a specific ip to access wan
-#config rule
-# option src lan
-# option src_ip 192.168.45.2
-# option dest wan
-# option proto tcp
-# option target REJECT
-
-# block a specific mac on wan
-#config rule
-# option dest wan
-# option src_mac 00:11:22:33:44:66
-# option target REJECT
-
-# block incoming ICMP traffic on a zone
-#config rule
-# option src lan
-# option proto ICMP
-# option target DROP
-
-# port redirect port coming in on wan to lan
-#config redirect
-# option src wan
-# option src_dport 80
-# option dest lan
-# option dest_ip 192.168.16.235
-# option dest_port 80
-# option protocol tcp
-
-# include a file with users custom iptables rules
-#config include
-# option path /etc/firewall.user
-
-
-### FULL CONFIG SECTIONS
-#config rule
-# option src lan
-# option src_ip 192.168.45.2
-# option src_mac 00:11:22:33:44:55
-# option src_port 80
-# option dest wan
-# option dest_ip 194.25.2.129
-# option dest_port 120
-# option proto tcp
-# option target REJECT
-
-#config redirect
-# option src lan
-# option src_ip 192.168.45.2
-# option src_mac 00:11:22:33:44:55
-# option src_port 1024
-# option src_dport 80
-# option dest_ip 194.25.2.129
-# option dest_port 120
-# option proto tcp
+++ /dev/null
-config mount
- option target /home
- option device /dev/sda1
- option fstype ext3
- option options rw,sync
- option enabled 0
-
-config swap
- option device /dev/sda2
- option enabled 0
+++ /dev/null
-
-config 'httpd'
- option 'port' '80'
- option 'home' '/www'
-
+++ /dev/null
-config 'smap_scannet' 'SIP_LAN'
- option 'enable' '0'
- option 'interface' 'lan'
- option 'subnet' '192.168.99.0/24'
- option 'ports' '5060'
- option 'timeout' '10'
- option 'repeat_count' '1'
- option 'sleepreq' '100'
-
-config 'smap_scannet' 'SIP_WAN'
- option 'enable' '0'
- option 'interface' 'wan'
- option 'subnet' '216.218.0.0/16'
-
-config 'netdiscover_scannet' 'SCAN_LAN'
- option 'enable' '0'
- option 'interface' 'lan'
- option 'subnet' '192.168.99.0/24'
-
-config 'netdiscover_scannet' 'SCAN_WAN'
- option 'enable' '0'
- option 'interface' 'wan'
- option 'subnet' '216.218.0.0/16'
- option 'ports' '5060'
- option 'timeout' '10'
- option 'repeat_count' '1'
- option 'sleepreq' '100'
-
-
+++ /dev/null
-
-config 'mactodevinfo'
- option 'maclow' '00:19:15:00:00:00'
- option 'machigh' '00:19:15:ff:ff:ff'
- option 'vendor' 'Vertical Communications'
- option 'devtype' 'SIP devices'
- option 'model' 'varies'
- option 'ouiowneroverride' 'Some company'
- option 'name' 'Vertical XIP and Phones'
-
+++ /dev/null
-#### VLAN configuration
-config switch eth0
- option vlan0 "0 1 2 3 5*"
- option vlan1 "4 5"
-
-
-#### Loopback configuration
-config interface loopback
- option ifname "lo"
- option proto static
- option ipaddr 127.0.0.1
- option netmask 255.0.0.0
-
-
-#### LAN configuration
-config interface lan
- option type bridge
- option ifname "eth0"
- option proto static
- option ipaddr 192.168.1.1
- option netmask 255.255.255.0
-
-
-#### WAN configuration
-config interface wan
- option ifname "wlan0"
- option proto dhcp
+++ /dev/null
-config ntpserver
- option hostname '0.openwrt.pool.ntp.org'
- option port '123'
-
-config ntpserver
- option hostname '1.openwrt.pool.ntp.org'
- option port '123'
-
-config ntpserver
- option hostname '2.openwrt.pool.ntp.org'
- option port '123'
-
-config ntpserver
- option hostname '3.openwrt.pool.ntp.org'
- option port '123'
-
-config ntpdrift
- option freq '0'
-
-config ntpclient
- option interval 60
- #option count 10
+++ /dev/null
-# QoS configuration for OpenWrt
-
-# INTERFACES:
-config interface wan
- option classgroup "Default"
- option enabled 1
- option overhead 1
- option upload 128
- option download 1024
-
-# RULES:
-config classify
- option target "Bulk"
- option ipp2p "all"
-config classify
- option target "Bulk"
- option layer7 "edonkey"
-config classify
- option target "Bulk"
- option layer7 "bittorrent"
-config classify
- option target "Priority"
- option ports "22,53"
-config classify
- option target "Normal"
- option proto "tcp"
- option ports "20,21,25,80,110,443,993,995"
-config classify
- option target "Express"
- option ports "5190"
-config default
- option target "Express"
- option proto "udp"
- option pktsize "-500"
-config reclassify
- option target "Priority"
- option proto "icmp"
-config default
- option target "Bulk"
- option portrange "1024-65535"
-config reclassify
- option target "Priority"
- option proto "tcp"
- option pktsize "-128"
- option mark "!Bulk"
- option tcpflags "SYN"
-config reclassify
- option target "Priority"
- option proto "tcp"
- option pktsize "-128"
- option mark "!Bulk"
- option tcpflags "ACK"
-
-
-# Don't change the stuff below unless you
-# really know what it means :)
-
-config classgroup "Default"
- option classes "Priority Express Normal Bulk"
- option default "Normal"
-
-
-config class "Priority"
- option packetsize 400
- option maxsize 400
- option avgrate 10
- option priority 20
-config class "Priority_down"
- option packetsize 1000
- option avgrate 10
-
-
-config class "Express"
- option packetsize 1000
- option maxsize 800
- option avgrate 50
- option priority 10
-
-config class "Normal"
- option packetsize 1500
- option packetdelay 100
- option avgrate 10
- option priority 5
-config class "Normal_down"
- option avgrate 20
-
-config class "Bulk"
- option avgrate 1
- option packetdelay 200
+++ /dev/null
-config system
- option hostname OpenWrt
- option timezone UTC
+++ /dev/null
-config upnpd config
- option log_output 0
- option download 1024
- option upload 512
+++ /dev/null
-config wifi-device wifi0
- option type atheros
- option channel auto
- option disabled 0
-
-config wifi-iface
- option device wifi0
- option network lan
- option mode ap
- option ssid OpenWrt
- option encryption none
-
- # Fake active wifi
- option ifname ath0
- option up 1
-
+++ /dev/null
-include ../../build/config.mk
-include ../../build/gccconfig.mk
-
-UHTTPD_SRC = svn://svn.openwrt.org/openwrt/branches/backfire/package/uhttpd/src
-UHTTPD_DIR = uhttpd-src
-UHTTPD_PATCHDIR = patches
-
-all: compile
-
-include ../../build/module.mk
-
-$(UHTTPD_DIR)/Makefile:
- svn co $(UHTTPD_SRC) $(UHTTPD_DIR)
-
-$(UHTTPD_DIR)/.prepared: $(UHTTPD_DIR)/Makefile
- (cd $(UHTTPD_PATCHDIR); ls *.patch | sort > series) || true
- [ -f "$(UHTTPD_PATCHDIR)/series" ] && while read patch; do \
- patch -d $(UHTTPD_DIR) -p1 < $(UHTTPD_PATCHDIR)/$$patch; \
- done < $(UHTTPD_PATCHDIR)/series || true
- touch $@
-
-compile: $(UHTTPD_DIR)/.prepared
- (cd $(UHTTPD_DIR); $(MAKE) LUA_SUPPORT=0 TLS_SUPPORT=0 CGI_SUPPORT=1)
- mkdir -p dist/usr/sbin
- cp $(UHTTPD_DIR)/uhttpd dist/usr/sbin
-
-compile-all: compile
-
-clean:
- rm -rf $(UHTTPD_DIR)
+++ /dev/null
---- a/uhttpd-cgi.c
-+++ b/uhttpd-cgi.c
-@@ -216,7 +216,7 @@ void uh_cgi_request(
- (pi->stat.st_mode & S_IXOTH)) || (ip != NULL)
- ) {
- /* build environment */
-- clearenv();
-+ //clearenv();
-
- /* common information */
- setenv("GATEWAY_INTERFACE", "CGI/1.1", 1);
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -70,7 +70,7 @@ endif
- $(CC) $(CFLAGS) -c -o $@ $<
-
- compile: $(OBJ) $(TLSLIB) $(LUALIB)
-- $(CC) -o uhttpd $(LDFLAGS) $(LIB) $(OBJ)
-+ $(CC) -o uhttpd $(LDFLAGS) $(OBJ) $(LIB)
-
- clean:
- rm -f *.o *.so uhttpd
+++ /dev/null
-001-pass-env.patch
-002-link-order.patch
--- /dev/null
+
+# CBI models
+are Lua files describing the structure of an UCI config file and the resulting HTML form to be evaluated by the CBI parser.<br />
+All CBI model files must return an object of type **luci.cbi.Map**.<br />
+For a commented example of a CBI model, see the [Writing Modules tutorial](ModulesHowTo.md#cbimodels).
+
+The scope of a CBI model file is automatically extended by the contents of the module **luci.cbi** and the _translate_ function from **luci.i18n**
+
+This Reference covers **the basics** of the CBI system.
+
+
+## class Map (_config, title, description_)
+This is the root object of the model.
+
+* **config:** configuration filename to be mapped, see [UCI documentation](http://wiki.openwrt.org/doc/uci) and the files in /etc/config
+* **title:** title shown in the UI
+* **description:** description shown in the UI
+
+#### function :section (_sectionclass_, ...)
+Creates a new section
+* **sectionclass**: a class object of the section
+* _additional parameters passed to the constructor of the section class_
+
+----
+
+## class NamedSection (_name, type, title, description_)
+An object describing an UCI section selected by the name.<br />
+To instantiate use: `Map:section(NamedSection, "name", "type", "title", "description")`
+
+* **name:** UCI section name
+* **type:** UCI section type
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :option(_optionclass_, ...)
+Creates a new option
+* **optionclass:** a class object of the section
+* _additional parameters passed to the constructor of the option class_
+
+#### property .addremove = false
+Allows the user to remove and recreate the configuration section.
+
+#### property .dynamic = false
+Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options.
+
+#### property .optional = true
+Parse optional options
+
+----
+
+## class TypedSection (_type, title, description_)
+An object describing a group of UCI sections selected by their type.<br />
+To instantiate use: `Map:section(TypedSection, "type", "title", "description")`
+* **type:** UCI section type
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :option(_optionclass_, ...)
+Creates a new option
+ **optionclass:** a class object of the section
+ _additional parameters passed to the constructor of the option class_
+
+#### function :depends(_key, value_)
+Only select those sections where _key == value_ <br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+#### function .filter(_self, section_) -abstract-
+You can override this function to filter certain sections that will not be parsed.
+The filter function will be called for every section that should be parsed and returns **nil** for sections that should be filtered. For all other sections it should return the section name as given in the second parameter.
+
+#### property .addremove = false
+Allows the user to remove and recreate the configuration section
+
+#### property .dynamic = false
+Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options.
+
+#### property .optional = true
+Parse optional options
+
+#### property .anonymous = false
+Do not show UCI section names
+
+----
+
+## class Value (_option, title, description_)
+An object describing an option in a section of a UCI File. Creates a standard text field in the formular.<br />
+To instantiate use: `NamedSection:option(Value, "option", "title", "description")`<br />
+ or `TypedSection:option(Value, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :depends(key, value)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+#### function :value(key, value)
+Convert this text field into a combobox if possible and add a selection option.
+
+#### property .default = nil
+The default value
+
+#### property .maxlength = nil
+The maximum inputlength (of chars) of the value
+
+#### property .optional = false
+Marks this option as optional, implies .rmempty = true
+
+#### property .rmempty = true
+Removes this option from the configuration file when the user enters an empty value
+
+#### property .size = nil
+The maximum number of chars displayed by form field
+
+----
+
+## class ListValue (_option, title, description_)
+An object describing an option in a section of a UCI File.<br />
+Creates a list box or list of radio (for selecting one of many choices) in the formular.<br />
+To instantiate use: `NamedSection:option(ListValue, "option", "title", "description")`<br />
+or `TypedSection:option(ListValue, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :depends(key, value)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+#### function :value(_key, value_)
+Adds an entry to the selection list
+
+#### property .widget = "select"
+**"select"** shows a selction list, **"radio"** shows a list of radio buttons inside form
+
+#### property .default = nil
+The default value
+
+#### property .optional = false
+Marks this option as optional, implies .rmempty = true
+
+#### property .rmempty = true
+Removes this option from the configuration file when the user enters an empty value
+
+#### property .size = nil
+The size of the form field
+
+----
+
+## class Flag (_option, title, description_)
+An object describing an option with two possible values in a section of a UCI File.<br />
+Creates a checkbox field in the formular.<br />
+To instantiate use: `NamedSection:option(Flag, "option", ""title", "description")`<br />
+ or `TypedSection:option(Flag, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :depends (_key, value_)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+#### property .default = nil
+The default value
+
+#### property .disabled = 0
+the value that shoudl be set if the checkbox is unchecked
+
+#### property .enabled = 1
+the value that should be set if the checkbox is checked
+
+#### property .optional = false
+Marks this option as optional, implies .rmempty = true
+
+#### property .rmempty = true
+Removes this option from the configuration file when the user enters an empty value
+
+----
+
+## class MultiValue (_option'', ''title'', ''description_)
+An object describing an option in a section of a UCI File.<br />
+Creates a list of checkboxed or a multiselectable list as form fields.<br />
+To instantiate use: `NamedSection:option(MultiValue, "option", ""title", "description")`<br />
+ or `TypedSection:option(MultiValue, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### function :depends (_key, value_)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+#### function :value(_key, value_)
+Adds an entry to the list
+
+#### property .widget = "checkbox"
+**"select"** shows a selction list, **"checkbox"** shows a list of checkboxes inside form
+
+#### property .delimiter = " "
+The string which will be used to delimit the values inside stored option
+
+#### property .default = nil
+The default value
+
+#### property .optional = false
+Marks this option as optional, implies .rmempty = true
+
+#### property .rmempty = true
+Removes this option from the configuration file when the user enters an empty value
+
+#### property .size = nil
+The size of the form field (only used if property _.widget = "select"_)
+
+----
+
+## class StaticList (_option, title, description_)
+Similar to the MultiValue, but stores selected Values into a UCI list instead of a character-separated option.
+
+----
+
+## class DynamicList (_option, title, description_)
+A extensible list of user-defined values. Stores Values into a UCI list
+
+----
+
+## class DummyValue (_option, title, description_)
+Creates a readonly text in the form. !It writes no data to UCI!<br />
+To instantiate use: `NamedSection:option(DummyValue, "option", ""title", "description")`<br />
+ or `TypedSection:option(DummyValue, "option", "title", "description")`
+* **option:** UCI option name
+* **title:** The title shown in the UI
+* **description:** description shown in the UI
+
+#### property :depends (_key, value_)
+Only show this option field if another option _key_ is set to _value_ in the same section.<br />
+If you call this function several times the dependencies will be linked with **"or"**
+
+----
+
+## class TextValue (_option, title, description_)
+An object describing a multi-line textbox in a section in a non-UCI form.
+
+----
+
+## class Button (_option, title, description_)
+An object describing a Button in a section in a non-UCI form.
--- /dev/null
+LuCI provides some of its libraries to external applications through a JSON-RPC API.
+This Howto shows how to use it and provides information about available functions.
+
+
+# Basics
+LuCI comes with an efficient JSON De-/Encoder together with a JSON-RPC-Server which implements the *JSON-RPC 1.0_' and 2.0 (partly) specifications. The LuCI JSON-RPC server offers several independent APIs. Therefore you have to use '_different URLs for every exported library*.
+Assuming your LuCI-Installation can be reached through */cgi-bin/luci_' any exported library can be reached via '''/cgi-bin/luci/rpc/''LIBRARY_*.
+
+
+# Authentication
+Most exported libraries will require a valid authentication to be called with. If you get an *HTTP 403 Forbidden_' status code you are probably missing a valid authentication token. To get such a token you have to call the function '''login''' of the RPC-Library '''auth'''. Following our example from above this login function would be provided at '_/cgi-bin/luci/rpc/auth*. The function accepts 2 parameters: username and password (of a valid user account on the host system) and returns an authentication token.
+
+If you want to call any exported library which requires an authentication token you have to *append it as an URL parameter _auth''''' to the RPC-Server URL. So instead of calling '''/cgi-bin/luci/rpc/''LIBRARY''''' you have to call '''/cgi-bin/luci/rpc/''LIBRARY''?auth=''TOKEN_*.
+
+If your JSON-RPC client is Cookie-aware (like most browsers are) you will receive the authentication token also with a session cookie and probably don't have to append it to the RPC-Server URL.
+
+
+# Exported Libraries
+## uci
+The UCI-Library */rpc/uci* offers functionality to interact with the Universal Configuration Interface.
+*Exported Functions:*
+* [(string) add(config, type)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.add)
+* [(integer) apply(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.apply)
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.changes (object) changes([config])]
+* [(boolean) commit(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.commit)
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.delete (boolean) delete(config, section[, option])]
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.delete_all (boolean) delete_all(config[, type])]
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.foreach (array) foreach(config[, type])]
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get (mixed) get(config, section[, option])]
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get_all (object) get_all(config[, section])]
+* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get (mixed) get_state(config, section[, option])]
+* [(boolean) revert(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.revert)
+* [(name) section(config, type, name, values)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.section)
+* [(boolean) set(config, section, option, value)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.set)
+* [(boolean) tset(config, section, values)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.tset)
+
+## uvl
+The UVL-Library */rpc/uvl* offers functionality to validate UCI files and get schemes describing UCI files.
+*Exported Functions:*
+* [(array) get_scheme(scheme)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.get_scheme)
+* [(array) validate(config, section, option)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate)
+* [(array) validate_config(config)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_config)
+* [(array) validate_section(config, section)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_section)
+* [(array) validate(config, section, option)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_option)
+
+## fs
+The Filesystem library */rpc/fs* offers functionality to interact with the filesystem on the host machine.
+*Exported Functions:*
+
+* [Complete luci.fs library](http://luci.subsignal.org/api/luci/modules/luci.fs.html)
+*Note:* All functions are exported as they are except for _readfile'' which encodes its return value in base64 and ''writefile'' which only accepts base64 encoded data as second argument. Note that both functions will only be available when the ''luasocket_ packet is installed on the hostsystem.
+
+## sys
+The System library */rpc/sys* offers functionality to interact with the operating system on the host machine.
+*Exported Functions:*
+* [Complete luci.sys library](http://luci.subsignal.org/api/luci/modules/luci.sys.html)
+* [Complete luci.sys.group library](http://luci.subsignal.org/api/luci/modules/luci.sys.group.html) with prefix *group.*
+* [Complete luci.sys.net library](http://luci.subsignal.org/api/luci/modules/luci.sys.net.html) with prefix *net.*
+* [Complete luci.sys.process library](http://luci.subsignal.org/api/luci/modules/luci.sys.process.html) with prefix *process.*
+* [Complete luci.sys.user library](http://luci.subsignal.org/api/luci/modules/luci.sys.user.html) with prefix *user.*
+* [Complete luci.sys.wifi library](http://luci.subsignal.org/api/luci/modules/luci.sys.wifi.html) with prefix *wifi.*
+
+## ipkg
+The IPKG library */rpc/ipkg* offers functionality to interact with the package manager (IPKG or OPKG) on the host machine.
+*Exported Functions:*
+* [Complete luci.model.ipkg library](http://luci.subsignal.org/api/luci/modules/luci.model.ipkg.html)
--- /dev/null
+LAR is a simple archive format to pack multiple lua source files and arbitary other resources into a single file.
+
+
+# Format Specification
+
+A LAR archive file is divided into two parts: the payload and the index lookup table.
+All segments of the archive are 4 Byte aligned to ease reading and processing of the format.
+All integers are stored in network byte order, so an implementation has to use htonl() and htons() to properly read them.
+
+Schema:
+
+ <payload:
+ <member:
+ <N*4 bytes: path of file #1>
+ <N*4 bytes: data of file #1>
+ >
+
+ <member:
+ <N*4 bytes: path of file #2>
+ <N*4 bytes: data of file #2>
+ >
+
+ ...
+
+ <member:
+ <N*4 bytes: path of file #N>
+ <N*4 bytes: data of file #N>
+ >
+ >
+
+ <index table:
+ <entry:
+ <uint32: offset for path of file #1> <uint32: length for path of file #1>
+ <uint32: offset for data of file #1> <uint32: length for data of file #1>
+ <uint16: type of file #1> <uint16: flags of file #1>
+ >
+
+ <entry:
+ <uint32: offset for path of file #2> <uint32: length for path of file #2>
+ <uint32: offset for data of file #2> <uint32: length for data of file #2>
+ <uint16: type of file #2> <uint16: flags of file #2>
+ >
+
+ ...
+
+ <entry:
+ <uint32: offset for path of file #N> <uint32: length for path of file #N>
+ <uint32: offset for data of file #N> <uint32: length for data of file #N>
+ <uint16: type of file #N> <uint16: flags of file #N>
+ >
+ >
+
+ <uint32: offset for begin of index table>
+
+
+
+# Processing
+
+In order to process an LAR archive, an implementation would have to do the following steps:
+
+## Read Index
+
+1. Locate and open the archive file
+1. Seek to end of file - 4 bytes
+1. Read 32bit index offset and swap from network to native byte order
+1. Seek to index offset, calculate index length: filesize - index offset - 4
+1. Initialize a linked list for index table entries
+1. Read each index entry until the index length is reached, read and byteswap 4 * 32bit int and 2 * 16bit int
+1. Seek to begin of file
+
+## Read Member
+
+1. Read the archive index
+1. Iterate through the linked index list, perform the following steps for each entry
+1. Seek to the specified file path offset
+1. Read as much bytes as specified in the file path length into a buffer
+1. Compare the contents of the buffer against the path of the searched member
+1. If buffer and searched path are equal, seek to the specified file data offset
+1. Read data until the file data length is reached, return
+1. Select the next index table entry and repeat from step 3, if there is no next entry then return
+
+# Reference implementation
+
+A reference implementation can be found here:
+http://luci.subsignal.org/trac/browser/luci/trunk/contrib/lar
+
+The lar.pl script is a simple packer for LAR archives and cli.c provides a utility to list and dump packed LAR archives.
--- /dev/null
+LMO is a simple binary format to pack language strings into a more efficient form. Although it's suitable to store any kind of key-value table, it's only used for the LuCI *.po based translation system at the moment. The abbreviation "LMO" stands for "Lua Machine Objects" in the style of the GNU gettext *.mo format.
+
+
+# Format Specification
+
+A LMO file is divided into two parts: the payload and the index lookup table.
+All segments of the file are 4 Byte aligned to ease reading and processing of the format.
+Only unsigned 32bit integers are used and stored in network byte order, so an implementation has to use htonl() to properly read them.
+
+Schema:
+
+ <file:
+ <payload:
+ <entry #1: 4 byte aligned data>
+
+ <entry #2: 4 byte aligned data>
+
+ ...
+
+ <entry #N: 4 byte aligned data>
+ >
+
+ <index table:
+ <entry #1:
+ <uint32_t: hash of the first key>
+ <uint32_t: hash of the first value>
+ <uint32_t: file offset of the first value>
+ <uint32_t: length of the first value>
+ >
+
+ <entry #2:
+ <uint32_t: hash of the second key>
+ <uint32_t: hash of the second value>
+ <uint32_t: file offset of the second value>
+ <uint32_t: length of the second value>
+ >
+
+ ...
+
+ <entry #N:
+ <uint32_t: hash of the Nth key>
+ <uint32_t: hash of the Nth value>
+ <uint32_t: file offset of the Nth value>
+ <uint32_t: length of the Nth value>
+ >
+ >
+
+ <uint32_t: offset of the begin of index table>
+ >
+
+
+
+# Processing
+
+In order to process a LMO file, an implementation would have to do the following steps:
+
+## Read Index
+
+1. Locate and open the archive file
+1. Seek to end of file - 4 bytes (sizeof(uint32_t))
+1. Read 32bit index offset and swap from network to native byte order
+1. Seek to index offset, calculate index length: filesize - index offset - 4
+1. Initialize a linked list for index table entries
+1. Read each index entry until the index length is reached, read and byteswap 4 * uint32_t for each step
+1. Seek to begin of file
+
+## Read Entry
+
+1. Calculate the unsigned 32bit hash of the entries key value (see "Hash Function" section below)
+1. Obtain the archive index
+1. Iterate through the linked index list, perform the following steps for each entry:
+ 1. Compare the entry hash value with the calculated hash from step 1
+ 2. If the hash values are equal proceed with step 4
+ 3. Select the next entry and repeat from step 3.1
+1. Seek to the file offset specified in the selected entry
+1. Read as much bytes as specified in the entry length into a buffer
+1. Return the buffer value
+
+# Hash Function
+
+The current LuCI-LMO implementation uses the "Super Fast Hash" function which was kindly put in the public domain by it's original author. See http://www.azillionmonkeys.com/qed/hash.html for details. Below is the C-Implementation of this function:
+
+
+ #if (defined(__GNUC__) && defined(__i386__))
+ #define sfh_get16(d) (*((const uint16_t *) (d)))
+ #else
+ #define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+ +(uint32_t)(((const uint8_t *)(d))[0]) )
+ #endif
+
+ uint32_t sfh_hash(const char * data, int len)
+ {
+ uint32_t hash = len, tmp;
+ int rem;
+
+ if (len <= NULL) return 0;
+
+ rem = len & 3;
+ len >>= 2;
+
+ /* Main loop */
+ for (;len > 0; len--) {
+ hash += sfh_get16(data);
+ tmp = (sfh_get16(data+2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ data += 2*sizeof(uint16_t);
+ hash += hash >> 11;
+ }
+
+ /* Handle end cases */
+ switch (rem) {
+ case 3: hash += sfh_get16(data);
+ hash ^= hash << 16;
+ hash ^= data[sizeof(uint16_t)] << 18;
+ hash += hash >> 11;
+ break;
+ case 2: hash += sfh_get16(data);
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ break;
+ case 1: hash += *data;
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+ }
+
+
+# Reference Implementation
+
+A reference implementation can be found here:
+http://luci.subsignal.org/trac/browser/luci/trunk/libs/lmo/src
+
+The lmo_po2lmo.c executable implements a *.po to *.lmo conversation utility and lmo_lookup.c is a simple *.lmo test utility.
+Lua bindings for lmo are defined in lmo_lualib.c and associated headers.
--- /dev/null
+[[PageOutline(2-5, Table of Contents, floated)]]
+
+
+This document describes new features and incompatibilities to LuCI 0.9.x.
+It is targeted at module authors developing external addons to LuCI.
+
+# I18N Changes
+
+## API
+
+The call conventions for the i18n api changed, there is no dedicated translation
+key anymore and the english text is used for lookup instead. This was done to
+ease the maintenance of language files.
+
+Code that uses _translate()'' or ''i18n()_ must be changed as follows:
+
+
+ -- old style:
+ translate("some_text", "Some Text")
+ translatef("some_format_text", "Some formatted Text: %d", 123)
+
+ -- new style:
+ translate("Some Text")
+ translatef("Some formatted Text: %d", 123)
+
+
+Likewise for templates:
+
+
+ <!-- old style: -->
+ <%:some_text Some Text%>
+
+ <!-- new style: -->
+ <%:Some Text%>
+
+
+If code must support both LuCI 0.9.x and 0.10.x versions, it is suggested to write the calls as follows:
+
+ translate("Some Text", "Some Text")
+
+
+An alternative is wrapping translate() calls into a helper function:
+
+ function tr(key, alt)
+ return translate(key) or translate(alt) or alt
+ end
+
+
+... which is used as follows:
+
+ tr("some_key", "Some Text")
+
+
+## Translation File Format
+
+Translation catalogs are now maintained in *.po format files. During build those get translated
+into [*.lmo archives](http://luci.subsignal.org/trac/wiki/Documentation/LMO).
+
+LuCI ships a [utility script](http://luci.subsignal.org/trac/browser/luci/branches/luci-0.10/build/i18n-lua2po.pl)
+in the build/ directory to convert old Lua translation files to the *.po format. The generated *.po files should
+be placed in the appropriate subdirectories within the top po/ file in the LuCI source tree.
+
+### Components built within the LuCI tree
+
+If components using translations are built along with the LuCI tree, the newly added *.po file are automatically
+compiled into *.lmo archives during the build process. In order to bundle the appropriate *.lmo files into the
+corresponding *.ipk packages, component Makefiles must include a "PO" variable specifying the files to include.
+
+Given a module _applications/example/'' which uses ''po/en/example.po'' and ''po/en/example-extra.po_,
+the _applications/example/Makefile_ must be changed as follows:
+
+
+ PO = example example-extra
+
+ include ../../build/config.mk
+ include ../../build/module.mk
+
+
+### Standalone components
+
+Authors who externally package LuCI components must prepare required *.lmo archives themselves.
+To convert existing Lua based message catalogs to the *.po format, the build/i18n-lua2po.pl helper script can be used.
+In order to convert *.po files into *.lmo files, the standalone "po2lmo" utility must be compiled as follows:
+
+
+ $ svn co http://svn.luci.subsignal.org/luci/branches/luci-0.10/libs/lmo
+ $ cd lmo/
+ $ make
+ $ ./src/po2lmo translations.po translations.lmo
+
+
+Note that at the time of writing, the utility program needs Lua headers installed on the system in order to compile properly.
+
+# CBI
+
+## Datatypes
+
+The server side UVL validation has been dropped to reduce space requirements on the target.
+Instead it is possible to define datatypes for CBI widgets now:
+
+
+ opt = section:option(Value, "optname", "Title Text")
+ opt.datatype = "ip4addr"
+
+
+User provided data is validated once on the frontend via JavaScript and on the server side prior to saving it.
+A list of possible datatypes can be found in the [luci.cbi.datatypes](http://luci.subsignal.org/trac/browser/luci/branches/luci-0.10/libs/web/luasrc/cbi/datatypes.lua#L26) class.
+
+## Validation
+
+Server-sided validator function can now return custom error messages to provide better feedback on invalid input.
+
+
+ opt = section:option(Value, "optname", "Title Text")
+
+ function opt.validate(self, value, section)
+ if input_is_valid(value) then
+ return value
+ else
+ return nil, "The value is invalid because ..."
+ end
+ end
+
+
+## Tabs
+
+It is now possible to break up CBI sections into multiple tabs to better organize longer forms.
+The TypedSection and NamedSection classes gained two new functions to define tabs, _tab()'' and ''taboption()_.
+
+
+ sct = map:section(TypedSection, "name", "type", "Title Text")
+
+ sct:tab("general", "General Tab Title", "General Tab Description")
+ sct:tab("advanced", "Advanced Tab Title", "Advanced Tab Description")
+
+ opt = sct:taboption("general", Value, "optname", "Title Text")
+ ...
+
+
+The _tab()_ function is declares a new tab and takes up to three arguments:
+ * Internal name of the tab, must be unique within the section
+ * Title text of the tab
+ * Optional description text for the tab
+
+The _taboption()'' function wraps ''option()_ and assigns the option object to the given tab.
+It takes up to five arguments:
+
+ * Name of the tab to assign the option to
+ * Option type, e.g. Value or DynamicList
+ * Option name
+ * Title text of the option
+ * Optional description text of the option
+
+If tabs are used within a particular section, the _option()_ function must not be used,
+doing so results in undefined behaviour.
+
+## Hooks
+
+The CBI gained support for _hooks_ which can be used to trigger additional actions during the
+life-cycle of a map:
+
+
+ map = Map("config", "Title Text")
+
+ function map.on_commit(self)
+ -- do something if the UCI configuration got committed
+ end
+
+
+The following hooks are defined:
+
+|| on_cancel || The user pressed cancel within a multi-step Delegator or a SimpleForm instance ||
+|| on_init || The CBI is about to render the Map object ||
+|| on_parse || The CBI is about to read received HTTP form values ||
+|| on_save, on_before_save || The CBI is about to save modified UCI configuration files ||
+|| on_after_save || Modified UCI configuration files just got saved
+|| on_before_commit || The CBI is about to commit the changes ||
+|| on_commit, on_after_commit, on_before_apply || Modified configurations got committed and the CBI is about to restart associated services ||
+|| on_apply, on_after_apply || All changes where completely applied (only works on Map instances with the apply_on_parse attribute set) ||
+
+## Sortable Tables
+
+TypedSection instances which use the "cbi/tblsection" template may now use a new attribute _sortable_ to allow the user to reorder table rows.
+
+
+ sct = map:section(TypedSection, "name", "type", "Title Text")
+ sct.template = "cbi/tblsection"
+ sct.sortable = true
+
+ ...
+
+
+# JavaScript
+
+The LuCI 0.10 branch introduced a new JavaScript file _xhr.js_ which provides support routines for XMLHttpRequest operations.
+Each theme must include this file in the <head> area of the document for forms to work correctly.
+
+It should be included like this:
+
+
+ <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
+
\ No newline at end of file
--- /dev/null
+# Categories
+
+The LuCI modules are divided into several category directories, namely:
+* applications (Single applications or plugins for other modules or applications)
+* i18n (Translation files)
+* libs (Independent libraries)
+* modules (Collections of applications)
+* themes (Frontend themes)
+
+Each module goes into a subdirectory of any of this category-directories.
+
+# Module directory
+The contents of a module directory are as follows:
+
+## Makefile
+This is the module's makefile. If the module just contains Lua sourcecode or resources then the following Makefile should suffice.
+
+ include ../../build/config.mk
+ include ../../build/module.mk
+
+
+If you have C(++) code in your module your Makefile should at least contain the following things.
+
+ include ../../build/config.mk
+ include ../../build/gccconfig.mk
+ include ../../build/module.mk
+
+ compile:
+ # Commands to compile and link your C-code
+ # and to install them under the dist/ hierarchy
+
+ clean: luaclean
+ # Commands to clean your compiled objects
+
+
+
+## src
+The *src* directory is reserved for C sourcecode.
+
+## luasrc
+*luasrc* contains all Lua sourcecode files. These will automatically be stripped or compiled depending on the Make target and are installed in the LuCI installation directory.
+
+## lua
+*lua* is equivalent to _luasrc_ but containing Lua files will be installed in the Lua document root.
+
+## htdocs
+All files under *htdocs* will be copied to the document root of the target webserver.
+
+## root
+All directories and files under *root* will be copied to the installation target as they are.
+
+## dist
+*dist* is reserved for the builder to create a working installation tree that will represent the filesystem on the target machine.
+*DO NOT* put any files there as they will get deleted.
+
+## ipkg
+*ipkg* contains IPKG package control files, like _preinst'', ''posinst'', ''prerm'', ''postrm''. ''conffiles_.
+See IPKG documentation for details.
+
+
+# OpenWRT feed integration
+If you want to add your module to the LuCI OpenWRT feed you have to add several sections to the contrib/package/luci/Makefile.
+
+For a Web UI applications this is:
+
+A package description:
+
+ define Package/luci-app-YOURMODULE
+ $(call Package/luci/webtemplate)
+ DEPENDS+=+some-package +some-other-package
+ TITLE:=SHORT DESCRIPTION OF YOURMODULE
+ endef
+
+
+
+A package installation target:
+
+ define Package/luci-app-YOURMODULE/install
+ $(call Package/luci/install/template,$(1),applications/YOURMODULE)
+ endef
+
+
+A module build instruction:
+
+ ifneq ($(CONFIG_PACKAGE_luci-app-YOURMODULE),)
+ PKG_SELECTED_MODULES+=applications/YOURMODULE
+ endif
+
+
+
+A build package call:
+
+ $(eval $(call BuildPackage,luci-app-YOURMODULE))
+
--- /dev/null
+*Note:* If you plan to integrate your module into LuCI, you should read the [wiki:Documentation/Modules Module Reference] before.
+
+This tutorial describes how to write your own modules for the LuCI WebUI.
+For this tutorial we refer to your LuCI installation direcotry as *lucidir_' (/usr/lib/lua/luci if you are working with an installed version) and assume your LuCI installation is reachable through your webserver via '_/cgi-bin/luci*.
+
+If you are working with the development environment replace *lucidir_' with '''''/path/to/your/luci/checkout''/applications/myapplication/luasrc''' (this is a default empty module you can use for your experiments) and your LuCI installation can probably be reached via http://localhost:8080/luci/ after you ran '_make runhttpd*.
+
+
+
+# Show me the way (The dispatching process)
+To write a module you need to understand the basics of the dispatching process in LuCI.
+LuCI uses a dispatching tree that will be built by executing the index-Function of every available controller.
+The CGI-environment variable *PATH_INFO* will be used as the path in this dispatching tree, e.g.: /cgi-bin/luci/foo/bar/baz
+will be resolved to foo.bar.baz
+
+To register a function in the dispatching tree, you can use the *entry*-function of _luci.dispatcher_. entry takes 4 arguments (2 are optional):
+
+ entry(path, target, title=nil, order=nil)
+
+
+* *path* is a table that describes the position in the dispatching tree: For example a path of {"foo", "bar", "baz"} would insert your node in foo.bar.baz.
+* *target* describes the action that will be taken when a user requests the node. There are several predefined ones of which the 3 most important (call, template, cbi) are described later on on this page
+* *title* defines the title that will be visible to the user in the menu (optional)
+* *order* is a number with which nodes on the same level will be sorted in the menu (optional)
+
+You can assign more attributes by manipulating the node table returned by the entry-function. A few example attributes:
+
+* *i18n* defines which translation file should be automatically loaded when the page gets requested
+* *dependent* protects plugins to be called out of their context if a parent node is missing
+* *leaf* stops parsing the request at this node and goes no further in the dispatching tree
+* *sysauth* requires the user to authenticate with a given system user account
+
+
+# It's all about names (Naming and the module file)
+Now that you know the basics about dispatching, we can start writing modules. But before you have to choose the category and name of your new digital child.
+
+We assume you want to create a new application "myapp" with a module "mymodule".
+
+So you have to create a new subdirectory *_lucidir''/controller/myapp''' with a file '_mymodule.lua* with the following content:
+
+ module("luci.controller.myapp.mymodule", package.seeall)
+
+ function index()
+
+ end
+
+
+The first line is required for Lua to correctly identify the module and create its scope.
+The index-Function will be used to register actions in the dispatching tree.
+
+
+
+# Teaching your new child (Actions)
+So it is there and has a name but it has no actions.
+
+We assume you want to reuse your module myapp.mymodule that you begun in the last step.
+
+
+## Actions
+Reopen *_lucidir_/controller/myapp/mymodule.lua* and just add a function to it so that its content looks like this example:
+
+
+ module("luci.controller.myapp.mymodule", package.seeall)
+
+ function index()
+ entry({"click", "here", "now"}, call("action_tryme"), "Click here", 10).dependent=false
+ end
+
+ function action_tryme()
+ luci.http.prepare_content("text/plain")
+ luci.http.write("Haha, rebooting now...")
+ luci.sys.reboot()
+ end
+
+
+And now type */cgi-bin/luci/click/here/now_' ('_[http://localhost:8080/luci/click/here/now]* if you are using the development environment) in your browser.
+
+You see these action functions simple have to be added to a dispatching entry.
+
+As you might or might not know: CGI specification requires you to send a Content-Type header before you can send your content. You will find several shortcuts (like the one used above) as well as redirecting functions in the module *luci.http*
+
+## Views
+If you only want to show the user a text or some interesting familiy photos it may be enough to use a HTML-template. These templates can also include some Lua code but be aware that writing whole office suites by only using these templates might be called "dirty" by other developers.
+
+Now let's create a little template *_lucidir_/view/myapp-mymodule/helloworld.htm* with the content:
+
+
+ <%+header%>
+ <h1><%:Hello World%></h1>
+ <%+footer%>
+
+
+
+and add the following line to the index-Function of your module file.
+
+ entry({"my", "new", "template"}, template("myapp-mymodule/helloworld"), "Hello world", 20).dependent=false
+
+
+Now type */cgi-bin/luci/my/new/template_' ('_[http://localhost:8080/luci/my/new/template]* if you are using the development environment) in your browser.
+
+You may notice those fancy <% %>-Tags, these are [wiki:Documentation/Templates|template markups] used by the LuCI template processor.
+It is always good to include header and footer at the beginning and end of a template as those create the default design and menu.
+
+## <a name=cbimodels></a> CBI models
+The CBI is one of the uber coolest features of LuCI. It creates a formular based user interface and saves its contents to a specific UCI config file. You only have to describe the structure of the configuration file in a CBI model file and Luci does the rest of the work. This includes generating, parsing and validating a XHTML form and reading and writing the UCI file.
+
+So let's be serious at least for this paragraph and create a real pratical example *_lucidir_/model/cbi/myapp-mymodule/netifaces.lua* with the following contents:
+
+
+ m = Map("network", "Network") -- We want to edit the uci config file /etc/config/network
+
+ s = m:section(TypedSection, "interface", "Interfaces") -- Especially the "interface"-sections
+ s.addremove = true -- Allow the user to create and remove the interfaces
+ function s:filter(value)
+ return value ~= "loopback" and value -- Don't touch loopback
+ end
+ s:depends("proto", "static") -- Only show those with "static"
+ s:depends("proto", "dhcp") -- or "dhcp" as protocol and leave PPPoE and PPTP alone
+
+ p = s:option(ListValue, "proto", "Protocol") -- Creates an element list (select box)
+ p:value("static", "static") -- Key and value pairs
+ p:value("dhcp", "DHCP")
+ p.default = "static"
+
+ s:option(Value, "ifname", "interface", "the physical interface to be used") -- This will give a simple textbox
+
+ s:option(Value, "ipaddr", translate("ip", "IP Address")) -- Ja, das ist eine i18n-Funktion ;-)
+
+ s:option(Value, "netmask", "Netmask"):depends("proto", "static") -- You may remember this "depends" function from above
+
+ mtu = s:option(Value, "mtu", "MTU")
+ mtu.optional = true -- This one is very optional
+
+ dns = s:option(Value, "dns", "DNS-Server")
+ dns:depends("proto", "static")
+ dns.optional = true
+ function dns:validate(value) -- Now, that's nifty, eh?
+ return value:match("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") -- Returns nil if it doesn't match otherwise returns match
+ end
+
+ gw = s:option(Value, "gateway", "Gateway")
+ gw:depends("proto", "static")
+ gw.rmempty = true -- Remove entry if it is empty
+
+ return m -- Returns the map
+
+
+and of course don't forget to add something like this to your module's index-Function.
+
+ entry({"admin", "network", "interfaces"}, cbi("myapp-mymodule/netifaces"), "Network interfaces", 30).dependent=false
+
+
+There are many more features, see [wiki:Documentation/CBI the CBI reference] and the modules shipped with LuCI.
--- /dev/null
+LuCI has a simple regex based template processor which parses HTML-files to Lua functions and allows to store precompiled template files.
+The simplest form of a template is just an ordinary HTML-file. It will be printed out to the user as is.
+
+In LuCI every template is an object with an own scope. It can therefore be instanciated and each instance can has a different scope. As every template processor. LuCI supports several special markups. Those are enclosed in `<% %>`-Tags.
+
+By adding `-` (dash) right after the opening `<%` every whitespace before the markup will be stripped. Adding a `-` right before the closing `%>` will equivalently strip every whitespace behind the markup.
+
+
+# Builtin functions and markups
+## Including Lua code
+*Markup:*
+
+ <% code %>
+
+
+
+## Writing variables and function values
+*Syntax:*
+
+ <% write (value) %>
+
+
+*Short-Markup:*
+
+ <%=value%>
+
+
+## Including templates
+*Syntax:*
+
+ <% include (templatename) %>
+
+
+*Short-Markup:*
+
+ <%+templatename%>
+
+
+
+## Translating
+*Syntax:*
+
+ <%= translate("Text to translate") %>
+
+
+
+*Short-Markup:*
+
+ <%:Text to translate%>
+
+
+
+## Commenting
+*Markup:*
+
+ <%# comment %>
+
+
+# Builtin constants
+| Name | Value |
+---------|---------
+|`REQUEST_URI`|The current URL (without server part)|
+|`controller`|Path to the Luci main dispatcher|
+|`resource`|Path to the resource directory|
+|`media`|Path to the active theme directory|
--- /dev/null
+# HowTo: Create Themes
+*Note:* You should read the [Module Reference](Modules.md) and the [Template Reference](Templates.md) before.
+
+We assume you want to call your new theme _mytheme_. Make sure you replace this by your module name everytime this is mentionend in this Howto.
+
+
+
+# Creating the structure
+At first create a new theme directory *themes/_mytheme_*.
+
+Create a _Makefile_ inside your theme directory with the following content:
+
+ include ../../build/config.mk
+ include ../../build/module.mk
+
+
+Create the following directory structure inside your theme directory.
+* ipkg
+* htdocs
+ * luci-static
+ * _mytheme_
+* luasrc
+ * view
+ * themes
+ * _mytheme_
+* root
+ * etc
+ * uci-defaults
+
+
+
+# Designing
+Create two LuCI HTML-Templates named _header.htm'' and ''footer.htm'' under *luasrc/view/themes/''mytheme_*.
+The _header.htm'' will be included at the beginning of each rendered page and the ''footer.htm_ at the end.
+So your _header.htm'' will probably contain a DOCTYPE description, headers, the menu and layout of the page and the ''footer.htm_ will close all remaining open tags and may add a footer bar but hey that's your choice you are the designer ;-).
+
+Just make sure your _header.htm_ *begins* with the following lines:
+
+ <%
+ require("luci.http").prepare_content("text/html")
+ -%>
+
+
+This makes sure your content will be sent to the client with the right content type. Of course you can adapt _text/html_ to your needs.
+
+
+Put any stylesheets, Javascripts, images, ... into *htdocs/luci-static/_mytheme_*.
+You should refer to this directory in your header and footer templates as: _<%=media%>''. That means for a stylesheet *htdocs/luci-static/''mytheme_/cascade.css* you would write:
+
+ <link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
+
+
+
+
+# Making the theme selectable
+If you are done with your work there are two last steps to do.
+To make your theme OpenWRT-capable and selectable on the settings page you should now create a file *root/etc/uci-defaults/luci-theme-_mytheme_* with the following contents:
+
+ #!/bin/sh
+ uci batch <<-EOF
+ set luci.themes.MyTheme=/luci-static/mytheme
+ commit luci
+ EOF
+
+
+and another file *ipkg/postinst* with the following content:
+
+ #!/bin/sh
+ [ -n "${IPKG_INSTROOT}" ] || {
+ ( . /etc/uci-defaults/luci-theme-mytheme ) && rm -f /etc/uci-defaults/luci-theme-mytheme
+ }
+
+
+This is some OpenWRT magic to correctly register the template with LuCI when it gets installed.
+
+That's all. Now send your theme to the LuCI developers to get it into the development repository - if you like.
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><strong>Index</strong></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+</div> <!-- id="navigation" -->
+
+<div id="content">
+
+
+
+<h2>Modules</h2>
+<table class="module_list">
+<!--<tr><td colspan="2">Modules</td></tr>-->
+
+ <tr>
+ <td class="name"><a href="modules/luci.dispatcher.html">luci.dispatcher</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.html">luci.http</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.protocol.html">luci.http.protocol</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.protocol.date.html">luci.http.protocol.date</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.i18n.html">luci.i18n</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.ip.html">luci.ip</a></td>
+ <td class="summary">
+ LuCI IP calculation and netlink access library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.ip.cidr.html">luci.ip.cidr</a></td>
+ <td class="summary">
+ IP CIDR Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.json.html">luci.json</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.jsonc.html">luci.jsonc</a></td>
+ <td class="summary">
+ LuCI JSON parsing and serialization library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.jsonc.parser.html">luci.jsonc.parser</a></td>
+ <td class="summary">
+ LuCI JSON parser instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.model.ipkg.html">luci.model.ipkg</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.model.uci.html">luci.model.uci</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.rpcc.html">luci.rpcc</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.html">luci.sys</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.init.html">luci.sys.init</a></td>
+ <td class="summary">
+
+LuCI system utilities / init related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.iptparser.html">luci.sys.iptparser</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.net.html">luci.sys.net</a></td>
+ <td class="summary">
+
+LuCI system utilities / network related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.process.html">luci.sys.process</a></td>
+ <td class="summary">
+
+LuCI system utilities / process related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.user.html">luci.sys.user</a></td>
+ <td class="summary">
+
+LuCI system utilities / user related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.wifi.html">luci.sys.wifi</a></td>
+ <td class="summary">
+
+LuCI system utilities / wifi related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.util.html">luci.util</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.html">nixio</a></td>
+ <td class="summary">
+ General POSIX IO library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a></td>
+ <td class="summary">
+ Changes and improvements.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.CryptoHash.html">nixio.CryptoHash</a></td>
+ <td class="summary">
+ Cryptographical Hash and HMAC object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.File.html">nixio.File</a></td>
+ <td class="summary">
+ Large File Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.README.html">nixio.README</a></td>
+ <td class="summary">
+ General Information.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.Socket.html">nixio.Socket</a></td>
+ <td class="summary">
+ Socket Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.TLSContext.html">nixio.TLSContext</a></td>
+ <td class="summary">
+ Transport Layer Security Context Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.TLSSocket.html">nixio.TLSSocket</a></td>
+ <td class="summary">
+ TLS Socket Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a></td>
+ <td class="summary">
+ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.bin.html">nixio.bin</a></td>
+ <td class="summary">
+ Binary operations and conversion.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.bit.html">nixio.bit</a></td>
+ <td class="summary">
+ Bitfield operators and mainpulation functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.crypto.html">nixio.crypto</a></td>
+ <td class="summary">
+ Cryptographical library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.fs.html">nixio.fs</a></td>
+ <td class="summary">
+ Low-level and high-level filesystem manipulation library.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+body {
+ margin-left: 1em;
+ margin-right: 1em;
+ font-family: arial, helvetica, geneva, sans-serif;
+ background-color:#ffffff; margin:0px;
+}
+
+code {
+ font-family: "Andale Mono", monospace;
+}
+
+tt {
+ font-family: "Andale Mono", monospace;
+}
+
+body, td, th { font-size: 11pt; }
+
+h1, h2, h3, h4 { margin-left: 0em; }
+
+textarea, pre, tt { font-size:10pt; }
+body, td, th { color:#000000; }
+small { font-size:0.85em; }
+h1 { font-size:1.5em; }
+h2 { font-size:1.25em; }
+h3 { font-size:1.15em; }
+h4 { font-size:1.06em; }
+
+a:link { font-weight:bold; color: #004080; text-decoration: none; }
+a:visited { font-weight:bold; color: #006699; text-decoration: none; }
+a:link:hover { text-decoration:underline; }
+hr { color:#cccccc }
+img { border-width: 0px; }
+
+
+h3 { padding: 1em 0 0.5em; }
+
+p { margin-left: 1em; }
+
+p.name {
+ font-family: "Andale Mono", monospace;
+ padding-top: 1em;
+ margin-left: 0em;
+}
+
+blockquote { margin-left: 3em; }
+
+pre.example {
+ background-color: rgb(245, 245, 245);
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-style: solid;
+ border-right-style: solid;
+ border-bottom-style: solid;
+ border-left-style: solid;
+ border-top-color: silver;
+ border-right-color: silver;
+ border-bottom-color: silver;
+ border-left-color: silver;
+ padding: 1em;
+ margin-left: 1em;
+ margin-right: 1em;
+ font-family: "Andale Mono", monospace;
+ font-size: smaller;
+}
+
+
+hr {
+ margin-left: 0em;
+ background: #00007f;
+ border: 0px;
+ height: 1px;
+}
+
+ul { list-style-type: disc; }
+
+table.index { border: 1px #00007f; }
+table.index td { text-align: left; vertical-align: top; }
+table.index ul { padding-top: 0em; margin-top: 0em; }
+
+table {
+ border: 1px solid black;
+ border-collapse: collapse;
+ margin: 1em auto;
+}
+th {
+ border: 1px solid black;
+ padding: 0.5em;
+}
+td {
+ border: 1px solid black;
+ padding: 0.5em;
+}
+div.header, div.footer { margin-left: 0em; }
+
+#container
+{
+ margin-left: 1em;
+ margin-right: 1em;
+ background-color: #f0f0f0;
+}
+
+#product
+{
+ text-align: center;
+ border-bottom: 1px solid #cccccc;
+ background-color: #ffffff;
+}
+
+#product big {
+ font-size: 2em;
+}
+
+#product_logo
+{
+}
+
+#product_name
+{
+}
+
+#product_description
+{
+}
+
+#main
+{
+ background-color: #f0f0f0;
+ border-left: 2px solid #cccccc;
+}
+
+#navigation
+{
+ float: left;
+ width: 18em;
+ margin: 0;
+ vertical-align: top;
+ background-color: #f0f0f0;
+ overflow:visible;
+}
+
+#navigation h1 {
+ background-color:#e7e7e7;
+ font-size:1.1em;
+ color:#000000;
+ text-align:left;
+ margin:0px;
+ padding:0.2em;
+ border-top:1px solid #dddddd;
+ border-bottom:1px solid #dddddd;
+}
+
+#navigation ul
+{
+ font-size:1em;
+ list-style-type: none;
+ padding: 0;
+ margin: 1px;
+}
+
+#navigation li
+{
+ text-indent: -1em;
+ margin: 0em 0em 0em 0.5em;
+ display: block;
+ padding: 3px 0px 0px 12px;
+}
+
+#navigation li li a
+{
+ padding: 0px 3px 0px -1em;
+}
+
+#content
+{
+ margin-left: 18em;
+ padding: 1em;
+ border-left: 2px solid #cccccc;
+ border-right: 2px solid #cccccc;
+ background-color: #ffffff;
+}
+
+#about
+{
+ clear: both;
+ margin: 0;
+ padding: 5px;
+ border-top: 2px solid #cccccc;
+ background-color: #ffffff;
+}
+
+@media print {
+ body {
+ font: 12pt "Times New Roman", "TimeNR", Times, serif;
+ }
+ a { font-weight:bold; color: #004080; text-decoration: underline; }
+
+ #main\r {\r background-color: #ffffff;\r border-left: 0px;\r }\r
+ #container\r {\r margin-left: 2%;\r margin-right: 2%;\r background-color: #ffffff;\r }
+
+ #content\r {\r margin-left: 0px;\r padding: 1em;\r border-left: 0px;\r border-right: 0px;\r background-color: #ffffff;\r }
+
+ #navigation\r {\r display: none;
+ }
+ pre.example {
+ font-family: "Andale Mono", monospace;
+ font-size: 10pt;
+ page-break-inside: avoid;
+ }
+}
+
+table.module_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.module_list td.name { background-color: #f0f0f0; }
+table.module_list td.summary { width: 100%; }
+
+table.file_list
+{
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.file_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.file_list td.name { background-color: #f0f0f0; }
+table.file_list td.summary { width: 100%; }
+
+
+table.function_list
+{
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.function_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.function_list td.name { background-color: #f0f0f0; }
+table.function_list td.summary { width: 100%; }
+
+
+table.table_list
+{
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.table_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.table_list td.name { background-color: #f0f0f0; }
+table.table_list td.summary { width: 100%; }
+
+dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
+dl.function dd {padding: 0.5em 0;}
+dl.function h3 {margin: 0; font-size: medium;}
+
+dl.table dt {border-top: 1px solid #ccc; padding-top: 1em;}
+dl.table dd {padding-bottom: 1em;}
+dl.table h3 {padding: 0; margin: 0; font-size: medium;}
+
+#TODO: make module_list, file_list, function_list, table_list inherit from a list
+
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li><strong>luci.dispatcher</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.dispatcher</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#_">_</a> ()</td>
+ <td class="summary">
+
+No-op function used to mark translation entries for menu labels.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#alias">alias</a> (...)</td>
+ <td class="summary">
+
+Create a redirect to another dispatching node.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#arcombine">arcombine</a> (trg1, trg2)</td>
+ <td class="summary">
+
+Create a combined dispatching target for non argv and argv requests.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#assign">assign</a> (path, clone, title, order)</td>
+ <td class="summary">
+
+Clone a node of the dispatching tree to another position.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#build_url">build_url</a> (...)</td>
+ <td class="summary">
+
+Build the URL relative to the server webroot from given virtual path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#call">call</a> (name, ...)</td>
+ <td class="summary">
+
+Create a function-call dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cbi">cbi</a> (model)</td>
+ <td class="summary">
+
+Create a CBI model dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#createindex">createindex</a> ()</td>
+ <td class="summary">
+
+Generate the dispatching index using the native file-cache based strategy.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#createtree">createtree</a> ()</td>
+ <td class="summary">
+
+Create the dispatching tree from the index.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dispatch">dispatch</a> (request)</td>
+ <td class="summary">
+
+Dispatches a LuCI virtual path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#entry">entry</a> (path, target, title, order)</td>
+ <td class="summary">
+
+Create a new dispatching node and define common parameters.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#error404">error404</a> (message)</td>
+ <td class="summary">
+
+Send a 404 error code and render the "error404" template if available.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#error500">error500</a> (message)</td>
+ <td class="summary">
+
+Send a 500 error code and render the "error500" template if available.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#firstchild">firstchild</a> ()</td>
+ <td class="summary">
+
+Alias the first (lowest order) page automatically
+
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#form">form</a> (model)</td>
+ <td class="summary">
+
+Create a CBI form model dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#get">get</a> (...)</td>
+ <td class="summary">
+
+Fetch or create a dispatching node without setting the target module or
+
+enabling the node.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#httpdispatch">httpdispatch</a> (request)</td>
+ <td class="summary">
+
+Dispatch an HTTP request.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#modifier">modifier</a> (func, order)</td>
+ <td class="summary">
+
+Register a tree modifier.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#node">node</a> (...)</td>
+ <td class="summary">
+
+Fetch or create a new dispatching node.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#node_childs">node_childs</a> (node)</td>
+ <td class="summary">
+
+Return a sorted table of visible childs within a given node
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#node_visible">node_visible</a> (node)</td>
+ <td class="summary">
+
+Check whether a dispatch node shall be visible
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#rewrite">rewrite</a> (n, ...)</td>
+ <td class="summary">
+
+Rewrite the first x path values of the request.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#template">template</a> (name)</td>
+ <td class="summary">
+
+Create a template render dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#translate">translate</a> (text)</td>
+ <td class="summary">
+
+Access the luci.i18n translate() api.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="_"></a><strong>_</strong> ()</dt>
+<dd>
+
+
+No-op function used to mark translation entries for menu labels.
+
+This function does not actually translate the given argument but
+is used by build/i18n-scan.pl to find translatable entries.
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="alias"></a><strong>alias</strong> (...)</dt>
+<dd>
+
+
+Create a redirect to another dispatching node.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path destination
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="arcombine"></a><strong>arcombine</strong> (trg1, trg2)</dt>
+<dd>
+
+
+Create a combined dispatching target for non argv and argv requests.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ trg1: Overview Target
+ </li>
+
+ <li>
+ trg2: Detail Target
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="assign"></a><strong>assign</strong> (path, clone, title, order)</dt>
+<dd>
+
+
+Clone a node of the dispatching tree to another position.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Virtual path destination
+ </li>
+
+ <li>
+ clone: Virtual path source
+ </li>
+
+ <li>
+ title: Destination node title (optional)
+ </li>
+
+ <li>
+ order: Destination node order value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="build_url"></a><strong>build_url</strong> (...)</dt>
+<dd>
+
+
+Build the URL relative to the server webroot from given virtual path.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Relative URL
+
+
+
+</dd>
+
+
+
+
+<dt><a name="call"></a><strong>call</strong> (name, ...)</dt>
+<dd>
+
+
+Create a function-call dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Target function of local controller
+ </li>
+
+ <li>
+ ...: Additional parameters passed to the function
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cbi"></a><strong>cbi</strong> (model)</dt>
+<dd>
+
+
+Create a CBI model dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ model: CBI model to be rendered
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="createindex"></a><strong>createindex</strong> ()</dt>
+<dd>
+
+
+Generate the dispatching index using the native file-cache based strategy.
+
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="createtree"></a><strong>createtree</strong> ()</dt>
+<dd>
+
+
+Create the dispatching tree from the index.
+
+Build the index before if it does not exist yet.
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dispatch"></a><strong>dispatch</strong> (request)</dt>
+<dd>
+
+
+Dispatches a LuCI virtual path.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ request: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="entry"></a><strong>entry</strong> (path, target, title, order)</dt>
+<dd>
+
+
+Create a new dispatching node and define common parameters.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Virtual path
+ </li>
+
+ <li>
+ target: Target function to call when dispatched.
+ </li>
+
+ <li>
+ title: Destination node title
+ </li>
+
+ <li>
+ order: Destination node order value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="error404"></a><strong>error404</strong> (message)</dt>
+<dd>
+
+
+Send a 404 error code and render the "error404" template if available.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ message: Custom error message (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+false
+
+
+
+</dd>
+
+
+
+
+<dt><a name="error500"></a><strong>error500</strong> (message)</dt>
+<dd>
+
+
+Send a 500 error code and render the "error500" template if available.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ message: Custom error message (optional)#
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+false
+
+
+
+</dd>
+
+
+
+
+<dt><a name="firstchild"></a><strong>firstchild</strong> ()</dt>
+<dd>
+
+
+Alias the first (lowest order) page automatically
+
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="form"></a><strong>form</strong> (model)</dt>
+<dd>
+
+
+Create a CBI form model dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ model: CBI form model tpo be rendered
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="get"></a><strong>get</strong> (...)</dt>
+<dd>
+
+
+Fetch or create a dispatching node without setting the target module or
+
+enabling the node.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="httpdispatch"></a><strong>httpdispatch</strong> (request)</dt>
+<dd>
+
+
+Dispatch an HTTP request.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ request: LuCI HTTP Request object
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="modifier"></a><strong>modifier</strong> (func, order)</dt>
+<dd>
+
+
+Register a tree modifier.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ func: Modifier function
+ </li>
+
+ <li>
+ order: Modifier order value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="node"></a><strong>node</strong> (...)</dt>
+<dd>
+
+
+Fetch or create a new dispatching node.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="node_childs"></a><strong>node_childs</strong> (node)</dt>
+<dd>
+
+
+Return a sorted table of visible childs within a given node
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ node: Dispatch node
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Ordered table of child node names
+
+
+
+</dd>
+
+
+
+
+<dt><a name="node_visible"></a><strong>node_visible</strong> (node)</dt>
+<dd>
+
+
+Check whether a dispatch node shall be visible
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ node: Dispatch node
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the node should be visible
+
+
+
+</dd>
+
+
+
+
+<dt><a name="rewrite"></a><strong>rewrite</strong> (n, ...)</dt>
+<dd>
+
+
+Rewrite the first x path values of the request.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ n: Number of path values to replace
+ </li>
+
+ <li>
+ ...: Virtual path to replace removed path values with
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="template"></a><strong>template</strong> (name)</dt>
+<dd>
+
+
+Create a template render dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Template to be rendered
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="translate"></a><strong>translate</strong> (text)</dt>
+<dd>
+
+
+Access the luci.i18n translate() api.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ text: Text to translate
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li><strong>luci.http</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#build_querystring">build_querystring</a> (table)</td>
+ <td class="summary">
+
+Create a querystring out of a table of key - value pairs.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#close">close</a> ()</td>
+ <td class="summary">
+
+Close the HTTP-Connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#content">content</a> ()</td>
+ <td class="summary">
+
+Return the request content if the request was of unknown type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#formvalue">formvalue</a> (name, noparse)</td>
+ <td class="summary">
+
+Get a certain HTTP input value or a table of all input values.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#formvaluetable">formvaluetable</a> (prefix)</td>
+ <td class="summary">
+
+Get a table of all HTTP input values with a certain prefix.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#getcookie">getcookie</a> (name)</td>
+ <td class="summary">
+
+Get the value of a certain HTTP-Cookie.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#getenv">getenv</a> (name)</td>
+ <td class="summary">
+
+Get the value of a certain HTTP environment variable
+
+or the environment table itself.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#header">header</a> (key, value)</td>
+ <td class="summary">
+
+Send a HTTP-Header.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#prepare_content">prepare_content</a> (mime)</td>
+ <td class="summary">
+
+Set the mime type of following content data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#redirect">redirect</a> (url)</td>
+ <td class="summary">
+
+Redirects the client to a new URL and closes the connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#setfilehandler">setfilehandler</a> (callback)</td>
+ <td class="summary">
+
+Set a handler function for incoming user file uploads.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#source">source</a> ()</td>
+ <td class="summary">
+
+Get the RAW HTTP input source
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#splice">splice</a> (fp, size)</td>
+ <td class="summary">
+
+Splice data from a filedescriptor to the client.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#status">status</a> (code, message)</td>
+ <td class="summary">
+
+Set the HTTP status code and status message.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#write">write</a> (content, src_err)</td>
+ <td class="summary">
+
+Send a chunk of content data to the client.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#write_json">write_json</a> (data)</td>
+ <td class="summary">
+
+Send the given data as JSON encoded string.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="build_querystring"></a><strong>build_querystring</strong> (table)</dt>
+<dd>
+
+
+Create a querystring out of a table of key - value pairs.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: Query string source table
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Encoded HTTP query string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="close"></a><strong>close</strong> ()</dt>
+<dd>
+
+
+Close the HTTP-Connection.
+
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="content"></a><strong>content</strong> ()</dt>
+<dd>
+
+
+Return the request content if the request was of unknown type.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>HTTP request body
+
+ <li>HTTP request body length
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="formvalue"></a><strong>formvalue</strong> (name, noparse)</dt>
+<dd>
+
+
+Get a certain HTTP input value or a table of all input values.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the GET or POST variable to fetch
+ </li>
+
+ <li>
+ noparse: Don't parse POST data before getting the value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP input value or table of all input value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="formvaluetable"></a><strong>formvaluetable</strong> (prefix)</dt>
+<dd>
+
+
+Get a table of all HTTP input values with a certain prefix.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ prefix: Prefix
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of all HTTP input values with given prefix
+
+
+
+</dd>
+
+
+
+
+<dt><a name="getcookie"></a><strong>getcookie</strong> (name)</dt>
+<dd>
+
+
+Get the value of a certain HTTP-Cookie.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Cookie Name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing cookie data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="getenv"></a><strong>getenv</strong> (name)</dt>
+<dd>
+
+
+Get the value of a certain HTTP environment variable
+
+or the environment table itself.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Environment variable
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP environment value or environment table
+
+
+
+</dd>
+
+
+
+
+<dt><a name="header"></a><strong>header</strong> (key, value)</dt>
+<dd>
+
+
+Send a HTTP-Header.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Header key
+ </li>
+
+ <li>
+ value: Header value
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="prepare_content"></a><strong>prepare_content</strong> (mime)</dt>
+<dd>
+
+
+Set the mime type of following content data.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mime: Mimetype of following content
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="redirect"></a><strong>redirect</strong> (url)</dt>
+<dd>
+
+
+Redirects the client to a new URL and closes the connection.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ url: Target URL
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="setfilehandler"></a><strong>setfilehandler</strong> (callback)</dt>
+<dd>
+
+
+Set a handler function for incoming user file uploads.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ callback: Handler function
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="source"></a><strong>source</strong> ()</dt>
+<dd>
+
+
+Get the RAW HTTP input source
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP LTN12 source
+
+
+
+</dd>
+
+
+
+
+<dt><a name="splice"></a><strong>splice</strong> (fp, size)</dt>
+<dd>
+
+
+Splice data from a filedescriptor to the client.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fp: File descriptor
+ </li>
+
+ <li>
+ size: Bytes to splice (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="status"></a><strong>status</strong> (code, message)</dt>
+<dd>
+
+
+Set the HTTP status code and status message.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ code: Status code
+ </li>
+
+ <li>
+ message: Status message
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="write"></a><strong>write</strong> (content, src_err)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ content: Content chunk
+ </li>
+
+ <li>
+ src_err: Error object from source (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#close">
+ close
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="write_json"></a><strong>write_json</strong> (data)</dt>
+<dd>
+
+
+Send the given data as JSON encoded string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: Data to send
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li><strong>luci.http.protocol.conditionals</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.protocol.conditionals</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#if_match">if_match</a> (req, stat)</td>
+ <td class="summary">
+
+14.24 / If-Match
+
+Test whether the given message object contains an "If-Match" header and
+compare it against the given stat object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_modified_since">if_modified_since</a> (req, stat)</td>
+ <td class="summary">
+
+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.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_none_match">if_none_match</a> (req, stat)</td>
+ <td class="summary">
+
+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.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_range">if_range</a> (req, stat)</td>
+ <td class="summary">
+
+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 .</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_unmodified_since">if_unmodified_since</a> (req, stat)</td>
+ <td class="summary">
+
+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.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#mk_etag">mk_etag</a> (stat)</td>
+ <td class="summary">
+
+Implement 14.19 / ETag.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="if_match"></a><strong>if_match</strong> (req, stat)</dt>
+<dd>
+
+
+14.24 / If-Match
+
+Test whether the given message object contains an "If-Match" header and
+compare it against the given stat object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_modified_since"></a><strong>if_modified_since</strong> (req, stat)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+ <li>Table containing extra HTTP headers if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_none_match"></a><strong>if_none_match</strong> (req, stat)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+ <li>Table containing extra HTTP headers if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_range"></a><strong>if_range</strong> (req, stat)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_unmodified_since"></a><strong>if_unmodified_since</strong> (req, stat)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="mk_etag"></a><strong>mk_etag</strong> (stat)</dt>
+<dd>
+
+
+Implement 14.19 / ETag.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ stat: A file.stat structure
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the generated tag suitable for ETag headers
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li><strong>luci.http.protocol.date</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.protocol.date</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#compare">compare</a> (d1, d2)</td>
+ <td class="summary">
+
+Compare two dates which can either be unix epoch times or HTTP date strings.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#to_http">to_http</a> (time)</td>
+ <td class="summary">
+
+Convert the given unix epoch time to valid HTTP date string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#to_unix">to_unix</a> (data)</td>
+ <td class="summary">
+
+Parse given HTTP date string and convert it to unix epoch time.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#tz_offset">tz_offset</a> (tz)</td>
+ <td class="summary">
+
+Return the time offset in seconds between the UTC and given time zone.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="compare"></a><strong>compare</strong> (d1, d2)</dt>
+<dd>
+
+
+Compare two dates which can either be unix epoch times or HTTP date strings.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ d1: The first date or epoch time to compare
+ </li>
+
+ <li>
+ d2: The first date or epoch time to compare
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>-1 - if d1 is lower then d2
+
+ <li>0 - if both dates are equal
+
+ <li>1 - if d1 is higher then d2
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="to_http"></a><strong>to_http</strong> (time)</dt>
+<dd>
+
+
+Convert the given unix epoch time to valid HTTP date string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ time: Unix epoch time
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the formatted date
+
+
+
+</dd>
+
+
+
+
+<dt><a name="to_unix"></a><strong>to_unix</strong> (data)</dt>
+<dd>
+
+
+Parse given HTTP date string and convert it to unix epoch time.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: String containing the date
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Unix epoch time
+
+
+
+</dd>
+
+
+
+
+<dt><a name="tz_offset"></a><strong>tz_offset</strong> (tz)</dt>
+<dd>
+
+
+Return the time offset in seconds between the UTC and given time zone.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ tz: Symbolic or numeric timezone specifier
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Time offset to UTC in seconds
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li><strong>luci.http.protocol</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.protocol</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#header_source">header_source</a> (sock)</td>
+ <td class="summary">
+
+Creates a ltn12 source from the given socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#mimedecode_message_body">mimedecode_message_body</a> (src, msg, filecb)</td>
+ <td class="summary">
+
+Decode a mime encoded http message body with multipart/form-data
+
+Content-Type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse_message_body">parse_message_body</a> (src, msg, filecb)</td>
+ <td class="summary">
+
+Try to extract and decode a http message body from the given ltn12 source.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse_message_header">parse_message_header</a> (src)</td>
+ <td class="summary">
+
+Try to extract an http message header including information like protocol
+
+version, message headers and resulting CGI environment variables from the
+given ltn12 source.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode">urldecode</a> (str, no_plus)</td>
+ <td class="summary">
+
+Decode an urlencoded string - optionally without decoding
+
+the "+" sign to " " - and return the decoded string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode_message_body">urldecode_message_body</a> (src, msg)</td>
+ <td class="summary">
+
+Decode an urlencoded http message body with application/x-www-urlencoded
+
+Content-Type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode_params">urldecode_params</a> (url, tbl)</td>
+ <td class="summary">
+
+Extract and split urlencoded data pairs, separated bei either "&" or ";"
+
+from given url or string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urlencode">urlencode</a> (str)</td>
+ <td class="summary">
+
+Encode given string to x-www-urlencoded format.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urlencode_params">urlencode_params</a> (tbl)</td>
+ <td class="summary">
+
+Encode each key-value-pair in given table to x-www-urlencoded format,
+
+separated by "&".</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="header_source"></a><strong>header_source</strong> (sock)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ sock: Readable network socket
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Ltn12 source function
+
+
+
+</dd>
+
+
+
+
+<dt><a name="mimedecode_message_body"></a><strong>mimedecode_message_body</strong> (src, msg, filecb)</dt>
+<dd>
+
+
+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 withing 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)
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+ <li>
+ msg: HTTP message object
+ </li>
+
+ <li>
+ filecb: File callback function (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Value indicating successful operation (not nil means "ok")
+
+ <li>String containing the error if unsuccessful
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parse_message_header">
+ parse_message_header
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parse_message_body"></a><strong>parse_message_body</strong> (src, msg, filecb)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+ <li>
+ msg: HTTP message object
+ </li>
+
+ <li>
+ filecb: File data callback (optional, see mimedecode_message_body())
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Value indicating successful operation (not nil means "ok")
+
+ <li>String containing the error if unsuccessful
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parse_message_header">
+ parse_message_header
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parse_message_header"></a><strong>parse_message_header</strong> (src)</dt>
+<dd>
+
+
+Try to extract an http message header including information like protocol
+
+version, message headers and resulting CGI environment variables from the
+given ltn12 source.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP message object
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parse_message_body">
+ parse_message_body
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urldecode"></a><strong>urldecode</strong> (str, no_plus)</dt>
+<dd>
+
+
+Decode an urlencoded string - optionally without decoding
+
+the "+" sign to " " - and return the decoded string.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: Input string in x-www-urlencoded format
+ </li>
+
+ <li>
+ no_plus: Don't decode "+" signs to spaces
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+The decoded string
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urlencode">
+ urlencode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urldecode_message_body"></a><strong>urldecode_message_body</strong> (src, msg)</dt>
+<dd>
+
+
+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 withing the given message object. Multiple parameter
+values are stored as tables, ordinary ones as strings.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+ <li>
+ msg: HTTP message object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Value indicating successful operation (not nil means "ok")
+
+ <li>String containing the error if unsuccessful
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parse_message_header">
+ parse_message_header
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urldecode_params"></a><strong>urldecode_params</strong> (url, tbl)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ url: The url or string which contains x-www-urlencoded form data
+ </li>
+
+ <li>
+ tbl: Use the given table for storing values (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the urldecoded parameters
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urlencode_params">
+ urlencode_params
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urlencode"></a><strong>urlencode</strong> (str)</dt>
+<dd>
+
+
+Encode given string to x-www-urlencoded format.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String to encode
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the encoded data
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urldecode">
+ urldecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urlencode_params"></a><strong>urlencode_params</strong> (tbl)</dt>
+<dd>
+
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ tbl: Table with the values
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing encoded values
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urldecode_params">
+ urldecode_params
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li><strong>luci.http.protocol.mime</strong></li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.protocol.mime</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#to_ext">to_ext</a> (mimetype)</td>
+ <td class="summary">
+
+Return corresponding extension for a given mime type or nil if the
+
+given mime-type is unknown.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#to_mime">to_mime</a> (filename)</td>
+ <td class="summary">
+
+Extract extension from a filename and return corresponding mime-type or
+
+"application/octet-stream" if the extension is unknown.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="to_ext"></a><strong>to_ext</strong> (mimetype)</dt>
+<dd>
+
+
+Return corresponding extension for a given mime type or nil if the
+
+given mime-type is unknown.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mimetype: The mimetype to retrieve the extension from
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String with the extension or nil for unknown type
+
+
+
+</dd>
+
+
+
+
+<dt><a name="to_mime"></a><strong>to_mime</strong> (filename)</dt>
+<dd>
+
+
+Extract extension from a filename and return corresponding mime-type or
+
+"application/octet-stream" if the extension is unknown.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ filename: The filename for which the mime type is guessed
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containign the determined mime type
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li><strong>luci.i18n</strong></li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.i18n</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#clear">clear</a> ()</td>
+ <td class="summary">
+
+Clear the translation table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#load">load</a> (file, lang, force)</td>
+ <td class="summary">
+
+Load a translation and copy its data into the translation table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#loadc">loadc</a> (file, force)</td>
+ <td class="summary">
+
+Load a translation file using the default translation language.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#setlanguage">setlanguage</a> (lang)</td>
+ <td class="summary">
+
+Set the context default translation language.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#string">string</a> (key)</td>
+ <td class="summary">
+
+Return the translated value for a specific translation key
+
+and ensure that the returned value is a Lua string value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#stringf">stringf</a> (key, ...)</td>
+ <td class="summary">
+
+Return the translated value for a specific translation key and use it as sprintf pattern.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#translate">translate</a> (key)</td>
+ <td class="summary">
+
+Return the translated value for a specific translation key.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#translatef">translatef</a> (key, ...)</td>
+ <td class="summary">
+
+Return the translated value for a specific translation key and use it as sprintf pattern.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="clear"></a><strong>clear</strong> ()</dt>
+<dd>
+
+
+Clear the translation table.
+
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="load"></a><strong>load</strong> (file, lang, force)</dt>
+<dd>
+
+
+Load a translation and copy its data into the translation table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ file: Language file
+ </li>
+
+ <li>
+ lang: Two-letter language code
+ </li>
+
+ <li>
+ force: Force reload even if already loaded (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Success status
+
+
+
+</dd>
+
+
+
+
+<dt><a name="loadc"></a><strong>loadc</strong> (file, force)</dt>
+<dd>
+
+
+Load a translation file using the default translation language.
+
+Alternatively load the translation of the fallback language.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ file: Language file
+ </li>
+
+ <li>
+ force: Force reload even if already loaded (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="setlanguage"></a><strong>setlanguage</strong> (lang)</dt>
+<dd>
+
+
+Set the context default translation language.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ lang: Two-letter language code
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="string"></a><strong>string</strong> (key)</dt>
+<dd>
+
+
+Return the translated value for a specific translation key
+
+and ensure that the returned value is a Lua string value.
+This is the same as calling <code>tostring(translate(...))</code>
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Default translation text
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Translated string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="stringf"></a><strong>stringf</strong> (key, ...)</dt>
+<dd>
+
+
+Return the translated value for a specific translation key and use it as sprintf pattern.
+
+Ensure that the returned value is a Lua string value.
+This is the same as calling <code>tostring(translatef(...))</code>
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Default translation text
+ </li>
+
+ <li>
+ ...: Format parameters
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Translated and formatted string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="translate"></a><strong>translate</strong> (key)</dt>
+<dd>
+
+
+Return the translated value for a specific translation key.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Default translation text
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Translated string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="translatef"></a><strong>translatef</strong> (key, ...)</dt>
+<dd>
+
+
+Return the translated value for a specific translation key and use it as sprintf pattern.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Default translation text
+ </li>
+
+ <li>
+ ...: Format parameters
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Translated and formatted string
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li><strong>luci.ip.cidr</strong></li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.ip.cidr</code></h1>
+
+<p>
+ IP CIDR Object.
+ Represents an IPv4 or IPv6 address range.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is4">cidr:is4</a> ()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv4 address range
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is4rfc1918">cidr:is4rfc1918</a> ()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is within the private RFC1918 address space
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is4linklocal">cidr:is4linklocal</a> ()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is6">cidr:is6</a> ()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv6 address range
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is6linklocal">cidr:is6linklocal</a> ()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv6 link local address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is6mapped4">cidr:is6mapped4</a> ()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv6 mapped IPv4 address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.lower">cidr:lower</a> (addr)</td>
+ <td class="summary">
+
+Checks whether this CIDR instance is lower than the given argument.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.higher">cidr:higher</a> (addr)</td>
+ <td class="summary">
+
+Checks whether this CIDR instance is higher than the given argument.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.equal">cidr:equal</a> (addr)</td>
+ <td class="summary">
+
+Checks whether this CIDR instance is equal to the given argument.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.prefix">cidr:prefix</a> (mask)</td>
+ <td class="summary">
+
+Get or set prefix size of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.network">cidr:network</a> (mask)</td>
+ <td class="summary">
+
+Derive network address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.host">cidr:host</a> ()</td>
+ <td class="summary">
+
+Derive host address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.mask">cidr:mask</a> (mask)</td>
+ <td class="summary">
+
+Derive netmask of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.broadcast">cidr:broadcast</a> (mask)</td>
+ <td class="summary">
+
+Derive broadcast address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.mapped4">cidr:mapped4</a> ()</td>
+ <td class="summary">
+
+Derive mapped IPv4 address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.contains">cidr:contains</a> (addr)</td>
+ <td class="summary">
+
+Test whether CIDR contains given range.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.add">cidr:add</a> (amount, inplace)</td>
+ <td class="summary">
+
+Add given amount to CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.sub">cidr:sub</a> (amount, inplace)</td>
+ <td class="summary">
+
+Substract given amount from CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.minhost">cidr:minhost</a> ()</td>
+ <td class="summary">
+
+Calculate the lowest possible host address within this CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.maxhost">cidr:maxhost</a> ()</td>
+ <td class="summary">
+
+Calculate the highest possible host address within this CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.string">cidr:string</a> ()</td>
+ <td class="summary">
+
+Convert CIDR instance into string representation.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="cidr.is4"></a><strong>cidr:is4</strong> ()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv4 address range
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the CIDR is an IPv4 range, else <code>false</code>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.is6">
+ cidr:is6
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is4rfc1918"></a><strong>cidr:is4rfc1918</strong> ()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is within the private RFC1918 address space
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.45.2/24")
+if addr:is4rfc1918() then
+ print("Is a private address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the entire range of this CIDR lies within one of
+ the ranges <code>10.0.0.0-10.255.255.255</code>,
+ <code>172.16.0.0-172.31.0.0</code> or
+ <code>192.168.0.0-192.168.255.255</code>, else <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is4linklocal"></a><strong>cidr:is4linklocal</strong> ()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("169.254.34.125")
+if addr:is4linklocal() then
+ print("Is a zeroconf address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the entire range of this CIDR lies within the range
+ the range <code>169.254.0.0-169.254.255.255</code>, else <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is6"></a><strong>cidr:is6</strong> ()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv6 address range
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the CIDR is an IPv6 range, else <code>false</code>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.is4">
+ cidr:is4
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is6linklocal"></a><strong>cidr:is6linklocal</strong> ()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv6 link local address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("fe92:53a:3216:af01:221:63ff:fe75:aa17/64")
+if addr:is6linklocal() then
+ print("Is a linklocal address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the entire range of this CIDR lies within the range
+ the <code>fe80::/10</code> range, else <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is6mapped4"></a><strong>cidr:is6mapped4</strong> ()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv6 mapped IPv4 address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("::ffff:192.168.1.1")
+if addr:is6mapped4() then
+ print("Is a mapped IPv4 address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the address is an IPv6 mapped IPv4 address in the
+ form <code>::ffff:1.2.3.4</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.lower"></a><strong>cidr:lower</strong> (addr)</dt>
+<dd>
+
+
+Checks whether this CIDR instance is lower than the given argument.
+The comparisation follows these rules:
+<ul><li>An IPv4 address is always lower than an IPv6 address</li>
+<li>Prefix sizes are ignored</li></ul>
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
+ <code>luci.ip.new()</code> to compare against.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1")
+print(addr:lower(addr)) -- false
+print(addr:lower("10.10.10.10/24")) -- false
+print(addr:lower(luci.ip.new("::1"))) -- true
+print(addr:lower(luci.ip.new("192.168.200.1"))) -- true</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this CIDR is lower than the given address,
+ else <code>false</code>.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.higher">
+ cidr:higher
+ </a>
+
+ <li><a href="#cidr.equal">
+ cidr:equal
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.higher"></a><strong>cidr:higher</strong> (addr)</dt>
+<dd>
+
+
+Checks whether this CIDR instance is higher than the given argument.
+The comparisation follows these rules:
+<ul><li>An IPv4 address is always lower than an IPv6 address</li>
+<li>Prefix sizes are ignored</li></ul>
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
+ <code>luci.ip.new()</code> to compare against.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1")
+print(addr:higher(addr)) -- false
+print(addr:higher("10.10.10.10/24")) -- true
+print(addr:higher(luci.ip.new("::1"))) -- false
+print(addr:higher(luci.ip.new("192.168.200.1"))) -- false</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this CIDR is higher than the given address,
+ else <code>false</code>.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.lower">
+ cidr:lower
+ </a>
+
+ <li><a href="#cidr.equal">
+ cidr:equal
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.equal"></a><strong>cidr:equal</strong> (addr)</dt>
+<dd>
+
+
+Checks whether this CIDR instance is equal to the given argument.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
+ <code>luci.ip.new()</code> to compare against.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1")
+print(addr:equal(addr)) -- true
+print(addr:equal("192.168.1.1")) -- true
+print(addr:equal(luci.ip.new("::1"))) -- false
+
+local addr6 = luci.ip.new("::1")
+print(addr6:equal("0:0:0:0:0:0:0:1/64")) -- true
+print(addr6:equal(luci.ip.new("fe80::221:63ff:fe75:aa17"))) -- false</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this CIDR is equal to the given address,
+ else <code>false</code>.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.lower">
+ cidr:lower
+ </a>
+
+ <li><a href="#cidr.higher">
+ cidr:higher
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.prefix"></a><strong>cidr:prefix</strong> (mask)</dt>
+<dd>
+
+
+Get or set prefix size of CIDR instance.
+If the optional mask parameter is given, the prefix size of this CIDR is altered
+else the current prefix size is returned.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
+ netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("192.168.1.1/255.255.255.0")
+print(range:prefix()) -- 24
+
+range:prefix(16)
+print(range:prefix()) -- 16
+
+range:prefix("255.255.255.255")
+print(range:prefix()) -- 32</pre>
+
+
+
+<h3>Return value:</h3>
+Bit count of the current prefix size
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.network"></a><strong>cidr:network</strong> (mask)</dt>
+<dd>
+
+
+Derive network address of CIDR instance.
+
+Returns a new CIDR instance representing the network address of this instance
+with all host parts masked out. The used prefix size can be overridden by the
+optional mask parameter.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
+ netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("192.168.62.243/255.255.0.0")
+print(range:network()) -- "192.168.0.0"
+print(range:network(24)) -- "192.168.62.0"
+print(range:network("255.255.255.0")) -- "192.168.62.0"
+
+local range6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
+print(range6:network()) -- "fd9b:62b3:9cc5::"</pre>
+
+
+
+<h3>Return value:</h3>
+CIDR instance representing the network address
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.host"></a><strong>cidr:host</strong> ()</dt>
+<dd>
+
+
+Derive host address of CIDR instance.
+
+This function essentially constructs a copy of this CIDR with the prefix size
+set to <code>32</code> for IPv4 and <code>128</code> for IPv6.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("172.19.37.45/16")
+print(range) -- "172.19.37.45/16"
+print(range:host()) -- "172.19.37.45"</pre>
+
+
+
+<h3>Return value:</h3>
+CIDR instance representing the host address
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.mask"></a><strong>cidr:mask</strong> (mask)</dt>
+<dd>
+
+
+Derive netmask of CIDR instance.
+
+Constructs a CIDR instance representing the netmask of this instance. The used
+prefix size can be overridden by the optional mask parameter.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
+ netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("172.19.37.45/16")
+print(range:mask()) -- "255.255.0.0"
+print(range:mask(24)) -- "255.255.255.0"
+print(range:mask("255.0.0.0")) -- "255.0.0.0"</pre>
+
+
+
+<h3>Return value:</h3>
+CIDR instance representing the netmask
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.broadcast"></a><strong>cidr:broadcast</strong> (mask)</dt>
+<dd>
+
+
+Derive broadcast address of CIDR instance.
+
+Constructs a CIDR instance representing the broadcast address of this instance.
+The used prefix size can be overridden by the optional mask parameter.
+
+This function has no effect on IPv6 instances, it will return nothing in this
+case.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
+ netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("172.19.37.45/16")
+print(range:broadcast()) -- "172.19.255.255"
+print(range:broadcast(24)) -- "172.19.37.255"
+print(range:broadcast("255.0.0.0")) -- "172.255.255.255"</pre>
+
+
+
+<h3>Return value:</h3>
+Return a new CIDR instance representing the broadcast address if this
+ instance is an IPv4 range, else return nothing.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.mapped4"></a><strong>cidr:mapped4</strong> ()</dt>
+<dd>
+
+
+Derive mapped IPv4 address of CIDR instance.
+
+Constructs a CIDR instance representing the IPv4 address of the IPv6 mapped
+IPv4 address in this instance.
+
+This function has no effect on IPv4 instances or IPv6 instances which are not a
+mapped address, it will return nothing in this case.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("::ffff:172.16.19.1")
+print(addr:mapped4()) -- "172.16.19.1"</pre>
+
+
+
+<h3>Return value:</h3>
+Return a new CIDR instance representing the IPv4 address if this
+ instance is an IPv6 mapped IPv4 address, else return nothing.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.contains"></a><strong>cidr:contains</strong> (addr)</dt>
+<dd>
+
+
+Test whether CIDR contains given range.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
+ <code>luci.ip.new()</code> to test.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("10.24.0.0/255.255.0.0")
+print(range:contains("10.24.5.1")) -- true
+print(range:contains("::1")) -- false
+print(range:contains("10.0.0.0/8")) -- false
+
+local range6 = luci.ip.new("fe80::/10")
+print(range6:contains("fe80::221:63f:fe75:aa17/64")) -- true
+print(range6:contains("fd9b:6b3:c5:0:221:63f:fe75:aa17/64")) -- false</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this instance fully contains the given address else
+ <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.add"></a><strong>cidr:add</strong> (amount, inplace)</dt>
+<dd>
+
+
+Add given amount to CIDR instance. If the result would overflow the maximum
+address space, the result is set to the highest possible address.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ amount: A numeric value between 0 and 0xFFFFFFFF, a
+ <code>luci.ip.cidr</code> instance or a string convertable by
+ <code>luci.ip.new()</code>.
+ </li>
+
+ <li>
+ inplace: If <code>true</code>, modify this instance instead of returning
+ a new derived CIDR instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1/24")
+print(addr:add(250)) -- "192.168.1.251/24"
+print(addr:add("0.0.99.0")) -- "192.168.100.1/24"
+
+addr:add(256, true) -- true
+print(addr) -- "192.168.2.1/24
+
+addr:add("255.0.0.0", true) -- false (overflow)
+print(addr) -- "255.255.255.255/24
+
+local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
+print(addr6:add(256)) -- "fe80::221:63f:fe75:ab17/64"
+print(addr6:add("::ffff:0")) -- "fe80::221:640:fe74:aa17/64"
+
+addr:add(256, true) -- true
+print(addr) -- "fe80::221:63f:fe75:ab17/64
+
+addr:add("ffff::", true) -- false (overflow)
+print(addr) -- "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"</pre>
+
+
+
+<h3>Return value:</h3>
+<ul>
+ <li>When adding inplace: Return <code>true</code> if the addition succeded
+ or <code>false</code> when the addition overflowed.</li>
+ <li>When deriving new CIDR: Return new instance representing the value of
+ this instance plus the added amount or the highest possible address if
+ the addition overflowed the available address space.</li></ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.sub"></a><strong>cidr:sub</strong> (amount, inplace)</dt>
+<dd>
+
+
+Substract given amount from CIDR instance. If the result would under, the lowest
+possible address is returned.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ amount: A numeric value between 0 and 0xFFFFFFFF, a
+ <code>luci.ip.cidr</code> instance or a string convertable by
+ <code>luci.ip.new()</code>.
+ </li>
+
+ <li>
+ inplace: If <code>true</code>, modify this instance instead of returning
+ a new derived CIDR instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1/24")
+print(addr:sub(256)) -- "192.168.0.1/24"
+print(addr:sub("0.168.0.0")) -- "192.0.1.1/24"
+
+addr:sub(256, true) -- true
+print(addr) -- "192.168.0.1/24
+
+addr:sub("255.0.0.0", true) -- false (underflow)
+print(addr) -- "0.0.0.0/24
+
+local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
+print(addr6:sub(256)) -- "fe80::221:63f:fe75:a917/64"
+print(addr6:sub("::ffff:0")) -- "fe80::221:63e:fe76:aa17/64"
+
+addr:sub(256, true) -- true
+print(addr) -- "fe80::221:63f:fe75:a917/64"
+
+addr:sub("ffff::", true) -- false (underflow)
+print(addr) -- "::/64"</pre>
+
+
+
+<h3>Return value:</h3>
+<ul>
+ <li>When substracting inplace: Return <code>true</code> if the substraction
+ succeded or <code>false</code> when the substraction underflowed.</li>
+ <li>When deriving new CIDR: Return new instance representing the value of
+ this instance minus the substracted amount or the lowest address if
+ the substraction underflowed.</li></ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.minhost"></a><strong>cidr:minhost</strong> ()</dt>
+<dd>
+
+
+Calculate the lowest possible host address within this CIDR instance.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.123.56/24")
+print(addr:minhost()) -- "192.168.123.1"
+
+local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
+print(addr6:minhost()) -- "fd9b:62b3:9cc5::1"</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a new CIDR instance representing the lowest host address
+ within this range.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.maxhost"></a><strong>cidr:maxhost</strong> ()</dt>
+<dd>
+
+
+Calculate the highest possible host address within this CIDR instance.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.123.56/24")
+print(addr:maxhost()) -- "192.168.123.254" (.255 is broadcast)
+
+local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
+print(addr6:maxhost()) -- "fd9b:62b3:9cc5:0:ffff:ffff:ffff:ffff"</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a new CIDR instance representing the highest host address
+ within this range.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.string"></a><strong>cidr:string</strong> ()</dt>
+<dd>
+
+
+Convert CIDR instance into string representation.
+
+If the prefix size of instance is less than 32 for IPv4 or 128 for IPv6, the
+address is returned in the form "address/prefix" otherwise just "address".
+
+It is usually not required to call this function directly as CIDR objects
+define it as __tostring function in the associated metatable.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Returns a string representing the range or address of this CIDR instance
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li><strong>luci.ip</strong></li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.ip</code></h1>
+
+<p>
+ LuCI IP calculation and netlink access library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#new">new</a> (address, netmask)</td>
+ <td class="summary">
+
+Construct a new luci.ip.cidr instance and autodetect the address family.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IPv4">IPv4</a> (address, netmask)</td>
+ <td class="summary">
+
+Construct a new IPv4 luci.ip.cidr instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IPv6">IPv6</a> (address, netmask)</td>
+ <td class="summary">
+
+Construct a new IPv6 luci.ip.cidr instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#route">route</a> (address)</td>
+ <td class="summary">
+
+Determine the route leading to the given destination.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#routes">routes</a> (filter, callback)</td>
+ <td class="summary">
+
+Fetch all routes, optionally matching the given criteria.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#neighbors">neighbors</a> (filter, callback)</td>
+ <td class="summary">
+
+Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#link">link</a> (device)</td>
+ <td class="summary">
+
+Fetch basic device information </td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="new"></a><strong>new</strong> (address, netmask)</dt>
+<dd>
+
+
+Construct a new luci.ip.cidr instance and autodetect the address family.
+Throws an error if the given strings do not represent a valid address or
+if the given optional netmask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv4 or IPv6 address, optionally
+with prefix size (CIDR notation) or netmask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid IPv4 or IPv6 netmask or number
+containing a prefix size in bits (<code>0..32</code> for IPv4,
+<code>0..128</code> for IPv6). Overrides mask embedded in the first argument
+if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>addr = luci.ip.new("10.24.0.1/24")
+addr = luci.ip.new("10.24.0.1/255.255.255.0")
+addr = luci.ip.new("10.24.0.1", "255.255.255.0") -- separate netmask
+addr = luci.ip.new("10.24.0.1/24", 16) -- override netmask
+
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64")
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given
+address/mask range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv4">
+ IPv4
+ </a>
+
+ <li><a href="#IPv6">
+ IPv6
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="IPv4"></a><strong>IPv4</strong> (address, netmask)</dt>
+<dd>
+
+
+Construct a new IPv4 luci.ip.cidr instance.
+Throws an error if the given string does not represent a valid IPv4 address or
+if the given optional netmask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv4, optionally with prefix size
+(CIDR notation) or netmask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid IPv4 netmask or number
+containing a prefix size between <code>0</code> and <code>32</code> bit.
+Overrides mask embedded in the first argument if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>addr = luci.ip.IPv4("10.24.0.1/24")
+addr = luci.ip.IPv4("10.24.0.1/255.255.255.0")
+addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0") -- separate netmask
+addr = luci.ip.IPv4("10.24.0.1/24", 16) -- override netmask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given IPv4 range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv6">
+ IPv6
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="IPv6"></a><strong>IPv6</strong> (address, netmask)</dt>
+<dd>
+
+
+Construct a new IPv6 luci.ip.cidr instance.
+Throws an error if the given string does not represent a valid IPv6 address or
+if the given optional netmask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv6, optionally with prefix size
+(CIDR notation) or netmask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid IPv4 netmask or number
+containing a prefix size between <code>0</code> and <code>128</code> bit.
+Overrides mask embedded in the first argument if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given IPv6 range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv4">
+ IPv4
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="route"></a><strong>route</strong> (address)</dt>
+<dd>
+
+
+Determine the route leading to the given destination.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: A <code>luci.ip.cidr</code> instance or a string containing
+a valid IPv4 or IPv6 range as specified by <code>luci.ip.new()</code>.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Find default gateway by getting route to Google's public NS server
+<pre>rt = luci.ip.route("8.8.8.8")
+if rt ~= nil then
+ print("gateway is", rt.gw)
+end</pre></li>
+<li>Determine IPv6 upstream interface <pre>rt = luci.ip.route("2001::/7")
+if rt ~= nil then
+ print("ipv6 upstream device is", rt.dev)
+end</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+<p>Table containing the fields described below.</p>
+<table id="routetable">
+<tr><th>Field</th><th>Description</th></tr>
+<tr><td><code>type</code><td>
+ <p>Route type with one of the following numeric values:</p>
+ <table>
+ <tr>
+ <td><code>1</code></td>
+ <td><code>RTN_UNICAST</code> - Gateway or direct route</td>
+ </tr>
+ <tr>
+ <td><code>2</code></td>
+ <td><code>RTN_LOCAL</code> - Accept locally</td>
+ </tr>
+ <tr>
+ <td><code>3</code></td>
+ <td><code>RTN_BROADCAST</code> -
+ Accept locally as broadcast send as broadcast</td>
+ </tr>
+ <tr>
+ <td><code>4</code></td>
+ <td><code>RTN_ANYCAST</code> -
+ Accept locally as broadcast but send as unicast</td>
+ </tr>
+ <tr>
+ <td><code>5</code></td>
+ <td><code>RTN_MULTICAST</code> - Multicast route</td>
+ </tr>
+ </table>
+</td></tr>
+<tr>
+ <td><code>family</code></td>
+ <td>Number containing the route family, <code>4</code> for IPv4 or
+ <code>6</code> for IPv6</td>
+</tr>
+<tr>
+ <td><code>dest</code></td>
+ <td>Destination <code>luci.ip.cidr</code> instance</td>
+</tr>
+<tr>
+ <td><code>gw</code></td>
+ <td>Gateway <code>luci.ip.cidr</code> instance (optional)</td>
+</tr>
+<tr>
+ <td><code>from</code></td>
+ <td>Source address <code>luci.ip.cidr</code> instance (optional)</td>
+</tr>
+<tr>
+ <td><code>src</code></td>
+ <td>Preferred source <code>luci.ip.cidr</code> instance (optional)</td>
+</tr>
+<tr>
+ <td><code>dev</code></td>
+ <td>String containing the name of the outgoing interface</td>
+</tr>
+<tr>
+ <td><code>iif</code></td>
+ <td>String containing the name of the incoming interface (optional)</td>
+</tr>
+<tr>
+ <td><code>table</code></td>
+ <td>Number of the associated routing table (<code>0..65535</code>)</td>
+</tr>
+<tr>
+ <td><code>proto</code></td>
+ <td>Number of the associated routing protocol</td>
+</tr>
+<tr>
+ <td><code>scope</code></td>
+ <td>Number describing the scope of the route, most commonly
+ <code>0</code> for global or <code>253</code> for on-link</td>
+</tr>
+<tr>
+ <td><code>metric</code></td>
+ <td>Number describing the route metric (optional)</td>
+</tr>
+<tr>
+ <td><code>expires</code></td>
+ <td>Number of seconds the prefix is valid (IPv6 only, optional)</td>
+</tr>
+<tr>
+ <td><code>error</code></td>
+ <td>Route destination error code (optional)</td>
+</tr>
+</table>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#routes">
+ routes
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="routes"></a><strong>routes</strong> (filter, callback)</dt>
+<dd>
+
+
+Fetch all routes, optionally matching the given criteria.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ filter: <p>Table containing one or more of the possible filter
+critera described below (optional)</p><table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr><td><code>family</code></td><td>
+ Number describing the address family to return - <code>4</code> selects
+ IPv4 routes, <code>6</code> IPv6 ones. Any other value selects both.
+</td></tr>
+<tr><td><code>iif</code></td><td>
+ String containing the incoming route interface to match.
+</td></tr>
+<tr><td><code>oif</code></td><td>
+ String containing the outgoing route interface to match.
+</td></tr>
+<tr><td><code>type</code></td><td>
+ Numeric type to match, e.g. <code>1</code> for unicast.
+</td></tr>
+<tr><td><code>scope</code></td><td>
+ Numeric scope to match, e.g. <code>253</code> for onlink.
+</td></tr>
+<tr><td><code>proto</code></td><td>
+ Numeric protocol to match, e.g. <code>2</code> for boot.
+</td></tr>
+<tr><td><code>table</code></td><td>
+ Numeric routing table to match (<code>0..65535</code>).
+</td></tr>
+<tr><td><code>gw</code></td><td>
+ String containing the gateway address to match. Can be in any notation
+ specified by <code>luci.ip.new()</code>. Prefix matching is performed when
+ comparing the routes, e.g. "192.168.1.0/24" would select routes with gateway
+ addresses <code>192.168.1.1 .. 192.168.1.255</code>.
+</td></tr>
+<tr><td><code>dest</code></td><td>
+ String containing the destination to match. Prefix matching is performed.
+</td></tr>
+<tr><td><code>from</code></td><td>
+ String containing the source address to match. Prefix matching is performed.
+</td></tr>
+<tr><td><code>src</code></td><td>
+ String containing the preferred source address to match.
+ Prefix matching is performed.
+</td></tr>
+<tr><td><code>dest_exact</code></td><td>
+ String containing the destination to match. Exact matching is performed,
+ e.g. <code>dest = "0.0.0.0/0"</code> would match <em>any</em> IPv4 route
+ while <code>dest_exact = "0.0.0.0/0"</code> will <em>only</em> match the
+ default route.
+</td></tr>
+<tr><td><code>from_exact</code></td><td>
+ String containing the source address to match. Exact matching is performed.
+</td></tr>
+</table>
+ </li>
+
+ <li>
+ callback: <p>Callback function to invoke for each found route
+instead of returning one table of route objects (optional)</p>
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Find all IPv4 default routes:
+<pre>luci.ip.routes({ dest_exact = "0.0.0.0/0" }, function(rt)
+ print(rt.type, rt.gw, rt.dev)
+end)</pre></li>
+<li>Find all global IPv6 prefixes on the current system:
+<pre>luci.ip.routes({ from = "2001::/7" }, function(rt)
+ print(rt.from)
+end)</pre></li>
+<li>Fetch all IPv4 routes:
+<pre>routes = luci.ip.routes({ family = 4 })
+for _, rt in ipairs(routes) do
+ print(rt.dest, rt.gw, rt.dev)
+end</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+If no callback function is provided, a table of routes
+<a href="#routetable">as specified by <code>luci.ip.route()</code></a>
+is returned. If a callback function is given, it is invoked for each route
+and nothing is returned.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#route">
+ route
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="neighbors"></a><strong>neighbors</strong> (filter, callback)</dt>
+<dd>
+
+
+Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ filter: <p>Table containing one or more of the possible filter
+critera described below (optional)</p><table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr><td><code>family</code></td><td>
+ Number describing the address family to return - <code>4</code> selects
+ IPv4 ARP, <code>6</code> select IPv6 neighbour entries. Any other value
+ selects both.
+</td></tr>
+<tr><td><code>dev</code></td><td>
+ String containing the associated interface to match.
+</td></tr>
+<tr><td><code>dest</code></td><td>
+ String containing the associated address to match. Can be in any notation
+ specified by <code>luci.ip.new()</code>. Prefix matching is performed when
+ comparing the addresses, e.g. "192.168.1.0/24" would select ARP entries
+ for <code>192.168.1.1 .. 192.168.1.255</code>.
+</td></tr>
+<tr><td><code>mac</code></td><td>
+ String containing MAC address to match.
+</td></tr>
+</table>
+ </li>
+
+ <li>
+ callback: <p>Callback function to invoke for each found neighbour
+entry instead of returning one table of neighbour entries (optional)</p>
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Find all ARP neighbours in the LAN:
+<pre>luci.ip.neighbors({ dest = "192.168.0.0/16" }, function(n)
+ print(n.dest, n.mac)
+end)</pre></li>
+<li>Find all active IPv6 addresses of host with given MAC:
+<pre>luci.ip.neighbors({ family = 6, mac = "00:21:63:75:aa:17" },
+ function(n)
+ print(n.dest)
+ end)</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+If no callback function is provided, a table of neighbour entries
+is returned. If a callback function is given, it is invoked for each entry
+and nothing is returned.
+
+A neighbour entry is a table containing the following fields:
+
+<table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr>
+ <td><code>family</code></td>
+ <td>Number containing the neighbour entry family, <code>4</code> for IPv4
+ ARP or <code>6</code> for IPv6 NDP</td>
+</tr>
+<tr>
+ <td><code>dev</code></td>
+ <td>String containing the associated device of the neighbour entry</td>
+</tr>
+<tr>
+ <td><code>dest</code></td>
+ <td>IP address <code>luci.ip.cidr</code> instance</td>
+</tr>
+<tr>
+ <td><code>mac</code></td>
+ <td>String containing the associated MAC address</td>
+</tr>
+<tr>
+ <td><code>router</code></td>
+ <td>Boolean "true" if the neighbour entry is a router (IPv6, optional)</td>
+</tr>
+<tr>
+ <td><code>proxy</code></td>
+ <td>Boolean "true" if this is a proxy entry (optional)</td>
+</tr>
+<tr>
+ <td><code>incomplete</code></td>
+ <td>Boolean "true" if the entry is in incomplete state (optional)</td>
+</tr>
+<tr>
+ <td><code>reachable</code></td>
+ <td>Boolean "true" if the entry is in reachable state (optional)</td>
+</tr>
+<tr>
+ <td><code>stale</code></td>
+ <td>Boolean "true" if the entry is stale (optional)</td>
+</tr>
+<tr>
+ <td><code>delay</code></td>
+ <td>Boolean "true" if the entry is delayed (optional)</td>
+</tr>
+<tr>
+ <td><code>probe</code></td>
+ <td>Boolean "true" if the entry is in probe state (optional)</td>
+</tr>
+<tr>
+ <td><code>failed</code></td>
+ <td>Boolean "true" if the entry is in failed state (optional)</td>
+</tr>
+<tr>
+ <td><code>noarp</code></td>
+ <td>Boolean "true" if the entry is not caused by NDP or
+ ARP (optional)</td>
+</tr>
+<tr>
+ <td><code>permanent</code></td>
+ <td>Boolean "true" if the entry was statically configured from
+ userspace (optional)</td>
+</tr>
+</table>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="link"></a><strong>link</strong> (device)</dt>
+<dd>
+
+
+Fetch basic device information
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ device: String containing the network device to query
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Test whether device br-lan exists:
+<pre>print(luci.ip.link("br-lan").name ~= nil)
+</pre></li>
+<li>Query MAC address of eth0:
+<pre>print(luci.ip.link("eth0").mac)
+</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+If the given interface is found, a table containing the fields
+described below is returned, else an empty table.
+
+<table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr>
+ <td><code>up</code></td>
+ <td>Boolean indicating whether the device is in IFF_RUNNING state</td>
+</tr>
+<tr>
+ <td><code>type</code></td>
+ <td>Numeric value indicating the type of the device, e.g. <code>1</code>
+ for ethernet.</td>
+</tr>
+<tr>
+ <td><code>name</code></td>
+ <td>String containing the name of the device</td>
+</tr>
+<tr>
+ <td><code>master</code></td>
+ <td>If queried device is a bridge port, string containing the name of
+ parent bridge device (optional)</td>
+</tr>
+<tr>
+ <td><code>mtu</code></td>
+ <td>Number containing the current MTU of the device</td>
+</tr>
+<tr>
+ <td><code>qlen</code></td>
+ <td>Number containing the TX queue length of the device</td>
+</tr>
+<tr>
+ <td><code>mac</code></td>
+ <td>String containing the link local address of the device in
+ dotted hex notation</td>
+</tr>
+</table>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li><strong>luci.json</strong></li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.json</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#ActiveDecoder">ActiveDecoder</a> (customnull)</td>
+ <td class="summary">
+
+Create a new Active JSON-Decoder.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#ActiveDecoder.get">ActiveDecoder:get</a> ()</td>
+ <td class="summary">
+
+Fetches one JSON-object from given source
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Decoder">Decoder</a> (customnull)</td>
+ <td class="summary">
+
+Create a new JSON-Decoder.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Decoder.get">Decoder:get</a> ()</td>
+ <td class="summary">
+
+Get the decoded data packets after the rawdata has been sent to the sink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Decoder.sink">Decoder:sink</a> ()</td>
+ <td class="summary">
+
+Create an LTN12 sink from the decoder object which accepts the JSON-Data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Encoder">Encoder</a> (data, buffersize, fastescape)</td>
+ <td class="summary">
+
+Create a new JSON-Encoder.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Encoder.source">Encoder:source</a> ()</td>
+ <td class="summary">
+
+Create an LTN12 source providing the encoded JSON-Data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#decode">decode</a> (json)</td>
+ <td class="summary">
+
+Directly decode a JSON string
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#encode">encode</a> (obj)</td>
+ <td class="summary">
+
+Direcly encode a Lua object into a JSON string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#null">null</a> ()</td>
+ <td class="summary">
+
+Null replacement function
+ </td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="ActiveDecoder"></a><strong>ActiveDecoder</strong> (customnull)</dt>
+<dd>
+
+
+Create a new Active JSON-Decoder.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ customnull: Use luci.json.null instead of nil for decoding null
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Active JSON-Decoder
+
+
+
+</dd>
+
+
+
+
+<dt><a name="ActiveDecoder.get"></a><strong>ActiveDecoder:get</strong> ()</dt>
+<dd>
+
+
+Fetches one JSON-object from given source
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Decoded object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Decoder"></a><strong>Decoder</strong> (customnull)</dt>
+<dd>
+
+
+Create a new JSON-Decoder.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ customnull: Use luci.json.null instead of nil for decoding null
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+JSON-Decoder
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Decoder.get"></a><strong>Decoder:get</strong> ()</dt>
+<dd>
+
+
+Get the decoded data packets after the rawdata has been sent to the sink.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Decoded data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Decoder.sink"></a><strong>Decoder:sink</strong> ()</dt>
+<dd>
+
+
+Create an LTN12 sink from the decoder object which accepts the JSON-Data.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+LTN12 sink
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Encoder"></a><strong>Encoder</strong> (data, buffersize, fastescape)</dt>
+<dd>
+
+
+Create a new JSON-Encoder.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: Lua-Object to be encoded.
+ </li>
+
+ <li>
+ buffersize: Blocksize of returned data source.
+ </li>
+
+ <li>
+ fastescape: Use non-standard escaping (don't escape control chars)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+JSON-Encoder
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Encoder.source"></a><strong>Encoder:source</strong> ()</dt>
+<dd>
+
+
+Create an LTN12 source providing the encoded JSON-Data.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+LTN12 source
+
+
+
+</dd>
+
+
+
+
+<dt><a name="decode"></a><strong>decode</strong> (json)</dt>
+<dd>
+
+
+Directly decode a JSON string
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ json: JSON-String
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Lua object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="encode"></a><strong>encode</strong> (obj)</dt>
+<dd>
+
+
+Direcly encode a Lua object into a JSON string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ obj: Lua Object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+JSON string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="null"></a><strong>null</strong> ()</dt>
+<dd>
+
+
+Null replacement function
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+null
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li><strong>luci.jsonc</strong></li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.jsonc</code></h1>
+
+<p>
+ LuCI JSON parsing and serialization library.
+ The luci.jsonc class is a high level Lua binding to the JSON-C library to
+ allow reading and writing JSON data with minimal overhead.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#new">new</a> ()</td>
+ <td class="summary">
+
+Construct a new luci.jsonc.parser instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse">parse</a> (json)</td>
+ <td class="summary">
+
+Parse a complete JSON string and convert it into a Lua data structure.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#stringify">stringify</a> (data, pretty)</td>
+ <td class="summary">
+
+Convert given Lua data into a JSON string.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="new"></a><strong>new</strong> ()</dt>
+<dd>
+
+
+Construct a new luci.jsonc.parser instance.
+
+
+
+
+
+<h3>Usage:</h3>
+<code>parser = luci.jsonc.new()</code>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.jsonc.parser</code> object representing a JSON-C tokener.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="parse"></a><strong>parse</strong> (json)</dt>
+<dd>
+
+
+Parse a complete JSON string and convert it into a Lua data structure.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ json: A string containing the JSON data to parse, must be either a
+ JSON array or a JSON object.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>data = luci.jsonc.parse('{ "name": "John", "age": 34 }')
+print(data.name) -- "John"</pre>
+
+
+
+<h3>Return value:</h3>
+On success, a table containing the parsed JSON data is returned, on
+ failure the function returns <code>nil</code> and a string containing the reason of
+ the parse error.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#stringify">
+ stringify
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="stringify"></a><strong>stringify</strong> (data, pretty)</dt>
+<dd>
+
+
+Convert given Lua data into a JSON string.
+
+This function recursively converts the given Lua data into a JSON string,
+ignoring any unsupported data. Lua tables are converted into JSON arrays if they
+only contain integer keys, mixed tables are turned into JSON objects with any
+existing numeric keys converted into strings.
+
+Lua functions, coroutines and userdata objects are ignored and Lua numbers are
+converted to integers if they do not contain fractional values.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: The Lua data to convert, can be a table, string, boolean or number.
+ </li>
+
+ <li>
+ pretty: A boolean value indicating whether the resulting JSON should be
+ pretty printed.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>json = luci.jsonc.stringify({ item = true, values = { 1, 2, 3 } })
+print(json) -- '{"item":true,"values":[1,2,3]}'</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a string containing the JSON representation of the given Lua
+ data.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parse">
+ parse
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li><strong>luci.jsonc.parser</strong></li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.jsonc.parser</code></h1>
+
+<p>
+ LuCI JSON parser instance.
+ A JSON parser instance is useful to parse JSON data chunk by chunk, without
+ the need to assemble all data in advance.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.parse">parser:parse</a> (json)</td>
+ <td class="summary">
+
+Parses one chunk of JSON data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.get">parser:get</a> ()</td>
+ <td class="summary">
+
+Convert parsed JSON data into Lua table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.set">parser:set</a> (data)</td>
+ <td class="summary">
+
+Put Lua data into the parser.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.stringify">parser:stringify</a> (pretty)</td>
+ <td class="summary">
+
+Serialize current parser state as JSON.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="parser.parse"></a><strong>parser:parse</strong> (json)</dt>
+<dd>
+
+
+Parses one chunk of JSON data.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ json: String containing the JSON fragment to parse
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+
+while true do
+ chunk = ... -- fetch a cunk of data, e.g. from a socket
+ finish, errmsg = <b>parser.parse(chunk)</b>
+
+ if finish == nil then
+ error("Cannot parse JSON: " .. errmsg)
+ end
+
+ if finish == true then
+ break
+ end
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<ul>
+ <li><code>true</code> if a complete JSON object has been parsed and no further input is
+ expected.</li>
+ <li><code>false</code> if further input is required</li>
+ <li><code>nil</code> if an error was encountered while parsing the current chunk.
+ In this case a string describing the parse error is returned as second
+ value.</li></ul>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parser.get">
+ parser:get
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parser.get"></a><strong>parser:get</strong> ()</dt>
+<dd>
+
+
+Convert parsed JSON data into Lua table.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+parser:parse('{ "example": "test" }')
+
+data = parser:get()
+print(data.example) -- "test"</pre>
+
+
+
+<h3>Return value:</h3>
+Parsed JSON object converted into a Lua table or <code>nil</code> if the parser
+ didn't finish or encountered an error.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parser.parse">
+ parser:parse
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parser.set"></a><strong>parser:set</strong> (data)</dt>
+<dd>
+
+
+Put Lua data into the parser.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: Lua data to put into the parser object. The data is converted to an
+ internal JSON representation that can be dumped with <code>stringify()</code>.
+ The conversion follows the rules described in <code>luci.jsonc.stringify</code>.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+parser:set({ "some", "data" })</pre>
+
+
+
+<h3>Return value:</h3>
+Nothing is returned.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parser.stringify">
+ parser:stringify
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parser.stringify"></a><strong>parser:stringify</strong> (pretty)</dt>
+<dd>
+
+
+Serialize current parser state as JSON.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pretty: A boolean value indicating whether the resulting JSON should be pretty printed.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+parser:parse('{ "example": "test" }')
+print(parser:serialize()) -- '{"example":"test"}'</pre>
+
+
+
+<h3>Return value:</h3>
+Returns the serialized JSON data of this parser instance.
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li><strong>luci.model.ipkg</strong></li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.model.ipkg</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#compare_versions">compare_versions</a> (ver1, ver2, comp)</td>
+ <td class="summary">
+
+lua version of opkg compare-versions
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#find">find</a> (pat, cb)</td>
+ <td class="summary">
+
+Find packages that match the given pattern.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#info">info</a> (pkg)</td>
+ <td class="summary">
+
+Return information about installed and available packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#install">install</a> (...)</td>
+ <td class="summary">
+
+Install one or more packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#installed">installed</a> (pkg)</td>
+ <td class="summary">
+
+Determine whether a given package is installed.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#list_all">list_all</a> (pat, cb)</td>
+ <td class="summary">
+
+List all packages known to opkg.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#list_installed">list_installed</a> (pat, cb)</td>
+ <td class="summary">
+
+List installed packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#overlay_root">overlay_root</a> ()</td>
+ <td class="summary">
+
+Determines the overlay root used by opkg.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#remove">remove</a> (...)</td>
+ <td class="summary">
+
+Remove one or more packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#status">status</a> (pkg)</td>
+ <td class="summary">
+
+Return the package status of one or more packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#update">update</a> ()</td>
+ <td class="summary">
+
+Update package lists.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#upgrade">upgrade</a> ()</td>
+ <td class="summary">
+
+Upgrades all installed packages.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="compare_versions"></a><strong>compare_versions</strong> (ver1, ver2, comp)</dt>
+<dd>
+
+
+lua version of opkg compare-versions
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ver1: string version 1
+ </li>
+
+ <li>
+ ver2: string version 2
+ </li>
+
+ <li>
+ comp: string compare versions using
+ "<=" or "<" lower-equal
+ ">" or ">=" greater-equal
+ "=" equal
+ "<<" lower
+ ">>" greater
+ "~=" not equal
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating the status of the compare
+
+
+
+</dd>
+
+
+
+
+<dt><a name="find"></a><strong>find</strong> (pat, cb)</dt>
+<dd>
+
+
+Find packages that match the given pattern.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pat: Find packages whose names or descriptions match this pattern, nil results in zero results
+ </li>
+
+ <li>
+ cb: Callback function invoked for each patckage, receives name, version and description as arguments
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="info"></a><strong>info</strong> (pkg)</dt>
+<dd>
+
+
+Return information about installed and available packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pkg: Limit output to a (set of) packages
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing package information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="install"></a><strong>install</strong> (...)</dt>
+<dd>
+
+
+Install one or more packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: List of packages to install
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="installed"></a><strong>installed</strong> (pkg)</dt>
+<dd>
+
+
+Determine whether a given package is installed.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pkg: Package
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="list_all"></a><strong>list_all</strong> (pat, cb)</dt>
+<dd>
+
+
+List all packages known to opkg.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pat: Only find packages matching this pattern, nil lists all packages
+ </li>
+
+ <li>
+ cb: Callback function invoked for each package, receives name, version and description as arguments
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="list_installed"></a><strong>list_installed</strong> (pat, cb)</dt>
+<dd>
+
+
+List installed packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pat: Only find packages matching this pattern, nil lists all packages
+ </li>
+
+ <li>
+ cb: Callback function invoked for each package, receives name, version and description as arguments
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="overlay_root"></a><strong>overlay_root</strong> ()</dt>
+<dd>
+
+
+Determines the overlay root used by opkg.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the directory path of the overlay root.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="remove"></a><strong>remove</strong> (...)</dt>
+<dd>
+
+
+Remove one or more packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: List of packages to install
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="status"></a><strong>status</strong> (pkg)</dt>
+<dd>
+
+
+Return the package status of one or more packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pkg: Limit output to a (set of) packages
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing package status information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="update"></a><strong>update</strong> ()</dt>
+<dd>
+
+
+Update package lists.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="upgrade"></a><strong>upgrade</strong> ()</dt>
+<dd>
+
+
+Upgrades all installed packages.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li><strong>luci.model.uci</strong></li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.model.uci</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.add">Cursor:add</a> (config, type)</td>
+ <td class="summary">
+
+Add an anonymous section.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.apply">Cursor:apply</a> (configlist, command)</td>
+ <td class="summary">
+
+Applies UCI configuration changes
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.changes">Cursor:changes</a> (config)</td>
+ <td class="summary">
+
+Get a table of saved but uncommitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.commit">Cursor:commit</a> (config)</td>
+ <td class="summary">
+
+Commit saved changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.delete">Cursor:delete</a> (config, section, option)</td>
+ <td class="summary">
+
+Deletes a section or an option.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.delete_all">Cursor:delete_all</a> (config, type, comparator)</td>
+ <td class="summary">
+
+Delete all sections of a given type that match certain criteria.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.foreach">Cursor:foreach</a> (config, type, callback)</td>
+ <td class="summary">
+
+Call a function for every section of a certain type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get">Cursor:get</a> (config, section, option)</td>
+ <td class="summary">
+
+Get a section type or an option
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_all">Cursor:get_all</a> (config, section)</td>
+ <td class="summary">
+
+Get all sections of a config or all values of a section.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_bool">Cursor:get_bool</a> (config, section, option)</td>
+ <td class="summary">
+
+Get a boolean option and return it's value as true or false.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_confdir">Cursor:get_confdir</a> ()</td>
+ <td class="summary">
+
+Get the configuration directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_first">Cursor:get_first</a> (config, type, option, default)</td>
+ <td class="summary">
+
+Get the given option from the first section with the given type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_list">Cursor:get_list</a> (config, section, option)</td>
+ <td class="summary">
+
+Get an option or list and return values as table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_savedir">Cursor:get_savedir</a> ()</td>
+ <td class="summary">
+
+Get the directory for uncomitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.load">Cursor:load</a> (config)</td>
+ <td class="summary">
+
+Manually load a config.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.revert">Cursor:revert</a> (config)</td>
+ <td class="summary">
+
+Revert saved but uncommitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.save">Cursor:save</a> (config)</td>
+ <td class="summary">
+
+Saves changes made to a config to make them committable.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.section">Cursor:section</a> (config, type, name, values)</td>
+ <td class="summary">
+
+Create a new section and initialize it with data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set">Cursor:set</a> (config, section, option, value)</td>
+ <td class="summary">
+
+Set a value or create a named section.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_confdir">Cursor:set_confdir</a> (directory)</td>
+ <td class="summary">
+
+Set the configuration directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_list">Cursor:set_list</a> (config, section, option, value)</td>
+ <td class="summary">
+
+Set given values as list.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_savedir">Cursor:set_savedir</a> (directory)</td>
+ <td class="summary">
+
+Set the directory for uncommited changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.substate">Cursor:substate</a> ()</td>
+ <td class="summary">
+
+Create a sub-state of this cursor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.tset">Cursor:tset</a> (config, section, values)</td>
+ <td class="summary">
+
+Updated the data of a section using data from a table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.unload">Cursor:unload</a> (config)</td>
+ <td class="summary">
+
+Discard changes made to a config.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cursor">cursor</a> ()</td>
+ <td class="summary">
+
+Create a new UCI-Cursor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cursor_state">cursor_state</a> ()</td>
+ <td class="summary">
+
+Create a new Cursor initialized to the state directory.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="Cursor.add"></a><strong>Cursor:add</strong> (config, type)</dt>
+<dd>
+
+
+Add an anonymous section.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Name of created section
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.apply"></a><strong>Cursor:apply</strong> (configlist, command)</dt>
+<dd>
+
+
+Applies UCI configuration changes
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ configlist: List of UCI configurations
+ </li>
+
+ <li>
+ command: Don't apply only return the command
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.changes"></a><strong>Cursor:changes</strong> (config)</dt>
+<dd>
+
+
+Get a table of saved but uncommitted changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of changes
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.commit"></a><strong>Cursor:commit</strong> (config)</dt>
+<dd>
+
+
+Commit saved changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.revert">
+ Cursor:revert
+ </a>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.delete"></a><strong>Cursor:delete</strong> (config, section, option)</dt>
+<dd>
+
+
+Deletes a section or an option.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.delete_all"></a><strong>Cursor:delete_all</strong> (config, type, comparator)</dt>
+<dd>
+
+
+Delete all sections of a given type that match certain criteria.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ comparator: Function that will be called for each section and
+returns a boolean whether to delete the current section (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.foreach"></a><strong>Cursor:foreach</strong> (config, type, callback)</dt>
+<dd>
+
+
+Call a function for every section of a certain type.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ callback: Function to be called
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get"></a><strong>Cursor:get</strong> (config, section, option)</dt>
+<dd>
+
+
+Get a section type or an option
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_all"></a><strong>Cursor:get_all</strong> (config, section)</dt>
+<dd>
+
+
+Get all sections of a config or all values of a section.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of UCI sections or table of UCI values
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_bool"></a><strong>Cursor:get_bool</strong> (config, section, option)</dt>
+<dd>
+
+
+Get a boolean option and return it's value as true or false.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_confdir"></a><strong>Cursor:get_confdir</strong> ()</dt>
+<dd>
+
+
+Get the configuration directory.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Configuration directory
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_first"></a><strong>Cursor:get_first</strong> (config, type, option, default)</dt>
+<dd>
+
+
+Get the given option from the first section with the given type.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ option: UCI option (optional)
+ </li>
+
+ <li>
+ default: Default value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_list"></a><strong>Cursor:get_list</strong> (config, section, option)</dt>
+<dd>
+
+
+Get an option or list and return values as table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_savedir"></a><strong>Cursor:get_savedir</strong> ()</dt>
+<dd>
+
+
+Get the directory for uncomitted changes.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Save directory
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.load"></a><strong>Cursor:load</strong> (config)</dt>
+<dd>
+
+
+Manually load a config.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+ <li><a href="#Cursor.unload">
+ Cursor:unload
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.revert"></a><strong>Cursor:revert</strong> (config)</dt>
+<dd>
+
+
+Revert saved but uncommitted changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.commit">
+ Cursor:commit
+ </a>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.save"></a><strong>Cursor:save</strong> (config)</dt>
+<dd>
+
+
+Saves changes made to a config to make them committable.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.load">
+ Cursor:load
+ </a>
+
+ <li><a href="#Cursor.unload">
+ Cursor:unload
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.section"></a><strong>Cursor:section</strong> (config, type, name, values)</dt>
+<dd>
+
+
+Create a new section and initialize it with data.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ name: UCI section name (optional)
+ </li>
+
+ <li>
+ values: Table of key - value pairs to initialize the section with
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Name of created section
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set"></a><strong>Cursor:set</strong> (config, section, option, value)</dt>
+<dd>
+
+
+Set a value or create a named section.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option or UCI section type
+ </li>
+
+ <li>
+ value: UCI value or nil if you want to create a section
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_confdir"></a><strong>Cursor:set_confdir</strong> (directory)</dt>
+<dd>
+
+
+Set the configuration directory.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ directory: UCI configuration directory
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_list"></a><strong>Cursor:set_list</strong> (config, section, option, value)</dt>
+<dd>
+
+
+Set given values as list.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option
+ </li>
+
+ <li>
+ value: UCI value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_savedir"></a><strong>Cursor:set_savedir</strong> (directory)</dt>
+<dd>
+
+
+Set the directory for uncommited changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ directory: UCI changes directory
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.substate"></a><strong>Cursor:substate</strong> ()</dt>
+<dd>
+
+
+Create a sub-state of this 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.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI state cursor tied to the parent cursor
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.tset"></a><strong>Cursor:tset</strong> (config, section, values)</dt>
+<dd>
+
+
+Updated the data of a section using data from a table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name (optional)
+ </li>
+
+ <li>
+ values: Table of key - value pairs to update the section with
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.unload"></a><strong>Cursor:unload</strong> (config)</dt>
+<dd>
+
+
+Discard changes made to a config.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.load">
+ Cursor:load
+ </a>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cursor"></a><strong>cursor</strong> ()</dt>
+<dd>
+
+
+Create a new UCI-Cursor.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI-Cursor
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cursor_state"></a><strong>cursor_state</strong> ()</dt>
+<dd>
+
+
+Create a new Cursor initialized to the state directory.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI cursor
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li><strong>luci.rpcc</strong></li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.rpcc</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Client.proxy">Client:proxy</a> (prefix)</td>
+ <td class="summary">
+
+Create a transparent RPC proxy.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Client.request">Client:request</a> (method, params, notification)</td>
+ <td class="summary">
+
+Request an RP call and get the response.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="Client.proxy"></a><strong>Client:proxy</strong> (prefix)</dt>
+<dd>
+
+
+Create a transparent RPC proxy.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ prefix: Method prefix
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+RPC Proxy object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Client.request"></a><strong>Client:request</strong> (method, params, notification)</dt>
+<dd>
+
+
+Request an RP call and get the response.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ method: Remote method
+ </li>
+
+ <li>
+ params: Parameters
+ </li>
+
+ <li>
+ notification: Notification only?
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+response
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li><strong>luci.rpcc.ruci</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.rpcc.ruci</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#factory">factory</a> (rpccl)</td>
+ <td class="summary">
+
+Create a new UCI over RPC proxy.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="factory"></a><strong>factory</strong> (rpccl)</dt>
+<dd>
+
+
+Create a new UCI over RPC proxy.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ rpccl: RPC client
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Network transparent UCI module
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li><strong>luci.sys</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#call">call</a> (...)</td>
+ <td class="summary">
+
+Execute a given shell command and return the error code
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dmesg">dmesg</a> ()</td>
+ <td class="summary">
+
+Retrieves the output of the "dmesg" command.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#exec">exec</a> (command)</td>
+ <td class="summary">
+
+Execute a given shell command and capture its standard output
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#getenv">getenv</a> (var)</td>
+ <td class="summary">
+
+Retrieve environment variables.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#hostname">hostname</a> (String)</td>
+ <td class="summary">
+
+Get or set the current hostname.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#httpget">httpget</a> (url, stream, target)</td>
+ <td class="summary">
+
+Returns the contents of a documented referred by an URL.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#mounts">mounts</a> ()</td>
+ <td class="summary">
+
+Retrieve information about currently mounted file systems.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#reboot">reboot</a> ()</td>
+ <td class="summary">
+
+Initiate a system reboot.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#syslog">syslog</a> ()</td>
+ <td class="summary">
+
+Retrieves the output of the "logread" command.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#uniqueid">uniqueid</a> (bytes)</td>
+ <td class="summary">
+
+Generates a random id with specified length.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#uptime">uptime</a> ()</td>
+ <td class="summary">
+
+Returns the current system uptime stats.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="call"></a><strong>call</strong> (...)</dt>
+<dd>
+
+
+Execute a given shell command and return the error code
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Command to call
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Error code of the command
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dmesg"></a><strong>dmesg</strong> ()</dt>
+<dd>
+
+
+Retrieves the output of the "dmesg" command.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the current log buffer
+
+
+
+</dd>
+
+
+
+
+<dt><a name="exec"></a><strong>exec</strong> (command)</dt>
+<dd>
+
+
+Execute a given shell command and capture its standard output
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: Command to call
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containg the return the output of the command
+
+
+
+</dd>
+
+
+
+
+<dt><a name="getenv"></a><strong>getenv</strong> (var)</dt>
+<dd>
+
+
+Retrieve environment variables. If no variable is given then a table
+
+containing the whole environment is returned otherwise this function returns
+the corresponding string value for the given name or nil if no such variable
+exists.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ var: Name of the environment variable to retrieve (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>String containg the value of the specified variable
+
+ <li>Table containing all variables if no variable name is given
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="hostname"></a><strong>hostname</strong> (String)</dt>
+<dd>
+
+
+Get or set the current hostname.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ String: containing a new hostname to set (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the system hostname
+
+
+
+</dd>
+
+
+
+
+<dt><a name="httpget"></a><strong>httpget</strong> (url, stream, target)</dt>
+<dd>
+
+
+Returns the contents of a documented referred by an URL.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ url: The URL to retrieve
+ </li>
+
+ <li>
+ stream: Return a stream instead of a buffer
+ </li>
+
+ <li>
+ target: Directly write to target file name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the contents of given the URL
+
+
+
+</dd>
+
+
+
+
+<dt><a name="mounts"></a><strong>mounts</strong> ()</dt>
+<dd>
+
+
+Retrieve information about currently mounted file systems.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing mount information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="reboot"></a><strong>reboot</strong> ()</dt>
+<dd>
+
+
+Initiate a system reboot.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Return value of os.execute()
+
+
+
+</dd>
+
+
+
+
+<dt><a name="syslog"></a><strong>syslog</strong> ()</dt>
+<dd>
+
+
+Retrieves the output of the "logread" command.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the current log buffer
+
+
+
+</dd>
+
+
+
+
+<dt><a name="uniqueid"></a><strong>uniqueid</strong> (bytes)</dt>
+<dd>
+
+
+Generates a random id with specified length.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bytes: Number of bytes for the unique id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing hex encoded id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="uptime"></a><strong>uptime</strong> ()</dt>
+<dd>
+
+
+Returns the current system uptime stats.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing total uptime in seconds
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li><strong>luci.sys.init</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.init</code></h1>
+
+<p>
+
+LuCI system utilities / init related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#init.disable">disable</a> (name)</td>
+ <td class="summary">
+
+Disable the given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.enable">enable</a> (name)</td>
+ <td class="summary">
+
+Enable the given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.enabled">enabled</a> (name)</td>
+ <td class="summary">
+
+Test whether the given init script is enabled
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.index">index</a> (name)</td>
+ <td class="summary">
+
+Get the index of he given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.names">names</a> ()</td>
+ <td class="summary">
+
+Get the names of all installed init scripts
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.start">start</a> (name)</td>
+ <td class="summary">
+
+Start the given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.stop">stop</a> (name)</td>
+ <td class="summary">
+
+Stop the given init script
+ </td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="init.disable"></a><strong>disable</strong> (name)</dt>
+<dd>
+
+
+Disable the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.enable"></a><strong>enable</strong> (name)</dt>
+<dd>
+
+
+Enable the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.enabled"></a><strong>enabled</strong> (name)</dt>
+<dd>
+
+
+Test whether the given init script is enabled
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether init is enabled
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.index"></a><strong>index</strong> (name)</dt>
+<dd>
+
+
+Get the index of he given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Numeric index value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.names"></a><strong>names</strong> ()</dt>
+<dd>
+
+
+Get the names of all installed init scripts
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the names of all inistalled init scripts
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.start"></a><strong>start</strong> (name)</dt>
+<dd>
+
+
+Start the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.stop"></a><strong>stop</strong> (name)</dt>
+<dd>
+
+
+Stop the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li><strong>luci.sys.iptparser</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.sys.iptparser</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser">IptParser</a> (family)</td>
+ <td class="summary">
+
+Create a new iptables parser object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.chain">IptParser:chain</a> (table, chain)</td>
+ <td class="summary">
+
+Return the given firewall chain within the given table name.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.chains">IptParser:chains</a> (table)</td>
+ <td class="summary">
+
+Find the names of all chains within the given table name.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.is_custom_target">IptParser:is_custom_target</a> (target)</td>
+ <td class="summary">
+
+Test whether the given target points to a custom chain.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.resync">IptParser:resync</a> ()</td>
+ <td class="summary">
+
+Rebuild the internal lookup table, for example when rules have changed
+
+through external commands.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.tables">IptParser:tables</a> ()</td>
+ <td class="summary">
+
+Find the names of all tables.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="IptParser"></a><strong>IptParser</strong> (family)</dt>
+<dd>
+
+
+Create a new iptables parser object.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ family: Number specifying the address family. 4 for IPv4, 6 for IPv6
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+IptParser instance
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.chain"></a><strong>IptParser:chain</strong> (table, chain)</dt>
+<dd>
+
+
+Return the given firewall chain within the given table name.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: String containing the table name
+ </li>
+
+ <li>
+ chain: String containing the chain name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the fields "policy", "packets", "bytes"
+ and "rules". The "rules" field is a table of rule tables.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.chains"></a><strong>IptParser:chains</strong> (table)</dt>
+<dd>
+
+
+Find the names of all chains within the given table name.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: String containing the table name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of chain names in the order they occur.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.is_custom_target"></a><strong>IptParser:is_custom_target</strong> (target)</dt>
+<dd>
+
+
+Test whether the given target points to a custom chain.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ target: String containing the target action
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether target is a custom chain.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.resync"></a><strong>IptParser:resync</strong> ()</dt>
+<dd>
+
+
+Rebuild the internal lookup table, for example when rules have changed
+
+through external commands.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.tables"></a><strong>IptParser:tables</strong> ()</dt>
+<dd>
+
+
+Find the names of all tables.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table names.
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li><strong>luci.sys.net</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.net</code></h1>
+
+<p>
+
+LuCI system utilities / network related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#net.arptable">arptable</a> ()</td>
+ <td class="summary">
+
+Returns the current arp-table entries as two-dimensional table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.conntrack">conntrack</a> ()</td>
+ <td class="summary">
+
+Returns conntrack information
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.deviceinfo">deviceinfo</a> ()</td>
+ <td class="summary">
+
+Return information about available network interfaces.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.devices">devices</a> ()</td>
+ <td class="summary">
+
+Determine the names of available network interfaces.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.ipv4_hints">ipv4_hints</a> ()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of IPv4 address hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.ipv6_hints">ipv6_hints</a> ()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of IPv6 address hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.mac_hints">mac_hints</a> ()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of mac address hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.pingtest">pingtest</a> (host)</td>
+ <td class="summary">
+
+Tests whether the given host responds to ping probes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.routes">routes</a> ()</td>
+ <td class="summary">
+
+Returns the current kernel routing table entries.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.routes6">routes6</a> ()</td>
+ <td class="summary">
+
+Returns the current ipv6 kernel routing table entries.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="net.arptable"></a><strong>arptable</strong> ()</dt>
+<dd>
+
+
+Returns the current arp-table entries as two-dimensional table.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing the current arp entries.
+ The following fields are defined for arp entry objects:
+ { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" }
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.conntrack"></a><strong>conntrack</strong> ()</dt>
+<dd>
+
+
+Returns conntrack information
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table with the currently tracked IP connections
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.deviceinfo"></a><strong>deviceinfo</strong> ()</dt>
+<dd>
+
+
+Return information about available network interfaces.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing all current interface names and their information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.devices"></a><strong>devices</strong> ()</dt>
+<dd>
+
+
+Determine the names of available network interfaces.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing all current interface names
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.ipv4_hints"></a><strong>ipv4_hints</strong> ()</dt>
+<dd>
+
+
+Returns a two-dimensional table of IPv4 address hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "ip", "name" ]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.ipv6_hints"></a><strong>ipv6_hints</strong> ()</dt>
+<dd>
+
+
+Returns a two-dimensional table of IPv6 address hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "ip", "name" ]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.mac_hints"></a><strong>mac_hints</strong> ()</dt>
+<dd>
+
+
+Returns a two-dimensional table of mac address hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "mac", "name" ]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.pingtest"></a><strong>pingtest</strong> (host)</dt>
+<dd>
+
+
+Tests whether the given host responds to ping probes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: String containing a hostname or IPv4 address
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing 0 on success and >= 1 on error
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.routes"></a><strong>routes</strong> ()</dt>
+<dd>
+
+
+Returns the current kernel routing table entries.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of tables with properties of the corresponding routes.
+ The following fields are defined for route entry tables:
+ { "dest", "gateway", "metric", "refcount", "usecount", "irtt",
+ "flags", "device" }
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.routes6"></a><strong>routes6</strong> ()</dt>
+<dd>
+
+
+Returns the current ipv6 kernel routing table entries.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of tables with properties of the corresponding routes.
+ The following fields are defined for route entry tables:
+ { "source", "dest", "nexthop", "metric", "refcount", "usecount",
+ "flags", "device" }
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li><strong>luci.sys.process</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.process</code></h1>
+
+<p>
+
+LuCI system utilities / process related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#process.info">info</a> ()</td>
+ <td class="summary">
+
+Get the current process id.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.list">list</a> ()</td>
+ <td class="summary">
+
+Retrieve information about currently running processes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.setgroup">setgroup</a> (gid)</td>
+ <td class="summary">
+
+Set the gid of a process identified by given pid.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.setuser">setuser</a> (uid)</td>
+ <td class="summary">
+
+Set the uid of a process identified by given pid.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.signal">signal</a> (pid, sig)</td>
+ <td class="summary">
+
+Send a signal to a process identified by given pid.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="process.info"></a><strong>info</strong> ()</dt>
+<dd>
+
+
+Get the current process id.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing the current pid
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.list"></a><strong>list</strong> ()</dt>
+<dd>
+
+
+Retrieve information about currently running processes.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing process information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.setgroup"></a><strong>setgroup</strong> (gid)</dt>
+<dd>
+
+
+Set the gid of a process identified by given pid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ gid: Number containing the Unix group id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating successful operation
+
+ <li>String containing the error message if failed
+
+ <li>Number containing the error code if failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.setuser"></a><strong>setuser</strong> (uid)</dt>
+<dd>
+
+
+Set the uid of a process identified by given pid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ uid: Number containing the Unix user id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating successful operation
+
+ <li>String containing the error message if failed
+
+ <li>Number containing the error code if failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.signal"></a><strong>signal</strong> (pid, sig)</dt>
+<dd>
+
+
+Send a signal to a process identified by given pid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pid: Number containing the process id
+ </li>
+
+ <li>
+ sig: Signal to send (default: 15 [SIGTERM])
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating successful operation
+
+ <li>Number containing the error code if failed
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li><strong>luci.sys.user</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.user</code></h1>
+
+<p>
+
+LuCI system utilities / user related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#getuser">getuser</a> (uid)</td>
+ <td class="summary">
+
+Retrieve user informations for given uid.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#user.checkpasswd">checkpasswd</a> (username, pass)</td>
+ <td class="summary">
+
+Test whether given string matches the password of a given system user.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#user.getpasswd">getpasswd</a> (username)</td>
+ <td class="summary">
+
+Retrieve the current user password hash.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#user.setpasswd">setpasswd</a> (username, password)</td>
+ <td class="summary">
+
+Change the password of given user.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="getuser"></a><strong>getuser</strong> (uid)</dt>
+<dd>
+
+
+Retrieve user informations for given uid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ uid: Number containing the Unix user id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the following fields:
+ { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
+
+
+
+</dd>
+
+
+
+
+<dt><a name="user.checkpasswd"></a><strong>checkpasswd</strong> (username, pass)</dt>
+<dd>
+
+
+Test whether given string matches the password of a given system user.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ username: String containing the Unix user name
+ </li>
+
+ <li>
+ pass: String containing the password to compare
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating wheather the passwords are equal
+
+
+
+</dd>
+
+
+
+
+<dt><a name="user.getpasswd"></a><strong>getpasswd</strong> (username)</dt>
+<dd>
+
+
+Retrieve the current user password hash.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ username: String containing the username to retrieve the password for
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>String containing the hash or nil if no password is set.
+
+ <li>Password database entry
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="user.setpasswd"></a><strong>setpasswd</strong> (username, password)</dt>
+<dd>
+
+
+Change the password of given user.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ username: String containing the Unix user name
+ </li>
+
+ <li>
+ password: String containing the password to compare
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing 0 on success and >= 1 on error
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li><strong>luci.sys.wifi</strong></li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.wifi</code></h1>
+
+<p>
+
+LuCI system utilities / wifi related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#wifi.getiwinfo">getiwinfo</a> (ifname)</td>
+ <td class="summary">
+
+Get wireless information for given interface.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="wifi.getiwinfo"></a><strong>getiwinfo</strong> (ifname)</dt>
+<dd>
+
+
+Get wireless information for given interface.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ifname: String containing the interface name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A wrapped iwinfo object instance
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li><strong>luci.util</strong></li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.util</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#append">append</a> (src, ...)</td>
+ <td class="summary">
+
+Appends numerically indexed tables or single objects to a given table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bigendian">bigendian</a> ()</td>
+ <td class="summary">
+
+Test whether the current system is operating in big endian mode.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#class">class</a> (base)</td>
+ <td class="summary">
+
+Create a Class object (Python-style object model).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#clone">clone</a> (object, deep)</td>
+ <td class="summary">
+
+Clones the given object and return it's copy.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cmatch">cmatch</a> (str, pattern)</td>
+ <td class="summary">
+
+Count the occurences of given substring in given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#combine">combine</a> (tbl1, tbl2, ...)</td>
+ <td class="summary">
+
+Combines two or more numerically indexed tables and single objects into one table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#contains">contains</a> (table, value)</td>
+ <td class="summary">
+
+Checks whether the given table contains the given value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#copcall">copcall</a> (f, ...)</td>
+ <td class="summary">
+
+This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#coxpcall">coxpcall</a> (f, err, ...)</td>
+ <td class="summary">
+
+This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dtable">dtable</a> ()</td>
+ <td class="summary">
+
+Create a dynamic table which automatically creates subtables.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dumptable">dumptable</a> (t, maxdepth)</td>
+ <td class="summary">
+
+Recursively dumps a table to stdout, useful for testing and debugging.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#exec">exec</a> (command)</td>
+ <td class="summary">
+
+Execute given commandline and gather stdout.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#execi">execi</a> (command)</td>
+ <td class="summary">
+
+Return a line-buffered iterator over the output of given command.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#get_bytecode">get_bytecode</a> (val)</td>
+ <td class="summary">
+
+Return the current runtime bytecode of the given data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#imatch">imatch</a> (val)</td>
+ <td class="summary">
+
+Return a matching iterator for the given value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#instanceof">instanceof</a> (object, class)</td>
+ <td class="summary">
+
+Test whether the given object is an instance of the given class.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#keys">keys</a> (t)</td>
+ <td class="summary">
+
+Retrieve all keys of given associative table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#kspairs">kspairs</a> (t)</td>
+ <td class="summary">
+
+Return a key, value iterator for the given table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#libpath">libpath</a> ()</td>
+ <td class="summary">
+
+Returns the absolute path to LuCI base directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse_units">parse_units</a> (ustr)</td>
+ <td class="summary">
+
+Parse certain units from the given string and return the canonical integer
+
+value or 0 if the unit is unknown.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#pcdata">pcdata</a> (value)</td>
+ <td class="summary">
+
+Create valid XML PCDATA from given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#perror">perror</a> (obj)</td>
+ <td class="summary">
+
+Write given object to stderr.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#restore_data">restore_data</a> (str)</td>
+ <td class="summary">
+
+Restore data previously serialized with serialize_data().</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#serialize_data">serialize_data</a> (val)</td>
+ <td class="summary">
+
+Recursively serialize given data to lua code, suitable for restoring
+
+with loadstring().</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#serialize_json">serialize_json</a> (data, writer)</td>
+ <td class="summary">
+
+Convert data structure to JSON
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#spairs">spairs</a> (t, f)</td>
+ <td class="summary">
+
+Return a key, value iterator which returns the values sorted according to
+
+the provided callback function.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#split">split</a> (str, pat, max, regex)</td>
+ <td class="summary">
+
+Splits given string on a defined separator sequence and return a table
+
+containing the resulting substrings.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#strip_bytecode">strip_bytecode</a> (code)</td>
+ <td class="summary">
+
+Strips unnescessary lua bytecode from given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#striptags">striptags</a> (value)</td>
+ <td class="summary">
+
+Strip HTML tags from given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#threadlocal">threadlocal</a> ()</td>
+ <td class="summary">
+
+Create a new or get an already existing thread local store associated with
+
+the current active coroutine.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#trim">trim</a> (str)</td>
+ <td class="summary">
+
+Remove leading and trailing whitespace from given string value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#ubus">ubus</a> (object, method, values)</td>
+ <td class="summary">
+
+Issue an ubus call.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#update">update</a> (t, updates)</td>
+ <td class="summary">
+
+Update values in given table with the values from the second given table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#vspairs">vspairs</a> (t)</td>
+ <td class="summary">
+
+Return a key, value iterator for the given table.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="append"></a><strong>append</strong> (src, ...)</dt>
+<dd>
+
+
+Appends numerically indexed tables or single objects to a given table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Target table
+ </li>
+
+ <li>
+ ...: Objects to insert
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Target table
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bigendian"></a><strong>bigendian</strong> ()</dt>
+<dd>
+
+
+Test whether the current system is operating in big endian mode.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean value indicating whether system is big endian
+
+
+
+</dd>
+
+
+
+
+<dt><a name="class"></a><strong>class</strong> (base)</dt>
+<dd>
+
+
+Create a Class object (Python-style object model).
+
+The class object can be instantiated by calling itself.
+Any class functions or shared parameters can be attached to this object.
+Attaching a table to the class object makes this table shared between
+all instances of this class. For object parameters use the __init__ function.
+Classes can inherit member functions and values from a base class.
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ base: The base class to inherit from (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A class object
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#instanceof">
+ instanceof
+ </a>
+
+ <li><a href="#clone">
+ clone
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="clone"></a><strong>clone</strong> (object, deep)</dt>
+<dd>
+
+
+Clones the given object and return it's copy.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ object: Table value to clone
+ </li>
+
+ <li>
+ deep: Boolean indicating whether to do recursive cloning
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Cloned table value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cmatch"></a><strong>cmatch</strong> (str, pattern)</dt>
+<dd>
+
+
+Count the occurences of given substring in given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String to search in
+ </li>
+
+ <li>
+ pattern: String containing pattern to find
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number of found occurences
+
+
+
+</dd>
+
+
+
+
+<dt><a name="combine"></a><strong>combine</strong> (tbl1, tbl2, ...)</dt>
+<dd>
+
+
+Combines two or more numerically indexed tables and single objects into one table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ tbl1: Table value to combine
+ </li>
+
+ <li>
+ tbl2: Table value to combine
+ </li>
+
+ <li>
+ ...: More tables to combine
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table value containing all values of given tables
+
+
+
+</dd>
+
+
+
+
+<dt><a name="contains"></a><strong>contains</strong> (table, value)</dt>
+<dd>
+
+
+Checks whether the given table contains the given value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: Table value
+ </li>
+
+ <li>
+ value: Value to search within the given table
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number indicating the first index at which the given value occurs
+ within table or false.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="copcall"></a><strong>copcall</strong> (f, ...)</dt>
+<dd>
+
+
+This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ f: Lua function to be called protected
+ </li>
+
+ <li>
+ ...: Parameters passed to the function
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A boolean whether the function call succeeded and the returns
+ values of the function or the error object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="coxpcall"></a><strong>coxpcall</strong> (f, err, ...)</dt>
+<dd>
+
+
+This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ f: Lua function to be called protected
+ </li>
+
+ <li>
+ err: Custom error handler
+ </li>
+
+ <li>
+ ...: Parameters passed to the function
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A boolean whether the function call succeeded and the return
+ values of either the function or the error handler
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dtable"></a><strong>dtable</strong> ()</dt>
+<dd>
+
+
+Create a dynamic table which automatically creates subtables.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dynamic Table
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dumptable"></a><strong>dumptable</strong> (t, maxdepth)</dt>
+<dd>
+
+
+Recursively dumps a table to stdout, useful for testing and debugging.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: Table value to dump
+ </li>
+
+ <li>
+ maxdepth: Maximum depth
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Always nil
+
+
+
+</dd>
+
+
+
+
+<dt><a name="exec"></a><strong>exec</strong> (command)</dt>
+<dd>
+
+
+Execute given commandline and gather stdout.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: String containing command to execute
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the command's stdout
+
+
+
+</dd>
+
+
+
+
+<dt><a name="execi"></a><strong>execi</strong> (command)</dt>
+<dd>
+
+
+Return a line-buffered iterator over the output of given command.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: String containing the command to execute
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="get_bytecode"></a><strong>get_bytecode</strong> (val)</dt>
+<dd>
+
+
+Return the current runtime bytecode of the given data. The byte code
+
+will be stripped before it is returned.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ val: Value to return as bytecode
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the bytecode of the given data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="imatch"></a><strong>imatch</strong> (val)</dt>
+<dd>
+
+
+Return a matching iterator for the given value. The iterator will return
+
+one token per invocation, the tokens are separated by whitespace. If the
+input value is a table, it is transformed into a string first. A nil value
+will result in a valid interator which aborts with the first invocation.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ val: The value to scan (table, string or nil)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Iterator which returns one token per call
+
+
+
+</dd>
+
+
+
+
+<dt><a name="instanceof"></a><strong>instanceof</strong> (object, class)</dt>
+<dd>
+
+
+Test whether the given object is an instance of the given class.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ object: Object instance
+ </li>
+
+ <li>
+ class: Class object to test against
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the object is an instance
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#class">
+ class
+ </a>
+
+ <li><a href="#clone">
+ clone
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="keys"></a><strong>keys</strong> (t)</dt>
+<dd>
+
+
+Retrieve all keys of given associative table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: Table to extract keys from
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Sorted table containing the keys
+
+
+
+</dd>
+
+
+
+
+<dt><a name="kspairs"></a><strong>kspairs</strong> (t)</dt>
+<dd>
+
+
+Return a key, value iterator for the given table.
+
+The table pairs are sorted by key.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: The table to iterate
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Function value containing the corresponding iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="libpath"></a><strong>libpath</strong> ()</dt>
+<dd>
+
+
+Returns the absolute path to LuCI base directory.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the directory path
+
+
+
+</dd>
+
+
+
+
+<dt><a name="parse_units"></a><strong>parse_units</strong> (ustr)</dt>
+<dd>
+
+
+Parse certain units from the given string and return the canonical integer
+
+value or 0 if the unit is unknown. 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)
+ o "d" - one day (60*60*24)
+ o "h" - one hour (60*60)
+ o "min" - one minute (60)
+ o "kb" - one kilobyte (1024)
+ o "mb" - one megabyte (1024*1024)
+ o "gb" - one gigabyte (1024*1024*1024)
+ o "kib" - one si kilobyte (1000)
+ o "mib" - one si megabyte (1000*1000)
+ o "gib" - one si gigabyte (1000*1000*1000)
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ustr: String containing a numerical value with trailing unit
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing the canonical value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="pcdata"></a><strong>pcdata</strong> (value)</dt>
+<dd>
+
+
+Create valid XML PCDATA from given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ value: String value containing the data to escape
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the escaped data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="perror"></a><strong>perror</strong> (obj)</dt>
+<dd>
+
+
+Write given object to stderr.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ obj: Value to write to stderr
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the write operation was successful
+
+
+
+</dd>
+
+
+
+
+<dt><a name="restore_data"></a><strong>restore_data</strong> (str)</dt>
+<dd>
+
+
+Restore data previously serialized with serialize_data().
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String containing the data to restore
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Value containing the restored data structure
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#serialize_data">
+ serialize_data
+ </a>
+
+ <li><a href="#get_bytecode">
+ get_bytecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="serialize_data"></a><strong>serialize_data</strong> (val)</dt>
+<dd>
+
+
+Recursively serialize given data to lua code, suitable for restoring
+
+with loadstring().
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ val: Value containing the data to serialize
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the serialized code
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#restore_data">
+ restore_data
+ </a>
+
+ <li><a href="#get_bytecode">
+ get_bytecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="serialize_json"></a><strong>serialize_json</strong> (data, writer)</dt>
+<dd>
+
+
+Convert data structure to JSON
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: The data to serialize
+ </li>
+
+ <li>
+ writer: A function to write a chunk of JSON data (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the JSON if called without write callback
+
+
+
+</dd>
+
+
+
+
+<dt><a name="spairs"></a><strong>spairs</strong> (t, f)</dt>
+<dd>
+
+
+Return a key, value iterator which returns the values sorted according to
+
+the provided callback function.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: The table to iterate
+ </li>
+
+ <li>
+ f: A callback function to decide the order of elements
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Function value containing the corresponding iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="split"></a><strong>split</strong> (str, pat, max, regex)</dt>
+<dd>
+
+
+Splits given string on a defined separator sequence and return a table
+
+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.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String value containing the data to split up
+ </li>
+
+ <li>
+ pat: String with separator pattern (optional, defaults to "\n")
+ </li>
+
+ <li>
+ max: Maximum times to split (optional)
+ </li>
+
+ <li>
+ regex: Boolean indicating whether to interpret the separator
+ pattern as regular expression (optional, default is false)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the resulting substrings
+
+
+
+</dd>
+
+
+
+
+<dt><a name="strip_bytecode"></a><strong>strip_bytecode</strong> (code)</dt>
+<dd>
+
+
+Strips unnescessary lua bytecode from given string. Information like line
+
+numbers and debugging numbers will be discarded. Original version by
+Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ code: String value containing the original lua byte code
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the stripped lua byte code
+
+
+
+</dd>
+
+
+
+
+<dt><a name="striptags"></a><strong>striptags</strong> (value)</dt>
+<dd>
+
+
+Strip HTML tags from given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ value: String containing the HTML text
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String with HTML tags stripped of
+
+
+
+</dd>
+
+
+
+
+<dt><a name="threadlocal"></a><strong>threadlocal</strong> ()</dt>
+<dd>
+
+
+Create a new or get an already existing thread local store associated with
+
+the current active coroutine. A thread local store is private a table object
+whose values can't be accessed from outside of the running coroutine.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table value representing the corresponding thread local store
+
+
+
+</dd>
+
+
+
+
+<dt><a name="trim"></a><strong>trim</strong> (str)</dt>
+<dd>
+
+
+Remove leading and trailing whitespace from given string value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String value containing whitespace padded data
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value with leading and trailing space removed
+
+
+
+</dd>
+
+
+
+
+<dt><a name="ubus"></a><strong>ubus</strong> (object, method, values)</dt>
+<dd>
+
+
+Issue an ubus call.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ object: String containing the ubus object to call
+ </li>
+
+ <li>
+ method: String containing the ubus method to call
+ </li>
+
+ <li>
+ values: Table containing the values to pass
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containin the ubus result
+
+
+
+</dd>
+
+
+
+
+<dt><a name="update"></a><strong>update</strong> (t, updates)</dt>
+<dd>
+
+
+Update values in given table with the values from the second given table.
+
+Both table are - in fact - merged together.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: Table which should be updated
+ </li>
+
+ <li>
+ updates: Table containing the values to update
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Always nil
+
+
+
+</dd>
+
+
+
+
+<dt><a name="vspairs"></a><strong>vspairs</strong> (t)</dt>
+<dd>
+
+
+Return a key, value iterator for the given table.
+
+The table pairs are sorted by value.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: The table to iterate
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Function value containing the corresponding iterator
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li><strong>nixio.CHANGELOG</strong></li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.CHANGELOG</code></h1>
+
+<p>
+ Changes and improvements.</p>
+
+
+
+
+
+
+
+
+
+
+<h2>Tables</h2>
+<table class="table_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#0.2">0.2</a></td>
+ <td class="summary">
+ Initial Release.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#0.3">0.3</a></td>
+ <td class="summary">
+ Service Release.</td>
+ </tr>
+
+</table>
+
+
+
+<br/>
+<br/>
+
+
+
+
+<h2><a name="tables"></a>Tables</h2>
+<dl class="table">
+
+<dt><a name="0.2"></a><strong>0.2</strong></dt>
+<dd>
+ Initial Release.
+ <ul>
+ <li>Initial Release</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="0.3"></a><strong>0.3</strong></dt>
+<dd>
+ Service Release.
+ <ul>
+ <li>Added getifaddrs() function.</li>
+ <li>Added getsockopt(), setsockopt(), getsockname() and getpeername()
+ directly to TLS-socket objects unifying the socket interface.</li>
+ <li>Added support for CyaSSL as cryptographical backend.</li>
+ <li>Added support for x509 certificates in DER format.</li>
+ <li>Added support for splice() in UnifiedIO.copyz().</li>
+ <li>Added interface to inject chunks into UnifiedIO.linesource() buffer.</li>
+ <li>Changed TLS behaviour to explicitely separate servers and clients.</li>
+ <li>Fixed usage of signed datatype breaking Base64 decoding.</li>
+ <li>Fixed namespace clashes for nixio.fs.</li>
+ <li>Fixed splice() support for some exotic C libraries.</li>
+ <li>Reconfigure axTLS cryptographical provider and mark it as obsolete.</li>
+ </ul>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li><strong>nixio.CryptoHash</strong></li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.CryptoHash</code></h1>
+
+<p>
+ Cryptographical Hash and HMAC object.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#CryptoHash.final">CryptoHash:final</a> ()</td>
+ <td class="summary">
+ Finalize the hash and return the digest.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#CryptoHash.update">CryptoHash:update</a> (chunk)</td>
+ <td class="summary">
+ Add another chunk of data to be hashed.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="CryptoHash.final"></a><strong>CryptoHash:final</strong> ()</dt>
+<dd>
+
+ Finalize the hash and return the digest.
+
+
+
+
+
+<h3>Usage:</h3>
+You cannot call update on a hash object that was already finalized
+ you can however call final multiple times to get the digest.
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>hexdigest
+
+ <li>buffer containing binary digest
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="CryptoHash.update"></a><strong>CryptoHash:update</strong> (chunk)</dt>
+<dd>
+
+ Add another chunk of data to be hashed.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ chunk: Chunk of data
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+CryptoHash object (self)
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li><strong>nixio.File</strong></li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.File</code></h1>
+
+<p>
+ Large File Object.
+ Large file operations are supported up to 52 bits if the Lua number type is
+ double (default).</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#File.close">File:close</a> ()</td>
+ <td class="summary">
+ Close the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.fileno">File:fileno</a> ()</td>
+ <td class="summary">
+ Get the number of the filedescriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.lock">File:lock</a> (command, length)</td>
+ <td class="summary">
+ Apply or test a lock on the file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.read">File:read</a> (length)</td>
+ <td class="summary">
+ Read from a file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.seek">File:seek</a> (offset, whence)</td>
+ <td class="summary">
+ Reposition read / write offset of the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.setblocking">File:setblocking</a> (blocking)</td>
+ <td class="summary">
+ (POSIX) Set the blocking mode of the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.stat">File:stat</a> (field)</td>
+ <td class="summary">
+ Get file status and attributes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.sync">File:sync</a> (data_only)</td>
+ <td class="summary">
+ Synchronizes the file with the storage device.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.tell">File:tell</a> ()</td>
+ <td class="summary">
+ Return the current read / write offset of the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.write">File:write</a> (buffer, offset, length)</td>
+ <td class="summary">
+ Write to the file descriptor.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="File.close"></a><strong>File:close</strong> ()</dt>
+<dd>
+
+ Close the file descriptor.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.fileno"></a><strong>File:fileno</strong> ()</dt>
+<dd>
+
+ Get the number of the filedescriptor.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+file descriptor number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.lock"></a><strong>File:lock</strong> (command, length)</dt>
+<dd>
+
+ Apply or test a lock on the file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: Locking Command ["lock", "tlock", "ulock", "test"]
+ </li>
+
+ <li>
+ length: Amount of Bytes to lock from current offset (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls lockf() on POSIX and _locking() on Windows.
+
+ <li>The "lock" command is blocking, "tlock" is non-blocking,
+ "ulock" unlocks and "test" only tests for the lock.
+
+ <li>The "test" command is not available on Windows.
+
+ <li>Locks are by default advisory on POSIX, but mandatory on Windows.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.read"></a><strong>File:read</strong> (length)</dt>
+<dd>
+
+ Read from a file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all requested data
+ is read at once especially when dealing with pipes.
+ You have to check the return value - the length of the buffer actually read -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>The length of the return buffer is limited by the (compile time)
+ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
+ Any read request greater than that will be safely truncated to this value.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.seek"></a><strong>File:seek</strong> (offset, whence)</dt>
+<dd>
+
+ Reposition read / write offset of the file descriptor.
+ The seek will be done either from the beginning of the file or relative
+ to the current position or relative to the end.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ offset: File Offset
+ </li>
+
+ <li>
+ whence: Starting point [<strong>"set"</strong>, "cur", "end"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls lseek().
+
+
+
+<h3>Return value:</h3>
+new (absolute) offset position
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.setblocking"></a><strong>File:setblocking</strong> (blocking)</dt>
+<dd>
+
+ (POSIX) Set the blocking mode of the file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ blocking: (boolean)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.stat"></a><strong>File:stat</strong> (field)</dt>
+<dd>
+
+ Get file status and attributes.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ field: Only return a specific field, not the whole table (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls fstat().
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>atime = Last access timestamp</li>
+ <li>blksize = Blocksize (POSIX only)</li>
+ <li>blocks = Blocks used (POSIX only)</li>
+ <li>ctime = Creation timestamp</li>
+ <li>dev = Device ID</li>
+ <li>gid = Group ID</li>
+ <li>ino = Inode</li>
+ <li>modedec = Mode converted into a decimal number</li>
+ <li>modestr = Mode as string as returned by <code>ls -l</code></li>
+ <li>mtime = Last modification timestamp</li>
+ <li>nlink = Number of links</li>
+ <li>rdev = Device ID (if special file)</li>
+ <li>size = Size in bytes</li>
+ <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
+ <li>uid = User ID</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.sync"></a><strong>File:sync</strong> (data_only)</dt>
+<dd>
+
+ Synchronizes the file with the storage device.
+ Returns when the file is successfully written to the disk.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data_only: Do not synchronize the metadata. (optional, boolean)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls fsync() when data_only equals false
+ otherwise fdatasync(), on Windows _commit() is used instead.
+
+ <li>fdatasync() is only supported by Linux and Solaris. For other systems
+ the <em>data_only</em> parameter is ignored and fsync() is always called.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.tell"></a><strong>File:tell</strong> ()</dt>
+<dd>
+
+ Return the current read / write offset of the file descriptor.
+
+
+
+
+
+<h3>Usage:</h3>
+This function calls lseek() with offset 0 from the current position.
+
+
+
+<h3>Return value:</h3>
+offset position
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.write"></a><strong>File:write</strong> (buffer, offset, length)</dt>
+<dd>
+
+ Write to the file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all data
+ in the buffer is written at once especially when dealing with pipes.
+ You have to check the return value - the number of bytes actually written -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>Unlike standard Lua indexing the lowest offset and default is 0.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li><strong>nixio.README</strong></li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.README</code></h1>
+
+<p>
+ General Information.</p>
+
+
+
+
+
+
+
+
+
+
+<h2>Tables</h2>
+<table class="table_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Errorhandling">Errorhandling</a></td>
+ <td class="summary">
+ General error handling information.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Functions">Functions</a></td>
+ <td class="summary">
+ Function conventions.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Platforms">Platforms</a></td>
+ <td class="summary">
+ Platform information.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLS-Crypto">TLS-Crypto</a></td>
+ <td class="summary">
+ Cryptography and TLS libraries.</td>
+ </tr>
+
+</table>
+
+
+
+<br/>
+<br/>
+
+
+
+
+<h2><a name="tables"></a>Tables</h2>
+<dl class="table">
+
+<dt><a name="Errorhandling"></a><strong>Errorhandling</strong></dt>
+<dd>
+ General error handling information.
+ <ul>
+ <li> Most of the functions available in this library may fail. If any error
+ occurs the function returns <strong>nil or false</strong>, an error code
+ (usually errno) and an additional error message text (if avaialable).</li>
+ <li>At the moment false is only returned when a non-blocking I/O function
+ fails with EAGAIN, EWOULDBLOCK or WSAEWOULDBLOCK for any others nil is
+ returned as first parameter. Therefore you can use false to write portable
+ non-blocking I/O applications.</li>
+ <li>Note that the function documentation does only mention the return values
+ in case of a successful operation.</li>
+ <li>You can find a table of common error numbers and other useful constants
+ like signal numbers in <strong>nixio.const</strong> e.g. nixio.const.EINVAL,
+ nixio.const.SIGTERM, etc. For portability there is a second error constant
+ table <strong>nixio.const_sock</strong> for socket error codes. This might
+ be important if you are dealing with Windows applications, on POSIX however
+ const_sock is just an alias for const.</li>
+ <li>With some exceptions - which are explicitely stated in the function
+ documentation - all blocking functions are signal-protected and will not fail
+ with EINTR.</li>
+ <li>On POSIX the SIGPIPE signal will be set to ignore upon initialization.
+ You should restore the default behaviour or set a custom signal handler
+ in your program after loading nixio if you need this behaviour.</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="Functions"></a><strong>Functions</strong></dt>
+<dd>
+ Function conventions.
+ <br />In general all functions are namend and behave like their POSIX API
+ counterparts - where applicable - applying the following rules:
+ <ul>
+ <li>Functions should be named like the underlying POSIX API function ommiting
+ prefixes or suffixes - especially when placed in an object-context (
+ lockf -> File:lock, fsync -> File:sync, dup2 -> dup, ...)</li>
+ <li>If you are unclear about the behaviour of a function you should consult
+ your OS API documentation (e.g. the manpages).</li>
+ <li>If the name is significantly different from the POSIX-function, the
+ underlying function(s) are stated in the documentation.</li>
+ <li>Parameters should reflect those of the C-API, buffer length arguments and
+ by-reference parameters should be ommitted for pratical purposes.</li>
+ <li>If a C function accepts a bitfield as parameter, it should be translated
+ into lower case string flags representing the flags if the bitfield is the
+ last parameter and also ommiting prefixes or suffixes. (e.g. waitpid
+ (pid, &s, WNOHANG | WUNTRACED) -> waitpid(pid, "nohang", "untraced"),
+ getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ->
+ Socket:getopt("socket", "reuseaddr"), etc.) </li>
+ <li>If it is not applicable to provide a string representation of the
+ bitfield a bitfield generator helper is provided. It is named FUNCTION_flags.
+ (open("/tmp/test", O_RDONLY | O_NONBLOCK) -> open("/tmp/test", open_flags(
+ "rdonly", "nonblock")))</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="Platforms"></a><strong>Platforms</strong></dt>
+<dd>
+ Platform information.
+ <ul>
+ <li>The minimum platform requirements are a decent POSIX 2001 support.
+ Builds are more or less tested on Linux, Solaris and FreeBSD. Builds for
+ Windows XP SP1 and later can be compiled with MinGW either from Windows
+ itself or using the MinGW cross-compiler. Earlier versions of Windows are not
+ supported.</li>
+ <li>In general all functions which don't have any remarks
+ in their documentation are available on all platforms.</li>
+ <li>Functions with a (POSIX), (Linux) or similar prefix are only available
+ on these specific platforms. Same appplies to parameters of functions
+ with a similar suffix.</li>
+ <li>Some functions might have limitations on some platforms. This should
+ be stated in the documentation. Please also consult your OS API
+ documentation.</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="TLS-Crypto"></a><strong>TLS-Crypto</strong></dt>
+<dd>
+ Cryptography and TLS libraries.
+ <ul>
+ <li>Currently 3 underlying cryptography libraries are supported: openssl,
+ cyassl and axTLS. The name of the library in use is written to
+ <strong>nixio.tls_provider</strong></li>
+ <li>You should whenever possible use openssl or cyassl as axTLS has only
+ limited support. It does not provide support for non-blocking sockets and
+ is probably less audited than the other ones.</li>
+ <li>As the supported Windows versions are not suitable for embedded devices
+ axTLS is at the moment not supported on Windows.</li>
+ </ul>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li><strong>nixio.Socket</strong></li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.Socket</code></h1>
+
+<p>
+ Socket Object.
+ Supports IPv4, IPv6 and UNIX (POSIX only) families.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.accept">Socket:accept</a> ()</td>
+ <td class="summary">
+ Accept a connection on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.bind">Socket:bind</a> (host, port)</td>
+ <td class="summary">
+ Bind the socket to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.close">Socket:close</a> ()</td>
+ <td class="summary">
+ Close the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.connect">Socket:connect</a> (host, port)</td>
+ <td class="summary">
+ Connect the socket to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.fileno">Socket:fileno</a> ()</td>
+ <td class="summary">
+ Get the number of the filedescriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.getopt">Socket:getopt</a> (level, option)</td>
+ <td class="summary">
+ Get a socket option.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.getpeername">Socket:getpeername</a> ()</td>
+ <td class="summary">
+ Get the peer address of a socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.getsockname">Socket:getsockname</a> ()</td>
+ <td class="summary">
+ Get the local address of a socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.listen">Socket:listen</a> (backlog)</td>
+ <td class="summary">
+ Listen for connections on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.read ">Socket:read </a> (length)</td>
+ <td class="summary">
+ Receive a message on the socket (This is an alias for recv).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.recv ">Socket:recv </a> (length)</td>
+ <td class="summary">
+ Receive a message on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.recvfrom">Socket:recvfrom</a> (length)</td>
+ <td class="summary">
+ Receive a message on the socket including the senders source address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.send">Socket:send</a> (buffer, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.sendto">Socket:sendto</a> (buffer, host, port, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket specifying the destination.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.setblocking">Socket:setblocking</a> (blocking)</td>
+ <td class="summary">
+ Set the blocking mode of the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.setopt">Socket:setopt</a> (level, option, value)</td>
+ <td class="summary">
+ Set a socket option.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.shutdown">Socket:shutdown</a> (how)</td>
+ <td class="summary">
+ Shut down part of a full-duplex connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.write">Socket:write</a> (buffer, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket (This is an alias for send).</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="Socket.accept"></a><strong>Socket:accept</strong> ()</dt>
+<dd>
+
+ Accept a connection on the socket.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Socket Object
+
+ <li>Peer IP-Address
+
+ <li>Peer Port
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.bind"></a><strong>Socket:bind</strong> (host, port)</dt>
+<dd>
+
+ Bind the socket to a network address.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Host (optional, default: all addresses)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls getaddrinfo() and bind() but NOT listen().
+
+ <li>If <em>host</em> is a domain name it will be looked up and bind()
+ tries the IP-Addresses in the order returned by the DNS resolver
+ until the bind succeeds.
+
+ <li>UNIX sockets ignore the <em>port</em>,
+ and interpret <em>host</em> as a socket path.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.close"></a><strong>Socket:close</strong> ()</dt>
+<dd>
+
+ Close the socket.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.connect"></a><strong>Socket:connect</strong> (host, port)</dt>
+<dd>
+
+ Connect the socket to a network address.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Hostname or IP-Address (optional, default: localhost)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls getaddrinfo() and connect().
+
+ <li>If <em>host</em> is a domain name it will be looked up and connect()
+ tries the IP-Addresses in the order returned by the DNS resolver
+ until the connect succeeds.
+
+ <li>UNIX sockets ignore the <em>port</em>,
+ and interpret <em>host</em> as a socket path.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.fileno"></a><strong>Socket:fileno</strong> ()</dt>
+<dd>
+
+ Get the number of the filedescriptor.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+file descriptor number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.getopt"></a><strong>Socket:getopt</strong> (level, option)</dt>
+<dd>
+
+ Get a socket option.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ level: Level ["socket", "tcp", "ip", "ipv6"]
+ </li>
+
+ <li>
+ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
+ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
+ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
+ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
+ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
+ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.getpeername"></a><strong>Socket:getpeername</strong> ()</dt>
+<dd>
+
+ Get the peer address of a socket.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>IP-Address
+
+ <li>Port
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.getsockname"></a><strong>Socket:getsockname</strong> ()</dt>
+<dd>
+
+ Get the local address of a socket.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>IP-Address
+
+ <li>Port
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.listen"></a><strong>Socket:listen</strong> (backlog)</dt>
+<dd>
+
+ Listen for connections on the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ backlog: Length of queue for pending connections
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.read "></a><strong>Socket:read </strong> (length)</dt>
+<dd>
+
+ Receive a message on the socket (This is an alias for recv).
+ See the recvfrom description for more details.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.recvfrom">
+ Socket:recvfrom
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Socket.recv "></a><strong>Socket:recv </strong> (length)</dt>
+<dd>
+
+ Receive a message on the socket.
+ This function is identical to recvfrom except that it does not return
+ the sender's source address. See the recvfrom description for more details.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.recvfrom">
+ Socket:recvfrom
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Socket.recvfrom"></a><strong>Socket:recvfrom</strong> (length)</dt>
+<dd>
+
+ Receive a message on the socket including the senders source address.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all requested data
+ is read at once.
+ You have to check the return value - the length of the buffer actually read -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>The length of the return buffer is limited by the (compile time)
+ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
+ Any read request greater than that will be safely truncated to this value.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>buffer containing data successfully read
+
+ <li>host IP-Address of the sender
+
+ <li>port Port of the sender
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.send"></a><strong>Socket:send</strong> (buffer, offset, length)</dt>
+<dd>
+
+ Send a message on the socket.
+ This function is identical to sendto except for the missing destination
+ paramters. See the sendto description for a detailed description.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.sendto">
+ Socket:sendto
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Socket.sendto"></a><strong>Socket:sendto</strong> (buffer, host, port, offset, length)</dt>
+<dd>
+
+ Send a message on the socket specifying the destination.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ host: Target IP-Address
+ </li>
+
+ <li>
+ port: Target Port
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all data
+ in the buffer is written at once.
+ You have to check the return value - the number of bytes actually written -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>Unlike standard Lua indexing the lowest offset and default is 0.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.setblocking"></a><strong>Socket:setblocking</strong> (blocking)</dt>
+<dd>
+
+ Set the blocking mode of the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ blocking: (boolean)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.setopt"></a><strong>Socket:setopt</strong> (level, option, value)</dt>
+<dd>
+
+ Set a socket option.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ level: Level ["socket", "tcp", "ip", "ipv6"]
+ </li>
+
+ <li>
+ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
+ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
+ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
+ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
+ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
+ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
+ </li>
+
+ <li>
+ value: Value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.shutdown"></a><strong>Socket:shutdown</strong> (how)</dt>
+<dd>
+
+ Shut down part of a full-duplex connection.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ how: (optional, default: rdwr) ["rdwr", "rd", "wr"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.write"></a><strong>Socket:write</strong> (buffer, offset, length)</dt>
+<dd>
+
+ Send a message on the socket (This is an alias for send).
+ See the sendto description for a detailed description.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.sendto">
+ Socket:sendto
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li><strong>nixio.TLSContext</strong></li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.TLSContext</code></h1>
+
+<p>
+ Transport Layer Security Context Object.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.create">TLSContext:create</a> (socket)</td>
+ <td class="summary">
+ Create a TLS Socket from a socket descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_cert">TLSContext:set_cert</a> (path)</td>
+ <td class="summary">
+ Assign a PEM certificate to this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_ciphers">TLSContext:set_ciphers</a> (cipherlist)</td>
+ <td class="summary">
+ Set the available ciphers for this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_key">TLSContext:set_key</a> (path)</td>
+ <td class="summary">
+ Assign a PEM private key to this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_verify">TLSContext:set_verify</a> (flag1, ...)</td>
+ <td class="summary">
+ Set the verification flags of this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_verify_depth">TLSContext:set_verify_depth</a> (depth)</td>
+ <td class="summary">
+ Set the verification depth of this context.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="TLSContext.create"></a><strong>TLSContext:create</strong> (socket)</dt>
+<dd>
+
+ Create a TLS Socket from a socket descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ socket: Socket Object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+TLSSocket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_cert"></a><strong>TLSContext:set_cert</strong> (path)</dt>
+<dd>
+
+ Assign a PEM certificate to this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Certificate File path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_use_certificate_chain_file().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_ciphers"></a><strong>TLSContext:set_ciphers</strong> (cipherlist)</dt>
+<dd>
+
+ Set the available ciphers for this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ cipherlist: String containing a list of ciphers
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_set_cipher_list().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_key"></a><strong>TLSContext:set_key</strong> (path)</dt>
+<dd>
+
+ Assign a PEM private key to this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Private Key File path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_use_PrivateKey_file().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_verify"></a><strong>TLSContext:set_verify</strong> (flag1, ...)</dt>
+<dd>
+
+ Set the verification flags of this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ flag1: First Flag ["none", "peer", "verify_fail_if_no_peer_cert",
+ "client_once"]
+ </li>
+
+ <li>
+ ...: More Flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_set_verify().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_verify_depth"></a><strong>TLSContext:set_verify_depth</strong> (depth)</dt>
+<dd>
+
+ Set the verification depth of this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ depth: Depth
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_set_verify_depth().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li><strong>nixio.TLSSocket</strong></li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.TLSSocket</code></h1>
+
+<p>
+ TLS Socket Object.
+ TLS Sockets contain the underlying socket and context in the fields
+ "socket" and "context".</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.accept">TLSSocket:accept</a> ()</td>
+ <td class="summary">
+ Wait for a TLS handshake from a client.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.connect">TLSSocket:connect</a> ()</td>
+ <td class="summary">
+ Initiate the TLS handshake as client with the server.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.read ">TLSSocket:read </a> (length)</td>
+ <td class="summary">
+ Receive a message on the socket (This is an alias for recv).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.recv">TLSSocket:recv</a> (length)</td>
+ <td class="summary">
+ Receive a message on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.send">TLSSocket:send</a> (buffer, offset, length)</td>
+ <td class="summary">
+ Send a message to the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.shutdown">TLSSocket:shutdown</a> ()</td>
+ <td class="summary">
+ Shut down the TLS connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.write">TLSSocket:write</a> (buffer, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket (This is an alias for send).</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="TLSSocket.accept"></a><strong>TLSSocket:accept</strong> ()</dt>
+<dd>
+
+ Wait for a TLS handshake from a client.
+
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_accept().
+
+ <li>You have to call either connect or accept before transmitting data.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.connect">
+ TLSSocket:connect
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.connect"></a><strong>TLSSocket:connect</strong> ()</dt>
+<dd>
+
+ Initiate the TLS handshake as client with the server.
+
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_connect().
+
+ <li>You have to call either connect or accept before transmitting data.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.accept">
+ TLSSocket:accept
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.read "></a><strong>TLSSocket:read </strong> (length)</dt>
+<dd>
+
+ Receive a message on the socket (This is an alias for recv).
+ See the recv description for more details.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.recv">
+ TLSSocket:recv
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.recv"></a><strong>TLSSocket:recv</strong> (length)</dt>
+<dd>
+
+ Receive a message on the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_read().
+
+ <li><strong>Warning:</strong> It is not guaranteed that all requested data
+ is read at once.
+ You have to check the return value - the length of the buffer actually read -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>The length of the return buffer is limited by the (compile time)
+ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
+ Any read request greater than that will be safely truncated to this value.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.send"></a><strong>TLSSocket:send</strong> (buffer, offset, length)</dt>
+<dd>
+
+ Send a message to the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_write().
+
+ <li><strong>Warning:</strong> It is not guaranteed that all data
+ in the buffer is written at once.
+ You have to check the return value - the number of bytes actually written -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>Unlike standard Lua indexing the lowest offset and default is 0.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.shutdown"></a><strong>TLSSocket:shutdown</strong> ()</dt>
+<dd>
+
+ Shut down the TLS connection.
+
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_shutdown().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.write"></a><strong>TLSSocket:write</strong> (buffer, offset, length)</dt>
+<dd>
+
+ Send a message on the socket (This is an alias for send).
+ See the send description for a detailed description.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.send">
+ TLSSocket:send
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li><strong>nixio.UnifiedIO</strong></li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.UnifiedIO</code></h1>
+
+<p>
+ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.
+ These functions are added to the object function tables by doing <strong>
+ require "nixio.util"</strong>, can be used on all nixio IO Descriptors and
+ are based on the shared low-level read() and write() functions.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.blocksource">UnifiedIO:blocksource</a> (blocksize, limit)</td>
+ <td class="summary">
+ Create a block-based iterator.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.close">UnifiedIO:close</a> ()</td>
+ <td class="summary">
+ Close the descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.copy">UnifiedIO:copy</a> (fdout, size)</td>
+ <td class="summary">
+ Copy data from the current descriptor to another one.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.copyz">UnifiedIO:copyz</a> (fdout, size)</td>
+ <td class="summary">
+ Copy data from the current descriptor to another one using kernel-space
+ copying if possible.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.is_file">UnifiedIO:is_file</a> ()</td>
+ <td class="summary">
+ Test whether the I/O-Descriptor is a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.is_socket">UnifiedIO:is_socket</a> ()</td>
+ <td class="summary">
+ Test whether the I/O-Descriptor is a socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.is_tls_socket">UnifiedIO:is_tls_socket</a> ()</td>
+ <td class="summary">
+ Test whether the I/O-Descriptor is a TLS socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.linesource">UnifiedIO:linesource</a> (limit)</td>
+ <td class="summary">
+ Create a line-based iterator.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.readall">UnifiedIO:readall</a> (length)</td>
+ <td class="summary">
+ Read a block of data and wait until all data is available.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.sink">UnifiedIO:sink</a> (close_when_done)</td>
+ <td class="summary">
+ Create a sink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.writeall">UnifiedIO:writeall</a> (block)</td>
+ <td class="summary">
+ Write a block of data and wait until all data is written.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="UnifiedIO.blocksource"></a><strong>UnifiedIO:blocksource</strong> (blocksize, limit)</dt>
+<dd>
+
+ Create a block-based iterator.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ blocksize: Advisory blocksize (optional)
+ </li>
+
+ <li>
+ limit: Amount of data to consume (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level read function of the descriptor.
+
+ <li>The blocksize given is only advisory and to be seen as an upper limit,
+ if an underlying read returns less bytes the chunk is nevertheless returned.
+
+ <li>If the limit parameter is ommited, the iterator returns data
+ until an end-of-file, end-of-stream, connection shutdown or similar happens.
+
+ <li>The iterator will not buffer so it is safe to mix with calls to read.
+
+ <li>If the descriptor is non-blocking the iterator may fail with EAGAIN.
+
+ <li>The iterator can be used as an LTN12 source.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Block-based Iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.close"></a><strong>UnifiedIO:close</strong> ()</dt>
+<dd>
+
+ Close the descriptor.
+
+
+
+
+
+<h3>Usage:</h3>
+If the descriptor is a TLS-socket the underlying descriptor is
+ closed without touching the TLS connection.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.copy"></a><strong>UnifiedIO:copy</strong> (fdout, size)</dt>
+<dd>
+
+ Copy data from the current descriptor to another one.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fdout: Target Descriptor
+ </li>
+
+ <li>
+ size: Bytes to copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the blocksource function of the source descriptor
+ and the sink function of the target descriptor.
+
+ <li>If the limit parameter is ommited, data is copied
+ until an end-of-file, end-of-stream, connection shutdown or similar happens.
+
+ <li>If the descriptor is non-blocking the function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>bytes that were successfully written if no error occured
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>bytes that were successfully written even if an error occured
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.copyz"></a><strong>UnifiedIO:copyz</strong> (fdout, size)</dt>
+<dd>
+
+ Copy data from the current descriptor to another one using kernel-space
+ copying if possible.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fdout: Target Descriptor
+ </li>
+
+ <li>
+ size: Bytes to copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the sendfile() syscall to copy the data or the
+ blocksource function of the source descriptor and the sink function
+ of the target descriptor as a fallback mechanism.
+
+ <li>If the limit parameter is ommited, data is copied
+ until an end-of-file, end-of-stream, connection shutdown or similar happens.
+
+ <li>If the descriptor is non-blocking the function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>bytes that were successfully written if no error occured
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>bytes that were successfully written even if an error occured
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.is_file"></a><strong>UnifiedIO:is_file</strong> ()</dt>
+<dd>
+
+ Test whether the I/O-Descriptor is a file.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.is_socket"></a><strong>UnifiedIO:is_socket</strong> ()</dt>
+<dd>
+
+ Test whether the I/O-Descriptor is a socket.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.is_tls_socket"></a><strong>UnifiedIO:is_tls_socket</strong> ()</dt>
+<dd>
+
+ Test whether the I/O-Descriptor is a TLS socket.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.linesource"></a><strong>UnifiedIO:linesource</strong> (limit)</dt>
+<dd>
+
+ Create a line-based iterator.
+ Lines may end with either \n or \r\n, these control chars are not included
+ in the return value.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ limit: Line limit
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level read function of the descriptor.
+
+ <li><strong>Note:</strong> This function uses an internal buffer to read
+ ahead. Do NOT mix calls to read(all) and the returned iterator. If you want
+ to stop reading line-based and want to use the read(all) functions instead
+ you can pass "true" to the iterator which will flush the buffer
+ and return the bufferd data.
+
+ <li>If the limit parameter is ommited, this function uses the nixio
+ buffersize (8192B by default).
+
+ <li>If the descriptor is non-blocking the iterator may fail with EAGAIN.
+
+ <li>The iterator can be used as an LTN12 source.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Line-based Iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.readall"></a><strong>UnifiedIO:readall</strong> (length)</dt>
+<dd>
+
+ Read a block of data and wait until all data is available.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Bytes to read (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level read function of the descriptor.
+
+ <li>If the length parameter is ommited, this function returns all data
+ that can be read before an end-of-file, end-of-stream, connection shutdown
+ or similar happens.
+
+ <li>If the descriptor is non-blocking this function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>data that was successfully read if no error occured
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>data that was successfully read even if an error occured
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.sink"></a><strong>UnifiedIO:sink</strong> (close_when_done)</dt>
+<dd>
+
+ Create a sink.
+ This sink will simply write all data that it receives and optionally
+ close the descriptor afterwards.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ close_when_done: (optional, boolean)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the writeall function of the descriptor.
+
+ <li>If the descriptor is non-blocking the sink may fail with EAGAIN.
+
+ <li>The iterator can be used as an LTN12 sink.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Sink
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.writeall"></a><strong>UnifiedIO:writeall</strong> (block)</dt>
+<dd>
+
+ Write a block of data and wait until all data is written.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ block: Bytes to write
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level write function of the descriptor.
+
+ <li>If the descriptor is non-blocking this function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>bytes that were successfully written if no error occured
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>bytes that were successfully written even if an error occured
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li><strong>nixio.bin</strong></li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.bin</code></h1>
+
+<p>
+ Binary operations and conversion.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#b64decode">b64decode</a> (buffer)</td>
+ <td class="summary">
+ Base64 decode a given buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#b64encode">b64encode</a> (buffer)</td>
+ <td class="summary">
+ Base64 encode a given buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#crc32">crc32</a> (buffer, initial)</td>
+ <td class="summary">
+ Calculate the CRC32 value of a buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#hexlify">hexlify</a> (buffer)</td>
+ <td class="summary">
+ Return a hexadecimal ASCII represantation of the content of a buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#unhexlify">unhexlify</a> (hexvalue)</td>
+ <td class="summary">
+ Return a binary buffer from a hexadecimal ASCII representation.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="b64decode"></a><strong>b64decode</strong> (buffer)</dt>
+<dd>
+
+ Base64 decode a given buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Base 64 Encoded data
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+binary data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="b64encode"></a><strong>b64encode</strong> (buffer)</dt>
+<dd>
+
+ Base64 encode a given buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+base64 encoded buffer
+
+
+
+</dd>
+
+
+
+
+<dt><a name="crc32"></a><strong>crc32</strong> (buffer, initial)</dt>
+<dd>
+
+ Calculate the CRC32 value of a buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer
+ </li>
+
+ <li>
+ initial: Initial CRC32 value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+crc32 value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="hexlify"></a><strong>hexlify</strong> (buffer)</dt>
+<dd>
+
+ Return a hexadecimal ASCII represantation of the content of a buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+representation using characters [0-9a-f]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="unhexlify"></a><strong>unhexlify</strong> (hexvalue)</dt>
+<dd>
+
+ Return a binary buffer from a hexadecimal ASCII representation.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ hexvalue: representation using characters [0-9a-f]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+binary data
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li><strong>nixio.bit</strong></li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.bit</code></h1>
+
+<p>
+ Bitfield operators and mainpulation functions.
+ Can be used as a drop-in replacement for bitlib.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#arshift">arshift</a> (oper, shift)</td>
+ <td class="summary">
+ Arithmetically right shift a number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#band">band</a> (oper1, oper2, ...)</td>
+ <td class="summary">
+ Bitwise AND several numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bnot">bnot</a> (oper)</td>
+ <td class="summary">
+ Invert given number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bor">bor</a> (oper1, oper2, ...)</td>
+ <td class="summary">
+ Bitwise OR several numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bxor">bxor</a> (oper1, oper2, ...)</td>
+ <td class="summary">
+ Bitwise XOR several numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cast">cast</a> (oper)</td>
+ <td class="summary">
+ Cast a number to the bit-operating range.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#check">check</a> (bitfield, flag1, ...)</td>
+ <td class="summary">
+ Checks whether given flags are set in a bitfield.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#div">div</a> (oper1, oper2, ...)</td>
+ <td class="summary">
+ Integer division of 2 or more numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#lshift">lshift</a> (oper, shift)</td>
+ <td class="summary">
+ Left shift a number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#rshift">rshift</a> (oper, shift)</td>
+ <td class="summary">
+ Right shift a number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#set">set</a> (bitfield, flag1, ...)</td>
+ <td class="summary">
+ Sets one or more flags of a bitfield.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#unset">unset</a> (bitfield, flag1, ...)</td>
+ <td class="summary">
+ Unsets one or more flags of a bitfield.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="arshift"></a><strong>arshift</strong> (oper, shift)</dt>
+<dd>
+
+ Arithmetically right shift a number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+ <li>
+ shift: bits to shift
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="band"></a><strong>band</strong> (oper1, oper2, ...)</dt>
+<dd>
+
+ Bitwise AND several numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: First Operand
+ </li>
+
+ <li>
+ oper2: Second Operand
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bnot"></a><strong>bnot</strong> (oper)</dt>
+<dd>
+
+ Invert given number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: Operand
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bor"></a><strong>bor</strong> (oper1, oper2, ...)</dt>
+<dd>
+
+ Bitwise OR several numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: First Operand
+ </li>
+
+ <li>
+ oper2: Second Operand
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bxor"></a><strong>bxor</strong> (oper1, oper2, ...)</dt>
+<dd>
+
+ Bitwise XOR several numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: First Operand
+ </li>
+
+ <li>
+ oper2: Second Operand
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cast"></a><strong>cast</strong> (oper)</dt>
+<dd>
+
+ Cast a number to the bit-operating range.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="check"></a><strong>check</strong> (bitfield, flag1, ...)</dt>
+<dd>
+
+ Checks whether given flags are set in a bitfield.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bitfield: Bitfield
+ </li>
+
+ <li>
+ flag1: First Flag
+ </li>
+
+ <li>
+ ...: More Flags
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true when all flags are set, otherwise false
+
+
+
+</dd>
+
+
+
+
+<dt><a name="div"></a><strong>div</strong> (oper1, oper2, ...)</dt>
+<dd>
+
+ Integer division of 2 or more numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: Operand 1
+ </li>
+
+ <li>
+ oper2: Operand 2
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="lshift"></a><strong>lshift</strong> (oper, shift)</dt>
+<dd>
+
+ Left shift a number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+ <li>
+ shift: bits to shift
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="rshift"></a><strong>rshift</strong> (oper, shift)</dt>
+<dd>
+
+ Right shift a number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+ <li>
+ shift: bits to shift
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="set"></a><strong>set</strong> (bitfield, flag1, ...)</dt>
+<dd>
+
+ Sets one or more flags of a bitfield.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bitfield: Bitfield
+ </li>
+
+ <li>
+ flag1: First Flag
+ </li>
+
+ <li>
+ ...: More Flags
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+altered bitfield
+
+
+
+</dd>
+
+
+
+
+<dt><a name="unset"></a><strong>unset</strong> (bitfield, flag1, ...)</dt>
+<dd>
+
+ Unsets one or more flags of a bitfield.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bitfield: Bitfield
+ </li>
+
+ <li>
+ flag1: First Flag
+ </li>
+
+ <li>
+ ...: More Flags
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+altered bitfield
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li><strong>nixio.crypto</strong></li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.crypto</code></h1>
+
+<p>
+ Cryptographical library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.crypto.hash">hash</a> (algo)</td>
+ <td class="summary">
+ Create a hash object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.crypto.hmac">hmac</a> (algo, key)</td>
+ <td class="summary">
+ Create a HMAC object.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="nixio.crypto.hash"></a><strong>hash</strong> (algo)</dt>
+<dd>
+
+ Create a hash object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ algo: Algorithm ["sha1", "md5"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+CryptoHash Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.crypto.hmac"></a><strong>hmac</strong> (algo, key)</dt>
+<dd>
+
+ Create a HMAC object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ algo: Algorithm ["sha1", "md5"]
+ </li>
+
+ <li>
+ key: HMAC-Key
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+CryptoHash Object
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li><strong>nixio.fs</strong></li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.fs</code></h1>
+
+<p>
+ Low-level and high-level filesystem manipulation library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.access">access</a> (path, mode1, ...)</td>
+ <td class="summary">
+ Check user's permission on a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.basename">basename</a> (path)</td>
+ <td class="summary">
+ Strip the directory part from a path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.chmod">chmod</a> (path, mode)</td>
+ <td class="summary">
+ Change the file mode.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.chown">chown</a> (path, user, group)</td>
+ <td class="summary">
+ (POSIX) Change owner and group of a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.copy">copy</a> (src, dest)</td>
+ <td class="summary">
+ Copy a file, directory or symlink non-recursively preserving file mode,
+ timestamps, owner and group.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.copyr">copyr</a> (src, dest)</td>
+ <td class="summary">
+ Copy a file, directory or symlink recursively preserving file mode,
+ timestamps, owner and group.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.datacopy">datacopy</a> (src, dest, limit)</td>
+ <td class="summary">
+ Copy data between files.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.dir">dir</a> (path)</td>
+ <td class="summary">
+ Iterate over the entries of a directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.dirname">dirname</a> (path)</td>
+ <td class="summary">
+ Strip the base from a path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.glob">glob</a> (pattern)</td>
+ <td class="summary">
+ (POSIX) Find pathnames matching a pattern.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.lchown">lchown</a> (path, user, group)</td>
+ <td class="summary">
+ (POSIX) Change owner and group of a file and do not resolve
+ if target is a symlink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.link">link</a> (oldpath, newpath)</td>
+ <td class="summary">
+ Create a hard link.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.lstat">lstat</a> (path, field)</td>
+ <td class="summary">
+ Get file status and attributes and do not resolve if target is a symlink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mkdir">mkdir</a> (path, mode)</td>
+ <td class="summary">
+ Create a new directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mkdirr">mkdirr</a> (dest, mode)</td>
+ <td class="summary">
+ Create a directory and all needed parent directories recursively.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mkfifo">mkfifo</a> (path, mode)</td>
+ <td class="summary">
+ (POSIX) Create a FIFO (named pipe).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.move">move</a> (src, dest)</td>
+ <td class="summary">
+ Rename a file, directory or symlink non-recursively across filesystems.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mover">mover</a> (src, dest)</td>
+ <td class="summary">
+ Rename a file, directory or symlink recursively across filesystems.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.readfile">readfile</a> (path, limit)</td>
+ <td class="summary">
+ Read the contents of a file into a buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.readlink">readlink</a> (path)</td>
+ <td class="summary">
+ (POSIX) Read the target of a symbolic link.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.realpath">realpath</a> (path)</td>
+ <td class="summary">
+ Return the cannonicalized absolute pathname.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.remove">remove</a> (path)</td>
+ <td class="summary">
+ Remove a file or directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.rename">rename</a> (src, dest)</td>
+ <td class="summary">
+ Renames a file or directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.rmdir">rmdir</a> (path)</td>
+ <td class="summary">
+ Remove an empty directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.stat">stat</a> (path, field)</td>
+ <td class="summary">
+ Get file status and attributes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.statvfs">statvfs</a> (path)</td>
+ <td class="summary">
+ (POSIX) Get filesystem statistics.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.symlink">symlink</a> (oldpath, newpath)</td>
+ <td class="summary">
+ (POSIX) Create a symbolic link.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.unlink">unlink</a> (path)</td>
+ <td class="summary">
+ Delete a name and - if no links are left - the associated file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.utimes">utimes</a> (path, actime, mtime)</td>
+ <td class="summary">
+ Change file last access and last modification time.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.writefile">writefile</a> (path, data)</td>
+ <td class="summary">
+ Write a buffer into a file truncating the file first.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="nixio.fs.access"></a><strong>access</strong> (path, mode1, ...)</dt>
+<dd>
+
+ Check user's permission on a file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode1: First Mode to check ["f", "r", "w", "x"]
+ </li>
+
+ <li>
+ ...: More Modes to check [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.basename"></a><strong>basename</strong> (path)</dt>
+<dd>
+
+ Strip the directory part from a path.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function cannot fail and will never return nil.
+
+
+
+<h3>Return value:</h3>
+basename
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.chmod"></a><strong>chmod</strong> (path, mode)</dt>
+<dd>
+
+ Change the file mode.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode: File mode
+ [decimal mode number, "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>Windows only supports setting the write-protection through the
+ "Writable to others" bit.
+
+ <li><strong>Notice:</strong> The mode-flag for the functions
+ open, mkdir, mkfifo are affected by the umask.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.chown"></a><strong>chown</strong> (path, user, group)</dt>
+<dd>
+
+ (POSIX) Change owner and group of a file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ user: User ID or Username (optional)
+ </li>
+
+ <li>
+ group: Group ID or Groupname (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.copy"></a><strong>copy</strong> (src, dest)</dt>
+<dd>
+
+ Copy a file, directory or symlink non-recursively preserving file mode,
+ timestamps, owner and group.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.copyr"></a><strong>copyr</strong> (src, dest)</dt>
+<dd>
+
+ Copy a file, directory or symlink recursively preserving file mode,
+ timestamps, owner and group.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.datacopy"></a><strong>datacopy</strong> (src, dest, limit)</dt>
+<dd>
+
+ Copy data between files.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source file path
+ </li>
+
+ <li>
+ dest: Destination file path
+ </li>
+
+ <li>
+ limit: Maximum bytes to copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.dir"></a><strong>dir</strong> (path)</dt>
+<dd>
+
+ Iterate over the entries of a directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The special entries "." and ".." are omitted.
+
+
+
+<h3>Return value:</h3>
+directory iterator returning one entry per call
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.dirname"></a><strong>dirname</strong> (path)</dt>
+<dd>
+
+ Strip the base from a path.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function cannot fail and will never return nil.
+
+
+
+<h3>Return value:</h3>
+dirname
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.glob"></a><strong>glob</strong> (pattern)</dt>
+<dd>
+
+ (POSIX) Find pathnames matching a pattern.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pattern: Pattern
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>path iterator
+
+ <li>number of matches
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.lchown"></a><strong>lchown</strong> (path, user, group)</dt>
+<dd>
+
+ (POSIX) Change owner and group of a file and do not resolve
+ if target is a symlink.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ user: User ID or Username (optional)
+ </li>
+
+ <li>
+ group: Group ID or Groupname (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.link"></a><strong>link</strong> (oldpath, newpath)</dt>
+<dd>
+
+ Create a hard link.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oldpath: Path
+ </li>
+
+ <li>
+ newpath: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls link() on POSIX and CreateHardLink() on Windows.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.lstat"></a><strong>lstat</strong> (path, field)</dt>
+<dd>
+
+ Get file status and attributes and do not resolve if target is a symlink.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ field: Only return a specific field, not the whole table (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing attributes (see stat for a detailed description)
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.stat">
+ stat
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mkdir"></a><strong>mkdir</strong> (path, mode)</dt>
+<dd>
+
+ Create a new directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode: File mode (optional, see chmod and umask)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.chmod">
+ chmod
+ </a>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mkdirr"></a><strong>mkdirr</strong> (dest, mode)</dt>
+<dd>
+
+ Create a directory and all needed parent directories recursively.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ dest: Destination path
+ </li>
+
+ <li>
+ mode: File mode (optional, see chmod and umask)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.chmod">
+ chmod
+ </a>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mkfifo"></a><strong>mkfifo</strong> (path, mode)</dt>
+<dd>
+
+ (POSIX) Create a FIFO (named pipe).
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode: File mode (optional, see chmod and umask)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.chmod">
+ chmod
+ </a>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.move"></a><strong>move</strong> (src, dest)</dt>
+<dd>
+
+ Rename a file, directory or symlink non-recursively across filesystems.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mover"></a><strong>mover</strong> (src, dest)</dt>
+<dd>
+
+ Rename a file, directory or symlink recursively across filesystems.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.readfile"></a><strong>readfile</strong> (path, limit)</dt>
+<dd>
+
+ Read the contents of a file into a buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ limit: Maximum bytes to read (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+file contents
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.readlink"></a><strong>readlink</strong> (path)</dt>
+<dd>
+
+ (POSIX) Read the target of a symbolic link.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+target path
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.realpath"></a><strong>realpath</strong> (path)</dt>
+<dd>
+
+ Return the cannonicalized absolute pathname.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+absolute path
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.remove"></a><strong>remove</strong> (path)</dt>
+<dd>
+
+ Remove a file or directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.rename"></a><strong>rename</strong> (src, dest)</dt>
+<dd>
+
+ Renames a file or directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+It is normally not possible to rename files accross fileystems.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.rmdir"></a><strong>rmdir</strong> (path)</dt>
+<dd>
+
+ Remove an empty directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.stat"></a><strong>stat</strong> (path, field)</dt>
+<dd>
+
+ Get file status and attributes.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ field: Only return a specific field, not the whole table (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>atime = Last access timestamp</li>
+ <li>blksize = Blocksize (POSIX only)</li>
+ <li>blocks = Blocks used (POSIX only)</li>
+ <li>ctime = Creation timestamp</li>
+ <li>dev = Device ID</li>
+ <li>gid = Group ID</li>
+ <li>ino = Inode</li>
+ <li>modedec = Mode converted into a decimal number</li>
+ <li>modestr = Mode as string as returned by <code>ls -l</code></li>
+ <li>mtime = Last modification timestamp</li>
+ <li>nlink = Number of links</li>
+ <li>rdev = Device ID (if special file)</li>
+ <li>size = Size in bytes</li>
+ <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
+ <li>uid = User ID</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.statvfs"></a><strong>statvfs</strong> (path)</dt>
+<dd>
+
+ (POSIX) Get filesystem statistics.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path to any file within the filesystem.
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>bavail = available blocks</li>
+ <li>bfree = free blocks</li>
+ <li>blocks = number of fragments</li>
+ <li>frsize = fragment size</li>
+ <li>favail = available inodes</li>
+ <li>ffree = free inodes</li>
+ <li>files = inodes</li>
+ <li>flag = flags</li>
+ <li>fsid = filesystem ID</li>
+ <li>namemax = maximum filename length</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.symlink"></a><strong>symlink</strong> (oldpath, newpath)</dt>
+<dd>
+
+ (POSIX) Create a symbolic link.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oldpath: Path
+ </li>
+
+ <li>
+ newpath: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.unlink"></a><strong>unlink</strong> (path)</dt>
+<dd>
+
+ Delete a name and - if no links are left - the associated file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.utimes"></a><strong>utimes</strong> (path, actime, mtime)</dt>
+<dd>
+
+ Change file last access and last modification time.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ actime: Last access timestamp (optional, default: current time)
+ </li>
+
+ <li>
+ mtime: Last modification timestamp (optional, default: actime)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.writefile"></a><strong>writefile</strong> (path, data)</dt>
+<dd>
+
+ Write a buffer into a file truncating the file first.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ data: Data to write
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li><strong>nixio</strong></li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio</code></h1>
+
+<p>
+ General POSIX IO library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.bind">bind</a> (host, port, family, socktype)</td>
+ <td class="summary">
+ Create a new socket and bind it to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.chdir">chdir</a> (path)</td>
+ <td class="summary">
+ Change the working directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.closelog">closelog</a> ()</td>
+ <td class="summary">
+ (POSIX) Close the connection to the system logger.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.connect">connect</a> (host, port, family, socktype)</td>
+ <td class="summary">
+ Create a new socket and connect to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.crypt">crypt</a> (key, salt)</td>
+ <td class="summary">
+ (POSIX) Encrypt a user password.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.dup">dup</a> (oldfd, newfd)</td>
+ <td class="summary">
+ Duplicate a file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.errno">errno</a> ()</td>
+ <td class="summary">
+ Get the last system error code.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.exec">exec</a> (executable, ...)</td>
+ <td class="summary">
+ Execute a file to replace the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.exece">exece</a> (executable, arguments, environment)</td>
+ <td class="summary">
+ Execute a file with a custom environment to replace the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.execp">execp</a> (executable, ...)</td>
+ <td class="summary">
+ Invoke the shell and execute a file to replace the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fork">fork</a> ()</td>
+ <td class="summary">
+ (POSIX) Clone the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getaddrinfo">getaddrinfo</a> (host, family, service)</td>
+ <td class="summary">
+ Look up a hostname and service via DNS.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getcwd">getcwd</a> ()</td>
+ <td class="summary">
+ Get the current working directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getenv">getenv</a> (variable)</td>
+ <td class="summary">
+ Get the current environment table or a specific environment variable.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getgid">getgid</a> ()</td>
+ <td class="summary">
+ (POSIX) Get the group id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getgr">getgr</a> (group)</td>
+ <td class="summary">
+ (POSIX) Get all or a specific user group.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getifaddrs">getifaddrs</a> ()</td>
+ <td class="summary">
+ (Linux, BSD) Get a list of available network interfaces and their addresses.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getnameinfo">getnameinfo</a> (ipaddr)</td>
+ <td class="summary">
+ Reverse look up an IP-Address via DNS.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getpid">getpid</a> ()</td>
+ <td class="summary">
+ Get the ID of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getppid">getppid</a> ()</td>
+ <td class="summary">
+ (POSIX) Get the parent process id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getproto">getproto</a> (proto)</td>
+ <td class="summary">
+ Get all or a specifc proto entry.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getprotobyname">getprotobyname</a> (name)</td>
+ <td class="summary">
+ Get protocol entry by name.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getprotobynumber">getprotobynumber</a> (proto)</td>
+ <td class="summary">
+ Get protocol entry by number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getpw">getpw</a> (user)</td>
+ <td class="summary">
+ (POSIX) Get all or a specific user account.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getsp">getsp</a> (user)</td>
+ <td class="summary">
+ (Linux, Solaris) Get all or a specific shadow password entry.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getuid">getuid</a> ()</td>
+ <td class="summary">
+ (POSIX) Get the user id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.kill">kill</a> (target, signal)</td>
+ <td class="summary">
+ (POSIX) Send a signal to one or more processes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.nanosleep">nanosleep</a> (seconds, nanoseconds)</td>
+ <td class="summary">
+ Sleep for a specified amount of time.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.nice">nice</a> (nice)</td>
+ <td class="summary">
+ (POSIX) Change priority of current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.open">open</a> (path, flags, mode)</td>
+ <td class="summary">
+ Open a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.open_flags">open_flags</a> (flag1, ...)</td>
+ <td class="summary">
+ Generate flags for a call to open().</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.openlog">openlog</a> (ident, flag1, ...)</td>
+ <td class="summary">
+ (POSIX) Open a connection to the system logger.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.pipe">pipe</a> ()</td>
+ <td class="summary">
+ Create a pipe.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.poll">poll</a> (fds, timeout)</td>
+ <td class="summary">
+ Wait for some event on a file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.poll_flags">poll_flags</a> (mode1, ...)</td>
+ <td class="summary">
+ Generate events-bitfield or parse revents-bitfield for poll.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.sendfile">sendfile</a> (socket, file, length)</td>
+ <td class="summary">
+ (POSIX) Send data from a file to a socket in kernel-space.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setenv">setenv</a> (variable, value)</td>
+ <td class="summary">
+ Set or unset a environment variable.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setgid">setgid</a> (gid)</td>
+ <td class="summary">
+ (POSIX) Set the group id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setlogmask">setlogmask</a> (priority)</td>
+ <td class="summary">
+ (POSIX) Set the logmask of the system logger for current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setsid">setsid</a> ()</td>
+ <td class="summary">
+ (POSIX) Create a new session and set the process group ID.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setuid">setuid</a> (gid)</td>
+ <td class="summary">
+ (POSIX) Set the user id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.signal">signal</a> (signal, handler)</td>
+ <td class="summary">
+ Ignore or use set the default handler for a signal.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.socket">socket</a> (domain, type)</td>
+ <td class="summary">
+ Create a new socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.splice">splice</a> (fdin, fdout, length, flags)</td>
+ <td class="summary">
+ (Linux) Send data from / to a pipe in kernel-space.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.splice_flags">splice_flags</a> (flag1, ...)</td>
+ <td class="summary">
+ (Linux) Generate a flag bitfield for a call to splice.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.strerror">strerror</a> (errno)</td>
+ <td class="summary">
+ Get the error message for the corresponding error code.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.sysinfo">sysinfo</a> ()</td>
+ <td class="summary">
+ (Linux) Get overall system statistics.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.syslog">syslog</a> (priority)</td>
+ <td class="summary">
+ (POSIX) Write a message to the system logger.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.times">times</a> ()</td>
+ <td class="summary">
+ (POSIX) Get process times.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.tls">tls</a> (mode)</td>
+ <td class="summary">
+ Create a new TLS context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.umask">umask</a> (mask)</td>
+ <td class="summary">
+ Sets the file mode creation mask.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.uname">uname</a> ()</td>
+ <td class="summary">
+ (POSIX) Get information about current system and kernel.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.waitpid">waitpid</a> (pid, flag1, ...)</td>
+ <td class="summary">
+ (POSIX) Wait for a process to change state.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="nixio.bind"></a><strong>bind</strong> (host, port, family, socktype)</dt>
+<dd>
+
+ Create a new socket and bind it to a network address.
+ This function is a shortcut for calling nixio.socket and then bind()
+ on the socket object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Hostname or IP-Address (optional, default: all addresses)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+ <li>
+ family: Address family [<strong>"any"</strong>, "inet", "inet6"]
+ </li>
+
+ <li>
+ socktype: Socket Type [<strong>"stream"</strong>, "dgram"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This functions calls getaddrinfo(), socket(),
+ setsockopt() and bind() but NOT listen().
+
+ <li>The <em>reuseaddr</em>-option is automatically set before binding.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Socket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.chdir"></a><strong>chdir</strong> (path)</dt>
+<dd>
+
+ Change the working directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: New working directory
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.closelog"></a><strong>closelog</strong> ()</dt>
+<dd>
+
+ (POSIX) Close the connection to the system logger.
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.connect"></a><strong>connect</strong> (host, port, family, socktype)</dt>
+<dd>
+
+ Create a new socket and connect to a network address.
+ This function is a shortcut for calling nixio.socket and then connect()
+ on the socket object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Hostname or IP-Address (optional, default: localhost)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+ <li>
+ family: Address family [<strong>"any"</strong>, "inet", "inet6"]
+ </li>
+
+ <li>
+ socktype: Socket Type [<strong>"stream"</strong>, "dgram"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This functions calls getaddrinfo(), socket() and connect().
+
+
+
+<h3>Return value:</h3>
+Socket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.crypt"></a><strong>crypt</strong> (key, salt)</dt>
+<dd>
+
+ (POSIX) Encrypt a user password.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Key
+ </li>
+
+ <li>
+ salt: Salt
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+password hash
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.dup"></a><strong>dup</strong> (oldfd, newfd)</dt>
+<dd>
+
+ Duplicate a file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oldfd: Old descriptor [File Object, Socket Object (POSIX only)]
+ </li>
+
+ <li>
+ newfd: New descriptor to serve as copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This funcation calls dup2() if <em>newfd</em> is set, otherwise dup().
+
+
+
+<h3>Return value:</h3>
+File Object of new descriptor
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.errno"></a><strong>errno</strong> ()</dt>
+<dd>
+
+ Get the last system error code.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Error code
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.exec"></a><strong>exec</strong> (executable, ...)</dt>
+<dd>
+
+ Execute a file to replace the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ executable: Executable
+ </li>
+
+ <li>
+ ...: Parameters
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>The name of the executable is automatically passed as argv[0]
+
+ <li>This function does not return on success.
+
+</ul>
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.exece"></a><strong>exece</strong> (executable, arguments, environment)</dt>
+<dd>
+
+ Execute a file with a custom environment to replace the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ executable: Executable
+ </li>
+
+ <li>
+ arguments: Argument Table
+ </li>
+
+ <li>
+ environment: Environment Table (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>The name of the executable is automatically passed as argv[0]
+
+ <li>This function does not return on success.
+
+</ul>
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.execp"></a><strong>execp</strong> (executable, ...)</dt>
+<dd>
+
+ Invoke the shell and execute a file to replace the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ executable: Executable
+ </li>
+
+ <li>
+ ...: Parameters
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>The name of the executable is automatically passed as argv[0]
+
+ <li>This function does not return on success.
+
+</ul>
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fork"></a><strong>fork</strong> ()</dt>
+<dd>
+
+ (POSIX) Clone the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+the child process id for the parent process, 0 for the child process
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getaddrinfo"></a><strong>getaddrinfo</strong> (host, family, service)</dt>
+<dd>
+
+ Look up a hostname and service via DNS.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: hostname to lookup (optional)
+ </li>
+
+ <li>
+ family: address family [<strong>"any"</strong>, "inet", "inet6"]
+ </li>
+
+ <li>
+ service: service name or port (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing one or more tables containing: <ul>
+ <li>family = ["inet", "inet6"]</li>
+ <li>socktype = ["stream", "dgram", "raw"]</li>
+ <li>address = Resolved IP-Address</li>
+ <li>port = Resolved Port (if service was given)</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getcwd"></a><strong>getcwd</strong> ()</dt>
+<dd>
+
+ Get the current working directory.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+workign directory
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getenv"></a><strong>getenv</strong> (variable)</dt>
+<dd>
+
+ Get the current environment table or a specific environment variable.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ variable: Variable (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+environment table or single environment variable
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getgid"></a><strong>getgid</strong> ()</dt>
+<dd>
+
+ (POSIX) Get the group id of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+process group id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getgr"></a><strong>getgr</strong> (group)</dt>
+<dd>
+
+ (POSIX) Get all or a specific user group.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ group: Group ID or groupname (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>name = Group Name</li>
+ <li>gid = Group ID</li>
+ <li>passwd = Password</li>
+ <li>mem = {Member #1, Member #2, ...}</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getifaddrs"></a><strong>getifaddrs</strong> ()</dt>
+<dd>
+
+ (Linux, BSD) Get a list of available network interfaces and their addresses.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing one or more tables containing: <ul>
+ <li>name = Interface Name</li>
+ <li>family = ["inet", "inet6", "packet"]</li>
+ <li>addr = Interface Address (IPv4, IPv6, MAC, ...)</li>
+ <li>broadaddr = Broadcast Address</li>
+ <li>dstaddr = Destination Address (Point-to-Point)</li>
+ <li>netmask = Netmask (if available)</li>
+ <li>prefix = Prefix (if available)</li>
+ <li>flags = Table of interface flags (up, multicast, loopback, ...)</li>
+ <li>data = Statistics (Linux, "packet"-family)</li>
+ <li>hatype = Hardware Type Identifier (Linix, "packet"-family)</li>
+ <li>ifindex = Interface Index (Linux, "packet"-family)</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getnameinfo"></a><strong>getnameinfo</strong> (ipaddr)</dt>
+<dd>
+
+ Reverse look up an IP-Address via DNS.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ipaddr: IPv4 or IPv6-Address
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+FQDN
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getpid"></a><strong>getpid</strong> ()</dt>
+<dd>
+
+ Get the ID of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+process id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getppid"></a><strong>getppid</strong> ()</dt>
+<dd>
+
+ (POSIX) Get the parent process id of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+parent process id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getproto"></a><strong>getproto</strong> (proto)</dt>
+<dd>
+
+ Get all or a specifc proto entry.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ proto: protocol number or name to lookup (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table (or if no parameter is given, a table of tables)
+ containing the following fields: <ul>
+ <li>name = Protocol Name</li>
+ <li>proto = Protocol Number</li>
+ <li>aliases = Table of alias names</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getprotobyname"></a><strong>getprotobyname</strong> (name)</dt>
+<dd>
+
+ Get protocol entry by name.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: protocol name to lookup
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function returns nil if the given protocol is unknown.
+
+
+
+<h3>Return value:</h3>
+Table containing the following fields: <ul>
+ <li>name = Protocol Name</li>
+ <li>proto = Protocol Number</li>
+ <li>aliases = Table of alias names</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getprotobynumber"></a><strong>getprotobynumber</strong> (proto)</dt>
+<dd>
+
+ Get protocol entry by number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ proto: protocol number to lookup
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function returns nil if the given protocol is unknown.
+
+
+
+<h3>Return value:</h3>
+Table containing the following fields: <ul>
+ <li>name = Protocol Name</li>
+ <li>proto = Protocol Number</li>
+ <li>aliases = Table of alias names</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getpw"></a><strong>getpw</strong> (user)</dt>
+<dd>
+
+ (POSIX) Get all or a specific user account.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ user: User ID or username (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>name = Name</li>
+ <li>uid = ID</li>
+ <li>gid = Group ID</li>
+ <li>passwd = Password</li>
+ <li>dir = Home directory</li>
+ <li>gecos = Information</li>
+ <li>shell = Shell</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getsp"></a><strong>getsp</strong> (user)</dt>
+<dd>
+
+ (Linux, Solaris) Get all or a specific shadow password entry.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ user: username (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>namp = Name</li>
+ <li>expire = Expiration Date</li>
+ <li>flag = Flags</li>
+ <li>inact = Inactivity Date</li>
+ <li>lstchg = Last change</li>
+ <li>max = Maximum</li>
+ <li>min = Minimum</li>
+ <li>warn = Warning</li>
+ <li>pwdp = Password Hash</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getuid"></a><strong>getuid</strong> ()</dt>
+<dd>
+
+ (POSIX) Get the user id of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+process user id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.kill"></a><strong>kill</strong> (target, signal)</dt>
+<dd>
+
+ (POSIX) Send a signal to one or more processes.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ target: Target process of process group.
+ </li>
+
+ <li>
+ signal: Signal to send
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.nanosleep"></a><strong>nanosleep</strong> (seconds, nanoseconds)</dt>
+<dd>
+
+ Sleep for a specified amount of time.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ seconds: Seconds to wait (optional)
+ </li>
+
+ <li>
+ nanoseconds: Nanoseconds to wait (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>Not all systems support nanosecond precision but you can expect
+ to have at least maillisecond precision.
+
+ <li>This function is not signal-protected and may fail with EINTR.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.nice"></a><strong>nice</strong> (nice)</dt>
+<dd>
+
+ (POSIX) Change priority of current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ nice: Nice Value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.open"></a><strong>open</strong> (path, flags, mode)</dt>
+<dd>
+
+ Open a file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Filesystem path to open
+ </li>
+
+ <li>
+ flags: Flag string or number (see open_flags).
+ [<strong>"r"</strong>, "r+", "w", "w+", "a", "a+"]
+ </li>
+
+ <li>
+ mode: File mode for newly created files (see chmod, umask).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+Although this function also supports the traditional fopen()
+ file flags it does not create a file stream but uses the open() syscall.
+
+
+
+<h3>Return value:</h3>
+File Object
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.umask">
+ umask
+ </a>
+
+ <li><a href="#nixio.open_flags">
+ open_flags
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.open_flags"></a><strong>open_flags</strong> (flag1, ...)</dt>
+<dd>
+
+ Generate flags for a call to open().
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ flag1: First Flag ["append", "creat", "excl", "nonblock", "ndelay",
+ "sync", "trunc", "rdonly", "wronly", "rdwr"]
+ </li>
+
+ <li>
+ ...: More Flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function cannot fail and will never return nil.
+
+ <li>The "nonblock" and "ndelay" flags are aliases.
+
+ <li>The "nonblock", "ndelay" and "sync" flags are no-ops on Windows.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+flag to be used as second paramter to open
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.openlog"></a><strong>openlog</strong> (ident, flag1, ...)</dt>
+<dd>
+
+ (POSIX) Open a connection to the system logger.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ident: Identifier
+ </li>
+
+ <li>
+ flag1: Flag 1 ["cons", "nowait", "pid", "perror", "ndelay", "odelay"]
+ </li>
+
+ <li>
+ ...: More flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.pipe"></a><strong>pipe</strong> ()</dt>
+<dd>
+
+ Create a pipe.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>File Object of the read end
+
+ <li>File Object of the write end
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.poll"></a><strong>poll</strong> (fds, timeout)</dt>
+<dd>
+
+ Wait for some event on a file descriptor.
+ poll() sets the revents-field of the tables provided by fds to a bitfield
+ indicating the events that occured.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fds: Table containing one or more tables containing <ul>
+ <li> fd = I/O Descriptor [Socket Object, File Object (POSIX)]</li>
+ <li> events = events to wait for (bitfield generated with poll_flags)</li>
+ </ul>
+ </li>
+
+ <li>
+ timeout: Timeout in milliseconds
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function works in-place on the provided table and only
+ writes the revents field, you can use other fields on your demand.
+
+ <li>All metamethods on the tables provided as fds are ignored.
+
+ <li>The revents-fields are not reset when the call times out.
+ You have to check the first return value to be 0 to handle this case.
+
+ <li>If you want to wait on a TLS-Socket you have to use the underlying
+ socket instead.
+
+ <li>On Windows poll is emulated through select(), can only be used
+ on socket descriptors and cannot take more than 64 descriptors per call.
+
+ <li>This function is not signal-protected and may fail with EINTR.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>number of ready IO descriptors
+
+ <li>the fds-table with revents-fields set
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.poll_flags">
+ poll_flags
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.poll_flags"></a><strong>poll_flags</strong> (mode1, ...)</dt>
+<dd>
+
+ Generate events-bitfield or parse revents-bitfield for poll.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mode1: revents-Flag bitfield returned from poll to parse OR
+ ["in", "out", "err", "pri" (POSIX), "hup" (POSIX), "nval" (POSIX)]
+ </li>
+
+ <li>
+ ...: More mode strings for generating the flag [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+table with boolean fields reflecting the mode parameter
+ <strong>OR</strong> bitfield to use for the events-Flag field
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.poll">
+ poll
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.sendfile"></a><strong>sendfile</strong> (socket, file, length)</dt>
+<dd>
+
+ (POSIX) Send data from a file to a socket in kernel-space.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ socket: Socket Object
+ </li>
+
+ <li>
+ file: File Object
+ </li>
+
+ <li>
+ length: Amount of data to send (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+bytes sent
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setenv"></a><strong>setenv</strong> (variable, value)</dt>
+<dd>
+
+ Set or unset a environment variable.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ variable: Variable
+ </li>
+
+ <li>
+ value: Value (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The environment variable will be unset if value is ommited.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setgid"></a><strong>setgid</strong> (gid)</dt>
+<dd>
+
+ (POSIX) Set the group id of the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ gid: New Group ID
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setlogmask"></a><strong>setlogmask</strong> (priority)</dt>
+<dd>
+
+ (POSIX) Set the logmask of the system logger for current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ priority: Priority ["emerg", "alert", "crit", "err", "warning",
+ "notice", "info", "debug"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setsid"></a><strong>setsid</strong> ()</dt>
+<dd>
+
+ (POSIX) Create a new session and set the process group ID.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+session id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setuid"></a><strong>setuid</strong> (gid)</dt>
+<dd>
+
+ (POSIX) Set the user id of the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ gid: New User ID
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.signal"></a><strong>signal</strong> (signal, handler)</dt>
+<dd>
+
+ Ignore or use set the default handler for a signal.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ signal: Signal
+ </li>
+
+ <li>
+ handler: ["ign", "dfl"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.socket"></a><strong>socket</strong> (domain, type)</dt>
+<dd>
+
+ Create a new socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ domain: Domain ["inet", "inet6", "unix"]
+ </li>
+
+ <li>
+ type: Type ["stream", "dgram", "raw"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Socket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.splice"></a><strong>splice</strong> (fdin, fdout, length, flags)</dt>
+<dd>
+
+ (Linux) Send data from / to a pipe in kernel-space.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fdin: Input I/O descriptor
+ </li>
+
+ <li>
+ fdout: Output I/O descriptor
+ </li>
+
+ <li>
+ length: Amount of data to send (in Bytes).
+ </li>
+
+ <li>
+ flags: (optional, bitfield generated by splice_flags)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+bytes sent
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.splice_flags">
+ splice_flags
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.splice_flags"></a><strong>splice_flags</strong> (flag1, ...)</dt>
+<dd>
+
+ (Linux) Generate a flag bitfield for a call to splice.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ flag1: First Flag ["move", "nonblock", "more"]
+ </li>
+
+ <li>
+ ...: More flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Flag bitfield
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.splice">
+ splice
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.strerror"></a><strong>strerror</strong> (errno)</dt>
+<dd>
+
+ Get the error message for the corresponding error code.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ errno: System error code
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Error message
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.sysinfo"></a><strong>sysinfo</strong> ()</dt>
+<dd>
+
+ (Linux) Get overall system statistics.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>uptime = system uptime in seconds</li>
+ <li>loads = {loadavg1, loadavg5, loadavg15}</li>
+ <li>totalram = total RAM</li>
+ <li>freeram = free RAM</li>
+ <li>sharedram = shared RAM</li>
+ <li>bufferram = buffered RAM</li>
+ <li>totalswap = total SWAP</li>
+ <li>freeswap = free SWAP</li>
+ <li>procs = number of running processes</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.syslog"></a><strong>syslog</strong> (priority)</dt>
+<dd>
+
+ (POSIX) Write a message to the system logger.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ priority: Priority ["emerg", "alert", "crit", "err", "warning",
+ "notice", "info", "debug"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.times"></a><strong>times</strong> ()</dt>
+<dd>
+
+ (POSIX) Get process times.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>utime = user time</li>
+ <li>utime = system time</li>
+ <li>cutime = children user time</li>
+ <li>cstime = children system time</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.tls"></a><strong>tls</strong> (mode)</dt>
+<dd>
+
+ Create a new TLS context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mode: TLS-Mode ["client", "server"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+TLSContext Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.umask"></a><strong>umask</strong> (mask)</dt>
+<dd>
+
+ Sets the file mode creation mask.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: New creation mask (see chmod for format specifications)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>the old umask as decimal mode number
+
+ <li>the old umask as mode string
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.uname"></a><strong>uname</strong> ()</dt>
+<dd>
+
+ (POSIX) Get information about current system and kernel.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>sysname = operating system</li>
+ <li>nodename = network name (usually hostname)</li>
+ <li>release = OS release</li>
+ <li>version = OS version</li>
+ <li>machine = hardware identifier</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.waitpid"></a><strong>waitpid</strong> (pid, flag1, ...)</dt>
+<dd>
+
+ (POSIX) Wait for a process to change state.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pid: Process ID (optional, default: any childprocess)
+ </li>
+
+ <li>
+ flag1: Flag (optional) ["nohang", "untraced", "continued"]
+ </li>
+
+ <li>
+ ...: More Flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+If the "nohang" is given this function becomes non-blocking.
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>process id of child or 0 if no child has changed state
+
+ <li>["exited", "signaled", "stopped"]
+
+ <li>[exit code, terminate signal, stop signal]
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
--- /dev/null
+# General
+Translations are saved in the folder po/. You find the reference in po/templates/<package>.pot. The actual translation files can be found at po/<lang>/<package>.po .
+
+In order to use the commands below you need to have the _gettext'' utilities (''msgcat'', ''msgfmt'', ''msgmerge_) installed on your system.
+
+# Rebuild po files
+If you want to rebuild the translations after you made changes to a package this is an easy way:
+
+
+ ./build/i18n-scan.pl applications/[package] > po/templates/[application].pot
+ ./build/i18n-update.pl po [application].po
+
+*Note:* Some packages share translation files, in this case you need to scan through all their folders. The first command from above should then be:
+
+
+ ./build/i18n-scan.pl applications/[package-1] applications/[package-2] applications/[package-n] > po/templates/[application].pot
+
containing a prefix size between `0` and `32` bit.
Overrides mask embedded in the first argument if specified. (optional)
@return A `luci.ip.cidr` object representing the given IPv4 range.
-@usage `addr = luci.ip.new("10.24.0.1/24")
-addr = luci.ip.new("10.24.0.1/255.255.255.0")
-addr = luci.ip.new("10.24.0.1", "255.255.255.0") -- separate netmask
-addr = luci.ip.new("10.24.0.1/24", 16) -- override netmask`
+@usage `addr = luci.ip.IPv4("10.24.0.1/24")
+addr = luci.ip.IPv4("10.24.0.1/255.255.255.0")
+addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0") -- separate netmask
+addr = luci.ip.IPv4("10.24.0.1/24", 16) -- override netmask`
@see IPv6
]]
containing a prefix size between `0` and `128` bit.
Overrides mask embedded in the first argument if specified. (optional)
@return A `luci.ip.cidr` object representing the given IPv6 range.
-@usage `addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64")
-addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
-addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
-addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask`
+@usage `addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask`
@see IPv4
]]
local first = true
for key, entry in pairs(obj) do
- first = first or self:put(",")
- first = first and false
- self:parse_string(tostring(key))
- self:put(":")
- self:dispatch(entry)
+ if key ~= null then
+ first = first or self:put(",")
+ first = first and false
+ self:parse_string(tostring(key))
+ self:put(":")
+ self:dispatch(entry)
+ end
end
self:put("}")
LuCI JSON-Library
@cstyle instance
-module "luci.json"
]]
+module "luci.json"
---[[
Directly decode a JSON string
flags |= JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED;
lua_pushstring(L, json_object_to_json_string_ext(obj, flags));
+ json_object_put(obj);
return 1;
}
out:
lua_pop(L, 2);
- return 0;
+ return -1;
}
/* check for holes */
case LUA_TTABLE:
max = _lua_test_array(L, index);
- if (max > 0)
+ if (max >= 0)
{
obj = json_object_new_array();
lua_pushvalue(L, -2);
key = lua_tostring(L, -1);
- json_object_object_add(obj, key,
- _lua_to_json(L, lua_gettop(L) - 1));
+ if (key)
+ json_object_object_add(obj, key,
+ _lua_to_json(L, lua_gettop(L) - 1));
lua_pop(L, 2);
}
nixio__addr_write(&addr, (struct sockaddr *)&saddr);
- int res = getnameinfo((struct sockaddr *)&saddr, sizeof(saddr),
+ int res = getnameinfo((struct sockaddr *)&saddr,
+ (saddr.ss_family == AF_INET)
+ ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6),
host, sizeof(host), NULL, 0, NI_NAMEREQD);
#ifdef __linux__
LuCI RPC Client.
@cstyle instance
-module "luci.rpcc"
]]
+module "luci.rpcc"
---[[
Create a new JSON-RPC stream client.
Transparent UCI over RPC client.
@cstyle instance
-module "luci.rpcc.ruci"
]]
+module "luci.rpcc.ruci"
---[[
Create a new UCI over RPC proxy.
LUCI_LANG.pt=Português (Portuguese)
LUCI_LANG.ro=Română (Romanian)
LUCI_LANG.ru=Русский (Russian)
-LUCI_LANG.sk=Slovenčina (Slovene)
+LUCI_LANG.sk=Slovenčina (Slovak)
LUCI_LANG.sv=Svenska (Swedish)
LUCI_LANG.tr=Türkçe (Turkish)
LUCI_LANG.uk=украї́нська (Ukrainian)
LUCI_BASENAME:=base
LUCI_TITLE:=LuCI core libraries
-LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd
+LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua
PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files
-- Use optimized UCI writing
function Map.parse(self, readinput, ...)
- self.readinput = (readinput ~= false)
- self:_run_hooks("on_parse")
-
if self:formvalue("cbi.skip") then
self.state = FORM_SKIP
+ elseif not self.save then
+ self.state = FORM_INVALID
+ elseif not self:submitstate() then
+ self.state = FORM_NODATA
+ end
+
+ -- Back out early to prevent unauthorized changes on the subsequent parse
+ if self.state ~= nil then
return self:state_handler(self.state)
end
+ self.readinput = (readinput ~= false)
+ self:_run_hooks("on_parse")
+
Node.parse(self, ...)
- if self.save then
- self:_run_hooks("on_save", "on_before_save")
+ self:_run_hooks("on_save", "on_before_save")
+ for i, config in ipairs(self.parsechain) do
+ self.uci:save(config)
+ end
+ self:_run_hooks("on_after_save")
+ if (not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply") then
+ self:_run_hooks("on_before_commit")
for i, config in ipairs(self.parsechain) do
- self.uci:save(config)
- end
- self:_run_hooks("on_after_save")
- if self:submitstate() and ((not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply")) then
- self:_run_hooks("on_before_commit")
- for i, config in ipairs(self.parsechain) do
- self.uci:commit(config)
-
- -- Refresh data because commit changes section names
- self.uci:load(config)
- end
- self:_run_hooks("on_commit", "on_after_commit", "on_before_apply")
- if self.apply_on_parse then
- self.uci:apply(self.parsechain)
- self:_run_hooks("on_apply", "on_after_apply")
- else
- -- This is evaluated by the dispatcher and delegated to the
- -- template which in turn fires XHR to perform the actual
- -- apply actions.
- self.apply_needed = true
- end
-
- -- Reparse sections
- Node.parse(self, true)
+ self.uci:commit(config)
+ -- Refresh data because commit changes section names
+ self.uci:load(config)
end
- for i, config in ipairs(self.parsechain) do
- self.uci:unload(config)
- end
- if type(self.commit_handler) == "function" then
- self:commit_handler(self:submitstate())
+ self:_run_hooks("on_commit", "on_after_commit", "on_before_apply")
+ if self.apply_on_parse then
+ self.uci:apply(self.parsechain)
+ self:_run_hooks("on_apply", "on_after_apply")
+ else
+ -- This is evaluated by the dispatcher and delegated to the
+ -- template which in turn fires XHR to perform the actual
+ -- apply actions.
+ self.apply_needed = true
end
+
+ -- Reparse sections
+ Node.parse(self, true)
+ end
+ for i, config in ipairs(self.parsechain) do
+ self.uci:unload(config)
+ end
+ if type(self.commit_handler) == "function" then
+ self:commit_handler(self:submitstate())
end
- if self:submitstate() then
- if not self.save then
- self.state = FORM_INVALID
- elseif self.proceed then
- self.state = FORM_PROCEED
- else
- self.state = self.changed and FORM_CHANGED or FORM_VALID
- end
+ if self.proceed then
+ self.state = FORM_PROCEED
+ elseif self.changed then
+ self.state = FORM_CHANGED
else
- self.state = FORM_NODATA
+ self.state = FORM_VALID
end
return self:state_handler(self.state)
self.template = "cbi/value"
self.keylist = {}
self.vallist = {}
+ self.readonly = nil
end
function Value.reset_values(self)
table.insert(self.vallist, tostring(val))
end
+function Value.parse(self, section, novld)
+ if self.readonly then return end
+ AbstractValue.parse(self, section, novld)
+end
-- DummyValue - This does nothing except being there
DummyValue = class(AbstractValue)
end
-- A flag can only have two states: set or unset
-function Flag.parse(self, section)
+function Flag.parse(self, section, novld)
local fexists = self.map:formvalue(
FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
if fexists then
local fvalue = self:formvalue(section) and self.enabled or self.disabled
- if fvalue ~= self.default or (not self.optional and not self.rmempty) then
- self:write(section, fvalue)
- else
+ local cvalue = self:cfgvalue(section)
+ local val_err
+ fvalue, val_err = self:validate(fvalue, section)
+ if not fvalue then
+ if not novld then
+ self:add_error(section, "invalid", val_err)
+ end
+ return
+ end
+ if fvalue == self.default and (self.optional or self.rmempty) then
self:remove(section)
+ else
+ self:write(section, fvalue)
end
+ if (fvalue ~= cvalue) then self.section.changed = true end
else
self:remove(section)
+ self.section.changed = true
end
end
function Flag.cfgvalue(self, section)
return AbstractValue.cfgvalue(self, section) or self.default
end
-
+function Flag.validate(self, value)
+ return value
+end
--[[
ListValue - A one-line value predefined in a list
function index()
entry({"servicectl"}, alias("servicectl", "status")).sysauth = "root"
entry({"servicectl", "status"}, call("action_status")).leaf = true
- entry({"servicectl", "restart"}, call("action_restart")).leaf = true
+ entry({"servicectl", "restart"}, post("action_restart")).leaf = true
end
function action_status()
-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local fs = require "nixio.fs"
local path = {...}
local url = { http.getenv("SCRIPT_NAME") or "" }
- local k, v
- for k, v in pairs(context.urltoken) do
- url[#url+1] = "/;"
- url[#url+1] = http.urlencode(k)
- url[#url+1] = "="
- url[#url+1] = http.urlencode(v)
- end
-
local p
for _, p in ipairs(path) do
if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then
end
end
+ if #path == 0 then
+ url[#url+1] = "/"
+ end
+
return table.concat(url, "")
end
return user
end
- if context.urltoken.stok then
- context.urltoken.stok = nil
-
- local cookie = 'sysauth=%s; expires=%s; path=%s/' %{
- http.getcookie('sysauth') or 'x',
- 'Thu, 01 Jan 1970 01:00:00 GMT',
- build_url()
- }
-
- http.header("Set-Cookie", cookie)
- http.redirect(build_url())
- else
- require("luci.i18n")
- require("luci.template")
- context.path = {}
- http.status(403, "Forbidden")
- luci.template.render("sysauth", {duser=default, fuser=user})
- end
+ require("luci.i18n")
+ require("luci.template")
+ context.path = {}
+ http.status(403, "Forbidden")
+ luci.template.render("sysauth", {duser=default, fuser=user})
return false
local r = {}
context.request = r
- context.urltoken = {}
local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
end
end
- local tokensok = true
for node in pathinfo:gmatch("[^/]+") do
- local tkey, tval
- if tokensok then
- tkey, tval = node:match(";(%w+)=([a-fA-F0-9]*)")
- end
- if tkey then
- context.urltoken[tkey] = tval
- else
- tokensok = false
- r[#r+1] = node
- end
+ r[#r+1] = node
end
local stat, err = util.coxpcall(function()
--context._disable_memtrace()
end
+local function require_post_security(target)
+ if type(target) == "table" then
+ if type(target.post) == "table" then
+ local param_name, required_val, request_val
+
+ for param_name, required_val in pairs(target.post) do
+ request_val = http.formvalue(param_name)
+
+ if (type(required_val) == "string" and
+ request_val ~= required_val) or
+ (required_val == true and
+ (request_val == nil or request_val == ""))
+ then
+ return false
+ end
+ end
+
+ return true
+ end
+
+ return (target.post == true)
+ end
+
+ return false
+end
+
+function test_post_security()
+ if http.getenv("REQUEST_METHOD") ~= "POST" then
+ http.status(405, "Method Not Allowed")
+ http.header("Allow", "POST")
+ return false
+ end
+
+ if http.formvalue("token") ~= context.authtoken then
+ http.status(403, "Forbidden")
+ luci.template.render("csrftoken")
+ return false
+ end
+
+ return true
+end
+
function dispatch(request)
--context._disable_memtrace = require "luci.debug".trap_memtrace("l")
local ctx = context
ctx.args = args
ctx.requestargs = ctx.requestargs or args
local n
- local token = ctx.urltoken
local preq = {}
local freq = {}
resource = luci.config.main.resourcebase;
ifattr = function(...) return _ifattr(...) end;
attr = function(...) return _ifattr(true, ...) end;
+ url = build_url;
}, {__index=function(table, key)
if key == "controller" then
return build_url()
elseif key == "REQUEST_URI" then
return build_url(unpack(ctx.requestpath))
+ elseif key == "token" then
+ return ctx.authtoken
else
return rawget(table, key) or _G[key]
end
local def = (type(track.sysauth) == "string") and track.sysauth
local accs = def and {track.sysauth} or track.sysauth
local sess = ctx.authsession
- local verifytoken = false
if not sess then
sess = http.getcookie("sysauth")
sess = sess and sess:match("^[a-f0-9]*$")
- verifytoken = true
end
local sdat = (util.ubus("session", "get", { ubus_rpc_session = sess }) or { }).values
- local user
+ local user, token
if sdat then
- if not verifytoken or ctx.urltoken.stok == sdat.token then
- user = sdat.user
- end
+ user = sdat.user
+ token = sdat.token
else
local eu = http.getenv("HTTP_AUTH_USER")
local ep = http.getenv("HTTP_AUTH_PASS")
end
if sess and token then
- http.header("Set-Cookie", 'sysauth=%s; path=%s/' %{
- sess, build_url()
- })
+ http.header("Set-Cookie", 'sysauth=%s; path=%s' %{ sess, build_url() })
- ctx.urltoken.stok = token
ctx.authsession = sess
+ ctx.authtoken = token
ctx.authuser = user
http.redirect(build_url(unpack(ctx.requestpath)))
end
else
ctx.authsession = sess
+ ctx.authtoken = token
ctx.authuser = user
end
end
+ if c and require_post_security(c.target) then
+ if not test_post_security(c) then
+ return
+ end
+ end
+
if track.setgroup then
sys.process.setgroup(track.setgroup)
end
return {type = "call", argv = {...}, name = name, target = _call}
end
+function post_on(params, name, ...)
+ return {
+ type = "call",
+ post = params,
+ argv = { ... },
+ name = name,
+ target = _call
+ }
+end
+
+function post(...)
+ return post_on(true, ...)
+end
+
local _template = function(self, ...)
require "luci.template".render(self.view)
end
function cbi(model, config)
- return {type = "cbi", config = config, model = model, target = _cbi}
+ return {
+ type = "cbi",
+ post = { ["cbi.submit"] = "1" },
+ config = config,
+ model = model,
+ target = _cbi
+ }
end
end
function form(model)
- return {type = "cbi", model = model, target = _form}
+ return {
+ type = "cbi",
+ post = { ["cbi.submit"] = "1" },
+ model = model,
+ target = _form
+ }
end
translate = i18n.translate
end
function redirect(url)
+ if url == "" then url = "/" end
status(302, "Found")
header("Location", url)
close()
---[[
LuCI Web Framework high-level HTTP functions.
-
-module "luci.http"
]]
+module "luci.http"
---[[
Close the HTTP-Connection.
-- If we have a file callback then feed it
if type(filecb) == "function" then
- sink = filecb
-
+ 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, err )
+ sink = function( chunk )
if chunk then
if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then
msg.content = msg.content .. chunk
end
-- List helper
-function _list(action, pat, cb)
+local function _list(action, pat, cb)
local fd = io.popen(ipkg .. " " .. action ..
(pat and (" '%s'" % pat:gsub("'", "")) or ""))
if fd then
- local name, version, desc
+ local name, version, sz, desc
while true do
local line = fd:read("*l")
if not line then break end
- name, version, desc = line:match("^(.-) %- (.-) %- (.+)")
+ name, version, sz, desc = line:match("^(.-) %- (.-) %- (.-) %- (.+)")
if not name then
- name, version = line:match("^(.-) %- (.+)")
+ name, version, sz = line:match("^(.-) %- (.-) %- (.+)")
desc = ""
end
- cb(name, version, desc)
+ if name and version then
+ if #version > 26 then
+ version = version:sub(1,21) .. ".." .. version:sub(-3,-1)
+ end
+
+ cb(name, version, sz, desc)
+ end
name = nil
version = nil
+ sz = nil
desc = nil
end
end
function list_all(pat, cb)
- _list("list", pat, cb)
+ _list("list --size", pat, cb)
end
function list_installed(pat, cb)
- _list("list_installed", pat, cb)
+ _list("list_installed --size", pat, cb)
end
function find(pat, cb)
- _list("find", pat, cb)
+ _list("find --size", pat, cb)
end
return od
end
+
+function compare_versions(ver1, comp, ver2)
+ if not ver1 or not ver2
+ or not comp or not (#comp > 0) then
+ error("Invalid parameters")
+ return nil
+ end
+ -- correct compare string
+ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
+ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
+ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
+ elseif comp == "=" or comp == "==" then comp = "=="
+ elseif comp == "<<" then comp = "<"
+ elseif comp == ">>" then comp = ">"
+ else
+ error("Invalid compare string")
+ return nil
+ end
+
+ local av1 = util.split(ver1, "[%.%-]", nil, true)
+ local av2 = util.split(ver2, "[%.%-]", nil, true)
+
+ local max = table.getn(av1)
+ if (table.getn(av1) < table.getn(av2)) then
+ max = table.getn(av2)
+ end
+
+ for i = 1, max, 1 do
+ local s1 = av1[i] or ""
+ local s2 = av2[i] or ""
+
+ -- first "not equal" found return true
+ if comp == "~=" and (s1 ~= s2) then return true end
+ -- first "lower" found return true
+ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
+ -- first "greater" found return true
+ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
+ -- not equal then return false
+ if (s1 ~= s2) then return false end
+ end
+
+ -- all equal and not compare greater or lower then true
+ return not (comp == "<" or comp == ">")
+end
---[[
LuCI OPKG call abstraction library
-
-module "luci.model.ipkg"
]]
+module "luci.model.ipkg"
---[[
Return information about installed and available packages.
@return String containing the directory path of the overlay root.
]]
+---[[
+lua version of opkg compare-versions
+
+@class function
+@name compare_versions
+@param ver1 string version 1
+@param ver2 string version 2
+@param comp string compare versions using
+ "<=" or "<" lower-equal
+ ">" or ">=" greater-equal
+ "=" equal
+ "<<" lower
+ ">>" greater
+ "~=" not equal
+@return Boolean indicating the status of the compare
+]]
+
end
function wifinet.active_mode(self)
- local m = _stror(self.iwinfo.mode, self.iwdata.mode) or "ap"
+ local m = _stror(self.iwdata.mode, self.iwinfo.mode) or "ap"
if m == "ap" then m = "Master"
elseif m == "sta" then m = "Client"
end
function wifinet.active_ssid(self)
- return _stror(self.iwinfo.ssid, self.iwdata.ssid)
+ return _stror(self.iwdata.ssid, self.iwinfo.ssid)
end
function wifinet.active_bssid(self)
- return _stror(self.iwinfo.bssid, self.iwdata.bssid) or "00:00:00:00:00:00"
+ return _stror(self.iwdata.bssid, self.iwinfo.bssid) or "00:00:00:00:00:00"
end
function wifinet.active_encryption(self)
LuCI then needs to Cursor.apply the changes so deamons etc. are
reloaded.
@cstyle instance
-module "luci.model.uci"
]]
+module "luci.model.uci"
---[[
Create a new UCI-Cursor.
local stat, iwinfo = pcall(require, "iwinfo")
if ifname then
- local c = 0
- local u = uci.cursor_state()
local d, n = ifname:match("^(%w+)%.network(%d+)")
- if d and n then
+ local wstate = luci.util.ubus("network.wireless", "status") or { }
+
+ d = d or ifname
+ n = n and tonumber(n) or 1
+
+ if type(wstate[d]) == "table" and
+ type(wstate[d].interfaces) == "table" and
+ type(wstate[d].interfaces[n]) == "table" and
+ type(wstate[d].interfaces[n].ifname) == "string"
+ then
+ ifname = wstate[d].interfaces[n].ifname
+ else
ifname = d
- n = tonumber(n)
- u:foreach("wireless", "wifi-iface",
- function(s)
- if s.device == d then
- c = c + 1
- if c == n then
- ifname = s.ifname or s.device
- return false
- end
- end
- end)
- elseif u:get("wireless", ifname) == "wifi-device" then
- u:foreach("wireless", "wifi-iface",
- function(s)
- if s.device == ifname and s.ifname then
- ifname = s.ifname
- return false
- end
- end)
end
local t = stat and iwinfo.type(ifname)
---[[
LuCI Linux and POSIX system utilities.
-
-module "luci.sys"
]]
+module "luci.sys"
---[[
Execute a given shell command and return the error code
{ 'Africa/Blantyre', 'CAT-2' },
{ 'Africa/Brazzaville', 'WAT-1' },
{ 'Africa/Bujumbura', 'CAT-2' },
- { 'Africa/Cairo', 'EET-2EEST,M4.5.4/24,M9.5.4/24' },
+ { 'Africa/Cairo', 'EET-2' },
{ 'Africa/Casablanca', 'WET0WEST,M3.5.0,M10.5.0/3' },
{ 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Africa/Conakry', 'GMT0' },
{ 'Africa/Tripoli', 'EET-2' },
{ 'Africa/Tunis', 'CET-1' },
{ 'Africa/Windhoek', 'WAT-1WAST,M9.1.0,M4.1.0' },
- { 'America/Adak', 'HAST10HADT,M3.2.0,M11.1.0' },
+ { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' },
{ 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' },
{ 'America/Anguilla', 'AST4' },
{ 'America/Antigua', 'AST4' },
{ 'America/Cancun', 'EST5' },
{ 'America/Caracas', 'VET4:30' },
{ 'America/Cayenne', 'GFT3' },
- { 'America/Cayman', 'EST5' },
+ { 'America/Cayman', 'EST5EDT,M3.2.0,M11.1.0' },
{ 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' },
{ 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' },
{ 'America/Costa Rica', 'CST6' },
{ 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' },
{ 'America/Eirunepe', 'ACT5' },
{ 'America/El Salvador', 'CST6' },
+ { 'America/Fort Nelson', 'MST7' },
{ 'America/Fortaleza', 'BRT3' },
{ 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' },
{ 'America/Godthab', 'WGT3WGST,M3.5.0/-2,M10.5.0/-1' },
{ 'America/Miquelon', 'PMST3PMDT,M3.2.0,M11.1.0' },
{ 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' },
{ 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' },
- { 'America/Montevideo', 'UYT3UYST,M10.1.0,M3.2.0' },
+ { 'America/Montevideo', 'UYT3' },
{ 'America/Montserrat', 'AST4' },
{ 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' },
{ 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' },
{ 'Asia/Oral', 'ORAT-5' },
{ 'Asia/Phnom Penh', 'ICT-7' },
{ 'Asia/Pontianak', 'WIB-7' },
- { 'Asia/Pyongyang', 'KST-9' },
+ { 'Asia/Pyongyang', 'KST-8:30' },
{ 'Asia/Qatar', 'AST-3' },
{ 'Asia/Qyzylorda', 'QYZT-6' },
{ 'Asia/Rangoon', 'MMT-6:30' },
{ 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
{ 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
- { 'Europe/Chisinau', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
+ { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Dublin', 'GMT0IST,M3.5.0/1,M10.5.0' },
{ 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Pacific/Efate', 'VUT-11' },
{ 'Pacific/Enderbury', 'PHOT-13' },
{ 'Pacific/Fakaofo', 'TKT-13' },
- { 'Pacific/Fiji', 'FJT-12FJST,M11.1.0,M1.3.4/75' },
+ { 'Pacific/Fiji', 'FJT-12FJST,M11.1.0,M1.3.0/3' },
{ 'Pacific/Funafuti', 'TVT-12' },
{ 'Pacific/Galapagos', 'GALT6' },
{ 'Pacific/Gambier', 'GAMT9' },
{ 'Pacific/Midway', 'SST11' },
{ 'Pacific/Nauru', 'NRT-12' },
{ 'Pacific/Niue', 'NUT11' },
- { 'Pacific/Norfolk', 'NFT-11:30' },
+ { 'Pacific/Norfolk', 'NFT-11' },
{ 'Pacific/Noumea', 'NCT-11' },
{ 'Pacific/Pago Pago', 'SST11' },
{ 'Pacific/Palau', 'PWT-9' },
wat = 3600, -- WAT
cat = 7200, -- CAT
eet = 7200, -- EET
- eest = 10800, -- EEST
wet = 0, -- WET
sast = 7200, -- SAST
- hast = -36000, -- HAST
- hadt = -32400, -- HADT
+ hst = -36000, -- HST
+ hdt = -32400, -- HDT
akst = -32400, -- AKST
akdt = -28800, -- AKDT
ast = -14400, -- AST
pmst = -10800, -- PMST
pmdt = -7200, -- PMDT
uyt = -10800, -- UYT
- uyst = -7200, -- UYST
fnt = -7200, -- FNT
srt = -10800, -- SRT
clt = -10800, -- CLT
novt = 21600, -- NOVT
omst = 21600, -- OMST
orat = 18000, -- ORAT
- kst = 32400, -- KST
+ kst = 30600, -- KST
qyzt = 21600, -- QYZT
mmt = 23400, -- MMT
sakt = 36000, -- SAKT
galt = -21600, -- GALT
gamt = -32400, -- GAMT
sbt = 39600, -- SBT
- hst = -36000, -- HST
lint = 50400, -- LINT
kost = 39600, -- KOST
mht = 43200, -- MHT
sst = -39600, -- SST
nrt = 43200, -- NRT
nut = -39600, -- NUT
- nft = 41400, -- NFT
+ nft = 39600, -- NFT
nct = 39600, -- NCT
pwt = 32400, -- PWT
pont = 39600, -- PONT
assoclist = net:assoclist(),
country = net:country(),
txpower = net:txpower(),
- txpoweroff = net:txpower_offset()
+ txpoweroff = net:txpower_offset(),
+ disabled = (dev:get("disabled") == "1" or
+ net:get("disabled") == "1")
}
end
---[[
LuCI utility functions.
-
-module "luci.util"
]]
+module "luci.util"
---[[
Create a Class object (Python-style object model).
@name contains
@param table Table value
@param value Value to search within the given table
-@return Boolean indicating whether the given value occurs within table
+@return number indicating the first index at which the given value occurs
+-- within table or false.
]]
---[[
<script type="text/javascript">//<![CDATA[
var apply_xhr = new XHR();
- apply_xhr.get('<%=luci.dispatcher.build_url("servicectl", "restart", table.concat(configs, ","))%>', null,
+ apply_xhr.post('<%=url('servicectl/restart', table.concat(configs, ","))%>', { token: '<%=token%>' },
function() {
var checkfinish = function() {
- apply_xhr.get('<%=luci.dispatcher.build_url("servicectl", "status")%>', null,
+ apply_xhr.get('<%=url('servicectl/status')%>', null,
function(x) {
if( x.responseText == 'finish' )
{
<%+cbi/valueheader%>
<input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
<script type="text/javascript">
-cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=luci.dispatcher.build_url("admin", "filebrowser")%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
+cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=url('admin/filebrowser')%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
</script>
<%+cbi/valuefooter%>
<div class="cbi-map" id="cbi-<%=self.config%>">
- <% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
+ <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
<% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
<p class="alert-message danger">
<form method="post" name="cbi" action="<%=REQUEST_URI%>" enctype="multipart/form-data" onreset="return cbi_validate_reset(this)" onsubmit="return cbi_validate_form(this, '<%:Some fields are invalid, cannot save values!%>')">
<div>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="cbi.submit" value="1" />
<input type="submit" value="<%:Save%>" class="hidden" />
</div>
<%-+cbi/apply_xhr-%>
<div class="cbi-map" id="cbi-<%=self.config%>">
- <% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
+ <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
<% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
<%- if firstmap and applymap then cbi_apply_xhr(self.config, parsechain, redirect) end -%>
<%- self:render_children() %>
<%- else -%>
<%:unspecified -or- create:%>
<%- end -%> </em></label>
+ <input style="display:none" type="password" />
<input style="width:6em" type="text"<%=attr("name", cbid .. ".newnet")%> onfocus="document.getElementById('<%=cbid%>_new').checked=true" />
</div>
</li>
<form method="post" enctype="multipart/form-data" action="<%=REQUEST_URI%>">
<div>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="cbi.submit" value="1" />
</div>
<% end %>
<div class="cbi-map" id="cbi-<%=self.config%>">
- <% if self.title and #self.title > 0 then %><h2><a id="content" name="content"><%=self.title%></a></h2><% end %>
+ <% if self.title and #self.title > 0 then %><h2 name="content"><%=self.title%></h2><% end %>
<% if self.description and #self.description > 0 then %><div class="cbi-map-descr"><%=self.description%></div><% end %>
<% self:render_children() %>
<br />
<%+cbi/valueheader%>
<input type="<%=self.password and 'password" class="cbi-input-password' or 'text" class="cbi-input-text' %>" onchange="cbi_d_update(this.id)"<%=
attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
- ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder")
+ ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder") ..
+ ifattr(self.readonly, "readonly") .. ifattr(self.maxlength, "maxlength")
%> />
<% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
<% if #self.keylist > 0 or self.datatype then -%>
--- /dev/null
+<%#
+ Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+ Licensed to the public under the Apache License 2.0.
+-%>
+
+<%+header%>
+
+<h2 name="content"><%:Form token mismatch%></h2>
+<br />
+
+<p class="alert-message"><%:The submitted security token is invalid or already expired!%></p>
+
+<p><%:
+ In order to prevent unauthorized access to the system, your request has
+ been blocked. Click "Continue »" below to return to the previous page.
+%></p>
+
+<hr />
+
+<p class="right">
+ <strong><a href="#" onclick="window.history.back();">Continue »</a></strong>
+</p>
+
+<%+footer%>
-%>
<%+header%>
-<h2><a id="content" name="content">404 <%:Not Found%></a></h2>
+<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>
<%+footer%>
-%>
<%+header%>
-<h2><a id="content" name="content">500 <%:Internal Server Error%></a></h2>
+<h2 name="content">500 <%:Internal Server Error%></h2>
<p><%:Sorry, the server encountered an unexpected error.%></p>
<pre class="error500"><%=message%></pre>
<%+footer%>
<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
<div class="cbi-map">
- <h2><a id="content" name="content"><%:Authorization Required%></a></h2>
+ <h2 name="content"><%:Authorization Required%></h2>
<div class="cbi-map-descr">
<%:Please enter your username and password.%>
<%- if fuser then %>
msgid "15 Minute Load:"
msgstr "Càrrega de 15 minuts:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Càrrega de 5 minuts:"
msgid "Additional Hosts files"
msgstr "Fitxers de Hosts addicionals"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adreça"
msgid "Average:"
msgstr "Mitjana:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "En memòria intermèdia"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Botons"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configuració de dispositiu"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnòstics"
msgid "Distance to farthest network member in meters."
msgstr "Distància al membre de la xarxa més allunyat en metres."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversitat"
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Mètode EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Habilita negociació IPv6 en la enllaç PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Habilita el passatge de trames enormes"
msgid "Force TKIP and CCMP (AES)"
msgstr "Força el TKIP i el CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Reenvia el tràfic DHCP"
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr "Només IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Longitud de prefix IPv4"
"es pot accedir al dispositiu d'intercanvi amb unes taxes tan altes com les "
"de la <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignora <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ignora la interfície"
msgid "In"
msgstr "En"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Temps d'espera d'inactivitat"
msgid "MAC-List"
msgstr "Llista MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Velocitat màxima"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Es requereix el paquet libiwinfo!"
msgid "Password successfully changed!"
msgstr "La contrasenya s'ha canviat amb èxit!"
-msgid "Path"
-msgstr "Ruta"
-
msgid "Path to CA-Certificate"
msgstr "Ruta als Certificats CA"
msgid "Please enter your username and password."
msgstr "Si us plau entra el teu nom d'usuari i contrasenya."
-msgid "Please wait: Device rebooting..."
-msgstr "Si us plau espera: Dispositiu arrancant-se de nou"
-
msgid "Policy"
msgstr "Política"
msgid "Size"
msgstr "Mida"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Salta"
msgid "The selected protocol needs a device assigned"
msgstr "El protocol seleccionat necessita un dispositiu assignat"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Esperant que s'acabi l'ordre..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Advertència"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Advertència: Hi ha canvis que no s'han desat i que es perdran mentre "
-"s'arranca de nou!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Enrere"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Habilita negociació IPv6 en la enllaç PPP"
+
+#~ msgid "Path"
+#~ msgstr "Ruta"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Si us plau espera: Dispositiu arrancant-se de nou"
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Advertència: Hi ha canvis que no s'han desat i que es perdran mentre "
+#~ "s'arranca de nou!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Ací pots configurar els dispositius sense fils instal·lats."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignora <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Independent (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "Zatížení za 15 minut:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Zatížení za 5 minut:"
msgid "Additional Hosts files"
msgstr "Dodatečné Hosts soubory"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adresa"
msgid "Average:"
msgstr "Průměr:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Bufferováno"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Tlačítka"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Nastavení zařízení"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostika"
msgid "Distance to farthest network member in meters."
msgstr "Vzdálenost nejodlehlejšího člena sítě v metrech."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diverzita"
"Pro klienty alokovat DHCP adresy dynamicky. Pokud je volba zakázána, budou "
"obsloužení pouze klienti se statickými výpůjčkami."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Metoda EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Povolit dynamickou aktualizaci koncového bodu HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Na PPP spoji povolit vyjednání IPv6"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Povolit průchod jumbo rámců"
msgid "Force TKIP and CCMP (AES)"
msgstr "Vynutit TKIP a CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Přeposílat DHCP provoz"
msgid "General Setup"
msgstr "Obecné nastavení"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Vytvorǐt archív"
msgid "IPv4 only"
msgstr "Pouze IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Délka IPv4 prefixu"
"přístup na odkládací zařízení je řádově pomalejší, než přístup do paměti "
"<abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignorovat soubory Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
msgid "Ignore interface"
msgstr "Ignorovat rozhraní"
msgid "In"
msgstr "Dovnitř"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Časový limit nečinnosti"
msgid "MAC-List"
msgstr "Seznam Mac"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Nejvyšší míra"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Vyžadován balíček libiwinfo!"
msgid "Password successfully changed!"
msgstr "Heslo bylo úspěšně změněno!"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "Cesta k certifikátu CA"
msgid "Please enter your username and password."
msgstr "Prosím vložte vaše uživatelské jméno a heslo."
-msgid "Please wait: Device rebooting..."
-msgstr "Prosím počkejte: Provádím reboot..."
-
msgid "Policy"
msgstr "Politika"
msgid "Size"
msgstr "Velikost"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Přeskočit"
msgid "The selected protocol needs a device assigned"
msgstr "Vybraný protokol potřebuje mít přiřazeno zařízení"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Čekání na dokončení příkazu..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Varování"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Varování: Existují neuložené změny, které budou rebootem ztraceny!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Zpět"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Na PPP spoji povolit vyjednání IPv6"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorovat soubory Hosts"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Prosím počkejte: Provádím reboot..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "Varování: Existují neuložené změny, které budou rebootem ztraceny!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
msgid "15 Minute Load:"
msgstr "Systemlast (15 Minuten):"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Systemlast (5 Minuten):"
msgid "Additional Hosts files"
msgstr "Zusätzliche Hosts-Dateien"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adresse"
msgid "Average:"
msgstr "Durchschnitt:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Gepuffert"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Knöpfe"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr "Passt das Verhalten der Geräte-LEDs an - wenn dies möglich ist."
msgid "Device Configuration"
msgstr "Gerätekonfiguration"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnosen"
msgid "Distance to farthest network member in meters."
msgstr "Distanz zum am weitesten entfernten Funkpartner in Metern."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversität"
"DHCP Adressen dynamisch erzeugen. Wenn dies deaktiviert ist, werden nur "
"Clients mit konfigurierten statischen Leases bedient"
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-Methode"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Dynamisches HE.net IP-Adress-Update aktivieren"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Aushandeln von IPv6-Adressen auf der PPP-Verbindung aktivieren"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Aktiviere Jumbo Frame Durchleitung"
msgid "Force TKIP and CCMP (AES)"
msgstr "Erzwinge TKIP und CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "DHCP Traffic weiterleiten"
msgid "General Setup"
msgstr "Allgemeine Einstellungen"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Sicherung erstellen"
msgid "IPv4 only"
msgstr "nur IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Länge des IPv4 Präfix"
"effektive Größe des Arbeitsspeichers zu erhöhen. Die Auslagerung der Daten "
"ist natürlich bedeutend langsamer als direkte Arbeitsspeicherzugriffe."
-msgid "Ignore Hosts files"
-msgstr "Hosts-Dateien ignorieren"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignoriere /etc/hosts"
msgid "Ignore interface"
msgstr "Schnittstelle ignorieren"
msgid "In"
msgstr "Ein"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Timeout bei Inaktivität"
msgid "MAC-List"
msgstr "MAC-Adressliste"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Höchstübertragungsrate"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Benötige das libiwinfo Paket!"
msgid "Password successfully changed!"
msgstr "Passwort erfolgreich geändert!"
-msgid "Path"
-msgstr "Pfad"
-
msgid "Path to CA-Certificate"
msgstr "Pfad zum CA-Zertifikat"
msgid "Please enter your username and password."
msgstr "Bitte Benutzernamen und Passwort eingeben."
-msgid "Please wait: Device rebooting..."
-msgstr "Bitte warten: Neustart wird durchgeführt..."
-
msgid "Policy"
msgstr "Standardregel"
msgid "Size"
msgstr "Größe"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Überspringen"
msgid "The selected protocol needs a device assigned"
msgstr "Dem ausgewähltem Protokoll muss ein Gerät zugeordnet werden"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "IPv4-Adresse des Relais"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Der Befehl wird ausgeführt..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Warnung"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Warnung: Es gibt ungespeicherte Änderungen, die bei einem Neustart verloren "
-"gehen!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Zurück"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Aushandeln von IPv6-Adressen auf der PPP-Verbindung aktivieren"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Hosts-Dateien ignorieren"
+
+#~ msgid "Path"
+#~ msgstr "Pfad"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Bitte warten: Neustart wird durchgeführt..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Warnung: Es gibt ungespeicherte Änderungen, die bei einem Neustart "
+#~ "verloren gehen!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignoriere /etc/hosts"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Unabhängig (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "Φορτίο 15 λεπτών:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Φορτίο 5 λεπτών:"
msgid "Additional Hosts files"
msgstr "Επιπλέον αρχεία Hosts"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Διεύθυνση"
msgid "Average:"
msgstr "Μέσος Όρος:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Κουμπιά"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Παραμετροποίηση Συσκευής"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Διαγνωστικά"
msgid "Distance to farthest network member in meters."
msgstr "Απόσταση σε μέτρα από το πιο απομακρυσμένο μέλος του δικτύου."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Διαφορική Λήψη"
"Δυναμική απόδοση DHCP διευθύνσεων στους πελάτες. Σε περίπτωση "
"απενεργοποίησης, μόνο πελάτες με στατικα leases θα εξυπηρετούνται."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Μέθοδος EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Ενεργοποίηση ενημέρωσης δυναμικού τερματικού σημείου HE.net."
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Ενεργοποίηση διαπραγμάτευσης IPv6 πάνω στη PPP ζεύξη"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Ενεργοποίηση διέλευσης Jumbo Frame"
msgid "Force TKIP and CCMP (AES)"
msgstr "Επιβολή TKIP και CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Προώθηση κίνησης DHCP"
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr "Μόνο IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"προσπελαστεί με τους υψηλούς ρυθμούς μεταφοράς δεδομένων που διαθέτει η "
"<abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Αγνόησε <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Αγνόησε διεπαφή"
msgid "In"
msgstr "Είσοδος"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr "Λίστα MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Μέγιστος Ρυθμός"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Απαιτείται το πακέτο libiwinfo!"
msgid "Password successfully changed!"
msgstr "Ο κωδικός πρόσβασης άλλαξε επιτυχώς!"
-msgid "Path"
-msgstr "Διαδρομή"
-
msgid "Path to CA-Certificate"
msgstr "Διαδρομή για Πιστοποιητικό CA"
msgid "Please enter your username and password."
msgstr "Παρακαλώ εισάγετε όνομα χρήστη και κωδικό πρόσβασης."
-msgid "Please wait: Device rebooting..."
-msgstr "Παρακαλώ περιμένετε: Η συσκευή επανεκκινεί..."
-
msgid "Policy"
msgstr "Πολιτική"
msgid "Size"
msgstr "Μέγεθος"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Παράκαμψη"
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Προειδοποίηση"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Προειδοποίηση: Υπάρχουν μη-αποθηκευμένες αλλαγές που θα χαθούν κατά την "
-"επανεκκίνηση!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Πίσω"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Ενεργοποίηση διαπραγμάτευσης IPv6 πάνω στη PPP ζεύξη"
+
+#~ msgid "Path"
+#~ msgstr "Διαδρομή"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Παρακαλώ περιμένετε: Η συσκευή επανεκκινεί..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Προειδοποίηση: Υπάρχουν μη-αποθηκευμένες αλλαγές που θα χαθούν κατά την "
+#~ "επανεκκίνηση!"
+
#~ msgid "Configures this mount as overlay storage for block-extroot"
#~ msgstr ""
#~ "Ορίζει το συγκεκριμένο σημείο προσάρτησης ως επικαλύπτον αποθηκευτικό "
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Εδώ μπορείτε να ρυθμίσετε τις εγκατεστημένες ασύρματες συσκευές."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Αγνόησε <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Ανεξάρτητο (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "15 Minute Load:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "5 Minute Load:"
msgid "Additional Hosts files"
msgstr "Additional Hosts files"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Address"
msgid "Average:"
msgstr "Average:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Buffered"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Buttons"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Device Configuration"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostics"
msgid "Distance to farthest network member in meters."
msgstr "Distance to farthest network member in meters."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversity"
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-Method"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr "General Setup"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"slow process as the swap-device cannot be accessed with the high datarates "
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignore <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ignore interface"
msgid "In"
msgstr "In"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr "MAC-List"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Maximum Rate"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr "Path"
-
msgid "Path to CA-Certificate"
msgstr "Path to CA-Certificate"
msgid "Please enter your username and password."
msgstr "Please enter your username and password."
-msgid "Please wait: Device rebooting..."
-msgstr "Please wait: Device rebooting..."
-
msgid "Policy"
msgstr "Policy"
msgid "Size"
msgstr "Size"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Skip"
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Back"
+#~ msgid "Path"
+#~ msgstr "Path"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Please wait: Device rebooting..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+
#~ msgid "Cached"
#~ msgstr "Cached"
#~ "firewall zone of the choosen network.<br />Uncheck the attach option to "
#~ "define a new standalone network for this interface."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignore <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Independent (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "Carga a 15 minutos:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Carga a 5 minutos:"
msgid "Additional Hosts files"
msgstr "Ficheros de máquinas adicionales"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Dirección"
msgid "Average:"
msgstr "Media:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "En búfer"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Botones"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configuración del dispositivo"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnósticos"
msgid "Distance to farthest network member in meters."
msgstr "Distancia al miembro de la red mas lejana en metros."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversidad"
"Reparte direcciones DHCP dinámicamente a los clientes. Si se desactiva sólo "
"se servirá a clientes con cesiones estáticas."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Método EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Activar actualización dinámica de punto final HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Activar negociación IPv6 en el enlace PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Activar paso de tramas jumbo"
msgid "Force TKIP and CCMP (AES)"
msgstr "Forzar TKIP y CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Retransmitir tráfico DHCP"
msgid "General Setup"
msgstr "Configuración general"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Generar archivo"
msgid "IPv4 only"
msgstr "Sólo IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Longitud de prefijo IPv4"
"alta velocidad tal y como hace la memoria <abbr title=\"Random Access Memory"
"\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignorar fichero de máquinas"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorar <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ignorar interfaz"
msgid "In"
msgstr "Entrada"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Espera de inactividad"
msgid "MAC-List"
msgstr "Lista de direcciones MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Ratio Máximo"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "¡Se necesita el paquete libiwinfo!"
msgid "Password successfully changed!"
msgstr "¡Contraseña cambiada!"
-msgid "Path"
-msgstr "Ruta (path)"
-
msgid "Path to CA-Certificate"
msgstr "Ruta al Certificado CA"
msgid "Please enter your username and password."
msgstr "Por favor, introduzca su nombre de usuario y contraseña."
-msgid "Please wait: Device rebooting..."
-msgstr "Espere por favor: Rearrancando dispositivo..."
-
msgid "Policy"
msgstr "Política"
msgid "Size"
msgstr "Tamaño"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Saltar"
msgid "The selected protocol needs a device assigned"
msgstr "Este protocolo necesita estar asignado a un dispositivo"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "Dirección IPv4 del relé"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Esperando a que termine el comando..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Aviso"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Advertencia: Hay cambios realizados que no han sido guardados, los mismos se "
-"perderán mientras se rearranca!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Volver"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Activar negociación IPv6 en el enlace PPP"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorar fichero de máquinas"
+
+#~ msgid "Path"
+#~ msgstr "Ruta (path)"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Espere por favor: Rearrancando dispositivo..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Advertencia: Hay cambios realizados que no han sido guardados, los mismos "
+#~ "se perderán mientras se rearranca!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Aquí puede configurar los dispositivos Wi-Fi instalados."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorar <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Independiente (ad hoc) "
msgid "15 Minute Load:"
msgstr "Charge sur 15 minutes :"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Charge sur 5 minutes :"
msgid "Additional Hosts files"
msgstr "Fichiers hosts supplémetaires"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adresse"
msgid "Average:"
msgstr "Moyenne :"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Temporisé"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Boutons"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configuration de l'équipement"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostics"
msgid "Distance to farthest network member in meters."
msgstr "Distance au membre du réseau le plus éloigné, en mètres."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversité"
"Alloue dynamiquement des adresses pour les clients du DHCP. Si désactivé, "
"seuls les clients ayant des baux statiques seront gérés."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Méthode EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Activer la mise à jour dynamique de l'extrémité du tunnel chez HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Activer la négociation IPv6 sur le lien PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Activer la circulation de très grandes trames (Jumbo)"
msgid "Force TKIP and CCMP (AES)"
msgstr "Forcer TKIP et CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Transmettre le trafic DHCP"
msgid "General Setup"
msgstr "Configuration générale"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Construire l'archive"
msgid "IPv4 only"
msgstr "IPv4 seulement"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "longueur du préfixe IPv4"
"d'échange, relevant la quantité de RAM disponible. Ce processus est lent car "
"la mémoire d'échange ne peut être accédée aux taux de transfert de la RAM."
-msgid "Ignore Hosts files"
-msgstr "Ignorer le fichiers Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorer /etc/hosts"
msgid "Ignore interface"
msgstr "Ignorer l'interface"
msgid "In"
msgstr "Entrée"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Délai d'inactivité"
msgid "MAC-List"
msgstr "Liste des adresses MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Débit maximum"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Nécessite le paquet libiwinfo !"
msgid "Password successfully changed!"
msgstr "Mot de passe changé avec succès !"
-msgid "Path"
-msgstr "Chemin"
-
msgid "Path to CA-Certificate"
msgstr "Chemin de la CA"
msgid "Please enter your username and password."
msgstr "Saisissez votre nom d'utilisateur et mot de passe."
-msgid "Please wait: Device rebooting..."
-msgstr "Patientez s'il vous plaît: équipement en cours de redémarrage..."
-
msgid "Policy"
msgstr "Politique"
msgid "Size"
msgstr "Taille"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Passer au suivant"
msgid "The selected protocol needs a device assigned"
msgstr "Le protocole sélectionné nécessite l'attribution d'un périphérique"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "L'adresse IPv4 du relais"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "En attente de la fin de la commande..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Attention"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Attention : il reste des changements non appliqués qui seront perdus après "
-"redémarrage !"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Retour"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Activer la négociation IPv6 sur le lien PPP"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorer le fichiers Hosts"
+
+#~ msgid "Path"
+#~ msgstr "Chemin"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Patientez s'il vous plaît: équipement en cours de redémarrage..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Attention : il reste des changements non appliqués qui seront perdus "
+#~ "après redémarrage !"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Ici vous pouvez configurer les équipements Wi-Fi installés."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorer /etc/hosts"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Ad-Hoc"
msgid "15 Minute Load:"
msgstr "עומס במשך רבע שעה:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "עומס במשך 5 דקות:"
msgid "Additional Hosts files"
msgstr "קבצי מארח נוספים"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "כתובת"
msgid "Average:"
msgstr "ממוצע:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "כפתורים"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "הגדרות מכשיר"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "אבחון"
msgid "Distance to farthest network member in meters."
msgstr "מרחק לנק' הרשת הרחוקה ביותר במטרים"
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "גיוון"
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
msgstr ""
msgid "Ignore interface"
msgid "In"
msgstr ""
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr ""
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr ""
msgid "NAS ID"
msgstr ""
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr ""
msgid "Please enter your username and password."
msgstr "אנא הזן את שם המשתמש והסיסמה שלך:"
-msgid "Please wait: Device rebooting..."
-msgstr "אנא המתן: המכשיר מאותחל מחדש..."
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr ""
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "אזהרה"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "אזהרה: ישנם שינויים שלא נשמרו ויאבדו בעת הפעלה מחדש!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "<< אחורה"
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "אנא המתן: המכשיר מאותחל מחדש..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "אזהרה: ישנם שינויים שלא נשמרו ויאבדו בעת הפעלה מחדש!"
+
#~ msgid "Cached"
#~ msgstr "שמור במטמון"
msgid "15 Minute Load:"
msgstr "Terhelés (utolsó 15 perc):"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Terhelés (utolsó 5 perc):"
msgid "Additional Hosts files"
msgstr "További 'hosts' fájlok"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Cím"
msgid "Average:"
msgstr "Átlag:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Átmeneti tárban van"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Gombok"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Eszköz beállítások"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnosztika"
msgid "Distance to farthest network member in meters."
msgstr "A hálózat legtávolabbi tagjának távolsága méterben."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diverzitás"
"esetén csak a statikus DHCP bérlettel rendelkező kliensek lesznek "
"kiszolgálva."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP metódus"
msgid "Enable HE.net dynamic endpoint update"
msgstr "HE.net dinamikus végpont frissítésének engedélyezése"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "IPv6 egyeztetés engedélyezése a PPP linken"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Óriás keretek átengedésének engedélyezése"
msgid "Force TKIP and CCMP (AES)"
msgstr "TKIP és CCMP (AES) kényszerítése"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "DHCP forgalom továbbítás"
msgid "General Setup"
msgstr "Általános beállítások"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Archívum készítése"
msgid "IPv4 only"
msgstr "csak IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "IPv4 prefix hossza"
"nagyon lassú folyamat mivel a swap-eszköz nem érhető el akkora sebességgel "
"mint a <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "A hosts fájlok figyelmen kívül hagyása"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
msgid "Ignore interface"
msgstr "Interfész figyelmen kívül hagyása"
msgid "In"
msgstr "Be"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Inaktivitási időtúllépés"
msgid "MAC-List"
msgstr "MAC-lista"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Maximális sebesség"
msgid "NAS ID"
msgstr "NAS azonosító"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "A libiwinfo csomag szükséges!"
msgid "Password successfully changed!"
msgstr "A jelszó megváltoztatása sikeres!"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "CA tanúsítvány elérési útja"
msgid "Please enter your username and password."
msgstr "Adja meg a felhasználónevét és a jelszavát."
-msgid "Please wait: Device rebooting..."
-msgstr "Kérem várjon: az eszköz újraindul..."
-
msgid "Policy"
msgstr "Szabály"
msgid "Size"
msgstr "Méret"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Ugrás"
msgid "The selected protocol needs a device assigned"
msgstr "A kiválasztott protokoll eszköz hozzárendelést igényel"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "Az átjátszó IPV4 címe"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Várakozás a parancs befejezésére..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Figyelmeztetés"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Figyelem: vannak el nem mentett változások melyek el fognak veszni az "
-"újraindítás során!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Vissza"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "IPv6 egyeztetés engedélyezése a PPP linken"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "A hosts fájlok figyelmen kívül hagyása"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Kérem várjon: az eszköz újraindul..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Figyelem: vannak el nem mentett változások melyek el fognak veszni az "
+#~ "újraindítás során!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
msgid "15 Minute Load:"
msgstr "Carico in 15 minut:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Carico in 5 minuti:"
msgid "Additional Hosts files"
msgstr "File Hosts Aggiuntivo"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Indirizzo"
msgstr "Autorizzazione richiesta"
msgid "Auto Refresh"
-msgstr "Aggironamento Automatico"
+msgstr "Aggiornamento Automatico"
msgid "Automatic"
msgstr ""
msgid "Average:"
msgstr "Media:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Buffered"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Pulsanti"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configurazione del dispositivo"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostica"
msgid "Distance to farthest network member in meters."
msgstr "Distanza del membro più lontano della rete in metri."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversità"
"Fornisci dinamicamente gli indirizzi DHCP ai client. Se disabilitato, solo i "
"client con un indirizzo statico saranno serviti."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Metodo EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Abilitazione aggiornamento endpoint dinamico HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Attiva la negoziazione IPv6 sul collegamento PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Abilita Jumbo Frame passthrough"
msgid "Force TKIP and CCMP (AES)"
msgstr "Forza TKIP e CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Inoltra il traffico DHCP"
msgid "General Setup"
msgstr "Impostazioni Generali"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Genera Archivio"
msgid "IPv4 only"
msgstr "Solo IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Lunghezza prefisso IPv4"
"dispositivo di swap non può essere acceduto alle alte velocità della <abbr "
"title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignora i files Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignora <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ignora interfaccia"
msgid "In"
msgstr "In"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Tempo di Inattività"
msgid "MAC-List"
msgstr "Lista MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Velocità massima"
msgid "NAS ID"
msgstr "ID della NAS"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "E' richiesto il pacchetto libiwinfo!"
msgid "Password successfully changed!"
msgstr "Password cambiata con successo!"
-msgid "Path"
-msgstr "Percorso"
-
msgid "Path to CA-Certificate"
msgstr "Percorso al certificato CA"
msgid "Please enter your username and password."
msgstr "Per favore inserisci il tuo username e la password."
-msgid "Please wait: Device rebooting..."
-msgstr "Per favore attendi: Riavvio del dispositivo..."
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr "Dimensione"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Salta"
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "In attesa del comando da completare..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Avviso"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Attenzione: Ci sono modifiche non salvate che verranno persi riavviando!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Indietro"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Attiva la negoziazione IPv6 sul collegamento PPP"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignora i files Hosts"
+
+#~ msgid "Path"
+#~ msgstr "Percorso"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Per favore attendi: Riavvio del dispositivo..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Attenzione: Ci sono modifiche non salvate che verranno persi riavviando!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Qui puoi configurare i tuoi dispositivi wireless installati."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignora <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Independente (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "過去15分の負荷:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "過去5分の負荷:"
msgid "Additional Hosts files"
msgstr "追加のホストファイル"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "アドレス"
msgid "Average:"
msgstr "平均値:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "バッファ"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "ボタン"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "デバイス設定"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "診断機能"
msgid "Distance to farthest network member in meters."
msgstr "最も遠い端末との距離(メートル)を設定してください。"
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "ダイバシティ"
"クライアントに対して動的にDHCPアドレスを割り振ります。無効に設定した場合、静"
"的リースのみを行います。"
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAPメソッド"
msgid "Enable HE.net dynamic endpoint update"
msgstr "HE.netの動的endpoint更新を有効にします"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "PPPリンクのIPv6ネゴシエーションを有効にする"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "ジャンボフレーム・パススルーを有効にする"
msgid "Force TKIP and CCMP (AES)"
msgstr "TKIP 及びCCMP (AES) を使用"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "DHCPトラフィックを転送する"
msgid "General Setup"
msgstr "一般設定"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "バックアップアーカイブの作成"
msgid "IPv4 only"
msgstr "IPv4のみ"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "IPv4 プレフィクス長"
"title=\"Random Access Memory\">RAM</abbr>にアクセスすることができなくなる恐れ"
"があります。"
-msgid "Ignore Hosts files"
-msgstr "ホストファイルを無視する"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "<code>/etc/hosts</code>を無視"
msgid "Ignore interface"
msgstr "インターフェースを無視する"
msgid "In"
msgstr "イン"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "未使用時タイムアウト"
msgid "MAC-List"
msgstr "MAC-リスト"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "最大レート"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "libiwinfo パッケージをインストールしてください!"
msgid "Password successfully changed!"
msgstr "パスワードを変更しました"
-msgid "Path"
-msgstr "パス"
-
msgid "Path to CA-Certificate"
msgstr "CA証明書のパス"
msgid "Please enter your username and password."
msgstr "ユーザー名とパスワードを入力してください。"
-msgid "Please wait: Device rebooting..."
-msgstr "しばらくお待ちください: 再起動中です..."
-
msgid "Policy"
msgstr "ポリシー"
msgid "Size"
msgstr "サイズ"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "スキップ"
msgid "The selected protocol needs a device assigned"
msgstr "選択中のプロトコルを使用する場合、デバイスを設定する必要があります"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "コマンド実行中です..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "警告"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "警告: 保存されていない変更は再起動後に失われます!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« 戻る"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "PPPリンクのIPv6ネゴシエーションを有効にする"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "ホストファイルを無視する"
+
+#~ msgid "Path"
+#~ msgstr "パス"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "しばらくお待ちください: 再起動中です..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "警告: 保存されていない変更は再起動後に失われます!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "ここではインストールされた無線デバイスの設定を行うことが出来ます。"
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "<code>/etc/hosts</code>を無視"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "アドホック"
msgid "15 Minute Load:"
msgstr ""
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr ""
msgid "Additional Hosts files"
msgstr ""
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr ""
msgid "Average:"
msgstr ""
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr ""
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Butang"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr "Mengkustomisasi perilaku peranti LED jika mungkin."
msgid "Device Configuration"
msgstr ""
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
msgid "Distance to farthest network member in meters."
msgstr "Jarak ke rangkaian terjauh ahli dalam meter."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Keanekaragaman"
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-Kaedah"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr "Setup Umum"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"sangat lambat kerana peranti-penukar tidak boleh diakses dengan datarates "
"yang tinggi pada RAM."
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Mengabaikan /etc/hosts"
msgid "Ignore interface"
msgstr "Abaikan antara muka"
msgid "In"
msgstr "Masuk"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr "Senarai MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Rate Maksimum"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr "Path"
-
msgid "Path to CA-Certificate"
msgstr "Path ke CA-Sijil"
msgid "Please enter your username and password."
msgstr "Sila masukkan username dan kata laluan anda."
-msgid "Please wait: Device rebooting..."
-msgstr "Sila tunggu: Peranti sedang reboot..."
-
msgid "Policy"
msgstr "Dasar"
msgid "Size"
msgstr "Saiz"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Skip"
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Amaran: Ada perubahan yang belum disimpan akan hilang saat reboot!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Kembali"
+#~ msgid "Path"
+#~ msgstr "Path"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Sila tunggu: Peranti sedang reboot..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "Amaran: Ada perubahan yang belum disimpan akan hilang saat reboot!"
+
#~ msgid "Frequency Hopping"
#~ msgstr "Melompat Frekuensi"
#~ "dipilih. Hapus tanda pada pilihan untuk menentukan melampirkan rangkaian "
#~ "mandiri baru untuk antara muka ini."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Mengabaikan /etc/hosts"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "(Ad-Hoc) Tersendiri"
msgid "15 Minute Load:"
msgstr "15 minutters belastning:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "5 minutters belastning:"
msgid "Additional Hosts files"
msgstr "Tilleggs vertsfiler"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adresse"
msgid "Average:"
msgstr "Gjennomsnitt:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Bufret"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Knapper"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Enhet Konfigurasjon"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Nettverksdiagnostikk"
msgid "Distance to farthest network member in meters."
msgstr "Avstand i meter til det medlem av nettverket som er lengst unna."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Antennevariasjon"
"Dynamisk tildeling av DHCP adresser til klienter. Om deaktivert, kan en kun "
"bruke klienter med statisk leie."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-metode"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Aktiver HE,net dynamisk endepunkt oppdatering"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Aktiver IPv6 på PPP lenke"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Aktiver Jumbo Frames gjennomgang"
msgid "Force TKIP and CCMP (AES)"
msgstr "Bruk TKIP og CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Videresend DHCP trafikk"
msgid "General Setup"
msgstr "Generelt Oppsett"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Opprett arkiv"
msgid "IPv4 only"
msgstr "Kun IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "IPv4 prefikslengde"
"\"Random Access Memory\">RAM</abbr>. Vær oppmerksom på at bruk av swap er "
"mye langsommere en <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignorer vertsfiler"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
msgid "Ignore interface"
msgstr "Ignorer grensesnitt"
msgid "In"
msgstr "i"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Tidsavbrudd etter innaktivitet"
msgid "MAC-List"
msgstr "MAC-Liste"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Maksimal hastighet"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Pakken libiwinfo er nødvendig!"
msgid "Password successfully changed!"
msgstr "Passordet er endret!"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "Sti til CA-sertifikat"
msgid "Please enter your username and password."
msgstr "Skriv inn ditt brukernavn og passord."
-msgid "Please wait: Device rebooting..."
-msgstr "Vent: Enheten starter på nytt..."
-
msgid "Policy"
msgstr "Policy"
msgid "Size"
msgstr "Størrelse"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Gå videre"
msgid "The selected protocol needs a device assigned"
msgstr "Den valgte protokoll må ha en enhet tilknyttet"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "Dette IPv4 adressen til relayet"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Venter på at kommando fullføres..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Advarsel"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Advarsel: Det er ulagrede endringer som vil gå tapt under omstarten!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Tilbake"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Aktiver IPv6 på PPP lenke"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorer vertsfiler"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Vent: Enheten starter på nytt..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Advarsel: Det er ulagrede endringer som vil gå tapt under omstarten!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
msgstr ""
msgid "1 Minute Load:"
-msgstr "Obciążenie w ciągu 1 minuty:"
+msgstr "Obciążenie 1 min.:"
msgid "15 Minute Load:"
-msgstr "Obciążenie w ciągu 15 minut:"
+msgstr "Obciążenie 15 min.:"
+
+msgid "464XLAT (CLAT)"
+msgstr ""
msgid "5 Minute Load:"
-msgstr "Obciążenie w ciągu 5 minut:"
+msgstr "Obciążenie 5 min.:"
msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
msgid "Additional Hosts files"
msgstr "Dodatkowe pliki Hosts"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adres"
msgid "Average:"
msgstr "Średnia:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Buforowana"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Przyciski"
msgid "Custom delegated IPv6-prefix"
msgstr ""
+msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
# Spacji zabrało i napisy się skleiły
msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
msgid "Device Configuration"
msgstr "Konfiguracja urządzenia"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnostyka"
msgid "Distance to farthest network member in meters."
msgstr "Odległość do najdalej oddalonego członka sieci w metrach."
+msgid "Distribution feeds"
+msgstr ""
+
# Jak poprzednio trzymam się konwencji
msgid "Diversity"
msgstr "Wielorakość"
"Dynamicznie rezerwuje adresy DHCP dla klientów. Jeśli jest wyłączone tylko "
"klienci posiadający stałe dzierżawy będą obsłużeni."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Metoda EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Włącz dynamiczną aktualizację punktu końcowego sieci HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Włącz negocjację IPv6 na łączu PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Włącz przechodzenie ramek Jumbo"
msgid "Force TKIP and CCMP (AES)"
msgstr "Wymuś TKIP i CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Przekazuj ruch DHCP"
msgid "General Setup"
msgstr "Ustawienia podstawowe"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Twórz archiwum"
msgid "IPv4 only"
msgstr "Tylko IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Długość prefiksu IPv4"
"Memory\">RAM</abbr> będzie dostępna. Uwaga - plik wymiany jest dużo "
"wolniejszy niż pamięć <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignoruj pliki Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
msgid "Ignore interface"
msgstr "Ignoruj interfejs"
msgid "In"
msgstr "W"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Czas bezczynności"
msgid "MAC-List"
msgstr "Lista MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Maksymalna Szybkość"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgstr "Wychodzące"
msgid "Outbound:"
-msgstr "Wychodzące:"
+msgstr "Wychodzący:"
msgid "Outdoor Channels"
msgstr "Kanały zewnętrzne"
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Wymagany pakiet libiwinfo!"
msgid "Password successfully changed!"
msgstr "Pomyślnie zmieniono hasło!"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "Ścieżka do certyfikatu CA"
msgid "Please enter your username and password."
msgstr "Proszę wprowadź swój login i hasło."
-msgid "Please wait: Device rebooting..."
-msgstr "Proszę czekać: Ponowne uruchamianie..."
-
msgid "Policy"
msgstr "Zasada"
msgid "Size"
msgstr "Rozmiar"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Pomiń"
msgid "The selected protocol needs a device assigned"
msgstr "Wybrany protokół potrzebuje przypisanego urządzenia"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "Ten adres IPv4 przekaźnika"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Trwa wykonanie polecenia..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Ostrzeżenie"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Ostrzeżenie: Pozostały niezapisane zmian, które zostaną utracone podczas "
-"restartu!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Wróć"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Włącz negocjację IPv6 na łączu PPP"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignoruj pliki Hosts"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Proszę czekać: Ponowne uruchamianie..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Ostrzeżenie: Pozostały niezapisane zmian, które zostaną utracone podczas "
+#~ "restartu!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
msgid "15 Minute Load:"
msgstr "Carga 15 Minutos:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Carga 5 Minutos:"
msgid "Additional Hosts files"
msgstr "Arquivos adicionais de equipamentos conhecidos (hosts)"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Endereço"
msgid "Average:"
msgstr "Média:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Buffered"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Botões"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configuração do Dispositivo"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnóstico"
msgid "Distance to farthest network member in meters."
msgstr "Distância para o computador mais distante da rede (em metros)."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversidade"
"Aloca dinamicamente os endereços do DHCP para os clientes. Se desabilitado, "
"somente os clientes com atribuições estáticas serão servidos. "
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Método EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Ativar a atualização de ponto final dinâmico HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Ativar a negociação de IPv6 no enlace PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Ativar o encaminhamento de quadros jumbos (Jumbo Frames)"
msgid "Force TKIP and CCMP (AES)"
msgstr "Forçar TKIP e CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Encaminhar tráfego DHCP"
msgid "General Setup"
msgstr "Configurações Gerais"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Gerar arquivo"
msgid "IPv4 only"
msgstr "Somente IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Tamanho do prefixo IPv4"
"de transferência tão altas com a memória <abbr title=\"Memória de Acesso "
"Aleatório\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignorar arquivos de equipamentos conhecidos (hosts)"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorar <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ignorar interface"
msgid "In"
msgstr "Entrada"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Tempo limite de inatividade"
msgid "MAC-List"
msgstr "Lista de MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Taxa Máxima"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "O pacote libiwinfo é necessário!"
msgid "Password successfully changed!"
msgstr "A senha foi alterada com sucesso!"
-msgid "Path"
-msgstr "Directório"
-
msgid "Path to CA-Certificate"
msgstr "Caminho para o Certificado da AC"
msgid "Please enter your username and password."
msgstr "Entre com o seu usuário e senha."
-msgid "Please wait: Device rebooting..."
-msgstr "Por favor aguarde: Equipamento reiniciando..."
-
msgid "Policy"
msgstr "Política"
msgid "Size"
msgstr "Tamanho"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Pular"
msgid "The selected protocol needs a device assigned"
msgstr "O protocolo selecionado necessita estar associado a um dispositivo"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr "Este endereço IPv4 do repassar"
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Esperando o término do comando..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Atenção"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Aviso: Existem alterações não salvas que serão perdidas durante a "
-"reiniciação!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Voltar"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Ativar a negociação de IPv6 no enlace PPP"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorar arquivos de equipamentos conhecidos (hosts)"
+
+#~ msgid "Path"
+#~ msgstr "Directório"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Por favor aguarde: Equipamento reiniciando..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Aviso: Existem alterações não salvas que serão perdidas durante a "
+#~ "reiniciação!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Aqui pode configurar os dispositivos wifi instalados. "
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorar <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Independente (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "Carga de 15 minutos:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Carga 5 Minutos:"
msgid "Additional Hosts files"
msgstr "Ficheiro Adicional de Hosts"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Endereço"
msgid "Average:"
msgstr "Média:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Botões"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configuração do Dispositivo"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnósticos"
msgid "Distance to farthest network member in meters."
msgstr "Distância para o último host da rede em metros."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversidade"
"Alocar dinamicamente endereços DHCP para clientes. Se desativado, só os "
"clientes com reservas estáticas serão servidos."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Metodo-EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Ativar a atualização dinâmica de ponto final HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Ativar a negociação IPv6 no link PPP"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Ativar a passagem de Jumbo Frames"
msgid "Force TKIP and CCMP (AES)"
msgstr "Forçar TKIP e CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Encaminhar tráfego DHCP"
msgid "General Setup"
msgstr "Configuração Geral"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Gerar arquivo"
msgid "IPv4 only"
msgstr "Só IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Comprimento do prefixo IPv4"
"lento pois o dispositivo swap não pode ser acedido com um nível elevado de "
"memória <abbr title=\"Memória de Acesso Aleatório\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ignorar ficheiros de Hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignorar <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Ignorar interface"
msgid "In"
msgstr "Entrada"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Tempo de inatividade"
msgid "MAC-List"
msgstr "Lista-MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Taxa Máxima"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtp"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "O pacote libiwinfo é necessário!"
msgid "Password successfully changed!"
msgstr "Password alterada com sucesso!"
-msgid "Path"
-msgstr "Directório"
-
msgid "Path to CA-Certificate"
msgstr "Directorio do Certificado CA"
msgid "Please enter your username and password."
msgstr "Insira o seu username e password."
-msgid "Please wait: Device rebooting..."
-msgstr "Por favor aguarde: Equipamento a reiniciar..."
-
msgid "Policy"
msgstr "Política"
msgid "Size"
msgstr "Tamanho"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Saltar"
msgid "The selected protocol needs a device assigned"
msgstr "O protocolo escolhido precisa de um dispositivo atribuído."
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "A aguardar que o comando termine..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Aviso"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Aviso: Existem alterações não salvas que serão perdidas durante a "
-"reinicialização!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Voltar"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Ativar a negociação IPv6 no link PPP"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ignorar ficheiros de Hosts"
+
+#~ msgid "Path"
+#~ msgstr "Directório"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Por favor aguarde: Equipamento a reiniciar..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Aviso: Existem alterações não salvas que serão perdidas durante a "
+#~ "reinicialização!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Aqui pode configurar os dispositivos wifi instalados. "
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignorar <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Independente (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "Incarcarea in ultimele 15 minute"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Incarcarea in ultimele 5 minute"
msgid "Additional Hosts files"
msgstr "Fisiere de tip hosts aditionale"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adresa"
msgid "Average:"
msgstr "Medie:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Incarcat"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Butoane"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Configurarea dispozitivului"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Diagnosticuri"
msgid "Distance to farthest network member in meters."
msgstr "Distanta catre cel mai departat membru din retea in metri."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Diversitate"
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr "Forteaza TKIP si CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr "Configurare generala"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr "Doar IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
msgstr ""
msgid "Ignore interface"
msgid "In"
msgstr ""
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr ""
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Rata maxima"
msgid "NAS ID"
msgstr ""
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Pachetul libiwinfo este necesar !"
msgid "Password successfully changed!"
msgstr "Parola schimbata cu succes !"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "Calea catre certificatul CA"
msgid "Please enter your username and password."
msgstr "Introdu utilizatorul si parola."
-msgid "Please wait: Device rebooting..."
-msgstr "Asteapta: dispozitivul se restarteaza.."
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr "Marime"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Avertizare"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Atentie: exista modificari nesalvate care vor fi pierdute la restart !"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Inapoi"
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Asteapta: dispozitivul se restarteaza.."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Atentie: exista modificari nesalvate care vor fi pierdute la restart !"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
msgid "15 Minute Load:"
msgstr "Загрузка за 15 минут:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Загрузка за 5 минут:"
msgid "Additional Hosts files"
msgstr "Дополнительные файлы hosts"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Адрес"
msgid "Average:"
msgstr "Средняя:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Буферизировано"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Кнопки"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Конфигурация устройства"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Диагностика"
msgid "Distance to farthest network member in meters."
msgstr "Расстояние до самого удалённого сетевого узла в метрах."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Разновидность антенн"
"Динамически выделять DHCP-адреса клиентам. Если выключено, то будут "
"обслужены только клиенты с постоянно арендованными адресами."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "Метод EAP"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Включить динамическое обновление оконечной точки HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Включить IPv6-согласование на PPP-соединении"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Пропускать Jumbo-кадры"
msgid "Force TKIP and CCMP (AES)"
msgstr "TKIP или CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Перенаправлять трафик DHCP"
msgid "General Setup"
msgstr "Основные настройки"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Создать архив"
msgid "IPv4 only"
msgstr "Только IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Длина префикса IPv4"
"устройство, на котором располагается раздел подкачки, работает гораздо "
"медленнее, чем <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Игнорировать файлы hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Ignore <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Игнорировать интерфейс"
msgid "In"
msgstr "В"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Таймаут бездействия"
msgid "MAC-List"
msgstr "Список MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "МБ/с"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Максимальная скорость"
msgid "NAS ID"
msgstr "Идентификатор NAS"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPTP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Требуется пакет libiwinfo!"
msgid "Password successfully changed!"
msgstr "Пароль успешно изменён!"
-msgid "Path"
-msgstr "Путь"
-
msgid "Path to CA-Certificate"
msgstr "Путь к центру сертификации"
msgid "Please enter your username and password."
msgstr "Пожалуйста, введите логин и пароль."
-msgid "Please wait: Device rebooting..."
-msgstr "Пожалуйста подождите: устройство перезагружается..."
-
msgid "Policy"
msgstr "Политика"
msgid "Size"
msgstr "Размер"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Пропустить"
msgid "The selected protocol needs a device assigned"
msgstr "Для выбранного протокола необходимо задать устройство"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Ожидание завершения выполнения команды..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Внимание"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Внимание: есть несохранённые изменения, которые потеряются после "
-"перезагрузки!"
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Назад"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Включить IPv6-согласование на PPP-соединении"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Игнорировать файлы hosts"
+
+#~ msgid "Path"
+#~ msgstr "Путь"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Пожалуйста подождите: устройство перезагружается..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Внимание: есть несохранённые изменения, которые потеряются после "
+#~ "перезагрузки!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Здесь вы можете настроить установленные Wi-Fi устройства."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Ignore <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Незаыисимая (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr ""
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr ""
msgid "Additional Hosts files"
msgstr ""
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr ""
msgid "Average:"
msgstr ""
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr ""
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr ""
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr ""
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
msgid "Distance to farthest network member in meters."
msgstr ""
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr ""
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
msgstr ""
msgid "Ignore interface"
msgid "In"
msgstr ""
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr ""
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr ""
msgid "NAS ID"
msgstr ""
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr ""
msgid "Please enter your username and password."
msgstr ""
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr ""
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgid "15 Minute Load:"
msgstr "Belastning senaste 15 minutrarna:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Belastning senaste 5 minutrarna:"
msgid "Additional Hosts files"
msgstr ""
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr ""
msgid "Average:"
msgstr ""
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr ""
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr ""
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr ""
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
msgid "Distance to farthest network member in meters."
msgstr ""
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr ""
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
msgstr ""
msgid "Ignore interface"
msgid "In"
msgstr ""
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr ""
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr ""
msgid "NAS ID"
msgstr ""
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr ""
msgid "Please enter your username and password."
msgstr ""
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr ""
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgid "15 Minute Load:"
msgstr ""
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr ""
msgid "Additional Hosts files"
msgstr ""
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr ""
msgid "Average:"
msgstr ""
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr ""
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr ""
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr ""
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
msgid "Distance to farthest network member in meters."
msgstr ""
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr ""
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
msgid "Edit"
msgstr ""
+msgid ""
+"Edit the raw configuration data above to fix any error and hit \"Save\" to "
+"reload the page."
+msgstr ""
+
msgid "Edit this interface"
msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
msgstr ""
msgid "Ignore interface"
msgid "In"
msgstr ""
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr ""
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr ""
msgid "NAS ID"
msgstr ""
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr ""
msgid "Please enter your username and password."
msgstr ""
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr ""
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
"code> and <code>_</code>"
msgstr ""
+msgid "The configuration file could not be loaded due to the following error:"
+msgstr ""
+
msgid ""
"The device file of the memory or partition (<abbr title=\"for example\">e.g."
"</abbr> <code>/dev/sda1</code>)"
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgid "15 Minute Load:"
msgstr "15 Dakikalık Yük:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "5 Dakikalık Yük:"
msgid "Additional Hosts files"
msgstr ""
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Adresler"
msgid "Average:"
msgstr "Ortalama:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr ""
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr ""
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr ""
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
msgid "Distance to farthest network member in meters."
msgstr ""
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr ""
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr ""
-msgid "Ignore Hosts files"
+msgid "Ignore <code>/etc/hosts</code>"
msgstr ""
msgid "Ignore interface"
msgid "In"
msgstr ""
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr ""
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr ""
msgid "NAS ID"
msgstr ""
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr ""
msgid "Please enter your username and password."
msgstr ""
-msgid "Please wait: Device rebooting..."
-msgstr ""
-
msgid "Policy"
msgstr ""
msgid "Size"
msgstr ""
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgid "15 Minute Load:"
msgstr "Навантаження за 15 хвилин:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "Навантаження за 5 хвилин:"
msgid "Additional Hosts files"
msgstr "Додаткові файли hosts"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "Адреса"
msgid "Average:"
msgstr "Середнє значення:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "Буферизовано"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "Кнопки"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "Конфігурація пристрою"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "Діагностика"
msgid "Distance to farthest network member in meters."
msgstr "Відстань до найвіддаленішого вузла мережі в метрах."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Різновидність"
"Динамічне виділення DHCP-адрес для клієнтів. Якщо вимкнути, будуть "
"обслуговуватися тільки клієнти, які мають статичні оренди."
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-Метод"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Увімкнути динамічне оновлення кінцевої точки HE.net"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "Увімкнути узгодження IPv6 для PPP-з'єднань"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "Пропускати Jumbo-фрейми"
msgid "Force TKIP and CCMP (AES)"
msgstr "Примусово TKIP та CCMP (AES)"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "Спрямовувати DHCP-трафік"
msgid "General Setup"
msgstr "Загальні настройки"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "Cтворити архів"
msgid "IPv4 only"
msgstr "Тільки IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "Довжина префікса IPv4"
"своп-пристрої не можуть бути доступні з такою високою швидкістю, як <abbr "
"title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr "Ігнорувати файли hosts"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
msgid "Ignore interface"
msgstr "Ігнорувати интерфейс"
msgid "In"
msgstr "Вх."
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "Тайм-аут бездіяльності"
msgid "MAC-List"
msgstr "MAC-список"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MБ/с"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Максимальна швидкість"
msgid "NAS ID"
msgstr "Ідентифікатор NAS"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "Потрібен пакет libiwinfo!"
msgid "Password successfully changed!"
msgstr "Пароль успішно змінено!"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "Шлях до центру сертифікції"
msgid "Please enter your username and password."
msgstr "Введіть ім'я користувача і пароль"
-msgid "Please wait: Device rebooting..."
-msgstr "Зачекайте. Пристрій перезавантажується..."
-
msgid "Policy"
msgstr "Політика"
msgid "Size"
msgstr "Розмір"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "Пропустити"
msgid "The selected protocol needs a device assigned"
msgstr "Обраний протокол потребує призначених пристроїв"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "Очікуємо завершення виконання команди..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "Застереження"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Увага: Є незбережені зміни, які будуть втрачені при перезавантаженні!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« Назад"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "Увімкнути узгодження IPv6 для PPP-з'єднань"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "Ігнорувати файли hosts"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Зачекайте. Пристрій перезавантажується..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr ""
+#~ "Увага: Є незбережені зміни, які будуть втрачені при перезавантаженні!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
msgid "15 Minute Load:"
msgstr ""
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr ""
msgid "Additional Hosts files"
msgstr ""
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr ""
msgid "Average:"
msgstr ""
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr ""
msgid "Buffered"
msgstr ""
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr ""
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr ""
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr ""
msgid "Distance to farthest network member in meters."
msgstr "Khoảng cách tới thành viên xa nhất trong mạng lưới tính bằng mét"
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "Tính đa dạng"
"having static leases will be served."
msgstr ""
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-Method"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr ""
-
msgid "Enable Jumbo Frame passthrough"
msgstr ""
msgid "Force TKIP and CCMP (AES)"
msgstr ""
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr ""
msgid "General Setup"
msgstr ""
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr ""
msgid "IPv4 only"
msgstr ""
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr ""
"một quá trình rất chậm vì một thiết bị swap không thể được truy cập với "
"datarates cao hơn của <abbr title=\"Random Access Memory\">RAM</abbr>."
-msgid "Ignore Hosts files"
-msgstr ""
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "Lờ đi <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "Lờ đi giao diện"
msgid "In"
msgstr "Trong"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr ""
msgid "MAC-List"
msgstr "Danh sách MAC"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr ""
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "Mức cao nhất"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr ""
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr ""
msgid "Password successfully changed!"
msgstr ""
-msgid "Path"
-msgstr "Đường dẫn"
-
msgid "Path to CA-Certificate"
msgstr "Đường dẫn tới CA-Certificate"
msgid "Please enter your username and password."
msgstr "Nhập tên và mật mã"
-msgid "Please wait: Device rebooting..."
-msgstr "Xin chờ: Công cụ đang reboot"
-
msgid "Policy"
msgstr "Chính sách"
msgid "Size"
msgstr "Dung lượng "
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr ""
msgid "The selected protocol needs a device assigned"
msgstr ""
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr ""
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr ""
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "Cảnh báo: Các thay đổi chưa lưu sẽ bị mất trong khi khởi động lại!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr ""
+#~ msgid "Path"
+#~ msgstr "Đường dẫn"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "Xin chờ: Công cụ đang reboot"
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "Cảnh báo: Các thay đổi chưa lưu sẽ bị mất trong khi khởi động lại!"
+
#~ msgid "Frequency Hopping"
#~ msgstr "Tần số Hopping"
#~ msgid "Here you can configure installed wifi devices."
#~ msgstr "Ở đây bạn có thể định cấu hình của công cụ wifi được cài đặt."
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "Lờ đi <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "Độc lập (Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "15分钟负载:"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "5分钟负载:"
msgid "Additional Hosts files"
msgstr "额外的HOSTS文件"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "地址"
msgid "Average:"
msgstr "平均:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "已缓冲"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "按键"
msgstr "自定义分配的IPv6前缀"
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr "自定义<abbr title=\"Light Emitting Diode\">LED</abbr>的活动状态。"
msgid "Device Configuration"
msgstr "设备配置"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "网络诊断"
msgid "Distance to farthest network member in meters."
msgstr "最远客户端的距离(米)。"
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "分集"
"having static leases will be served."
msgstr "动态分配DHCP地址。如果禁用,则只能为静态租用表中的客户端提供网络服务。"
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP-Method"
msgid "Enable HE.net dynamic endpoint update"
msgstr "启用HE.net动态终端更新"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "在PPP链路上启用IPv6协商"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "启用巨型帧透传"
msgid "Force TKIP and CCMP (AES)"
msgstr "TKIP和CCMP(AES)混合加密"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "转发DHCP数据包"
msgid "General Setup"
msgstr "基本设置"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "生成备份"
msgid "IPv4 only"
msgstr "仅IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "IPv4地址前缀长度"
"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
msgstr "如果物理内存不足,闲置数据可自动移到交换区暂存,以提高可用内存。"
-msgid "Ignore Hosts files"
-msgstr "忽略HOSTS文件"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr "忽略 <code>/etc/hosts</code>"
msgid "Ignore interface"
msgstr "关闭DHCP"
msgid "In"
msgstr "入口"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "活动超时"
msgid "MAC-List"
msgstr "MAC-列表"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr "请确认你已经复制过整个根文件系统,例如使用以下命令:"
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "最高速率"
msgid "NAS ID"
msgstr "NAS ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr "NDP-代理"
msgid "PPtP"
msgstr "PPtP"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "需要libiwinfo软件包!"
msgid "Password successfully changed!"
msgstr "密码修改成功!"
-msgid "Path"
-msgstr "路径"
-
msgid "Path to CA-Certificate"
msgstr "CA证书路径"
msgid "Please enter your username and password."
msgstr "请输入用户名和密码。"
-msgid "Please wait: Device rebooting..."
-msgstr "请稍等:设备重启中..."
-
msgid "Policy"
msgstr "策略"
msgid "Size"
msgstr "大小"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "跳过"
msgid "The selected protocol needs a device assigned"
msgstr "所选的协议需要分配设备"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "正在执行命令..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "警告"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "警告: 有尚未保存的更改,重启将丢失!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« 后退"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "在PPP链路上启用IPv6协商"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "忽略HOSTS文件"
+
+#~ msgid "Path"
+#~ msgstr "路径"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "请稍等:设备重启中..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "警告: 有尚未保存的更改,重启将丢失!"
+
#~ msgid "CPU frequency"
#~ msgstr "CPU 频率"
#~ "如果连接在已有网络,那么它会被<em>桥接</em>到现有接口,并且被所选的防火墙"
#~ "区域覆盖。取消附加选项可以重定义此接口为新的独立网络。"
-#~ msgid "Ignore <code>/etc/hosts</code>"
-#~ msgstr "忽略 <code>/etc/hosts</code>"
-
#~ msgid "Independent (Ad-Hoc)"
#~ msgstr "独立(点对点Ad-Hoc)"
msgid "15 Minute Load:"
msgstr "15分鐘負載"
+msgid "464XLAT (CLAT)"
+msgstr ""
+
msgid "5 Minute Load:"
msgstr "5分鐘負載"
msgid "Additional Hosts files"
msgstr "額外的HOST檔案"
+msgid "Additional servers file"
+msgstr ""
+
msgid "Address"
msgstr "位置"
msgid "Average:"
msgstr "平均:"
+msgid "BR / DMR / AFTR"
+msgstr ""
+
msgid "BSSID"
msgstr "BSSID"
msgid "Buffered"
msgstr "已緩衝"
+msgid ""
+"Build/distribution specific feed definitions. This file will NOT be "
+"preserved in any sysupgrade."
+msgstr ""
+
msgid "Buttons"
msgstr "按鈕"
msgstr ""
msgid ""
+"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
+"sysupgrade."
+msgstr ""
+
+msgid "Custom feeds"
+msgstr ""
+
+msgid ""
"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
"\">LED</abbr>s if possible."
msgstr ""
msgid "Device Configuration"
msgstr "設定設備"
+msgid "Device is rebooting..."
+msgstr ""
+
+msgid "Device unreachable"
+msgstr ""
+
msgid "Diagnostics"
msgstr "診斷"
msgid "Distance to farthest network member in meters."
msgstr "到最遠的網路距離以米表示."
+msgid "Distribution feeds"
+msgstr ""
+
msgid "Diversity"
msgstr "差異"
"having static leases will be served."
msgstr "幫用戶端動態發配DHCP位址. 假如關閉的話,僅有有靜態位址的用戶端能被服務"
+msgid "EA-bits length"
+msgstr ""
+
msgid "EAP-Method"
msgstr "EAP協定驗證方式"
msgid "Enable HE.net dynamic endpoint update"
msgstr "啟用HE.net服務代管動態更新"
-msgid "Enable IPv6 negotiation on the PPP link"
-msgstr "啟用PPP連結上的IPv6交涉"
-
msgid "Enable Jumbo Frame passthrough"
msgstr "啟用超大訊框透穿"
msgid "Force TKIP and CCMP (AES)"
msgstr "強制TKIP+CCMP (AES)加密"
+msgid "Form token mismatch"
+msgstr ""
+
msgid "Forward DHCP traffic"
msgstr "轉發DHCP流量"
msgid "General Setup"
msgstr "一般設置"
+msgid "General options for opkg"
+msgstr ""
+
msgid "Generate archive"
msgstr "製作壓縮檔"
msgid "IPv4 only"
msgstr "僅用IPv4"
+msgid "IPv4 prefix"
+msgstr ""
+
msgid "IPv4 prefix length"
msgstr "IPv4前綴長度"
"緩慢的過程,作為交換裝置不能用高數據速率訪問該<abbr title=\"Random Access "
"Memory\">RAM</縮寫>"
-msgid "Ignore Hosts files"
-msgstr "被忽視的主機檔案"
+msgid "Ignore <code>/etc/hosts</code>"
+msgstr ""
msgid "Ignore interface"
msgstr "被忽視的介面"
msgid "In"
msgstr "輸入"
+msgid ""
+"In order to prevent unauthorized access to the system, your request has been "
+"blocked. Click \"Continue »\" below to return to the previous page."
+msgstr ""
+
msgid "Inactivity timeout"
msgstr "閒置過期"
msgid "MAC-List"
msgstr "MAC-清單"
+msgid "MAP / LW4over6"
+msgstr ""
+
msgid "MB/s"
msgstr "MB/s"
"below:"
msgstr ""
+msgid "Manual"
+msgstr ""
+
msgid "Maximum Rate"
msgstr "最快速度"
msgid "NAS ID"
msgstr " 網路附存伺服器ID"
+msgid "NAT64 Prefix"
+msgstr ""
+
msgid "NDP-Proxy"
msgstr ""
msgid "PPtP"
msgstr "PPtP點對點VPN虛擬私人隧道協定"
+msgid "PSID offset"
+msgstr ""
+
+msgid "PSID-bits length"
+msgstr ""
+
msgid "Package libiwinfo required!"
msgstr "軟體包必需有libiwinfo!"
msgid "Password successfully changed!"
msgstr "密碼已變更成功!"
-msgid "Path"
-msgstr ""
-
msgid "Path to CA-Certificate"
msgstr "CA-證書的路徑"
msgid "Please enter your username and password."
msgstr "請輸入你的用戶名稱和密碼"
-msgid "Please wait: Device rebooting..."
-msgstr "請稍等:設備正重開中..."
-
msgid "Policy"
msgstr "策略"
msgid "Size"
msgstr "大小"
+msgid "Size (.ipk)"
+msgstr ""
+
msgid "Skip"
msgstr "跳過"
msgid "The selected protocol needs a device assigned"
msgstr "選到的協定需要指定到設備上"
+msgid "The submitted security token is invalid or already expired!"
+msgstr ""
+
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
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 ""
+
+msgid ""
"This is a list of shell glob patterns for matching files and directories to "
"include during sysupgrade. Modified files in /etc/config/ and certain other "
"configurations are automatically preserved."
msgid "Waiting for command to complete..."
msgstr "等待完整性指令..."
+msgid "Waiting for device..."
+msgstr ""
+
msgid "Warning"
msgstr "警告"
-msgid "Warning: There are unsaved changes that will be lost while rebooting!"
-msgstr "警告:重開機後某些未存檔的修改將會漏失!"
+msgid "Warning: There are unsaved changes that will get lost on reboot!"
+msgstr ""
msgid "Whether to create an IPv6 default route over the tunnel"
msgstr ""
msgid "« Back"
msgstr "« 倒退"
+#~ msgid "Enable IPv6 negotiation on the PPP link"
+#~ msgstr "啟用PPP連結上的IPv6交涉"
+
+#~ msgid "Ignore Hosts files"
+#~ msgstr "被忽視的主機檔案"
+
+#~ msgid "Please wait: Device rebooting..."
+#~ msgstr "請稍等:設備正重開中..."
+
+#~ msgid ""
+#~ "Warning: There are unsaved changes that will be lost while rebooting!"
+#~ msgstr "警告:重開機後某些未存檔的修改將會漏失!"
+
#~ msgid ""
#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
#~ "this option does not comply with IEEE 802.11n-2009!"
config core main
option lang auto
- option mediaurlbase /luci-static/openwrt.org
+ option mediaurlbase /luci-static/bootstrap
option resourcebase /luci-static/resources
config extern flash_keep
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci" />
</head>
-<body style="background-color: black">
-<a style="color: white; text-decoration: none" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
+<body style="background-color: white">
+<a style="color: black; font-family: arial, helvetica, sans-serif;" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
</body>
</html>
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Administration - full-featured for full control
-LUCI_DEPENDS:=+luci-base +libubus-lua
+LUCI_DEPENDS:=+luci-base
PKG_BUILD_DEPENDS:=iwinfo
if sid then
utl.ubus("session", "destroy", { ubus_rpc_session = sid })
- dsp.context.urltoken.stok = nil
-
luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
})
end
- luci.http.redirect(luci.dispatcher.build_url())
+ luci.http.redirect(dsp.build_url())
end
-- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
+-- Copyright 2011-2015 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.admin.network", package.seeall)
end)
if has_wifi then
- page = entry({"admin", "network", "wireless_join"}, call("wifi_join"), nil)
+ page = entry({"admin", "network", "wireless_join"}, post("wifi_join"), nil)
page.leaf = true
- page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil)
+ page = entry({"admin", "network", "wireless_add"}, post("wifi_add"), nil)
page.leaf = true
- page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil)
+ page = entry({"admin", "network", "wireless_delete"}, post("wifi_delete"), nil)
page.leaf = true
page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil)
page.leaf = true
- page = entry({"admin", "network", "wireless_reconnect"}, call("wifi_reconnect"), nil)
+ page = entry({"admin", "network", "wireless_reconnect"}, post("wifi_reconnect"), nil)
page.leaf = true
- page = entry({"admin", "network", "wireless_shutdown"}, call("wifi_shutdown"), nil)
+ page = entry({"admin", "network", "wireless_shutdown"}, post("wifi_shutdown"), nil)
page.leaf = true
page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wifi"), 15)
page = entry({"admin", "network", "iface_add"}, cbi("admin_network/iface_add"), nil)
page.leaf = true
- page = entry({"admin", "network", "iface_delete"}, call("iface_delete"), nil)
+ page = entry({"admin", "network", "iface_delete"}, post("iface_delete"), nil)
page.leaf = true
page = entry({"admin", "network", "iface_status"}, call("iface_status"), nil)
page.leaf = true
- page = entry({"admin", "network", "iface_reconnect"}, call("iface_reconnect"), nil)
+ page = entry({"admin", "network", "iface_reconnect"}, post("iface_reconnect"), nil)
page.leaf = true
- page = entry({"admin", "network", "iface_shutdown"}, call("iface_shutdown"), nil)
+ page = entry({"admin", "network", "iface_shutdown"}, post("iface_shutdown"), nil)
page.leaf = true
page = entry({"admin", "network", "network"}, arcombine(cbi("admin_network/network"), cbi("admin_network/ifaces")), _("Interfaces"), 10)
page.title = _("Diagnostics")
page.order = 60
- page = entry({"admin", "network", "diag_ping"}, call("diag_ping"), nil)
+ page = entry({"admin", "network", "diag_ping"}, post("diag_ping"), nil)
page.leaf = true
- page = entry({"admin", "network", "diag_nslookup"}, call("diag_nslookup"), nil)
+ page = entry({"admin", "network", "diag_nslookup"}, post("diag_nslookup"), nil)
page.leaf = true
- page = entry({"admin", "network", "diag_traceroute"}, call("diag_traceroute"), nil)
+ page = entry({"admin", "network", "diag_traceroute"}, post("diag_traceroute"), nil)
page.leaf = true
- page = entry({"admin", "network", "diag_ping6"}, call("diag_ping6"), nil)
+ page = entry({"admin", "network", "diag_ping6"}, post("diag_ping6"), nil)
page.leaf = true
- page = entry({"admin", "network", "diag_traceroute6"}, call("diag_traceroute6"), nil)
+ page = entry({"admin", "network", "diag_traceroute6"}, post("diag_traceroute6"), nil)
page.leaf = true
-- end
end
function wifi_join()
- local function param(x)
- return luci.http.formvalue(x)
- end
-
- local function ptable(x)
- x = param(x)
- return x and (type(x) ~= "table" and { x } or x) or {}
- end
-
- local dev = param("device")
- local ssid = param("join")
+ local tpl = require "luci.template"
+ local http = require "luci.http"
+ local dev = http.formvalue("device")
+ local ssid = http.formvalue("join")
if dev and ssid then
- local cancel = (param("cancel") or param("cbi.cancel")) and true or false
-
- if cancel then
- luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless_join?device=" .. dev))
- else
+ local cancel = (http.formvalue("cancel") or http.formvalue("cbi.cancel"))
+ if not cancel then
local cbi = require "luci.cbi"
- local tpl = require "luci.template"
local map = luci.cbi.load("admin_network/wifi_add")[1]
if map:parse() ~= cbi.FORM_DONE then
map:render()
tpl.render("footer")
end
+
+ return
end
- else
- luci.template.render("admin_network/wifi_join")
end
+
+ tpl.render("admin_network/wifi_join")
end
function wifi_add()
function index()
entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true
entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
- entry({"admin", "status", "iptables"}, call("action_iptables"), _("Firewall"), 2).leaf = true
+
+ entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true
+ entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true
+
entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3)
entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4)
entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5)
function action_iptables()
if luci.http.formvalue("zero") then
- if luci.http.formvalue("zero") == "6" then
- luci.util.exec("ip6tables -Z")
+ if luci.http.formvalue("family") == "6" then
+ luci.util.exec("/usr/sbin/ip6tables -Z")
else
- luci.util.exec("iptables -Z")
+ luci.util.exec("/usr/sbin/iptables -Z")
end
- luci.http.redirect(
- luci.dispatcher.build_url("admin", "status", "iptables")
- )
- elseif luci.http.formvalue("restart") == "1" then
- luci.util.exec("/etc/init.d/firewall reload")
- luci.http.redirect(
- luci.dispatcher.build_url("admin", "status", "iptables")
- )
- else
- luci.template.render("admin_status/iptables")
+ elseif luci.http.formvalue("restart") then
+ luci.util.exec("/etc/init.d/firewall restart")
end
+
+ luci.http.redirect(luci.dispatcher.build_url("admin/status/iptables"))
end
function action_bandwidth(iface)
entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
- entry({"admin", "system", "clock_status"}, call("action_clock_status"))
+ entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status"))
entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2)
if fs.access("/bin/opkg") then
- entry({"admin", "system", "packages"}, call("action_packages"), _("Software"), 10)
+ entry({"admin", "system", "packages"}, post_on({ exec = "1" }, "action_packages"), _("Software"), 10)
entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg"))
end
end
entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70)
+ entry({"admin", "system", "flashops", "reset"}, post("action_reset"))
+ entry({"admin", "system", "flashops", "backup"}, post("action_backup"))
entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles"))
- entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90)
+ -- call() instead of post() due to upload handling!
+ entry({"admin", "system", "flashops", "restore"}, call("action_restore"))
+ entry({"admin", "system", "flashops", "sysupgrade"}, call("action_sysupgrade"))
+
+ entry({"admin", "system", "reboot"}, template("admin_system/reboot"), _("Reboot"), 90)
+ entry({"admin", "system", "reboot", "call"}, post("action_reboot"))
end
function action_clock_status()
function action_packages()
local fs = require "nixio.fs"
local ipkg = require "luci.model.ipkg"
- local submit = luci.http.formvalue("submit")
+ local submit = (luci.http.formvalue("exec") == "1")
+ local update, upgrade
local changes = false
local install = { }
local remove = { }
query = (query ~= '') and query or nil
- -- Packets to be installed
- local ninst = submit and luci.http.formvalue("install")
- local uinst = nil
-
- -- Install from URL
- local url = luci.http.formvalue("url")
- if url and url ~= '' and submit then
- uinst = url
- end
+ -- Modifying actions
+ if submit then
+ -- Packets to be installed
+ local ninst = luci.http.formvalue("install")
+ local uinst = nil
- -- Do install
- if ninst then
- install[ninst], out, err = ipkg.install(ninst)
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- changes = true
- end
+ -- Install from URL
+ local url = luci.http.formvalue("url")
+ if url and url ~= '' then
+ uinst = url
+ end
- if uinst then
- local pkg
- for pkg in luci.util.imatch(uinst) do
- install[uinst], out, err = ipkg.install(pkg)
+ -- Do install
+ if ninst then
+ install[ninst], out, err = ipkg.install(ninst)
stdout[#stdout+1] = out
stderr[#stderr+1] = err
changes = true
end
- end
- -- Remove packets
- local rem = submit and luci.http.formvalue("remove")
- if rem then
- remove[rem], out, err = ipkg.remove(rem)
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- changes = true
- end
+ if uinst then
+ local pkg
+ for pkg in luci.util.imatch(uinst) do
+ install[uinst], out, err = ipkg.install(pkg)
+ stdout[#stdout+1] = out
+ stderr[#stderr+1] = err
+ changes = true
+ end
+ end
+ -- Remove packets
+ local rem = luci.http.formvalue("remove")
+ if rem then
+ remove[rem], out, err = ipkg.remove(rem)
+ stdout[#stdout+1] = out
+ stderr[#stderr+1] = err
+ changes = true
+ end
- -- Update all packets
- local update = luci.http.formvalue("update")
- if update then
- update, out, err = ipkg.update()
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- end
+
+ -- Update all packets
+ update = luci.http.formvalue("update")
+ if update then
+ update, out, err = ipkg.update()
+ stdout[#stdout+1] = out
+ stderr[#stderr+1] = err
+ end
- -- Upgrade all packets
- local upgrade = luci.http.formvalue("upgrade")
- if upgrade then
- upgrade, out, err = ipkg.upgrade()
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
+ -- Upgrade all packets
+ upgrade = luci.http.formvalue("upgrade")
+ if upgrade then
+ upgrade, out, err = ipkg.upgrade()
+ stdout[#stdout+1] = out
+ stderr[#stderr+1] = err
+ end
end
end
end
-function action_flashops()
- local sys = require "luci.sys"
- local fs = require "nixio.fs"
-
- local upgrade_avail = fs.access("/lib/upgrade/platform.sh")
- local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
+local function image_supported(image)
+ return (os.execute("sysupgrade -T %q >/dev/null" % image) == 0)
+end
- local restore_cmd = "tar -xzC/ >/dev/null 2>&1"
- local backup_cmd = "sysupgrade --create-backup - 2>/dev/null"
- local image_tmp = "/tmp/firmware.img"
+local function image_checksum(image)
+ return (luci.sys.exec("md5sum %q" % image):match("^([^%s]+)"))
+end
- local function image_supported()
- return (os.execute("sysupgrade -T %q >/dev/null" % image_tmp) == 0)
- end
+local function supports_sysupgrade()
+ return nixio.fs.access("/lib/upgrade/platform.sh")
+end
- local function image_checksum()
- return (luci.sys.exec("md5sum %q" % image_tmp):match("^([^%s]+)"))
- end
+local function supports_reset()
+ return (os.execute([[grep -sq '"rootfs_data"' /proc/mtd]]) == 0)
+end
- local function storage_size()
- local size = 0
- if fs.access("/proc/mtd") then
- for l in io.lines("/proc/mtd") do
- local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
- if n == "linux" or n == "firmware" then
- size = tonumber(s, 16)
- break
- end
+local function storage_size()
+ local size = 0
+ if nixio.fs.access("/proc/mtd") then
+ for l in io.lines("/proc/mtd") do
+ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
+ if n == "linux" or n == "firmware" then
+ size = tonumber(s, 16)
+ break
end
- elseif fs.access("/proc/partitions") then
- for l in io.lines("/proc/partitions") do
- local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
- if b and n and not n:match('[0-9]') then
- size = tonumber(b) * 1024
- break
- end
+ end
+ elseif nixio.fs.access("/proc/partitions") then
+ for l in io.lines("/proc/partitions") do
+ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
+ if b and n and not n:match('[0-9]') then
+ size = tonumber(b) * 1024
+ break
end
end
- return size
end
+ return size
+end
+
+
+function action_flashops()
+ --
+ -- Overview
+ --
+ luci.template.render("admin_system/flashops", {
+ reset_avail = supports_reset(),
+ upgrade_avail = supports_sysupgrade()
+ })
+end
+function action_sysupgrade()
+ local fs = require "nixio.fs"
+ local http = require "luci.http"
+ local image_tmp = "/tmp/firmware.img"
local fp
- luci.http.setfilehandler(
+ http.setfilehandler(
function(meta, chunk, eof)
- if not fp then
- if meta and meta.name == "image" then
- fp = io.open(image_tmp, "w")
- else
- fp = io.popen(restore_cmd, "w")
- end
+ if not fp and meta and meta.name == "image" then
+ fp = io.open(image_tmp, "w")
end
- if chunk then
+ if fp and chunk then
fp:write(chunk)
end
- if eof then
+ if fp and eof then
fp:close()
end
end
)
- if luci.http.formvalue("backup") then
- --
- -- Assemble file list, generate backup
- --
- local reader = ltn12_popen(backup_cmd)
- luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % {
- luci.sys.hostname(), os.date("%Y-%m-%d")})
- luci.http.prepare_content("application/x-targz")
- luci.ltn12.pump.all(reader, luci.http.write)
- elseif luci.http.formvalue("restore") then
- --
- -- Unpack received .tar.gz
- --
- local upload = luci.http.formvalue("archive")
- if upload and #upload > 0 then
- luci.template.render("admin_system/applyreboot")
- luci.sys.reboot()
+ if not luci.dispatcher.test_post_security() then
+ fs.unlink(image_tmp)
+ return
+ end
+
+ --
+ -- Cancel firmware flash
+ --
+ if http.formvalue("cancel") then
+ fs.unlink(image_tmp)
+ http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
+ return
+ end
+
+ --
+ -- Initiate firmware flash
+ --
+ local step = tonumber(http.formvalue("step") or 1)
+ if step == 1 then
+ if image_supported(image_tmp) then
+ luci.template.render("admin_system/upgrade", {
+ checksum = image_checksum(image_tmp),
+ storage = storage_size(),
+ size = (fs.stat(image_tmp, "size") or 0),
+ keep = (not not http.formvalue("keep"))
+ })
+ else
+ fs.unlink(image_tmp)
+ luci.template.render("admin_system/flashops", {
+ reset_avail = supports_reset(),
+ upgrade_avail = supports_sysupgrade(),
+ image_invalid = true
+ })
end
- elseif luci.http.formvalue("image") or luci.http.formvalue("step") then
- --
- -- Initiate firmware flash
- --
- local step = tonumber(luci.http.formvalue("step") or 1)
- if step == 1 then
- if image_supported() then
- luci.template.render("admin_system/upgrade", {
- checksum = image_checksum(),
- storage = storage_size(),
- size = (fs.stat(image_tmp, "size") or 0),
- keep = (not not luci.http.formvalue("keep"))
- })
- else
- fs.unlink(image_tmp)
- luci.template.render("admin_system/flashops", {
- reset_avail = reset_avail,
- upgrade_avail = upgrade_avail,
- image_invalid = true
- })
+ --
+ -- Start sysupgrade flash
+ --
+ elseif step == 2 then
+ local keep = (http.formvalue("keep") == "1") and "" or "-n"
+ luci.template.render("admin_system/applyreboot", {
+ title = luci.i18n.translate("Flashing..."),
+ msg = luci.i18n.translate("The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
+ addr = (#keep > 0) and "192.168.1.1" or nil
+ })
+ fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
+ end
+end
+
+function action_backup()
+ local reader = ltn12_popen("sysupgrade --create-backup - 2>/dev/null")
+
+ luci.http.header(
+ 'Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' %{
+ luci.sys.hostname(),
+ os.date("%Y-%m-%d")
+ })
+
+ luci.http.prepare_content("application/x-targz")
+ luci.ltn12.pump.all(reader, luci.http.write)
+end
+
+function action_restore()
+ local fs = require "nixio.fs"
+ local http = require "luci.http"
+ local archive_tmp = "/tmp/restore.tar.gz"
+
+ local fp
+ http.setfilehandler(
+ function(meta, chunk, eof)
+ if not fp and meta and meta.name == "archive" then
+ fp = io.open(archive_tmp, "w")
+ end
+ if fp and chunk then
+ fp:write(chunk)
+ end
+ if fp and eof then
+ fp:close()
end
- --
- -- Start sysupgrade flash
- --
- elseif step == 2 then
- local keep = (luci.http.formvalue("keep") == "1") and "" or "-n"
- luci.template.render("admin_system/applyreboot", {
- title = luci.i18n.translate("Flashing..."),
- msg = luci.i18n.translate("The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
- addr = (#keep > 0) and "192.168.1.1" or nil
- })
- fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
end
- elseif reset_avail and luci.http.formvalue("reset") then
- --
- -- Reset system
- --
+ )
+
+ if not luci.dispatcher.test_post_security() then
+ fs.unlink(archive_tmp)
+ return
+ end
+
+ local upload = http.formvalue("archive")
+ if upload and #upload > 0 then
+ luci.template.render("admin_system/applyreboot")
+ os.execute("tar -C / -xzf %q >/dev/null 2>&1" % archive_tmp)
+ luci.sys.reboot()
+ return
+ end
+
+ http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
+end
+
+function action_reset()
+ if supports_reset() then
luci.template.render("admin_system/applyreboot", {
title = luci.i18n.translate("Erasing..."),
msg = luci.i18n.translate("The system is erasing the configuration partition now and will reboot itself when finished."),
addr = "192.168.1.1"
})
+
fork_exec("killall dropbear uhttpd; sleep 1; mtd -r erase rootfs_data")
- else
- --
- -- Overview
- --
- luci.template.render("admin_system/flashops", {
- reset_avail = reset_avail,
- upgrade_avail = upgrade_avail
- })
+ return
end
+
+ http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
end
function action_passwd()
end
function action_reboot()
- local reboot = luci.http.formvalue("reboot")
- luci.template.render("admin_system/reboot", {reboot=reboot})
- if reboot then
- luci.sys.reboot()
- end
+ luci.sys.reboot()
end
function fork_exec(command)
-- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
+-- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.admin.uci", package.seeall)
entry({"admin", "uci"}, nil, _("Configuration"))
entry({"admin", "uci", "changes"}, call("action_changes"), _("Changes"), 40).query = {redir=redir}
- entry({"admin", "uci", "revert"}, call("action_revert"), _("Revert"), 30).query = {redir=redir}
- entry({"admin", "uci", "apply"}, call("action_apply"), _("Apply"), 20).query = {redir=redir}
- entry({"admin", "uci", "saveapply"}, call("action_apply"), _("Save & Apply"), 10).query = {redir=redir}
+ entry({"admin", "uci", "revert"}, post("action_revert"), _("Revert"), 30).query = {redir=redir}
+ entry({"admin", "uci", "apply"}, post("action_apply"), _("Apply"), 20).query = {redir=redir}
+ entry({"admin", "uci", "saveapply"}, post("action_apply"), _("Save & Apply"), 10).query = {redir=redir}
end
function action_changes()
s:taboption("files", Flag, "nohosts",
- translate("Ignore Hosts files")).optional = true
+ translate("Ignore <code>/etc/hosts</code>")).optional = true
-hf = s:taboption("files", DynamicList, "addnhosts",
- translate("Additional Hosts files"))
-
-hf:depends("nohosts", "")
-hf.optional = true
+s:taboption("files", DynamicList, "addnhosts",
+ translate("Additional Hosts files")).optional = true
s:taboption("advanced", Flag, "boguspriv",
translate("No negative cache"),
translate("Do not cache negative replies, e.g. for not existing domains"))
+s:taboption("advanced", Value, "serversfile",
+ translate("Additional servers file"),
+ translate("This file may contain lines like 'server=/domain/1.2.3.4' or 'server=1.2.3.4' for"..
+ "domain-specific or full upstream <abbr title=\"Domain Name System\">DNS</abbr> servers."))
+
s:taboption("advanced", Flag, "strictorder",
translate("Strict order"),
translate("<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the " ..
newnet:depends("_attach", "")
newnet.default = arg[1] and "net_" .. arg[1]:gsub("[^%w_]+", "_")
-newnet.datatype = "uciname"
+newnet.datatype = "and(uciname,maxlength(15))"
+
+advice = m:field(DummyValue, "d1", translate("Note: interface name length"),
+ translate("Maximum length of the name is 15 characters including " ..
+ "the automatic protocol/bridge prefix (br-, 6in4-, pppoe- etc.)"
+ ))
newproto = m:field(ListValue, "_netproto", translate("Protocol of the new interface"))
local _, net
if wnet:mode() ~= "sta" then
for _, net in ipairs(wdev:get_wifinets()) do
- if net:mode() == "sta" then
+ if net:mode() == "sta" and net:get("disabled") ~= "1" then
if not found_sta then
found_sta = {}
found_sta.channel = net:channel()
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/sda1 /tmp/extroot
-tar -C /tmp/intproot -cvf - . | tar -C /tmp/extroot -xf -
+tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
umount /tmp/introot
umount /tmp/extroot</pre>
]] %{
-- Licensed to the public under the Apache License 2.0.
local ipkgfile = "/etc/opkg.conf"
+local distfeeds = "/etc/opkg/distfeeds.conf"
+local customfeeds = "/etc/opkg/customfeeds.conf"
-f = SimpleForm("ipkgconf", translate("OPKG-Configuration"))
+f = SimpleForm("ipkgconf", translate("OPKG-Configuration"), translate("General options for opkg"))
f:append(Template("admin_system/ipkg"))
t = f:field(TextValue, "lines")
+t.wrap = "off"
t.rows = 10
function t.cfgvalue()
return nixio.fs.readfile(ipkgfile) or ""
return true
end
-return f
+g = SimpleForm("distfeedconf", translate("Distribution feeds"),
+ translate("Build/distribution specific feed definitions. This file will NOT be preserved in any sysupgrade."))
+
+d = g:field(TextValue, "lines2")
+d.wrap = "off"
+d.rows = 10
+function d.cfgvalue()
+ return nixio.fs.readfile(distfeeds) or ""
+end
+
+function d.write(self, section, data)
+ return nixio.fs.writefile(distfeeds, data:gsub("\r\n", "\n"))
+end
+
+function g.handle(self, state, data)
+ return true
+end
+
+h = SimpleForm("customfeedconf", translate("Custom feeds"),
+ translate("Custom feed definitions, e.g. private feeds. This file can be preserved in a sysupgrade."))
+
+c = h:field(TextValue, "lines3")
+c.wrap = "off"
+c.rows = 10
+function c.cfgvalue()
+ return nixio.fs.readfile(customfeeds) or ""
+end
+
+function c.write(self, section, data)
+ return nixio.fs.writefile(customfeeds, data:gsub("\r\n", "\n"))
+end
+
+function h.handle(self, state, data)
+ return true
+end
+
+return f, g, h
legend.parentNode.style.display = 'block';
legend.style.display = 'inline';
- stxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/diag_' + tool + protocol + '/' + addr, null,
+ stxhr.post('<%=url('admin/network')%>/diag_' + tool + protocol + '/' + addr, { token: '<%=token%>' },
function(x)
{
if (x.responseText)
}
//]]></script>
-<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
+<form method="post" action="<%=url('admin/network/diagnostics')%>">
<div class="cbi-map">
- <h2><a id="content" name="content"><%:Diagnostics%></a></h2>
+ <h2 name="content"><%:Diagnostics%></h2>
<fieldset class="cbi-section">
<legend><%:Network Utilities%></legend>
s.innerHTML = '<%:Waiting for changes to be applied...%>';
}
- XHR.get('<%=luci.dispatcher.build_url("admin", "network")%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
+ (new XHR()).post('<%=url('admin/network')%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, { token: '<%=token%>' },
function(x)
{
if (s)
);
}
+ function iface_delete(id) {
+ if (!confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>'))
+ return;
+
+ (new XHR()).post('<%=url('admin/network/iface_delete')%>/' + id, { token: '<%=token%>' },
+ function(x) {
+ location.href = '<%=url('admin/network/network')%>';
+ }
+ );
+ }
var iwxhr = new XHR();
var wifidevs = <%=luci.http.write_json(netdevs)%>;
var arptable = <%=luci.http.write_json(arpcache)%>;
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "iface_status", table.concat(ifaces, ","))%>', null,
+ XHR.poll(5, '<%=url('admin/network/iface_status', table.concat(ifaces, ","))%>', null,
function(x, ifcs)
{
if (ifcs)
d.innerHTML = String.format(
'<em><%:Unsupported protocol type.%></em><br />' +
'<a href="%h"><%:Install protocol extensions...%></a>',
- '<%=luci.dispatcher.build_url("admin/system/packages")%>?query=luci-proto&display=available'
+ '<%=url("admin/system/packages")%>?query=luci-proto&display=available'
);
}
else if (d && !ifc.ifname)
{
d.innerHTML = String.format(
'<em><%:Network without interfaces.%></em><br />' +
- '<a href="<%=luci.dispatcher.build_url("admin/network/network/%s")%>?tab.network.%s=physical"><%:Assign interfaces...%></a>',
+ '<a href="<%=url("admin/network/network/%s")%>?tab.network.%s=physical"><%:Assign interfaces...%></a>',
ifc.name, ifc.name
);
}
<td style="width:420px">
<input type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', true)" title="<%:Reconnect this interface%>" value="<%:Connect%>" />
<input type="button" class="cbi-button cbi-button-reset" style="width:100px" onclick="iface_shutdown('<%=net[1]%>', false)" title="<%:Shutdown this interface%>" value="<%:Stop%>" />
- <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
- <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="if (confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this interface.%>')) location.href='<%=luci.dispatcher.build_url("admin/network/iface_delete", net[1])%>'" title="<%:Delete this interface%>" value="<%:Delete%>" />
+ <input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=url("admin/network/network", net[1])%>'" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" />
+ <input type="submit" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
</td>
</tr>
<% end %>
</table>
- <input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/iface_add")%>'" />
+ <input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=url("admin/network/iface_add")%>'" />
</fieldset>
</div>
<%+cbi/valueheader%>
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "iface_status", self.network)%>', null,
+ XHR.poll(5, '<%=url('admin/network/iface_status', self.network)%>', null,
function(x, ifc)
{
if (ifc && (ifc = ifc[0]))
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "dhcplease_status")%>', null,
+ XHR.poll(5, '<%=url('admin/network/dhcplease_status')%>', null,
function(x, st)
{
var tb = document.getElementById('lease_status_table');
<script type="text/javascript">//<![CDATA[
var switches = [ '<%=table.concat(self.switches, "', '")%>' ];
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "switch_status")%>/' + switches.join(','), null,
+ XHR.poll(5, '<%=url('admin/network/switch_status')%>/' + switches.join(','), null,
function(x, st)
{
for (var i = 0; i < switches.length; i++)
<%#
- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2009-2015 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Join Network: Wireless Scan%></a></h2>
+<h2 name="content"><%:Join Network: Wireless Scan%></h2>
<div class="cbi-map">
<fieldset class="cbi-section">
<strong>Encryption:</strong> <%=format_wifi_encryption(net.encryption)%>
</td>
<td class="cbi-value-field" style="width:40px">
- <form action="<%=REQUEST_URI%>" method="post">
+ <form action="<%=url('admin/network/wireless_join')%>" method="post">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
<input type="hidden" name="join" value="<%=utl.pcdata(net.ssid)%>" />
<input type="hidden" name="mode" value="<%=net.mode%>" />
</fieldset>
</div>
<div class="cbi-page-actions right">
- <form class="inline" action="<%=luci.dispatcher.build_url("admin/network/wireless")%>" method="get">
+ <form class="inline" action="<%=url("admin/network/wireless")%>" method="get">
<input class="cbi-button cbi-button-reset" type="submit" value="<%:Back to overview%>" />
</form>
- <form class="inline" action="<%=REQUEST_URI%>" method="get">
+ <form class="inline" action="<%=url('admin/network/wireless_join')%>" method="post">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="device" value="<%=utl.pcdata(dev)%>" />
<input class="cbi-button cbi-input-find" type="submit" value="<%:Repeat scan%>" />
</form>
st.innerHTML = '<em><%:Wireless is restarting...%></em>';
}
- XHR.get('<%=luci.dispatcher.build_url("admin", "network")%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
+ (new XHR()).post('<%=url('admin/network')%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, { token: '<%=token%>' },
function(x)
{
if (s)
);
}
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "wireless_status", table.concat(netlist, ","))%>', null,
+ function wifi_delete(id) {
+ if (!confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>'))
+ return;
+
+ (new XHR()).post('<%=url('admin/network/wireless_delete')%>/' + id, { token: '<%=token%>' },
+ function(x) {
+ location.href = '<%=url('admin/network/wireless')%>';
+ }
+ );
+ }
+
+ XHR.poll(5, '<%=url('admin/network/wireless_status', table.concat(netlist, ","))%>', null,
function(x, st)
{
if (st)
for( var i = 0; i < st.length; i++ )
{
var iw = st[i];
- var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && iw.mode != 'Unknown');
+ var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && iw.mode != 'Unknown' && !iw.disabled);
var p = iw.quality;
var q = is_assoc ? p : -1;
);
//]]></script>
-<h2><a id="content" name="content"><%:Wireless Overview%></a></h2>
+<h2 name="content"><%:Wireless Overview%></h2>
<fieldset class="cbi-section" style="display:none">
<legend><%:Reconnecting interface%></legend>
<span id="<%=dev:name()%>-iw-devinfo"></span>
</td>
<td style="width:310px;text-align:right">
- <input type="button" class="cbi-button cbi-button-find" style="width:100px" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/wireless_join")%>?device=<%=dev:name()%>'" title="<%:Find and join network%>" value="<%:Scan%>" />
- <input type="button" class="cbi-button cbi-button-add" style="width:100px" onclick="location.href='<%=luci.dispatcher.build_url("admin/network/wireless_add")%>?device=<%=dev:name()%>'" title="<%:Provide new network%>" value="<%:Add%>" />
+ <form action="<%=url('admin/network/wireless_join')%>" method="post" class="inline">
+ <input type="hidden" name="device" value="<%=dev:name()%>" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="submit" class="cbi-button cbi-button-find" style="width:100px" title="<%:Find and join network%>" value="<%:Scan%>" />
+ </form>
+ <form action="<%=url('admin/network/wireless_add')%>" method="post" class="inline">
+ <input type="hidden" name="device" value="<%=dev:name()%>" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="submit" class="cbi-button cbi-button-add" style="width:100px" title="<%:Provide new network%>" value="<%:Add%>" />
+ </form>
</td>
</tr>
<!-- /physical device -->
<td class="cbi-value-field" style="width:310px;text-align:right">
<input id="<%=net:id()%>-iw-toggle" type="button" class="cbi-button cbi-button-reload" style="width:100px" onclick="wifi_shutdown('<%=net:id()%>', this)" title="<%:Delete this network%>" value="<%:Enable%>" />
<input type="button" class="cbi-button cbi-button-edit" style="width:100px" onclick="location.href='<%=net:adminlink()%>'" title="<%:Edit this network%>" value="<%:Edit%>" />
- <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="if (confirm('<%:Really delete this wireless network? The deletion cannot be undone!\nYou might lose access to this device if you are connected via this network.%>')) location.href='<%=luci.dispatcher.build_url("admin/network/wireless_delete", net:ifname())%>'" title="<%:Delete this network%>" value="<%:Remove%>" />
+ <input type="button" class="cbi-button cbi-button-remove" style="width:100px" onclick="wifi_delete('<%=net:ifname()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
</td>
</tr>
<% end %>
<% end %>
- <h2><a id="content" name="content"><%:Associated Stations%></a></h2>
+ <h2><%:Associated Stations%></h2>
<fieldset class="cbi-section">
<table class="cbi-section-table" style="margin:10px" id="iw-assoclist">
<%+cbi/valueheader%>
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "wireless_status", self.ifname)%>', null,
+ XHR.poll(5, '<%=url('admin/network/wireless_status', self.ifname)%>', null,
function(x, iw)
{
if (iw && (iw = iw[0]))
{
- var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel);
+ var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && !iw.disabled);
var p = iw.quality;
var q = is_assoc ? p : -1;
);
//]]></script>
-<h2><a id="content" name="content"><%:Realtime Traffic%></a></h2>
+<h2 name="content"><%:Realtime Traffic%></h2>
<ul class="cbi-tabmenu">
<% for _, dev in ipairs(devices) do %>
);
//]]></script>
-<h2><a id="content" name="content"><%:Realtime Connections%></a></h2>
+<h2 name="content"><%:Realtime Connections%></h2>
<div class="cbi-map-descr"><%:This page gives an overview over currently active network connections.%></div>
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Kernel Log%></a></h2>
+<h2 name="content"><%:Kernel Log%></h2>
<div id="content_syslog">
<textarea readonly="readonly" wrap="off" rows="<%=dmesg:cmatch("\n")+2%>" id="syslog"><%=dmesg:pcdata()%></textarea>
</div>
if has_dsl then
local dsl_stat = luci.sys.exec("/etc/init.d/dsl_control lucistat")
local dsl_func = loadstring(dsl_stat)
- rv.dsl = dsl_func()
+ if dsl_func then
+ rv.dsl = dsl_func()
+ end
end
luci.http.prepare_content("application/json")
for (var nidx = 0; nidx < dev.networks.length; nidx++)
{
var net = dev.networks[nidx];
- var is_assoc = (net.bssid != '00:00:00:00:00:00' && net.channel);
+ var is_assoc = (net.bssid != '00:00:00:00:00:00' && net.channel && !net.disabled);
var icon;
if (!is_assoc)
);
//]]></script>
-<h2><a id="content" name="content"><%:Status%></a></h2>
+<h2 name="content"><%:Status%></h2>
<fieldset class="cbi-section">
<legend><%:System%></legend>
<%#
Copyright 2008-2009 Steven Barth <steven@midlink.org>
- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
local net = wba.iface_get_network(i)
if net and i ~= "lo" then
return '<a href="%s">%s</a>' %{
- luci.dispatcher.build_url("admin", "network", "network", net), i
+ url("admin/network/network", net), i
}
end
}
</style>
-<h2><a id="content" name="content"><%:Firewall Status%></a></h2>
+<h2 name="content"><%:Firewall Status%></h2>
+<br />
<% if has_ip6tables then %>
<ul class="cbi-tabmenu">
- <li class="cbi-tab<%= mode ~= 4 and "-disabled" %>"><a href="<%=luci.dispatcher.build_url("admin/status/iptables/4")%>"><%:IPv4 Firewall%></a></li>
- <li class="cbi-tab<%= mode ~= 6 and "-disabled" %>"><a href="<%=luci.dispatcher.build_url("admin/status/iptables/6")%>"><%:IPv6 Firewall%></a></li>
+ <li class="cbi-tab<%= mode ~= 4 and "-disabled" %>"><a href="<%=url("admin/status/iptables/4")%>"><%:IPv4 Firewall%></a></li>
+ <li class="cbi-tab<%= mode ~= 6 and "-disabled" %>"><a href="<%=url("admin/status/iptables/6")%>"><%:IPv6 Firewall%></a></li>
</ul>
<% end %>
-<form method="post" action="<%=REQUEST_URI%>">
- <div class="cbi-map">
- <fieldset class="cbi-section">
- <h3><%:Actions%></h3>
- <ul>
- <li><a href="<%=REQUEST_URI%>?zero=<%=mode%>"><%:Reset Counters%></a></li>
- <li><a href="<%=REQUEST_URI%>?restart=1"><%:Restart Firewall%></a></li>
- </ul>
- <br /><br />
-
- <% for _, tbl in ipairs(tables) do chaincnt = 0 %>
- <h3><%:Table%>: <%=tbl%></h3>
- <table class="cbi-section-table" style="font-size:90%">
- <% for _, chain in ipairs(ipt:chains(tbl)) do
- rowcnt = 0
- chaincnt = chaincnt + 1
- chaininfo = ipt:chain(tbl, chain)
- %>
- <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
- <th class="cbi-section-table-cell" style="text-align:left" colspan="11">
- <br /><span id="rule_<%=tbl:lower()%>_<%=chain%>">
- <%:Chain%> <em><%=chain%></em>
- (<%- if chaininfo.policy then -%>
- <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
- <%- else -%>
- <%:References%>: <%=chaininfo.references-%>
- <%- end -%>)</span>
- </th>
+<div class="cbi-map" style="position: relative">
+
+ <form method="post" action="<%=url("admin/status/iptables_action")%>" style="position: absolute; right: 0">
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="family" value="<%=mode%>" />
+ <input type="submit" class="cbi-button" name="zero" value="<%:Reset Counters%>" />
+ <input type="submit" class="cbi-button" name="restart" value="<%:Restart Firewall%>" />
+ </form>
+
+ <fieldset class="cbi-section">
+
+ <% for _, tbl in ipairs(tables) do chaincnt = 0 %>
+ <h3><%:Table%>: <%=tbl%></h3>
+ <table class="cbi-section-table" style="font-size:90%">
+ <% for _, chain in ipairs(ipt:chains(tbl)) do
+ rowcnt = 0
+ chaincnt = chaincnt + 1
+ chaininfo = ipt:chain(tbl, chain)
+ %>
+ <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
+ <th class="cbi-section-table-cell" style="text-align:left" colspan="11">
+ <br /><span id="rule_<%=tbl:lower()%>_<%=chain%>">
+ <%:Chain%> <em><%=chain%></em>
+ (<%- if chaininfo.policy then -%>
+ <%:Policy%>: <em><%=chaininfo.policy%></em>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%>
+ <%- else -%>
+ <%:References%>: <%=chaininfo.references-%>
+ <%- end -%>)</span>
+ </th>
+ </tr>
+ <tr class="cbi-section-table-descr">
+ <th class="cbi-section-table-cell"><%:Pkts.%></th>
+ <th class="cbi-section-table-cell"><%:Traffic%></th>
+ <th class="cbi-section-table-cell"><%:Target%></th>
+ <th class="cbi-section-table-cell"><%:Prot.%></th>
+ <th class="cbi-section-table-cell"><%:In%></th>
+ <th class="cbi-section-table-cell"><%:Out%></th>
+ <th class="cbi-section-table-cell"><%:Source%></th>
+ <th class="cbi-section-table-cell"><%:Destination%></th>
+ <th class="cbi-section-table-cell" style="width:30%"><%:Options%></th>
+ </tr>
+
+ <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
+ <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
+ <td><%=rule.packets%></td>
+ <td style="white-space: nowrap"><%=wba.byte_format(rule.bytes)%></td>
+ <td><%=rule.target and link_target(tbl, rule.target) or "-"%></td>
+ <td><%=rule.protocol%></td>
+ <td><%=link_iface(rule.inputif)%></td>
+ <td><%=link_iface(rule.outputif)%></td>
+ <td><%=rule.source%></td>
+ <td><%=rule.destination%></td>
+ <td style="width:30%"><small><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></small></td>
</tr>
- <tr class="cbi-section-table-descr">
- <th class="cbi-section-table-cell"><%:Rule #%></th>
- <th class="cbi-section-table-cell"><%:Pkts.%></th>
- <th class="cbi-section-table-cell"><%:Traffic%></th>
- <th class="cbi-section-table-cell"><%:Target%></th>
- <th class="cbi-section-table-cell"><%:Prot.%></th>
- <th class="cbi-section-table-cell"><%:Flags%></th>
- <th class="cbi-section-table-cell"><%:In%></th>
- <th class="cbi-section-table-cell"><%:Out%></th>
- <th class="cbi-section-table-cell"><%:Source%></th>
- <th class="cbi-section-table-cell"><%:Destination%></th>
- <th class="cbi-section-table-cell" style="width:30%"><%:Options%></th>
- </tr>
-
- <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
- <td><%=rule.index%></td>
- <td><%=rule.packets%></td>
- <td><%=wba.byte_format(rule.bytes)%></td>
- <td><%=rule.target and link_target(tbl, rule.target) or "-"%></td>
- <td><%=rule.protocol%></td>
- <td><%=rule.flags%></td>
- <td><%=link_iface(rule.inputif)%></td>
- <td><%=link_iface(rule.outputif)%></td>
- <td><%=rule.source%></td>
- <td><%=rule.destination%></td>
- <td style="width:30%"><small><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%></small></td>
- </tr>
- <% end %>
-
- <% if rowcnt == 1 then %>
- <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
- <td colspan="11"><em><%:No rules in this chain%></em></td>
- </tr>
- <% end %>
<% end %>
- <% if chaincnt == 0 then %>
+ <% if rowcnt == 1 then %>
<tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
- <td colspan="11"><em><%:No chains in this table%></em></td>
+ <td colspan="9"><em><%:No rules in this chain%></em></td>
</tr>
<% end %>
- </table>
- <br /><br />
- <% end %>
- </fieldset>
- </div>
-</form>
+ <% end %>
+
+ <% if chaincnt == 0 then %>
+ <tr class="cbi-section-table-titles cbi-rowstyle-<%=rowstyle()%>">
+ <td colspan="9"><em><%:No chains in this table%></em></td>
+ </tr>
+ <% end %>
+ </table>
+ <br /><br />
+ <% end %>
+ </fieldset>
+</div>
<%+footer%>
);
//]]></script>
-<h2><a id="content" name="content"><%:Realtime Load%></a></h2>
+<h2 name="content"><%:Realtime Load%></h2>
<embed id="bwsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/load.svg" />
<div style="text-align:right"><small id="scale">-</small></div>
<%+header%>
<div class="cbi-map" id="cbi-network">
- <h2><a id="content" name="content"><%:Routes%></a></h2>
+ <h2 name="content"><%:Routes%></h2>
<div class="cbi-map-descr"><%:The following rules are currently active on this system.%></div>
<fieldset class="cbi-section">
-%>
<%+header%>
-<h2><a id="content" name="content"><%:System Log%></a></h2>
+<h2 name="content"><%:System Log%></h2>
<div id="content_syslog">
<textarea readonly="readonly" wrap="off" rows="<%=syslog:cmatch("\n")+2%>" id="syslog"><%=syslog:pcdata()%></textarea>
</div>
);
//]]></script>
-<h2><a id="content" name="content"><%:Realtime Wireless%></a></h2>
+<h2 name="content"><%:Realtime Wireless%></h2>
<ul class="cbi-tabmenu">
<% for _, dev in ipairs(devices) do %>
<body>
<div id="maincontainer">
<div id="maincontent">
- <h2><a id="content" name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></a></h2>
+ <h2 name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></h2>
<fieldset class="cbi-section">
<p>
<% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>
-%>
<ul class="cbi-tabmenu">
- <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/system/flashops")%>"><%:Actions%></a></li>
+ <li class="cbi-tab-disabled"><a href="<%=url("admin/system/flashops")%>"><%:Actions%></a></li>
<li class="cbi-tab"><a href="#"><%:Configuration%></a></li>
</ul>
<%+cbi/valueheader%>
<script type="text/javascript">//<![CDATA[
- XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "system", "clock_status")%>', null,
+ XHR.poll(5, '<%=url('admin/system/clock_status')%>', null,
function(x, rv)
{
var s = document.getElementById('<%=self.option%>-clock-status');
btn.disabled = true;
btn.value = '<%:Synchronizing...%>';
- XHR.get('<%=luci.dispatcher.build_url("admin", "system", "clock_status")%>',
- { set: Math.floor((new Date()).getTime() / 1000) },
+ (new XHR()).post('<%=url('admin/system/clock_status')%>',
+ { token: '<%=token%>', set: Math.floor((new Date()).getTime() / 1000) },
function()
{
btn.disabled = false;
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Flash operations%></a></h2>
+<h2 name="content"><%:Flash operations%></h2>
<ul class="cbi-tabmenu">
<li class="cbi-tab"><a href="#"><%:Actions%></a></li>
<fieldset class="cbi-section">
<legend><%:Backup / Restore%></legend>
- <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
- <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
- <div class="cbi-section-node">
+ <div class="cbi-section-descr"><%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%></div>
+ <div class="cbi-section-node">
+ <form class="inline" method="post" action="<%=url('admin/system/flashops/backup')%>">
+ <input type="hidden" name="token" value="<%=token%>" />
<div class="cbi-value<% if not reset_avail then %> cbi-value-last<% end %>">
<label class="cbi-value-title" for="image"><%:Download backup%>:</label>
<div class="cbi-value-field">
<input class="cbi-button cbi-button-apply" type="submit" name="backup" value="<%:Generate archive%>" />
</div>
</div>
- <% if reset_avail then %>
+ </form>
+ <% if reset_avail then %>
+ <form class="inline" method="post" action="<%=url('admin/system/flashops/reset')%>">
+ <input type="hidden" name="token" value="<%=token%>" />
<div class="cbi-value cbi-value-last">
<label class="cbi-value-title"><%:Reset to defaults%>:</label>
<div class="cbi-value-field">
<input onclick="return confirm('<%:Really reset all changes?%>')" class="cbi-button cbi-button-reset" type="submit" name="reset" value="<%:Perform reset%>" />
</div>
</div>
- <% end %>
- </div>
- <br />
- <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
- <div class="cbi-section-node">
+ </form>
+ <% end %>
+ </div>
+ <br />
+ <div class="cbi-section-descr"><%:To restore configuration files, you can upload a previously generated backup archive here.%></div>
+ <div class="cbi-section-node">
+ <form class="inline" method="post" action="<%=url('admin/system/flashops/restore')%>" enctype="multipart/form-data">
<div class="cbi-value cbi-value-last">
<label class="cbi-value-title" for="archive"><%:Restore backup%>:</label>
<div class="cbi-value-field">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="file" name="archive" id="archive" />
<input type="submit" class="cbi-button cbi-input-apply" name="restore" value="<%:Upload archive...%>" />
</div>
</div>
- </div>
- </form>
+ </form>
+ </div>
</fieldset>
<br />
<fieldset class="cbi-section">
<legend><%:Flash new firmware image%></legend>
<% if upgrade_avail then %>
- <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
+ <form method="post" action="<%=url('admin/system/flashops/sysupgrade')%>" enctype="multipart/form-data">
+ <input type="hidden" name="token" value="<%=token%>" />
<div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires an OpenWrt compatible firmware image).%></div>
<div class="cbi-section-node">
<div class="cbi-value">
-%>
<ul class="cbi-tabmenu">
- <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/system/packages")%>"><%:Actions%></a></li>
+ <li class="cbi-tab-disabled"><a href="<%=url("admin/system/packages")%>"><%:Actions%></a></li>
<li class="cbi-tab"><a href="#"><%:Configuration%></a></li>
</ul>
<%+header%>
-<h2><a id="content" name="content"><%:Software%></a></h2>
+<h2 name="content"><%:Software%></h2>
-<form method="post" action="<%=REQUEST_URI%>">
- <div class="cbi-map">
+<div class="cbi-map">
- <ul class="cbi-tabmenu">
- <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
- <li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/ipkg"><%:Configuration%></a></li>
- </ul>
-
- <fieldset class="cbi-section">
+ <ul class="cbi-tabmenu">
+ <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
+ <li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/ipkg"><%:Configuration%></a></li>
+ </ul>
+ <form method="post" action="<%=REQUEST_URI%>">
+ <input type="hidden" name="exec" value="1" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <fieldset class="cbi-section">
<fieldset class="cbi-section-node">
<% if (install and next(install)) or (remove and next(remove)) or update or upgrade then %>
<div class="cbi-value">
<% else %>
<%:No package lists available%>
<% end %>
- <input type="button" onclick="location.href='?update=1'" href="#" class="cbi-button cbi-button-apply" style="margin-left:3em" value="<%:Update lists%>" />
+ <input type="submit" name="update" href="#" class="cbi-button cbi-button-apply" style="margin-left:3em" value="<%:Update lists%>" />
</div>
<% end %>
<label class="cbi-value-title"><%:Download and install package%>:</label>
<div class="cbi-value-field">
<input type="text" name="url" size="30" value="" />
- <input class="cbi-button cbi-input-save" type="submit" name="submit" value="<%:OK%>" />
+ <input class="cbi-button cbi-input-save" type="submit" name="exec" value="<%:OK%>" />
</div>
</div>
</div>
</fieldset>
</fieldset>
- <br />
-
- <h3><%:Status%></h3>
-
-
- <ul class="cbi-tabmenu">
- <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
- <li class="cbi-tab<% if display ~= "available" then %>-disabled<% end %>"><a href="?display=available&query=<%=pcdata(query)%>"><%:Available packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
- </ul>
-
- <% if display ~= "available" then %>
- <fieldset class="cbi-section">
- <table class="cbi-section-table" style="width:100%">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" style="text-align:left"> </th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
- </tr>
- <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, d) empty = false; filter[n] = true %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
- <td style="text-align:left; width:10%"><a onclick="return window.confirm('<%:Remove%> "<%=luci.util.pcdata(n)%>" ?')" href="<%=REQUEST_URI%>?submit=1&remove=<%=luci.util.pcdata(n)%>"><%:Remove%></a></td>
- <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
- <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
- </tr>
- <% end) %>
- <% if empty then %>
- <tr class="cbi-section-table-row">
- <td style="text-align:left"> </td>
- <td style="text-align:left"><em><%:none%></em></td>
- <td style="text-align:left"><em><%:none%></em></td>
- </tr>
- <% end %>
- </table>
- </fieldset>
- <% else %>
- <fieldset class="cbi-section">
- <% if not querypat then %>
- <ul class="cbi-tabmenu">
- <% local i; for i = 65, 90 do %>
- <li class="cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href="?display=available&letter=<%=string.char(i)%>"><%=string.char(i)%></a></li>
- <% end %>
- <li class="cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href="?display=available&letter=%23">#</a></li>
- </ul>
- <div class="cbi-section-node">
- <% end %>
- <table class="cbi-section-table" style="width:100%">
- <tr class="cbi-section-table-titles">
- <th class="cbi-section-table-cell" style="text-align:left"> </th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
- <th class="cbi-section-table-cell" style="text-align:left"><%:Description%></th>
- </tr>
- <% local empty = true; opkg_list(querypat or letterpat, function(n, v, d) if filter[n] then return end; empty = false %>
- <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
- <td style="text-align:left; width:10%"><a onclick="return window.confirm('<%:Install%> "<%=luci.util.pcdata(n)%>" ?')" href="<%=REQUEST_URI%>?submit=1&install=<%=luci.util.pcdata(n)%>"><%:Install%></a></td>
- <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
- <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
- <td style="text-align:left"><%=luci.util.pcdata(d)%></td>
- </tr>
- <% end) %>
- <% if empty then %>
- <tr class="cbi-section-table-row">
- <td style="text-align:left"> </td>
- <td style="text-align:left"><em><%:none%></em></td>
- <td style="text-align:left"><em><%:none%></em></td>
- <td style="text-align:left"><em><%:none%></em></td>
- </tr>
- <% end %>
- </table>
- <% if not querypat then %>
- </div>
- <% end %>
- </fieldset>
+ </form>
+
+
+ <h3><%:Status%></h3>
+
+
+ <ul class="cbi-tabmenu">
+ <li class="cbi-tab<% if display ~= "installed" then %>-disabled<% end %>"><a href="?display=installed&query=<%=pcdata(query)%>"><%:Installed packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
+ <li class="cbi-tab<% if display ~= "available" then %>-disabled<% end %>"><a href="?display=available&query=<%=pcdata(query)%>"><%:Available packages%><% if query then %> (<%=pcdata(query)%>)<% end %></a></li>
+ </ul>
+
+ <% if display ~= "available" then %>
+ <fieldset class="cbi-section">
+ <table class="cbi-section-table" style="width:100%">
+ <tr class="cbi-section-table-titles">
+ <th class="cbi-section-table-cell" style="text-align:left"> </th>
+ <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
+ <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
+ </tr>
+ <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %>
+ <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
+ <td style="text-align:left; width:10%">
+ <form method="post" class="inline" action="<%=REQUEST_URI%>">
+ <input type="hidden" name="exec" value="1" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="remove" value="<%=pcdata(n)%>" />
+ <a onclick="window.confirm('<%:Remove%> "<%=luci.util.pcdata(n)%>" ?') && this.parentNode.submit(); return false" href="#"><%:Remove%></a>
+ </form>
+ </td>
+ <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
+ <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
+ </tr>
+ <% end) %>
+ <% if empty then %>
+ <tr class="cbi-section-table-row">
+ <td style="text-align:left"> </td>
+ <td style="text-align:left"><em><%:none%></em></td>
+ <td style="text-align:left"><em><%:none%></em></td>
+ </tr>
+ <% end %>
+ </table>
+ </fieldset>
+ <% else %>
+ <fieldset class="cbi-section">
+ <% if not querypat then %>
+ <ul class="cbi-tabmenu">
+ <% local i; for i = 65, 90 do %>
+ <li class="cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href="?display=available&letter=<%=string.char(i)%>"><%=string.char(i)%></a></li>
+ <% end %>
+ <li class="cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href="?display=available&letter=%23">#</a></li>
+ </ul>
+ <div class="cbi-section-node">
+ <% end %>
+ <table class="cbi-section-table" style="width:100%">
+ <tr class="cbi-section-table-titles">
+ <th class="cbi-section-table-cell" style="text-align:left"> </th>
+ <th class="cbi-section-table-cell" style="text-align:left"><%:Package name%></th>
+ <th class="cbi-section-table-cell" style="text-align:left"><%:Version%></th>
+ <th class="cbi-section-table-cell" style="text-align:right"><%:Size (.ipk)%></th>
+ <th class="cbi-section-table-cell" style="text-align:left"><%:Description%></th>
+ </tr>
+ <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %>
+ <tr class="cbi-section-table-row cbi-rowstyle-<%=rowstyle()%>">
+ <td style="text-align:left; width:10%">
+ <form method="post" class="inline" action="<%=REQUEST_URI%>">
+ <input type="hidden" name="exec" value="1" />
+ <input type="hidden" name="token" value="<%=token%>" />
+ <input type="hidden" name="install" value="<%=pcdata(n)%>" />
+ <a onclick="window.confirm('<%:Install%> "<%=luci.util.pcdata(n)%>" ?') && this.parentNode.submit(); return false" href="#"><%:Install%></a>
+ </form>
+ </td>
+ <td style="text-align:left"><%=luci.util.pcdata(n)%></td>
+ <td style="text-align:left"><%=luci.util.pcdata(v)%></td>
+ <td style="text-align:right"><%=luci.util.pcdata(s)%></td>
+ <td style="text-align:left"><%=luci.util.pcdata(d)%></td>
+ </tr>
+ <% end) %>
+ <% if empty then %>
+ <tr class="cbi-section-table-row">
+ <td style="text-align:left"> </td>
+ <td style="text-align:left"><em><%:none%></em></td>
+ <td style="text-align:left"><em><%:none%></em></td>
+ <td style="text-align:right"><em><%:none%></em></td>
+ <td style="text-align:left"><em><%:none%></em></td>
+ </tr>
+ <% end %>
+ </table>
+ <% if not querypat then %>
+ </div>
<% end %>
- </div>
-</form>
+ </fieldset>
+ <% end %>
+</div>
+
<%+footer%>
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
-<h3><%:Reboot%></h3>
+
+<h2 name="content"><%:Reboot%></h2>
+<br />
+
<p><%:Reboots the operating system of your device%></p>
-<%-
-local c = require("luci.model.uci").cursor():changes()
-if c and next(c) then
--%>
- <p class="warning"><%:Warning: There are unsaved changes that will be lost while rebooting!%></p>
-<%-
-end
-if not reboot then
--%>
-<p><a href="<%=controller%>/admin/system/reboot?reboot=1"><%:Perform reboot%></a></p>
-<%- else -%>
-<p><%:Please wait: Device rebooting...%></p>
-<script type="text/javascript">setTimeout("location='<%=controller%>/admin'", 60000)</script>
+
+<%- local c = require("luci.model.uci").cursor():changes(); if c and next(c) then -%>
+ <p class="alert-message warning"><%:Warning: There are unsaved changes that will get lost on reboot!%></p>
<%- end -%>
-<%+footer%>
\ No newline at end of file
+
+<hr />
+
+<script type="text/javascript">//<![CDATA[
+ var tries = 0;
+
+ function ok() {
+ window.location = '<%=controller%>/admin';
+ }
+
+ function check() {
+ if (tries++ < 12)
+ window.setTimeout(ping, 5000);
+ else
+ alert('<%:Device unreachable%>');
+ }
+
+ function ping() {
+ var img = document.createElement('img');
+
+ img.onload = ok;
+ img.onerror = check;
+ img.src = '<%=resource%>/icons/loading.gif?' + Math.random();
+
+ document.getElementById('reboot-message').innerHTML = '<%:Waiting for device...%>';
+ }
+
+ function reboot(button) {
+ button.style.display = 'none';
+ document.getElementById('reboot-message').parentNode.style.display = '';
+
+ (new XHR()).post('<%=controller%>/admin/system/reboot/call', { token: '<%=token%>' }, check);
+ }
+//]]></script>
+
+<input class="cbi-button cbi-button-apply" type="button" value="<%:Perform reboot%>" onclick="reboot(this)" />
+
+<p class="alert-message" style="display:none">
+ <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
+ <span id="reboot-message"><%:Device is rebooting...%></span>
+</p>
+
+<%+footer%>
<%+header%>
-<h2><a id="content" name="content"><%:Flash Firmware%> - <%:Verify%></a></h2>
+<h2 name="content"><%:Flash Firmware%> - <%:Verify%></h2>
<p>
<%_ The flash image was uploaded.
Below is the checksum and file size listed,
</fieldset>
<div class="cbi-page-actions right">
- <form style="display:inline" action="<%=REQUEST_URI%>" method="post">
- <input class="cbi-button cbi-button-reset" type="submit" value="<%:Cancel%>" />
- </form>
- <form style="display:inline" action="<%=REQUEST_URI%>" method="post">
+ <form class="inline" action="<%=REQUEST_URI%>" method="post">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="step" value="2" />
<input type="hidden" name="keep" value="<%=keep and "1" or ""%>" />
+ <input class="cbi-button cbi-button-reset" name="cancel" type="submit" value="<%:Cancel%>" />
<input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
</form>
</div>
<%+header%>
-<h2><a id="content" name="content"><%:Configuration%> / <%:Apply%></a></h2>
+<h2 name="content"><%:Configuration%> / <%:Apply%></h2>
<% if changes then %>
<%+cbi/apply_xhr%>
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+header%>
-<h2><a id="content" name="content"><%:Configuration%> / <%:Changes%></a></h2>
+<h2 name="content"><%:Configuration%> / <%:Changes%></h2>
<% if changes then %>
<%+admin_uci/changelog%>
<% end %>
<div style="text-align:right">
- <form class="inline" method="get" action="<%=controller%>/admin/uci/apply">
+ <form class="inline" method="post" action="<%=controller%>/admin/uci/apply">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
<input class="cbi-button cbi-button-apply" type="submit" value="<%:Apply%>" />
</form>
- <form class="inline" method="get" action="<%=controller%>/admin/uci/saveapply">
+ <form class="inline" method="post" action="<%=controller%>/admin/uci/saveapply">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
<input class="cbi-button cbi-button-save" type="submit" value="<%:Save & Apply%>" />
</form>
- <form class="inline" method="get" action="<%=controller%>/admin/uci/revert">
+ <form class="inline" method="post" action="<%=controller%>/admin/uci/revert">
+ <input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
<input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" />
</form>
<%+header%>
-<h2><a id="content" name="content"><%:Configuration%> / <%:Revert%></a></h2>
+<h2 name="content"><%:Configuration%> / <%:Revert%></h2>
<% if changes then %>
<%+cbi/apply_xhr%>
-%>
<%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
<br />
<p><% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %></p>
<p><%:Please wait: Device rebooting...%></p>
-%>
<%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
<h3><%:Backup / Restore%></h3>
<p><%:Here you can backup and restore your configuration and - if possible - reset this device to the default settings.%></p>
<br />
Licensed to the public under the Apache License 2.0.
-%>
-<h2><a id="content" name="content"><%:Hello!%></a></h2>
+<h2 name="content"><%:Hello!%></h2>
<p><%_This is the administration area of <abbr title="Lua Configuration Interface">LuCI</abbr>.%></p>
<p><%_<abbr title="Lua Configuration Interface">LuCI</abbr> is a free, flexible, and user friendly graphical interface for configuring OpenWrt.%><br />
<%:On the following pages you can adjust all important settings of this device.%></p>
-%>
<%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
<h3><%:Reboot%></h3>
<p><%:Reboots the operating system of your device%></p>
<%-
<%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
<h3><%:Flash Firmware%></h3>
<% if step == 1 then %>
fp = io.open(image_tmp, "w")
end
end
- if chunk then
- fp:write(chunk)
- end
- if eof then
- fp:close()
+ if fp then
+ if chunk then
+ fp:write(chunk)
+ end
+ if eof then
+ fp:close()
+ end
end
end
)
<body>
<div id="maincontainer">
<div id="maincontent">
- <h2><a id="content" name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></a></h2>
+ <h2 name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></h2>
<fieldset class="cbi-section">
<p>
<% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>
<%+header%>
-<h2><a id="content" name="content"><%:Flash operations%></a></h2>
+<h2 name="content"><%:Flash operations%></h2>
<fieldset class="cbi-section">
<legend><%:Flash new firmware image%></legend>
<% if upgrade_avail then %>
-%>
<%+header%>
-<h2><a id="content" name="content"><%:System%></a></h2>
+<h2 name="content"><%:System%></h2>
<h3><%:Reboot%></h3>
<p><%:Reboots the operating system of your device%></p>
<%- if not reboot then -%>
<%+header%>
-<h2><a id="content" name="content"><%:Flash Firmware%> - <%:Verify%></a></h2>
+<h2 name="content"><%:Flash Firmware%> - <%:Verify%></h2>
<p>
<%_ The flash image was uploaded.
Below is the checksum and file size listed,
local fs = require "nixio.fs"
local util = require "luci.util"
local uci = require "luci.model.uci".cursor()
-local profiles = "/etc/config/profile_"
+local profiles = "/etc/config/profile_*"
m = Map("freifunk", translate ("Community"))
c = m:section(NamedSection, "community", "public", nil, translate("These are the basic settings for your local wireless community. These settings define the default values for the wizard and DO NOT affect the actual configuration of the router."))
community.rmempty = false
local profile
-for profile in fs.dir(profiles) do
+for profile in fs.glob(profiles) do
local name = uci:get_first(profile, "community", "name") or "?"
community:value(profile, name)
end
%>
<% if has_latlon then %>
- <iframe style="width:100%; height:640px; border:none" src="<%=luci.dispatcher.build_url("freifunk/map/content")%>"></iframe>
+ <iframe style="width:100%; height:640px; border:none" src="<%=url("freifunk/map/content")%>"></iframe>
<h3><%:Legend%>:</h3>
<ul>
<li><strong><span style="color:#00cc00"><%:Green%></span></strong>:<%:Very good (ETX < 2)%></li>
end
%>
-<h2><a id="content" name="content"><%:Contact%></a></h2>
+<h2 name="content"><%:Contact%></h2>
<fieldset xmlns="http://www.w3.org/1999/xhtml" class="cbi-section">
<legend><%:Operator%></legend>
end
local has_iwinfo = pcall(require, "iwinfo")
+
+-- Find default routes
+
+local _, r, def4, def6
+
+for _, r in ipairs(ip.routes({ type = 1, dest_exact = "0.0.0.0/0" })) do
+ def4 = {
+ gateway = r.gw:string(),
+ dest = r.dest:string(),
+ dev = r.dev,
+ metr = r.metric or 0
+ }
+ break
+end
+
+for _, r in ipairs(ip.routes({ type = 1, dest_exact = "::/0" })) do
+ def6 = {
+ gateway = r.gw:string(),
+ dest = r.dest:string(),
+ dev = r.dev,
+ metr = r.metric or 0
+ }
+ break
+end
+
+
if luci.http.formvalue("status") == "1" then
local rv = { }
for dev in pairs(netdevs) do
end
- -- Find default routes
-
- local _, r, def4, def6
-
- for _, r in ipairs(ip.routes({ type = 1, dest_exact = "0.0.0.0/0" })) do
- def4 = {
- gateway = r.gw:string(),
- dest = r.dest:string(),
- dev = r.dev,
- metr = r.metric or 0
- }
- break
- end
-
- for _, r in ipairs(ip.routes({ type = 1, dest_exact = "::/0" })) do
- def6 = {
- gateway = r.gw:string(),
- dest = r.dest:string(),
- dev = r.dev,
- metr = r.metric or 0
- }
- break
- end
-
rv[#rv+1] = {
time = time,
uptime = uptime,
if bitrate ~= "N/A" then
bitrate = ( bitrate / 1000 ).."Mb/s"
end
- local interface = net.iwdata.ifname or "N/A"
+ local interface = net.iwinfo.ifname or "N/A"
%>
<tr class="cbi-section-table-row cbi-rowstyle-1">
<td class="cbi-value-field" id="<%=net:ifname()%>-signal"><%=signal_string%></td>
<div class="cbi-section">
<div class="cbi-section-node">
-<% if not defroutev4 and not defroutev6 then %>
+<% if not def4 and not def6 then %>
<%:No default routes known.%>
<%else%>
<table class="cbi-section-table">
<th class="cbi-section-table-cell"><%:Metric%></th>
</tr>
- <% if defroutev4 then %>
-
+ <% if def4 then %>
<tr class="cbi-section-table-row cbi-rowstyle-1">
- <td class="cbi-value-field" id="v4dst"><%=defroutev4.dest%></td>
- <td class="cbi-value-field" id="v4dev"><%=defroutev4.device%></td>
- <td class="cbi-value-field" id="v4gw"><%=defroutev4.gateway%></td>
- <td class="cbi-value-field" id="v4metr"><%=defroutev4.metric%></td>
+ <td class="cbi-value-field" id="v4dst"><%=def4.dest%></td>
+ <td class="cbi-value-field" id="v4dev"><%=def4.dev%></td>
+ <td class="cbi-value-field" id="v4gw"><%=def4.gateway%></td>
+ <td class="cbi-value-field" id="v4metr"><%=def4.metr%></td>
</tr>
<% end
- if defroutev6 then %>
+ if def6 then %>
<tr class="cbi-section-table-row cbi-rowstyle-2">
- <td class="cbi-value-field" id="v6dst"><%=defroutev6.dest%></td>
- <td class="cbi-value-field" id="v6dev"><%=defroutev6.device%></td>
- <td class="cbi-value-field" id="v6gw"><%=defroutev6.nexthop%></td>
- <td class="cbi-value-field" id="v6metr"><%=defroutev6.metric%></td>
+ <td class="cbi-value-field" id="v6dst"><%=def6.dest%></td>
+ <td class="cbi-value-field" id="v6dev"><%=def6.dev%></td>
+ <td class="cbi-value-field" id="v6gw"><%=def6.gateway%></td>
+ <td class="cbi-value-field" id="v6metr"><%=def6.metr%></td>
</tr>
<% end %>
server.challenge = function(user, pass)
local sid, token, secret
+ local config = require "luci.config"
+
if sys.user.checkpasswd(user, pass) then
- local sdat = util.ubus("session", "create", { timeout = luci.config.sauth.sessiontime })
+ local sdat = util.ubus("session", "create", { timeout = config.sauth.sessiontime })
if sdat then
sid = sdat.ubus_rpc_session
token = sys.uniqueid(16)
s:taboption("general", Value, "ealen",
- translate("EA-bits length")).datatype = "range(0,16)"
+ translate("EA-bits length")).datatype = "range(0,48)"
s:taboption("general", Value, "psidlen",
translate("PSID-bits length")).datatype = "range(0,16)"
%>
<div class="pull-right">
<% if ucichanges > 0 then %>
- <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes"><%:Unsaved Changes%>: <%=ucichanges%></a>
+ <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucichanges%></a>
<% end %>
<span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
<span class="label success" id="xhr_poll_status_on"><%:Auto Refresh%> <%:on%></span>
+++ /dev/null
-#
-# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
-#
-# This is free software, licensed under the Apache License, Version 2.0 .
-#
-
-include $(TOPDIR)/rules.mk
-
-LUCI_TITLE:=Freifunk Berlin Nordost Theme
-LUCI_DEPENDS:=
-
-include ../../luci.mk
-
-# call BuildPackage - OpenWrt buildroot signature
+++ /dev/null
-* {
- margin: 0;
- padding: 0;
-}
-
-body {
- background-color: #ffffff;
- color: #ffffff;
- font-family: Verdana, Arial, sans-serif;
- font-size: 100%;
- line-height: 100%;
- background-image: url(images/main-back.png);
- background-repeat: repeat-x;
- background-position: left bottom;
- }
-#all {
- margin: 0px;
- padding: 0px;
- min-height: 800px;
-}
-
-code {
- font-family: monospace;
- white-space: pre;
-}
-
-a:link, a:visited {
- color:#000000;
- font-weight:bold;
- text-decoration:none;
- }
-a:hover {
- color:#333333;
- font-weight:bold;
- }
-
-/* Custom*/
- #wrapper
-{
- width: 95%;
- color: #333333;
- margin-left: auto;
- margin-right: auto;
-/* background-image: url(images/corner-left.gif); */
-/* background-repeat: no-repeat; */
-/* background-position: left bottom; */
- background-color: #FffdF4;
- min-width: 710px;
- min-height: 710px;
-}
-#main {
- clear: both;
- width: 100%;
- margin: 0;
- padding: 0;
- color: #333333;
-/* background-image: url(images/corner-right.gif); */
-/* background-repeat: no-repeat; */
-/* background-position: right bottom; */
- min-height: 710px;
-}
-
-div#maincontent ul {
- margin-left: 2em;
-}
-
-.warning {
- color: red !important;
- font-weight: bold;
-}
-
-.clear {
- clear: both;
- height: 1px;
-}
-
-.hidden {
- display: none;
-}
-
-.error {
- color: #ff0000;
-}
-
-#header
-{
- padding: 0px;
- height: 100px;
-}
-#headerleft
-{
- height: 100px;
- background-color: #FFFfff;
- background-image: url(images/header-left.gif);
- background-repeat: no-repeat;
- background-position: left top;
-}
-#headerright
-{
- height: 100px;
- background-color: #FFfffF;
-
- margin-left: 5px;
- background-image: url(images/header-right.gif);
- background-repeat: no-repeat;
- background-position: right top;
-}
-
-#headerback
-{
- margin-right: 5px;
- height: 100px;
- background-color: #FFfffF;
- background-image: url(images/header-back.gif);
- background-repeat: repeat-x;
- background-position: left top;
-}
-#schriftzug {
- font-size : 1.5em;
- text-align:left;
- margin-bottom: 7px;
- margin-top: 7px;
- float:left;
- width: 450px;
-}
-
-#schriftzug a:hover{
- background-color:transparent;
-}
-#logo{
- margin-top: 5px;
- float:right;
- width: 115px;
-}
-
-.pathbar {
- display: none;
-}
-
-.menubar {
- width: 100%;
- min-height: 1.8em;
- background: #ffffff;
- color: #000000;
- border-top:0.4em solid #DC0067;
-}
-
-.mainmenu {
- float: left;
- width: auto;
- min-height: 1.8em;
- background: #ffffff;
- color: #000000;
-}
-.modemenu li {
- border-top:0.3em solid #DC0067;
- margin-left: 0.3em;
- margin-top: -0.3em;
-}
-.mainmenu div {
- float: left;
- border-top:0.3em solid #DC0067;
- margin-right: 0.3em;
- margin-top: -0.3em;
-}
-.mainmenu div.preactive {
- border-top: 0.3em solid #FFCB05;
- margin-top: -0.2em;
-}
-
-.mainmenu li {
- white-space: nowrap;
-}
-
-.mainmenu div ul {
- display: none;
- position: absolute;
- background: #ffffff;
- color: #000000;
- border-width: 0 1px 1px 1px;
- border-style: solid;
- border-color: #444444;
- list-style-type: none;
-}
-
-.mainmenu ul li:hover > ul,
-.mainmenu div:hover > ul {
- display: block;
-}
-
-.mainmenu ul li > ul {
- left: 100%;
- margin-top: -1.8em;
- border-width: 1px;
-}
-
-.modemenu a,
-.mainmenu a {
- display: block;
- padding: 0.2em;
- color: #000000;
- text-decoration: none;
- font-size: 70%;
- font-weight: bold;
-}
-
-
-.modemenu .active a {
- color: #000000;
- font-weight: bold;
- border-top:0.3em solid #FFCB05;
- margin-top: -0.2em;
-}
-.mainmenu .active a{
- color: #000000;
- font-weight: bold;
- border-top:0.2em solid #FFCB05;
-}
-.mainmenu li > span:active {
- background-color: #FFE990;
-}
-
-.mainmenu li:hover > span > a,
-.mainmenu div:hover > a {
-color: #ffffff;
-background-color: #FFCB05;
-}
-
-
-.modemenu a:focus,
-.mainmenu a:focus {
- color: #000000;
-}
-
-.mainmenu a:hover,
-.modemenu a:hover {
-color: #ffffff;
-background-color: #FFCB05;
-}
-
-.mainmenu div.preactive > a {
- color: #DC0067;
- font-weight: bold;
-}
-.mainmenu div.preactive > a:hover,
-.mainmenu div.preactive > a:focus {
- color: #ffffff;
- font-weight: bold;
-}
-
-.modemenu ul {
- width: auto;
- background: #000000;
- color: #ffffff;
- list-style-type: none;
-}
-
-.modemenu li {
- float: right;
-
-}
-
-#maincontent {
- clear: both;
- width: 98%;
- margin: 0 auto;
- padding: 0.5em;
- background: #FFF4BE;
- color: #000000;
- font-size: 80%;
- border-top:1px solid #D2A800;
-}
-
-#maincontent h2 {
- margin: 0.25em 0 0.5em 0;
- font-size: 150%;
- font-weight: normal;
-}
-
-#maincontent h3 {
- margin: 0.5em 0;
- font-size: 120%;
- font-weight: normal;
- text-decoration: underline;
-}
-
-#maincontent p {
- margin-bottom: 1em;
-}
-
-.cbi-section {
- margin-bottom: 0.5em;
- padding: 0.5em 1em;
- border: 1px dotted #D2A800;
- background-color: #FFE990;
-}
-
-.cbi-section legend {
- font-size: 110%;
- font-weight: bold;
- height: 1em;
- padding: 0 0.25em;
- color: #555555;
-}
-
-.cbi-section h2 {
- margin: 0em 0 0.5em -0.5em !important;
-}
-
-.cbi-section h3 {
- height: 1.5em;
- font-size: 90%;
- color: #555555;
-}
-
-.cbi-section-descr {
- margin-bottom: 0.5em;
- font-size: 95%;
-}
-
-.cbi-title-ref {
- color: inherit;
- text-decoration: none;
- padding-right: 18px;
- background: url('../resources/cbi/link.gif') no-repeat scroll right center;
- background-color: inherit;
-}
-
-input[type=submit],
-input[type=reset],
-input[type=image],
-label {
- cursor: pointer;
-}
-
-select,
-input,
-textarea {
- background: #FffdF4;
- color: #000000;
- border-width: 1px;
- border-color: #000000;
-}
-
-input[type=image] {
- border: none;
-}
-
-
-input:focus,
-input:hover,
-select:focus,
-select:hover,
-textarea:focus,
-textarea:hover {
- background-color: #FFF4BE;
-}
-
-select,
-input[type=text],
-input[type=password] {
- width: 20em;
-}
-
-td select,
-td input[type=text],
-td input[type=password] {
- width: 99%;
-}
-
-img.cbi-image-button {
- cursor: pointer;
- margin: 0 2px;
- vertical-align: middle;
-}
-
-input.cbi-input-user {
- background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
-}
-
-input.cbi-input-password {
- background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
-}
-
-input.cbi-input-find {
- background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
-}
-
-input.cbi-input-reload {
- background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
-}
-
-input.cbi-input-add,
-input.cbi-button-add {
- background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-input-fieldadd,
-input.cbi-button-fieldadd {
- background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-input-reset,
-input.cbi-button-reset {
- background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-input-save,
-input.cbi-button-save {
- background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-input-apply,
-input.cbi-button-apply {
- background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-input-remove,
-div.cbi-section-remove input {
- background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
- background-color: inherit;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-button-up {
- background-image: url('../resources/cbi/up.gif');
- padding-left: 11px;
- padding-right: 1px;
-}
-
-input.cbi-button-down {
- background-image: url('../resources/cbi/down.gif');
- padding-left: 11px;
- padding-right: 1px;
-}
-
-input.cbi-button-edit {
- background-image: url('../resources/cbi/edit.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-button-reload {
- background-image: url('../resources/cbi/reload.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-button-reset {
- background-image: url('../resources/cbi/reset.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-input.cbi-button-remove {
- background-image: url('../resources/cbi/remove.gif');
- color: #000000;
- padding-left: 17px;
- padding-right: 1px;
-}
-
-.cbi-input-invalid {
- background-image: url('../resources/cbi/reset.gif');
- background-repeat: no-repeat;
- background-position: right;
- color: #FF0000 !important;
- border-color: #FF0000;
-}
-
-div.cbi-section-remove input {
- border-bottom: none;
-}
-
-textarea {
- margin-left: -1px;
- margin-bottom: 0.5em;
-}
-
-form > div > input[type=submit],
-form > div > input[type=reset] {
- float: right;
- margin-left: 0.5em;
-}
-
-table.smalltext {
-background-color: #FFCB05;
- border-top: 1px solid #666666;
- border-right: 1px solid #666666;
- border-bottom: 1px solid #666666;
- font-size: 90%;
- width: 80%;
- margin-left: auto;
- margin-right: auto;
- border-collapse: collapse;
-}
-
-table.smalltext tr:hover td {
-background-color: #FFE990;
-}
-
-table.smalltext tr th {
- padding: 0 0.25em;
- border-left: 1px solid #666666;
- text-align: left;
-}
-
-table.smalltext tr td {
- padding: 0 0.25em;
- border-top: 1px solid #666666;
- border-left: 1px solid #666666;
-}
-
-.cbi-rowstyle-1 {
- background-color: #FFF4BE;
-}
-
-.cbi-rowstyle-2 {
-}
-
-table.cbi-section-table .cbi-section-table-cell {
- padding: 3px;
- white-space: nowrap;
-}
-
-div.cbi-value {
- clear: left;
- vertical-align: middle;
- padding-left: 0.25em;
- border-bottom: 1px dotted #FFCB05;
-}
-
-div.cbi-value:hover {
- background: #FFF4BE;
-}
-
-div.cbi-value:last-child {
- border: none;
-}
-
-.cbi-value-title {
- float: left;
- width: 40%;
-}
-
-div.cbi-value-field {
- width: 58%;
- margin: 0.25em 0 0.25em 40%;
-}
-
-div.cbi-value-description {
- font-size: 90%;
-}
-
-div.cbi-value-field > div.cbi-value-description {
- display: none;
-}
-
-div.cbi-value:hover div.cbi-value-field > div.cbi-value-description {
- display: block;
- color: #ffffff;
- background-color: #FFCB05;
-}
-
-option:active,
-option:before,
-option:after,
-option:focus,
-option:hover {
- color: #ffffff;
- background-color: #EEBA00;
- background: url(images/bgoption.png);
-}
-
-div.cbi-section-create {
- clear: left;
- white-space: nowrap;
-}
-
-div.cbi-map-descr {
- margin-bottom: 1em;
-}
-
-div.cbi-optionals {
- margin: 0.5em 0;
- padding: 0 0.25em;
-}
-
-div.cbi-section-remove {
- float: right;
-}
-
-.cbi-section-node {
- clear: both;
- border: 1px dotted #FFCB05;
- padding-bottom: 0;
-}
-
-.cbi-section-node div.cbi-section-table-row {
- margin: 0.25em;
-}
-
-table.cbi-section-table {
- width: 100%;
- font-size: 95%;
-}
-
-table.cbi-section-table th,
-table.cbi-section-table td {
- text-align: center;
-}
-
-tr.cbi-section-table-descr th {
- font-weight: normal;
- font-size: 90%;
-}
-
-td.cbi-section-table-optionals {
- text-align: left !important;
- padding-top: 1em;
-}
-
-.cbi-value-helpicon img {
- vertical-align: bottom;
-}
-
-div.cbi-error {
- font-size: 95%;
- font-weight: bold;
- color: #FF0000;
-}
-
-td.cbi-value-error {
- border-color: red !important;
-}
-
-.cbi-value-error input,
-.cbi-value-error select {
- color: red !important;
- background-color: #FFCCCC;
-}
-
-.cbi-section-error {
- color: red;
- font-size: 95%;
- border: 1px dotted red;
- margin: 3px;
- padding: 3px;
-}
-
-ul.cbi-apply {
- font-size: 90%;
-}
-
-ul.cbi-tabmenu {
- padding: 3px 0;
- margin-left: 0 !important;
- margin-bottom: -1px;
- list-style-type: none;
-}
-
-ul.cbi-tabmenu li.cbi-tab,
-ul.cbi-tabmenu li.cbi-tab-disabled {
- display: inline;
- margin: 0;
-}
-
-ul.cbi-tabmenu li.cbi-tab a,
-ul.cbi-tabmenu li.cbi-tab-disabled a {
- text-decoration: none;
- padding: 3px 7px;
- margin-right: 3px;
- border: 1px outset #000;
- border-bottom: none;
- background-color: #eee;
- color: #bbb;
-}
-
-ul.cbi-tabmenu li.cbi-tab-highlighted a {
- color: #000;
- background-color: #FFEEAA;
-}
-
-ul.cbi-tabmenu li a:hover {
- color: #000;
-}
-
-ul.cbi-tabmenu li.cbi-tab a {
- position: relative;
- top: 1px;
- padding-top: 4px;
- color: #000;
- background-color: #fff;
-}
-
-div.cbi-tab-descr {
- background-image: url(/luci-static/resources/cbi/help.gif);
- background-position: 0.25em 50%;
- background-repeat: no-repeat;
- border-bottom: 1px solid #ccc;
- margin: 0.25em 0.25em 2em;
- padding: 0.5em 0.5em 0.5em 2em;
-}
-
-
-.left {
- text-align: left !important;
-}
-
-.right {
- text-align: right !important;
-}
-
-.luci {
- position: fixed;
- bottom: 0;
- left: 0;
- text-align: right;
-}
-
-.luci a {
- color: #666666;
- text-decoration: none;
- font-size: 70%;
-}
-
-.inline {
- display: inline;
-}
-
-.error500 {
- white-space: normal;
- border: 1px dotted #FF0000;
- background-color: #FFFFFF;
- padding: 0.5em;
-}
-
-/* obligatory IE6 Voodoo Code */
-* html body {
- padding-left: 50% !important;
-}
-
-* html div#header {
- margin-left: -100% !important;
-}
-
-* html div.menubar {
- margin-left: -100% !important;
- width: 200% !important;
-}
-
-* html div#maincontent {
- margin-left: -80% !important;
- width: 160% !important;
-}
-
-* html div.mainmenu div.hover ul,
-* html div.mainmenu div li.hover ul,
-* html div.mainmenu div li li.hover ul,
-* html div.mainmenu div li li li.hover ul,
-* html div.mainmenu div li li li li.hover ul {
- display: block !important;
- margin-left: 3em;
-}
-
-* html div.mainmenu div.hover ul {
- margin-left: 0;
-}
-
-* html div.mainmenu .hover ul ul,
-* html div.mainmenu .hover ul ul ul,
-* html div.mainmenu .hover ul ul ul ul,
-* html div.mainmenu .hover ul ul ul ul ul {
- display: none !important;
-}
-
-* html div.mainmenu li {
- height: 1em !important;
- width: 10em !important;
-}
-
-* html .mainmenu {
- height: 1.8em;
-}
-
-* html div.cbi-value-description {
- margin-left: 40%;
-}
-
-
-.ifacebox {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
- margin: 0 10px;
- text-align: center;
- white-space: nowrap;
-}
-
-.ifacebox .ifacebox-head {
- border-bottom: 1px solid #CCCCCC;
- padding: 2px;
-}
-
-.ifacebox .ifacebox-body {
- padding: 2px;
-}
-
-
-.ifacebadge {
- background-color: #FFFFFF;
- border: 1px solid #CCCCCC;
- padding: 2px;
- margin-left: 2px;
- display: inline-block;
-}
-
-.ifacebadge-active {
- border-color: #000000;
- font-weight: bold;
-}
-
-
-.zonebadge {
- padding: 2px;
- display: inline-block;
- white-space: nowrap;
- cursor: pointer;
-}
-
-.zonebadge em,
-.zonebadge strong {
- margin: 3px;
- display: inline-block;
-}
-
-.zonebadge input {
- width: 6em;
- height: 1.5em;
-}
-
-.zonebadge-empty {
- border: 1px dashed #AAAAAA;
- color: #AAAAAA;
- font-style: italic;
- font-size: smaller;
-}
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
- <br class="clear" />
- </div>
-</div></div>
-</div>
-
-<div class="luci separator black whitetext bold">
- <% local ver = require "luci.version" -%>
- <a href="<%=controller%>/about">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a>
-</div>
-</div><!-- end main --><div align="center" style="padding-top:5px "></div>
-<br>
-</div><!-- end wrapper -->
-
-</center>
-</div>
-
-</body>
-</html>
+++ /dev/null
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%
-require("luci.sys")
-require("luci.util")
-
-local boardinfo = luci.util.ubus("system", "board")
-
-local request = require("luci.dispatcher").context.path
-local category = request[1]
-local tree = luci.dispatcher.node()
-local cattree = category and luci.dispatcher.node(category)
-local node = luci.dispatcher.context.dispatched
-
-local c = tree
-for i,r in ipairs(request) do
- if c.nodes and c.nodes[r] then
- c = c.nodes[r]
- c._menu_selected = true
- end
-end
-
-require("luci.http").prepare_content("text/html")
-
--%>
-
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
- <% if node and node.css then %><link rel="stylesheet" type="text/css" href="<%=resource%>/<%=node.css%>" /><% end %>
- <% if css then %><style title="text/css">
- <%-= css %>
- </style>
- <% end -%>
- <link rel="shortcut icon" href="<%=media%>/images/favicon.ico" />
- <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
- <meta http-equiv="content-script-type" content="text/javascript" />
- <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
- <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
-
- <!--[if lt IE 7]>
- <script type="text/javascript">
- function setup_hover() {
- function ie_hover(e) {
- e.onmouseover = function() { this.className = "hover" }
- e.onmouseout = function() { this.className = null }
- }
-
- var lis = document.getElementById("mainmenu").getElementsByTagName("LI");
- var divs = document.getElementById("mainmenu").getElementsByTagName("DIV");
-
- for( var i = 0; i < lis.length; i++ ) ie_hover( lis[i] );
- for( var i = 0; i < divs.length; i++ ) ie_hover( divs[i] );
- }
- </script>
- <![endif]-->
-</head>
-<body onload="window.setup_hover && setup_hover()">
-<div id="all">
-<center>
-
-<div id="wrapper">
-<%- if luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
- <div class="warning">
- <strong><%:No password set!%></strong><br />
- <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
- </div>
-<%- end -%>
-<div id="main">
-
-
-<div id="header">
- <div id="headerleft">
- <div id="headerright">
- <div id="headerback">
- <div id="schriftzug"><img src="<%=media%>/images/schriftzug.gif" alt="Freifunk Nordost ueberschrift" name="Freifunk_nordost_ueberschrift" border="0"> </div>
- <div id="logo"><img src="<%=media%>/images/logo.gif" alt="Freifunk Nordost logo" name="Freifunk_nordost" border="0"></a></div>
- <div class="clear"></div>
-
- </div>
- </div>
- </div>
-</div>
-
-<div class="pathbar separator black whitetext bold">
-<%:Path%>: <%
-local c = tree
-local url = controller
-for k,v in pairs(request) do
- if c.nodes and c.nodes[v] then
- c = c.nodes[v]
- url = url .. "/" .. v
- %><a href="<%=url%>"><%=pcdata(striptags(translate(c.title) or v))%></a> <% if k ~= #request then %>» <% end
- end
-end
-%>
-</div>
-
-<div class="menubar">
- <div id="mainmenu" class="mainmenu">
-<%-
-local function submenu(prefix, node)
- if not node.nodes or node.hidden then
- return false
- end
- local index = {}
- local count = 0
- for k, n in pairs(node.nodes) do
- if n.title and n.target then
- table.insert(index, {name=k, order=n.order or 100})
- count = count + 1
- end
- end
-
- table.sort(index, function(a, b) return a.order < b.order end)
-
- if count > 0 then
-%>
- <ul>
- <%- for j, v in pairs(index) do
- if not v.hidden and #v.name > 0 then
- local nnode = node.nodes[v.name]
- local href = controller .. prefix .. v.name
- href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
- %>
- <li>
- <span<% if nnode._menu_selected then %> class="active"<%end%>><a href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a></span>
- <%- submenu(prefix .. v.name .. "/", nnode) %>
- </li>
- <%- end %>
- <%- end %>
- </ul>
-<%-
- end
-end
-
-if cattree and cattree.nodes then
- local index = {}
- for k, node in pairs(cattree.nodes) do
- table.insert(index, {name=k, order=node.order or 100})
- end
-
- table.sort(index, function(a, b) return a.order < b.order end)
-
- for i, k in ipairs(index) do
- node = cattree.nodes[k.name]
- if not node.hidden and node.title and node.target then
- local href = controller.."/"..category.."/"..k.name
- href = (k.query) and href .. luci.http.build_querystring(k.query) or href %>
- <div<% if node._menu_selected then %> class="preactive"<%end%>><a href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(node.title)))%></a>
- <%submenu("/" .. category .. "/" .. k.name .. "/", node)%>
- </div>
-<% end
- end
-end
-%>
- </div>
- <div class="modemenu">
- <ul><%
- for k,node in pairs(tree.nodes) do
- if node.title and not node.hidden then %>
- <li<% if request[1] == k then %> class="active"<%end%>><a href="<%=controller%>/<%=k%>"><%=pcdata(striptags(translate(node.title)))%></a></li>
-<% end
- end%>
- </ul>
- </div>
-
- <%
- if tree.nodes[category] and tree.nodes[category].ucidata then
- local ucic = 0
-
- for i, j in pairs(require("luci.model.uci").cursor():changes()) do
- for k, l in pairs(j) do
- for m, n in pairs(l) do
- ucic = ucic + 1;
- end
- end
- end
- %>
- <div class="mainmenu" style="float:right; margin-right:2em">
- <div>
- <% if ucic > 0 then %>
- <a class="warning" href="<%=controller%>/<%=category%>/uci/changes"><%:Unsaved Changes%>: <%=ucic%></a>
- <% submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"]) -%>
- <% else %>
- <a href="#"><%:Changes%>: 0</a>
- <% end %>
- </div>
- </div>
- <% end %>
-
- <br class="clear" />
-</div>
-
-<div id="maincontent">
-<% if category ~= "freifunk" and category ~= "splash" then %>
-<noscript>
- <div class="errorbox">
- <strong><%:Java Script required!%></strong><br />
- <%:You must enable Java Script in your browser or LuCI will not work properly.%>
- </div>
-</noscript>
-<% end %>
+++ /dev/null
-#!/bin/sh
-uci batch <<-EOF
- set luci.themes.Freifunk_BNO=/luci-static/freifunk-bno
- set luci.main.mediaurlbase=/luci-static/freifunk-bno
- commit luci
-EOF
--- /dev/null
+#
+# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=Material Theme
+LUCI_DEPENDS:=
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
--- /dev/null
+/**
+ * Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+ *
+ * luci-theme-material
+ * Copyright 2015 Lutty Yang <lutty@wcan.in>
+ *
+ * Have a bug? Please create an issue here on GitHub!
+ * https://github.com/LuttyYang/luci-theme-material/issues
+ *
+ * luci-theme-bootstrap:
+ * Copyright 2008 Steven Barth <steven@midlink.org>
+ * Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ * Copyright 2012 David Menting <david@nut-bolt.nl>
+ *
+ * MUI:
+ * https://github.com/muicss/mui
+ *
+ * Licensed to the public under the Apache License 2.0
+ */
+
+/*
+ * Font generate by Icomoon<icomoon.io>
+ */
+@font-face {
+ font-family: 'icomoon';
+ src: url('../fonts/font.eot');
+ src: url('../fonts/font.eot') format('embedded-opentype'),
+ url('../fonts/font.ttf') format('truetype'),
+ url('../fonts/font.woff') format('woff'),
+ url('../fonts/font.svg') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+.cbi-button-up,
+.cbi-button-down,
+.cbi-value-helpicon,
+.showSide,
+.main > .loading > span {
+ font-family: 'icomoon' !important;
+ speak: none;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ line-height: 1;
+
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+
+html {
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+
+html, body {
+ margin: 0px;
+ padding: 0px;
+ height: 100%;
+ font-family: "Helvetica Neue", Helvetica, Microsoft Yahei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif;
+}
+
+select {
+ padding: 0.36rem 0.8rem;
+ color: #555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+}
+
+select,
+input {
+ background-color: transparent;
+ color: rgba(0, 0, 0, .87);
+ border: none;
+ border-bottom: 1px solid rgba(0, 0, 0, .26);
+ outline: 0;
+ padding: 0;
+ box-shadow: none;
+ border-radius: 0;
+ background-image: none;
+ height: 2rem;
+ font-size: 1.1rem;
+}
+
+select:not([multiple="multiple"]):focus,
+input:focus {
+ height: 2rem;
+ height: calc(2rem + 1px);
+ margin-bottom: -1px;
+ border-color: #0099CC;
+ border-width: 2px;
+}
+
+select[multiple="multiple"] {
+ height: auto;
+}
+
+code {
+ color: #0099CC;
+}
+
+abbr {
+ color: #005470;
+ text-decoration: underline;
+ cursor: help;
+}
+
+hr{
+ margin: 1rem 0;
+ border-color: #EEE;
+ opacity: 0.1;
+}
+
+header, .main {
+ width: 100%;
+ position: absolute;
+}
+
+header {
+ height: 4rem;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, .26);
+ transition: box-shadow .2s;
+ float: left;
+ position: fixed;
+ z-index: 101;
+}
+
+footer {
+ text-align: right;
+ padding: 1rem;
+ color: #aaa;
+ font-size: 0.8rem;
+ text-shadow: 0px 0px 2px #BBB;
+}
+
+footer > a {
+ color: #aaa;
+ text-decoration: none;
+}
+
+.main {
+ top: 4rem;
+ bottom: 0rem;
+ position: relative;
+ height: 100%;
+ height: calc(100% - 4rem);
+}
+
+.main > .loading {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ z-index: 1000;
+ display: block;
+ background-color: rgb(240, 240, 240);
+ top: 0;
+}
+
+.main > .loading > span {
+ display: block;
+ text-align: center;
+ margin-top: 2rem;
+ color: #888;
+ font-size: 1.3rem;
+}
+
+.main > .loading > span > .loading-img:before {
+ content: "\e603";
+}
+
+.main > .loading > span > .loading-img {
+ animation: anim-rotate 2s infinite linear;
+ margin-right: 0.2rem;
+ display: inline-block;
+}
+
+@keyframes anim-rotate {
+ 0% {
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ -ms-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+}
+
+.main-left {
+ float: left;
+ top: 4rem;
+ width: 15%;
+ width: calc(0% + 17rem);
+ height: 100%;
+ height: calc(100% - 4rem);
+ background-color: white;
+
+ overflow-x: auto;
+ position: fixed;
+}
+
+.main-right {
+ width: 85%;
+ width: calc(100% - 17rem);
+ float: right;
+ height: 100%;
+ background-color: #EEE;
+}
+
+.main-right > #maincontent {
+ background-color: #EEE;
+}
+
+.pull-right {
+ float: right;
+}
+
+.pull-left {
+ float: left;
+}
+
+header {
+ background: #0099CC;
+ color: white;
+}
+
+header > .container {
+ margin-top: 0.5rem;
+ padding: 0.5rem 1rem 0 1rem;
+}
+
+header > .container > .brand {
+ font-size: 1.5rem;
+ color: white;
+ text-decoration: none;
+ cursor: default;
+ vertical-align: text-bottom;
+}
+
+.warning {
+ background-color: #FF7D60 !important;
+ color: #FFF;
+}
+
+.errorbox,
+.alert-message {
+ margin: 2rem 0 0 0;
+ padding: 2rem;
+ border: 0;
+ font-weight: normal;
+ font-style: normal;
+ line-height: 1;
+ font-family: inherit;
+ min-width: inherit;
+ overflow: auto;
+ border-radius: 0;
+ background-color: #FFF;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+}
+
+.errorbox {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+
+.error {
+ color: red;
+}
+
+#maincontent > .container > div:nth-child(1).alert-message.warning > a {
+ font: inherit;
+ overflow: visible;
+ text-transform: none;
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ touch-action: manipulation;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-image: none;
+ min-width: 6rem;
+ padding: 0.5rem 1rem;
+ font-size: 1.1rem;
+ line-height: 1.42857143;
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+ margin-top: 2rem;
+ text-decoration: inherit;
+}
+
+.main > .main-left > .nav {
+ margin-top: 0.5rem;
+}
+
+.main > .main-left > .nav > li a {
+ color: #404040;
+ display: block;
+}
+
+.main > .main-left > .nav > li:nth-last-child(1) {
+ margin-top: 2rem;
+ font-size: 1.2rem;
+}
+
+.main > .main-left > .nav > li {
+ padding: 0.5rem 1rem;
+ cursor: pointer;
+}
+
+.main > .main-left > .nav > .slide {
+ padding: 0;
+}
+
+.main > .main-left > .nav > .slide > ul {
+ display: none;
+}
+
+.main > .main-left > .nav > .slide > .menu {
+ display: block;
+ padding: 0.5rem 1rem;
+ text-decoration: none;
+ cursor: default;
+ font-size: 1.2rem;
+}
+
+.main > .main-left > .nav > li:hover,
+.main > .main-left > .nav > .slide > .menu:hover {
+ background: #D4D4D4;
+}
+
+.main > .main-left > .nav > .slide:hover {
+ background: none;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > li {
+ padding: 0.4rem 2rem;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > .active {
+ background-color: #0099CC;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > li > a {
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > .active > a {
+ color: white;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > li:hover {
+ background: #D4D4D4;
+}
+
+.main > .main-left > .nav > .slide > .slide-menu > .active:hover {
+ background-color: #0099CC;
+ cursor: hand;
+}
+
+li {
+ list-style-type: none;
+}
+
+#maincontent > .container {
+ margin: 0 2rem 1rem 2rem;
+}
+
+h1 {
+ font-size: 4rem;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #eee;
+}
+
+h2 {
+ margin: 2rem 0 0 0;
+ font-size: 2.5rem;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #eee;
+}
+
+h3 {
+ margin: 2rem 0 0 0;
+ font-size: 2rem;
+ padding-bottom: 10px;
+}
+
+h4 {
+
+}
+
+fieldset {
+ margin: 2rem 0 0 0;
+ padding: 2rem;
+ border: 0;
+ font-weight: normal;
+ font-style: normal;
+ line-height: 1;
+ font-family: inherit;
+
+ min-width: inherit;
+ overflow-x: auto;
+ overflow-y: hidden;
+
+ border-radius: 0;
+ background-color: #FFF;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+
+ -webkit-overflow-scrolling: touch;
+}
+
+fieldset > legend {
+ display: none !important;
+}
+
+fieldset > fieldset {
+ margin: 0;
+ padding: 0;
+ border: none;
+ box-shadow: none;
+}
+
+.panel-title {
+ width: 100%;
+ display: block;
+ line-height: 1;
+ color: #404040;
+ font-size: 1.9rem;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #eee;
+}
+
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ width: 100%;
+ border: 1px solid #eee;
+}
+
+table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th {
+ padding: 8px;
+ line-height: 1.42857143;
+ border-top: 1px solid #ddd;
+
+ white-space: nowrap;
+}
+
+.cbi-section-table-cell {
+ text-align: center;
+}
+
+.cbi-section-table-row {
+ text-align: center;
+}
+
+fieldset > table > tbody > tr:nth-of-type(odd) {
+ background-color: #f9f9f9;
+}
+
+/* fix progress bar */
+#swaptotal > div,
+#swapfree > div,
+#memfree > div,
+#membuff > div,
+#conns > div,
+#memtotal > div {
+ width: 100% !important;
+ height: 1.4rem !important;
+}
+
+#swaptotal > div > div,
+#swapfree > div > div,
+#memfree > div > div,
+#membuff > div > div,
+#conns > div > div,
+#memtotal > div > div {
+ height: 1.4rem !important;
+ background-color: #0099CC !important;
+}
+
+/* fix multiple table */
+
+table table {
+ border: none;
+}
+
+.cbi-value-field table {
+ border: none;
+}
+
+td > table > tbody > tr > td {
+ border: none;
+}
+
+.cbi-value-field > table > tbody > tr > td {
+ border: none;
+}
+
+/* button style */
+
+.cbi-button {
+ -webkit-appearance: none;
+ text-transform: uppercase;
+ color: rgba(0, 0, 0, 0.87);
+ background-color: #F0F0F0;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ padding: 0.5rem 1rem;
+ border: none;
+ border-radius: 0.2rem;
+ cursor: pointer;
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+ background-image: none;
+ text-align: center;
+ vertical-align: middle;
+ white-space: nowrap;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ font-size: 1rem;
+ width: auto !important;
+}
+
+.cbi-button:hover,
+.cbi-button:focus,
+.cbi-button:active {
+ color: rgba(0, 0, 0, 0.87);
+ outline: 0;
+ text-decoration: none;
+ color: rgba(0, 0, 0, 0.87);
+}
+
+.cbi-button:hover,
+.cbi-button:focus {
+ box-shadow: 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2);
+}
+
+.cbi-button:active {
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
+}
+
+.cbi-button:disabled {
+ cursor: not-allowed;
+ pointer-events: none;
+ opacity: 0.60;
+ box-shadow: none;
+}
+
+form.inline + form.inline,
+.cbi-button + .cbi-button {
+ margin-left: 0.6rem;
+}
+
+.cbi-button-reset,
+.cbi-input-remove {
+ color: #fff !important;
+ background-color: #f0ad4e !important;
+ border-color: #eea236 !important;
+}
+
+.cbi-input-find,
+.cbi-input-save,
+.cbi-button-add,
+.cbi-button-save,
+.cbi-button-find,
+.cbi-input-reload,
+.cbi-button-reload {
+ color: #fff !important;
+ background-color: #337ab7 !important;
+ border-color: #2e6da4 !important;
+}
+
+.cbi-input-apply,
+.cbi-button-apply,
+.cbi-button-edit {
+ color: #fff !important;
+ background-color: #5bc0de !important;
+ border-color: #46b8da !important;
+}
+
+.cbi-input-reset,
+.cbi-button-remove {
+ color: #fff !important;
+ background-color: #d9534f !important;
+ border-color: #d43f3a !important;
+}
+
+.a-to-btn {
+ text-decoration: none;
+}
+
+/* table */
+
+.tabs {
+ margin: 0 -2rem;
+ padding-left: 0.5rem;
+ background-color: #FFFFFF;
+}
+
+.cbi-tabmenu > li,
+.tabs > li {
+ display: inline-block;
+ padding: 0.9rem 0rem;
+}
+
+.cbi-tabmenu > li > a,
+.tabs > li > a {
+ text-decoration: none;
+ color: #404040;
+ padding: 0.9rem 1.5rem;
+}
+
+.tabs > li[class~="active"],
+.tabs > li:hover {
+ cursor: pointer;
+ border-bottom: 0.2rem solid #0099CC;
+ color: #0099CC;
+ margin-bottom: -0.18751rem;
+}
+
+.tabs > li[class~="active"] > a {
+ color: #0099cc;
+}
+
+.tabs > li:hover {
+ border-bottom: 0.18751rem solid #C9C9C9;
+}
+
+.cbi-tabmenu {
+ border-top: 1px solid #D4D4D4;
+ border-left: 1px solid #D4D4D4;
+ border-right: 1px solid #D4D4D4;
+}
+
+.cbi-tabmenu > li:hover {
+ background-color: #F1F1F1;
+}
+
+.cbi-tabmenu > li[class~="cbi-tab"] {
+ background-color: white;
+}
+
+.cbi-tabmenu {
+ background-color: #D4D4D4;
+}
+
+.cbi-section-node-tabbed {
+ padding: 0;
+ margin-top: 0;
+ border-bottom: 1px solid #D4D4D4;
+ border-left: 1px solid #D4D4D4;
+ border-right: 1px solid #D4D4D4;
+}
+
+.cbi-tabcontainer > .cbi-value:nth-of-type(2n) {
+ background-color: #f9f9f9;
+}
+
+.cbi-value-field,
+.cbi-value-description {
+ display: table-cell;
+}
+
+.cbi-value-helpicon > img {
+ display: none;
+}
+
+.cbi-value-helpicon:before {
+ content: "\f059";
+}
+
+.cbi-value-description {
+ font-size: small;
+ opacity: 0.5;
+ padding: 0.5rem 0 0 0;
+}
+
+.cbi-value-title {
+ word-wrap: break-word;
+ padding-top: 0.6rem;
+ width: 23rem;
+ float: left;
+ text-align: right;
+ padding-right: 2rem;
+ display: table-cell;
+}
+
+.cbi-value {
+ padding: 1rem;
+ display: inline-block;
+ width: 100%;
+}
+
+.cbi-section-table-descr > .cbi-section-table-cell,
+.cbi-section-table-titles > .cbi-section-table-cell {
+ border: none;
+}
+
+.cbi-rowstyle-2 {
+ background-color: #eee;
+}
+
+.cbi-rowstyle-2 .cbi-button-up,
+.cbi-rowstyle-2 .cbi-button-down{
+ background-color: #FFF !important;
+}
+
+.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell {
+ width: auto !important;
+}
+
+/* desc */
+.cbi-section-descr,
+.cbi-map-descr {
+ padding: 0.5rem;
+ color: #999;
+ font-size: small;
+}
+
+/* luci */
+
+.hidden {
+ display: none
+}
+
+.left {
+ text-align: left !important;
+}
+
+.right {
+ text-align: right !important;
+}
+
+.inline {
+ display: inline;
+}
+
+.cbi-page-actions {
+ border-top: 1px solid #eee;
+ padding-top: 2rem;
+ text-align: right;
+}
+
+/* input */
+.cbi-value input[type="password"],
+.cbi-value input[type="text"] {
+ min-width: 15rem;
+}
+
+/* select */
+.cbi-value-field .cbi-input-select {
+ min-width: 15rem;
+}
+
+.ifacebadge {
+ display: inline-flex;
+ border-bottom: 1px solid #CCCCCC;
+ padding: 0.5rem 1rem;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.ifacebadge > img {
+ float: right;
+ margin-left: 0.3rem;
+}
+
+/*textarea*/
+
+.cbi-input-textarea {
+ width: 100%;
+ min-height: 16rem;
+ padding: 1rem;
+ font-size: 0.9rem;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color: black;
+}
+
+#syslog {
+ width: 100%;
+ min-height: 15rem;
+ padding: 1rem;
+ font-size: small;
+ color: #5F5F5F;
+
+ margin-bottom: 20px;
+ border-radius: 0;
+ background-color: #FFF;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+ border: none;
+}
+
+/* change */
+
+.uci-change-list {
+ font-family: monospace;
+}
+
+.uci-change-list ins,
+.uci-change-legend-label ins {
+ text-decoration: none;
+ border: 1px solid #00FF00;
+ background-color: #CCFFCC;
+ display: block;
+ padding: 2px;
+}
+
+.uci-change-list del,
+.uci-change-legend-label del {
+ text-decoration: none;
+ border: 1px solid #FF0000;
+ background-color: #FFCCCC;
+ display: block;
+ font-style: normal;
+ padding: 2px;
+}
+
+.uci-change-list var,
+.uci-change-legend-label var {
+ text-decoration: none;
+ border: 1px solid #CCCCCC;
+ background-color: #EEEEEE;
+ display: block;
+ font-style: normal;
+ padding: 2px;
+}
+
+.uci-change-list var ins,
+.uci-change-list var del {
+ border: none;
+ white-space: pre;
+ font-style: normal;
+ padding: 0px;
+}
+
+.uci-change-legend {
+ padding: 5px;
+}
+
+.uci-change-legend-label {
+ width: 150px;
+ float: left;
+}
+
+.uci-change-legend-label > ins,
+.uci-change-legend-label > del,
+.uci-change-legend-label > var {
+ float: left;
+ margin-right: 4px;
+ width: 10px;
+ height: 10px;
+ display: block;
+}
+
+.uci-change-legend-label var ins,
+.uci-change-legend-label var del {
+ line-height: 6px;
+ border: none;
+}
+
+.uci-change-list var,
+.uci-change-list del,
+.uci-change-list ins {
+ padding: 0.5rem;
+}
+
+/* other fix */
+#iwsvg,
+#iwsvg2,
+#bwsvg {
+ border: 1px solid #D4D4D4 !important;
+ border-top: none !important;
+}
+
+.ifacebox {
+ border: 1px solid #999;
+ background-color: #f9f9f9;
+}
+
+.cbi-image-button {
+ margin-left: 0.5rem;
+}
+
+.zonebadge {
+ padding: 0.2rem 0.5rem;
+ display: inline-block;
+ cursor: pointer;
+}
+
+.zonebadge > .ifacebadge {
+ padding: 0.2rem 1rem;
+ margin: 0.3rem;
+ border: 1px solid #6C6C6C;
+}
+
+.zonebadge > input[type="text"] {
+ padding: 0.16rem 1rem;
+ min-width: 10rem;
+ margin-top: 0.3rem;
+}
+
+.cbi-value-field .cbi-input-checkbox,
+.cbi-value-field .cbi-input-radio {
+ margin-top: 0.3rem;
+}
+
+.cbi-section-table-row > .cbi-value-field .cbi-input-select {
+ min-width: 7rem;
+}
+
+.cbi-section-create > .cbi-button-add {
+ margin: 0.5rem;
+}
+
+div.cbi-value var, td.cbi-value-field var {
+ font-style: italic;
+ color: #0069D6;
+}
+
+small {
+ font-size: small;
+ white-space: normal;
+}
+
+.cbi-button-up,
+.cbi-button-down {
+ display: inline-block;
+ min-width: 0;
+ padding: 0.2rem 0.3rem;
+ font-size: 1.3rem;
+}
+
+.cbi-optionals {
+ padding: 1rem 1rem 0 1rem;
+ border-top: 1px solid #CCC;
+}
+
+#diag-rc-output > pre {
+ background-color: #f5f5f5;
+ display: block;
+ padding: 8.5px;
+ margin: 0 0 18px;
+ line-height: 1.5rem;
+ -moz-border-radius: 3px;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ font-size: 1.5rem;
+ color: #404040;
+}
+
+input[name="ping"],
+input[name="traceroute"],
+input[name="nslookup"] {
+ width: 80%;
+}
+
+header > .container > .pull-right > * {
+ position: relative;
+ top: 0.45rem;
+ cursor: pointer;
+}
+
+#xhr_poll_status > .label.success {
+ background-color: #14CE14;
+}
+
+.label {
+ padding: 0.3rem 0.8rem;
+ font-size: 1rem;
+ font-weight: bold;
+ color: #ffffff !important;
+ text-transform: uppercase;
+ white-space: nowrap;
+ background-color: #bfbfbf;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ text-shadow: none;
+ text-decoration: none;
+}
+
+.notice {
+ background-color: #5BC0DE;
+}
+
+.showSide {
+ display: none;
+}
+
+.darkMask {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ background-color: rgba(0, 0, 0, 0.56);
+ content: "";
+ z-index: 99;
+ display: none;
+}
+
+/* fix Main Login*/
+.node-main-login > .main > .main-left {
+ display: none;
+}
+
+.node-main-login > .main > .main-right {
+ width: 100%;
+}
+
+.node-main-login > .main fieldset {
+ padding: 0.5rem;
+ margin-bottom: 1rem;
+ display: inline;
+ background: none;
+ border: none;
+ box-shadow: none;
+ overflow: hidden;
+}
+
+.node-main-login > .main .cbi-value-title {
+ width: 7rem;
+}
+
+.node-main-login > .main #maincontent {
+
+ text-align: center;
+}
+
+.node-main-login > .main .container {
+ display: inline-block;
+ padding: 2rem 4rem;
+ margin-top: 2rem !important;
+ background-color: #FFF;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+ text-align: left;
+}
+
+.node-main-login > .main form > div:nth-last-child(1) {
+ float: right;
+}
+
+.node-main-login > .main .cbi-value {
+ display: block;
+}
+
+.node-main-login > .main .cbi-value > * {
+ display: inline-block !important;
+}
+
+.node-main-login > .main .cbi-input-user,
+.node-main-login > .main .cbi-input-password {
+ min-width: 15rem;
+}
+
+.node-main-login footer {
+ bottom: 0;
+ position: absolute;
+ width: 100%;
+}
+
+/* fix status overview */
+
+.node-status-overview > .main fieldset:nth-child(4) td:nth-child(2) {
+ white-space: normal;
+}
+
+/* fix status processes */
+
+.node-status-processes > .main table tr td:nth-child(3) {
+ white-space: normal;
+}
+
+.node-status-iptables > .main div > .cbi-map > form {
+ margin: 2rem 2rem 0 0;
+}
+
+/* fix system reboot */
+
+.node-system-reboot > .main > .main-right p,
+.node-system-reboot > .main > .main-right h3 {
+ padding-left: 2rem;
+}
+
+/* fix Services Network Shares*/
+.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-title {
+ margin-bottom: 1rem;
+}
+
+.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-field {
+ display: list-item;
+}
+
+.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-description {
+ padding-top: 1rem;
+}
+
+/* fix System Software*/
+.node-system-packages > .main table tr td:nth-child(1) {
+ width: auto !important;
+}
+
+.node-system-packages > .main table tr td:nth-last-child(1) {
+ white-space: normal;
+ font-size: small;
+ color: #404040;
+}
+
+.node-system-packages > .main .cbi-tabmenu > li > a, .tabs > li > a {
+ padding: 0.5rem 1rem;
+}
+
+.node-system-packages > .main .cbi-value > pre {
+ background-color: #eee;
+ padding: 0.5rem;
+ overflow: auto;
+}
+
+.cbi-tabmenu + .cbi-section {
+ margin-top: 0;
+}
+
+/* fix network firewall*/
+.node-network-firewall > .main .cbi-section-table-row > .cbi-value-field .cbi-input-select {
+ min-width: 4rem;
+}
+
+.node-status-iptables fieldset,
+.node-system-packages fieldset,
+.node-system-flashops fieldset {
+ margin-top: 0;
+}
+
+.node-status-iptables .cbi-tabmenu,
+.node-system-packages .cbi-tabmenu,
+.node-system-flashops .cbi-tabmenu {
+ border: none;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+}
+
+#cbi-firewall-redirect table *,
+#cbi-network-switch_vlan table *,
+#cbi-firewall-zone table *{
+ font-size: small;
+}
+
+#cbi-firewall-redirect table input[type="text"],
+#cbi-network-switch_vlan table input[type="text"],
+#cbi-firewall-zone table input[type="text"]{
+ width: 5rem;
+}
+
+#cbi-firewall-redirect table select,
+#cbi-network-switch_vlan table select,
+#cbi-firewall-zone table select{
+ min-width: 3.5rem;
+}
+
+
+/* language fix */
+body.lang_pl.node-main-login .cbi-value-title {
+ width: 12rem;
+}
+
+@media screen and (max-width: 1600px) {
+ .main-left {
+ width: calc(0% + 15rem);
+ }
+
+ .main-right {
+ width: calc(100% - 15rem);
+ }
+
+ .cbi-button {
+ padding: 0.3rem 0.6rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ }
+
+ header > .container > .pull-right > * {
+ top: 0.35rem;
+ }
+
+ .label {
+ padding: 0.2rem 0.6rem;
+ }
+
+ .cbi-value-title {
+ width: 15rem;
+ padding-right: 0.6rem;
+ }
+
+ fieldset {
+ padding: 1rem;
+ }
+
+ .cbi-input-textarea {
+ font-size: small;
+ }
+
+ .node-status-iptables > .main fieldset li > a {
+ padding: 0.3rem 0.6rem;
+ }
+}
+
+@media screen and (max-width: 1280px) {
+ header {
+ height: 3.5rem;
+ }
+
+ header > .container {
+ margin-top: 0.25rem;
+ }
+
+ .main {
+ top: 3.5rem;
+ height: calc(100% - 3.5rem);
+ }
+
+ .main-left {
+ width: calc(0% + 13rem);
+ top: 3.5rem;
+ height: calc(100% - 3.5rem);
+ }
+
+ .main-right {
+ width: calc(100% - 13rem);
+ }
+
+ .cbi-tabmenu > li > a, .tabs > li > a {
+ padding: 0.2rem 0.5rem;
+ }
+
+ .panel-title {
+ font-size: 1.3rem;
+ padding-bottom: 1rem;
+ }
+
+ table {
+ font-size: 0.8rem !important;
+ width: 100% !important;
+ }
+
+ .main > .main-left > .nav > li,
+ .main > .main-left > .nav > li a,
+ .main > .main-left > .nav > .slide > .menu {
+ font-size: 1.1rem;
+ }
+
+ .main > .main-left > .nav > .slide > .slide-menu > li > a {
+ font-size: 0.9rem;
+ }
+}
+
+@media screen and (max-width: 992px) {
+ .main-left {
+ width: 0;
+ position: fixed;
+ z-index: 100;
+ }
+
+ .main-right {
+ width: 100%;
+ }
+
+ .showSide {
+ padding: 0.1rem;
+ margin-right: 0.5rem;
+ display: inline-block;
+ }
+
+ .showSide:before {
+ content: "\e20e";
+ font-size: 1.7rem;
+ }
+
+ .node-main-login .showSide {
+ display: none !important;
+ }
+
+ .cbi-value-title {
+ width: 9rem;
+ padding-right: 1rem;
+ }
+
+ .node-network-diagnostics > .main .cbi-map fieldset > div * {
+ width: 100% !important;
+ }
+
+ .node-network-diagnostics > .main .cbi-map fieldset > div input[type="text"] {
+ margin: 3rem 0 0 0 !important;
+ }
+
+ .node-network-diagnostics > .main .cbi-map fieldset > div:nth-child(4) input[type="text"] {
+ margin: 0 !important;
+ }
+
+ .node-network-diagnostics > .main .cbi-map fieldset > div select,
+ .node-network-diagnostics > .main .cbi-map fieldset > div input[type="button"] {
+ margin: 1rem 0 0 0;
+ }
+
+ .node-network-diagnostics > .main .cbi-map fieldset > div {
+ width: 100% !important;
+ }
+
+ #diag-rc-output > pre {
+ font-size: 1.2rem;
+ }
+
+ .node-main-login > .main .cbi-value-title {
+ text-align: left;
+ }
+}
+
+@media screen and (max-width: 480px) {
+ fieldset {
+ padding: 1rem;
+ margin: 1rem 0 0 0;
+ }
+
+ .tabs {
+ margin: 0 -1rem;
+ }
+
+ #maincontent > .container {
+ margin: 0 1rem 1.5rem 1rem;
+ }
+
+ .main > .main-left > .nav > .slide > .menu {
+ font-size: 1.3rem;
+ }
+
+ .main > .main-left > .nav > .slide > .slide-menu > li > a {
+ font-size: 1.1rem;
+ }
+
+ .cbi-value-title {
+ width: 100%;
+ min-width: 0rem !important;
+ display: block;
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+ text-align: left;
+ }
+
+ .cbi-value-field, .cbi-value-description {
+ width: 100%;
+ }
+
+ .cbi-value > .cbi-value-field {
+ display: inline-block;
+ }
+
+ .cbi-tabmenu > li, .tabs > li {
+ padding: 0.6rem 0rem;
+ }
+
+ .cbi-tabmenu > li > a, .tabs > li > a {
+ padding: 0.2rem 0.3rem;
+ font-size: 0.9rem;
+ }
+
+ .cbi-page-actions > div > input {
+ display: none;
+ }
+
+ .node-main-login > .main .container {
+ padding: 0.5rem 1rem 2rem 1rem;
+ }
+
+ .node-main-login > .main .cbi-value {
+ padding: 0;
+ }
+
+ .node-main-login > .main form > div:nth-last-child(1) {
+ margin-top: 2rem;
+ }
+
+ .node-main-login > .main .cbi-value-title {
+ width: 100% !important;
+ font-size: 1.2rem;
+ }
+
+ .node-main-login > .main fieldset {
+ margin: 0;
+ padding: 0.5rem;
+ }
+
+ h2 {
+ font-size: 2rem;
+ }
+
+ .tabs > li > a {
+ font-size: 0.9rem;
+ }
+
+ select,
+ input {
+ font-size: 0.9rem;
+ }
+
+ .mobile-hide {
+ display: none;
+ }
+
+ .panel-title {
+ font-size: 1.4rem;
+ padding-bottom: 1rem;
+ }
+
+ .node-system-packages > .main .cbi-value.cbi-value-last > div {
+ width: 100% !important;
+ }
+
+ .node-system-packages > .main .cbi-value .cbi-value-field input {
+ width: 100%;
+ }
+
+ .node-status-iptables > .main div > .cbi-map > form {
+ position: static !important;
+ margin: 0 0 2rem 0;
+ padding: 2rem;
+ border: 0;
+ font-weight: normal;
+ font-style: normal;
+ line-height: 1;
+ font-family: inherit;
+ min-width: inherit;
+ overflow-x: auto;
+ overflow-y: hidden;
+ border-radius: 0;
+ background-color: #FFF;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .node-status-iptables > .main div > .cbi-map > form input[type="submit"]{
+ width: 100% !important;
+ margin: 0;
+ }
+
+ .node-status-iptables > .main div > .cbi-map > form input[type="submit"] + input[type="submit"]{
+ margin-top: 1rem;
+ }
+}
+
+@media screen and (min-width: 992px) {
+ .cbi-value input[type="password"],
+ .cbi-value input[type="text"] {
+ min-width: 20rem;
+ }
+
+ .cbi-value-field .cbi-input-select {
+ min-width: 20rem;
+ }
+}
+
+@media screen and (min-width: 1280px) {
+ .cbi-value input[type="password"],
+ .cbi-value input[type="text"] {
+ min-width: 22rem;
+ }
+
+ .cbi-value-field .cbi-input-select {
+ min-width: 22rem;
+ }
+}
+
+@media screen and (min-width: 1600px) {
+ .cbi-value input[type="password"],
+ .cbi-value input[type="text"] {
+ min-width: 25rem;
+ }
+
+ .cbi-value-field .cbi-input-select {
+ min-width: 25rem;
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode=" " horiz-adv-x="512" d="" />
+<glyph unicode="" glyph-name="expand_less" d="M512 596.667l256-256-60-60-196 196-196-196-60 60z" />
+<glyph unicode="" glyph-name="expand_more" d="M708 572.667l60-60-256-256-256 256 60 60 196-196z" />
+<glyph unicode="" glyph-name="menu" d="M128 682.667h768v-86h-768v86zM128 384.667v84h768v-84h-768zM128 170.667v86h768v-86h-768z" />
+<glyph unicode="" glyph-name="favorite" d="M512 28.667l-62 56q-106 96-154 142t-107 114-81 123-22 113q0 98 67 166t167 68q116 0 192-90 76 90 192 90 100 0 167-68t67-166q0-78-52-162t-113-146-199-186z" />
+<glyph unicode="" glyph-name="spinner9" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96s96 42.98 96 96c0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96s-96-42.98-96-96c0-282.77 229.23-512 512-512z" />
+<glyph unicode="" glyph-name="question-circle" horiz-adv-x="878" d="M512 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-109.714q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143zM658.286 548.571q0 50.286-31.714 93.143t-79.143 66.286-97.143 23.429q-138.857 0-212-121.714-8.571-13.714 4.571-24l75.429-57.143q4-3.429 10.857-3.429 9.143 0 14.286 6.857 30.286 38.857 49.143 52.571 19.429 13.714 49.143 13.714 27.429 0 48.857-14.857t21.429-33.714q0-21.714-11.429-34.857t-38.857-25.714q-36-16-66-49.429t-30-71.714v-20.571q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143q0 10.857 12.286 28.286t31.143 28.286q18.286 10.286 28 16.286t26.286 20 25.429 27.429 16 34.571 7.143 46.286zM877.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z" />
+</font></defs></svg>
\ No newline at end of file
--- /dev/null
+/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
+return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
--- /dev/null
+/**
+ * Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+ *
+ * luci-theme-material
+ * Copyright 2015 Lutty Yang <lutty@wcan.in>
+ *
+ * Have a bug? Please create an issue here on GitHub!
+ * https://github.com/LuttyYang/luci-theme-material/issues
+ *
+ * luci-theme-bootstrap:
+ * Copyright 2008 Steven Barth <steven@midlink.org>
+ * Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ * Copyright 2012 David Menting <david@nut-bolt.nl>
+ *
+ * MUI:
+ * https://github.com/muicss/mui
+ *
+ * Licensed to the public under the Apache License 2.0
+ */
+(function ($) {
+ $(".main > .loading").fadeOut();
+
+ /**
+ * trim text, Remove spaces, wrap
+ * @param text
+ * @returns {string}
+ */
+ function trimText(text) {
+ return text.replace(/[ \t\n\r]+/g, " ");
+ }
+
+
+ var lastNode = undefined;
+ var mainNodeName = undefined;
+
+ var nodeUrl = "";
+ (function(node){
+ if (node[0] == "admin"){
+ luciLocation = [node[1], node[2]];
+ }else{
+ luciLocation = node;
+ }
+
+ for(var i in luciLocation){
+ nodeUrl += luciLocation[i];
+ if (i != luciLocation.length - 1){
+ nodeUrl += "/";
+ }
+ }
+ })(luciLocation);
+
+ /**
+ * get the current node by Burl (primary)
+ * @returns {boolean} success?
+ */
+ function getCurrentNodeByUrl() {
+ var ret = false;
+ if (!$('body').hasClass('logged-in')) {
+ luciLocation = ["Main", "Login"];
+ return true;
+ }
+
+ $(".main > .main-left > .nav > .slide > .menu").each(function () {
+ var ulNode = $(this);
+ ulNode.next().find("a").each(function () {
+ var that = $(this);
+ var href = that.attr("href");
+
+ if (href.indexOf(nodeUrl) != -1) {
+ ulNode.click();
+ ulNode.next(".slide-menu").stop(true, true);
+ lastNode = that.parent();
+ lastNode.addClass("active");
+ ret = true;
+ return true;
+ }
+ });
+ });
+ return ret;
+ }
+
+ /**
+ * menu click
+ */
+ $(".main > .main-left > .nav > .slide > .menu").click(function () {
+ var ul = $(this).next(".slide-menu");
+ var menu = $(this);
+ if (!ul.is(":visible")) {
+ menu.addClass("active");
+ ul.addClass("active");
+ ul.stop(true).slideDown("fast");
+ } else {
+ ul.stop(true).slideUp("fast", function () {
+ menu.removeClass("active");
+ ul.removeClass("active");
+ });
+ }
+ });
+
+ /**
+ * hook menu click and add the hash
+ */
+ $(".main > .main-left > .nav > .slide > .slide-menu > li > a").click(function () {
+ if (lastNode != undefined) lastNode.removeClass("active");
+ $(this).parent().addClass("active");
+ $(".main > .loading").fadeIn("fast");
+ return true;
+ });
+
+ /**
+ * fix menu click
+ */
+ $(".main > .main-left > .nav > .slide > .slide-menu > li").click(function () {
+ if (lastNode != undefined) lastNode.removeClass("active");
+ $(this).addClass("active");
+ $(".main > .loading").fadeIn("fast");
+ window.location = $($(this).find("a")[0]).attr("href");
+ return;
+ });
+
+ /**
+ * get current node and open it
+ */
+ if (getCurrentNodeByUrl()) {
+ mainNodeName = "node-" + luciLocation[0] + "-" + luciLocation[1];
+ mainNodeName = mainNodeName.replace(/[ \t\n\r\/]+/g, "_").toLowerCase();
+ $("body").addClass(mainNodeName);
+ }
+ $(".cbi-button-up").val("");
+ $(".cbi-button-down").val("");
+
+
+ /**
+ * hook other "A Label" and add hash to it.
+ */
+ $("#maincontent > .container").find("a").each(function () {
+ var that = $(this);
+ var onclick = that.attr("onclick");
+ if (onclick == undefined || onclick == "") {
+ that.click(function () {
+ var href = that.attr("href");
+ if (href.indexOf("#") == -1) {
+ $(".main > .loading").fadeIn("fast");
+ return true;
+ }
+ });
+ }
+ });
+
+ /**
+ * Sidebar expand
+ */
+ var showSide = false;
+ $(".showSide").click(function () {
+ if (showSide) {
+ $(".darkMask").stop(true).fadeOut("fast");
+ $(".main-left").stop(true).animate({
+ width: "0"
+ }, "fast");
+ $(".main-right").css("overflow-y", "auto");
+ showSide = false;
+ } else {
+ $(".darkMask").stop(true).fadeIn("fast");
+ $(".main-left").stop(true).animate({
+ width: "15rem"
+ }, "fast");
+ $(".main-right").css("overflow-y", "hidden");
+ showSide = true;
+ }
+ });
+
+
+ $(".darkMask").click(function () {
+ if (showSide) {
+ showSide = false;
+ $(".darkMask").stop(true).fadeOut("fast");
+ $(".main-left").stop(true).animate({
+ width: "0"
+ }, "fast");
+ $(".main-right").css("overflow-y", "auto");
+ }
+ });
+
+ $(window).resize(function () {
+ if ($(window).width() > 921) {
+ $(".main-left").css("width", "");
+ $(".darkMask").stop(true);
+ $(".darkMask").css("display", "none");
+ showSide = false;
+ }
+ });
+
+ /**
+ * fix legend position
+ */
+ $("legend").each(function () {
+ var that = $(this);
+ that.after("<span class='panel-title'>" + that.text() + "</span>");
+ });
+
+
+ $(".main-right").focus();
+ $(".main-right").blur();
+ $("input").attr("size", "0");
+
+ if (mainNodeName != undefined) {
+ console.log(mainNodeName);
+ switch (mainNodeName) {
+ case "node-status-system_log":
+ case "node-status-kernel_log":
+ $("#syslog").focus(function () {
+ $("#syslog").blur();
+ $(".main-right").focus();
+ $(".main-right").blur();
+ });
+ break;
+ case "node-status-firewall":
+ var button = $(".node-status-firewall > .main fieldset li > a");
+ button.addClass("cbi-button cbi-button-reset a-to-btn");
+ break;
+ case "node-system-reboot":
+ var button = $(".node-system-reboot > .main > .main-right p > a");
+ button.addClass("cbi-button cbi-input-reset a-to-btn");
+ break;
+ }
+ }
+
+})(jQuery);
--- /dev/null
+<%#
+ Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+
+ luci-theme-material
+ Copyright 2015 Lutty Yang <lutty@wcan.in>
+
+ Have a bug? Please create an issue here on GitHub!
+ https://github.com/LuttyYang/luci-theme-material/issues
+
+ luci-theme-bootstrap:
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2012 David Menting <david@nut-bolt.nl>
+
+ MUI:
+ https://github.com/muicss/mui
+
+ Licensed to the public under the Apache License 2.0
+-%>
+
+<%
+ local ver = require "luci.version"
+ local disp = require "luci.dispatcher"
+ local request = disp.context.path
+ local category = request[1]
+ local tree = disp.node()
+ local categories = disp.node_childs(tree)
+%>
+ </div>
+ <footer class="mobile-hide">
+ <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> /
+ <a href="https://openwrt.org/"><%= ver.distversion %></a>
+ <% if #categories > 1 then %>
+ <ul class="breadcrumb pull-right" id="modemenu">
+ <% for i, r in ipairs(categories) do %>
+ <li<% if request[1] == r then %> class="active"<%end%>><a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> <span class="divider">|</span></li>
+ <% end %>
+ </ul>
+ <% end %>
+ </footer>
+ </div>
+ </div>
+
+ <script>
+ // thanks for Jo-Philipp Wich <jow@openwrt.org>
+ var luciLocation = <%= luci.http.write_json(luci.dispatcher.context.path) %>;
+ </script>
+ <script src="<%=media%>/js/jquery.min.js"></script>
+ <script src="<%=media%>/js/script.js"></script>
+</body>
+</html>
--- /dev/null
+<%#
+ Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
+
+ luci-theme-material
+ Copyright 2015 Lutty Yang <lutty@wcan.in>
+
+ Have a bug? Please create an issue here on GitHub!
+ https://github.com/LuttyYang/luci-theme-material/issues
+
+ luci-theme-bootstrap:
+ Copyright 2008 Steven Barth <steven@midlink.org>
+ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2012 David Menting <david@nut-bolt.nl>
+
+ MUI:
+ https://github.com/muicss/mui
+
+ Licensed to the public under the Apache License 2.0
+-%>
+
+<%
+ local ver = require "luci.version"
+ local sys = require "luci.sys"
+ local util = require "luci.util"
+ local http = require "luci.http"
+ local disp = require "luci.dispatcher"
+
+ local boardinfo = util.ubus("system", "board")
+
+ local request = disp.context.path
+ local request2 = disp.context.request
+
+ local category = request[1]
+ local cattree = category and disp.node(category)
+
+ local leaf = request2[#request2]
+
+ local tree = disp.node()
+ local node = disp.context.dispatched
+
+ local categories = disp.node_childs(tree)
+
+ local c = tree
+ local i, r
+
+ -- tag all nodes leading to this page
+ for i, r in ipairs(request) do
+ if c.nodes and c.nodes[r] then
+ c = c.nodes[r]
+ c._menu_selected = true
+ end
+ end
+
+ -- send as HTML5
+ http.prepare_content("text/html")
+
+ local function nodeurl(prefix, name, query)
+ local url = controller .. prefix .. name .. "/"
+ if query then
+ url = url .. http.build_querystring(query)
+ end
+ return pcdata(url)
+ end
+
+ local function subtree(prefix, node, level)
+ if not level then
+ level = 1
+ end
+
+ local childs = disp.node_childs(node)
+ if #childs > 0 then
+
+ if level > 2 then
+%>
+ <ul class="tabs">
+ <%
+ end
+
+ local selected_node
+ local selected_name
+ local i, v
+
+ for i, v in ipairs(childs) do
+ local nnode = node.nodes[v]
+ if nnode._menu_selected then
+ selected_node = nnode
+ selected_name = v
+ end
+ if level > 2 then
+ %>
+ <li class="tabmenu-item-<%=v%><%- if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
+ <a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
+ </li>
+ <% end
+ end
+
+ if level > 2 then
+ %>
+ </ul>
+<% end
+
+ if selected_node then
+ subtree(prefix .. selected_name .. "/", selected_node, level + 1)
+ end
+ end
+ end
+-%>
+<!DOCTYPE html>
+<html lang="<%=luci.i18n.context.lang%>">
+<head>
+ <meta charset="utf-8">
+ <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
+ <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
+ <meta name="format-detection" content="telephone=no, email=no"/>
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="x5-fullscreen" content="true">
+ <meta name="full-screen" content="yes">
+ <meta name="x5-page-mode" content="app">
+ <meta name="browsermode" content="application">
+ <meta name="theme-color" content="#0099CC">
+ <meta name="msapplication-tap-highlight" content="no">
+ <meta name="msapplication-TileColor" content="#0099CC">
+ <meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
+ <link rel="stylesheet" href="<%=media%>/css/style.css">
+ <link rel="shortcut icon" href="<%=media%>/favicon.ico">
+ <% if node and node.css then %>
+ <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
+ <% end -%>
+ <% if css then %>
+ <style title="text/css">
+ <%-= css %>
+ </style>
+ <% end -%>
+ <script src="<%=resource%>/xhr.js"></script>
+</head>
+
+<body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>">
+
+<header>
+ <div class="container">
+ <span class="showSide"></span>
+ <a class="brand" href="#"><%=boardinfo.hostname or "?"%></a>
+ <div class="pull-right">
+ <%
+ -- calculate the number of unsaved changes
+ if tree.nodes[category] and tree.nodes[category].ucidata then
+ local ucichanges = 0
+ for i, j in pairs(require("luci.model.uci").cursor():changes()) do
+ for k, l in pairs(j) do
+ for m, n in pairs(l) do
+ ucichanges = ucichanges + 1;
+ end
+ end
+ end
+ %>
+ <% if ucichanges > 0 then %>
+ <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><span class="mobile-hide"><%:Unsaved Changes%>: </span><%=ucichanges%></a>
+ <% end %>
+ <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
+ <span class="label success" id="xhr_poll_status_on"><span class="mobile-hide"><%:Auto Refresh%> </span><%:on%></span>
+ <span class="label" id="xhr_poll_status_off" style="display:none"><span class="mobile-hide"><%:Auto Refresh%> </span><%:off%></span>
+ </span>
+ <% end %>
+ </div>
+ </div>
+</header>
+
+ <div class="main">
+ <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
+ <div class="main-left">
+ <ul class="nav">
+ <%-
+ local function submenu(prefix, node)
+ local childs = disp.node_childs(node)
+ if #childs > 0 then
+ %>
+ <ul class="slide-menu">
+ <%-
+ for i, r in ipairs(childs) do
+ local nnode = node.nodes[r]
+ local href = controller .. prefix .. r ..
+ (nnode.query and http.build_querystring(nnode.query) or "")
+ %>
+ <li><a data-title="<%=pcdata(striptags(nnode.title))%>" href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a></li>
+ <%-
+ end
+ %>
+ </ul>
+ <%-
+ end
+ end
+
+ childs = disp.node_childs(cattree)
+
+ if #childs > 0 then
+ for i, r in ipairs(childs) do
+ local nnode = cattree.nodes[r]
+ local href = controller .. "/" .. category .. "/" .. r ..
+ (nnode.query and http.build_querystring(k.query) or "")
+ local grandchildren = disp.node_childs(nnode)
+
+ if #grandchildren > 0 then
+ %>
+ <li class="slide">
+ <a class="menu" data-title="<%=pcdata(striptags(nnode.title))%>" href="#"><%=pcdata(striptags(translate(nnode.title)))%></a>
+ <%- submenu("/" .. category .. "/" .. r .. "/", nnode) %>
+ </li>
+ <% else %>
+ <li>
+ <a data-title="<%=pcdata(striptags(nnode.title))%>" href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a>
+ </li>
+ <%
+ end
+ end
+ end
+ %>
+ </ul>
+ </div>
+ <div class="main-right">
+ <div class="darkMask"></div>
+ <div id="maincontent">
+ <div class="container">
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
+ <div class="alert-message warning">
+ <h4><%:No password set!%></h4>
+ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
+ <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
+ </div>
+ <%- end -%>
+ <% if category then subtree("/" .. category .. "/", cattree) end %>
+
--- /dev/null
+#!/bin/sh
+uci batch <<-EOF
+ set luci.themes.Material=/luci-static/material
+ set luci.main.mediaurlbase=/luci-static/material
+ commit luci
+EOF
+exit 0