# 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