summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--applications/luci-app-acl/po/mr/acl.po67
-rw-r--r--applications/luci-app-adblock/po/pl/adblock.po10
-rw-r--r--applications/luci-app-adblock/po/tr/adblock.po33
-rw-r--r--applications/luci-app-banip/po/tr/banip.po4
-rw-r--r--applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js1344
-rwxr-xr-xapplications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns3
-rw-r--r--applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json8
-rw-r--r--applications/luci-app-mwan3/po/pt/mwan3.po14
-rw-r--r--applications/luci-app-nut/po/pt/nut.po6
-rw-r--r--applications/luci-app-openvpn/po/pt/openvpn.po8
-rw-r--r--applications/luci-app-privoxy/po/pt/privoxy.po23
-rw-r--r--applications/luci-app-simple-adblock/po/pl/simple-adblock.po11
-rw-r--r--applications/luci-app-statistics/po/pt/statistics.po30
-rw-r--r--applications/luci-app-tinyproxy/po/pt/tinyproxy.po8
-rw-r--r--applications/luci-app-travelmate/po/pl/travelmate.po43
-rw-r--r--applications/luci-app-travelmate/po/pt/travelmate.po4
-rw-r--r--applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po10
-rw-r--r--applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po4
-rw-r--r--applications/luci-app-vpnbypass/po/pl/vpnbypass.po9
-rw-r--r--applications/luci-app-yggdrasil/po/pt/yggdrasil.po12
20 files changed, 930 insertions, 721 deletions
diff --git a/applications/luci-app-acl/po/mr/acl.po b/applications/luci-app-acl/po/mr/acl.po
index b2fabb1f50..dee44d4a9c 100644
--- a/applications/luci-app-acl/po/mr/acl.po
+++ b/applications/luci-app-acl/po/mr/acl.po
@@ -1,120 +1,127 @@
msgid ""
msgstr ""
-"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2020-10-01 08:41+0000\n"
+"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n"
+"Language-Team: Marathi <https://hosted.weblate.org/projects/openwrt/"
+"luciapplicationsacl/mr/>\n"
"Language: mr\n"
"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-acl/root/usr/share/luci/menu.d/luci-app-acl.json:3
msgid "ACL Settings"
-msgstr ""
+msgstr "एसीएल सेटिंग्ज"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:78
msgid "ACL group"
-msgstr ""
+msgstr "एसीएल गट"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:80
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:303
msgid "Access level"
-msgstr ""
+msgstr "प्रवेश स्तर"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:267
msgid "Cannot encrypt plaintext password since uhttpd is not installed."
msgstr ""
+"Uhttpd स्थापित केलेला नसल्यामुळे साधा मजकूर संकेतशब्द कूटबद्ध करू शकत नाही."
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:79
msgid "Description"
-msgstr ""
+msgstr "वर्णन"
#: applications/luci-app-acl/root/usr/share/rpcd/acl.d/luci-app-acl.json:3
msgid "Grant access to ACL configuration"
-msgstr ""
+msgstr "एसीएल कॉन्फिगरेशनमध्ये प्रवेश मंजूर करा"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:212
msgid "Login name"
-msgstr ""
+msgstr "लॉगिन नाव"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:202
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:209
msgid "LuCI Logins"
-msgstr ""
+msgstr "LuCI लॉगिन"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:209
msgid "New account"
-msgstr ""
+msgstr "नवीन खाते"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:244
msgid "Password value"
-msgstr ""
+msgstr "संकेतशब्द मूल्य"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:215
msgid "Password variant"
-msgstr ""
+msgstr "संकेतशब्द प्रकार"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:297
msgid "Read access"
-msgstr ""
+msgstr "वाचन प्रवेश"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:289
msgid "Session timeout"
-msgstr ""
+msgstr "सत्र कालबाह्य वेळ"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:86
msgctxt "Set all permissions in the table below to one of the given values"
msgid "Set all:"
-msgstr ""
+msgstr "सर्व सेट करा:"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:175
msgid ""
"The LuCI ACL management is in an experimental stage! It does not yet work "
"reliably with all applications"
msgstr ""
+"LuCI ACL व्यवस्थापन प्रायोगिक अवस्थेत आहे! हे अद्याप सर्व अनुप्रयोगांसह "
+"विश्वसनीयरित्या कार्य करत नाही"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:259
msgid "The password may not start with \"$p$\"."
-msgstr ""
+msgstr "संकेतशब्द \"$p$\" ने प्रारंभ होणार नाही."
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:232
msgid "The system account to use the password from"
-msgstr ""
+msgstr "ज्यातून संकेतशब्द वापरायचा असे सिस्टिम खाते"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:232
msgid "UNIX account"
-msgstr ""
+msgstr "UNIX खाते"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:282
msgid "Unable to encrypt plaintext password: %s"
-msgstr ""
+msgstr "साधा मजकूर : %s संकेतशब्द कूटबद्ध करण्यात अक्षम"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:217
msgid "Use UNIX password in /etc/shadow"
-msgstr ""
+msgstr "UNIX संकेतशब्द /etc/shadow मधून वापरा"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:218
msgid "Use encrypted password hash"
-msgstr ""
+msgstr "कूटबद्ध संकेतशब्द हॅश वापरा"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:219
msgid "Use plain password"
-msgstr ""
+msgstr "साधा संकेतशब्द वापरा"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:300
msgid "Write access"
-msgstr ""
+msgstr "लेखन प्रवेश"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:67
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:89
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:110
msgctxt "No permissions granted"
msgid "denied"
-msgstr ""
+msgstr "नाकारले"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:294
msgid "does not expire"
-msgstr ""
+msgstr "कालबाह्य होत नाही"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:63
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:95
@@ -122,21 +129,21 @@ msgstr ""
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:305
msgctxt "All permissions granted"
msgid "full"
-msgstr ""
+msgstr "संपूर्ण"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:307
msgctxt "Select individual permissions manually"
msgid "individual"
-msgstr ""
+msgstr "वैयक्तिक"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:65
msgctxt "Some permissions granted"
msgid "partial (%d/%d)"
-msgstr ""
+msgstr "आंशिक (%d/%d)"
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:92
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:111
#: applications/luci-app-acl/htdocs/luci-static/resources/view/system/acl.js:306
msgctxt "Only read permissions granted"
msgid "readonly"
-msgstr ""
+msgstr "फक्त वाचा"
diff --git a/applications/luci-app-adblock/po/pl/adblock.po b/applications/luci-app-adblock/po/pl/adblock.po
index f8ff18b46b..994c06fcc9 100644
--- a/applications/luci-app-adblock/po/pl/adblock.po
+++ b/applications/luci-app-adblock/po/pl/adblock.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-27 12:38+0000\n"
-"Last-Translator: Atrate <Atrate@protonmail.com>\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
+"Last-Translator: Krzysiek Fulko <kfulko@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadblock/pl/>\n"
"Language: pl\n"
@@ -266,15 +266,15 @@ msgstr "Licznik powiadomień email"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:465
msgid "E-Mail Profile"
-msgstr "Profil email"
+msgstr "Profil E-mail"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:325
msgid "E-Mail Receiver Address"
-msgstr "Adres email odbiorcy"
+msgstr "Adres E-mail odbiorcy"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:457
msgid "E-Mail Sender Address"
-msgstr "Adres email nadawcy"
+msgstr "Adres E-mail nadawcy"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:461
msgid "E-Mail Topic"
diff --git a/applications/luci-app-adblock/po/tr/adblock.po b/applications/luci-app-adblock/po/tr/adblock.po
index 33ee5ef996..a4c1b4ca39 100644
--- a/applications/luci-app-adblock/po/tr/adblock.po
+++ b/applications/luci-app-adblock/po/tr/adblock.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-28 13:26+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: Mehmet Çetin <excom_zkko@hotmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadblock/tr/>\n"
@@ -29,11 +29,11 @@ msgstr "Reklam engelleme eylemi"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:11
msgid "Add Blacklist Domain"
-msgstr "Kara Listeye Ekle"
+msgstr "Alan Adını Kara Listeye Ekle"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:46
msgid "Add Whitelist Domain"
-msgstr "İzin verilen listesine Alan Adı ekle"
+msgstr "Alan Adını İzin Verilen Listesine Ekle"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:12
msgid "Add this (sub-)domain to your local blacklist."
@@ -45,7 +45,7 @@ msgstr "Bu (alt)alan adını yerel izin verilen listenize ekleyin."
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:414
msgid "Additional Jail Blocklist"
-msgstr "Ek Engelleme listesi"
+msgstr "Ek \"Hapis\" Engelleme listesi"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:269
msgid "Additional Settings"
@@ -54,8 +54,7 @@ msgstr "Ek Ayarlar"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:341
msgid "Additional trigger delay in seconds before adblock processing begins."
msgstr ""
-"Reklam engelleme işlemi başlamadan önce saniye cinsinden ek tetikleme "
-"gecikmesi."
+"Reklam engelleme işlemi başlamadan önce saniye cinsinden gecikme süresi."
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:270
msgid "Advanced DNS Settings"
@@ -75,19 +74,19 @@ msgstr "Cevap"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:362
msgid "Backup Directory"
-msgstr "Yedek Dizini"
+msgstr "Yedekleme Dizini"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:353
msgid "Base Temp Directory"
-msgstr "Geçici dosyalar icin temel Dizini"
+msgstr "Geçici dosyalar icin temel Dizin"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:353
msgid ""
"Base Temp Directory for all adblock related runtime operations, e.g. "
"downloading, sorting, merging etc."
msgstr ""
-"Reklam engelleyici ile ilişkili tüm gerçek zamanlı operasyonlar için Temel "
-"Geçici Dizin, ör. indirme, sıralama, birleştirme vb."
+"Reklam engelleyici ile ilişkili tüm gerçek zamanlı işlemler için Temel "
+"Geçici Dizin, örn. indirme, sıralama, birleştirme vb."
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/blacklist.js:15
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:34
@@ -132,10 +131,10 @@ msgid ""
"those listed in the whitelist. Please note: You can use this restrictive "
"blocklist e.g. for guest wifi or kidsafe configurations."
msgstr ""
-"İzin verilen alan adları listesinde listelenenler dışındaki tüm alan "
-"adlarına erişimi engellemek için ek bir DNS engelleme listesi oluşturur. "
-"Lütfen dikkat: Bu kısıtlayıcı engelleme listesini misafir veya cocuk wifi "
-"yapılandırmaları için kullanabilirsiniz."
+"İzin verilen alan adları listesindekiler dışındaki tüm alan adlarına erişimi "
+"engellemek için ek bir DNS engelleme listesi oluşturur. Not: Bu kısıtlayıcı "
+"engelleme listesini misafir veya çocuk wifi yapılandırmaları için "
+"kullanabilirsiniz."
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:22
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:57
@@ -151,7 +150,7 @@ msgid ""
"><p>&#xa0;</p>"
msgstr ""
"Bu sekmedeki değişikliklerin yürürlüğe girmesi için reklam engelleme "
-"hizmetinin yeniden başlatılması gerekir..<br />2<p>3&#xa0;4</p>"
+"hizmetinin yeniden başlatılması gerekir.<br /><p>&#xa0;</p>"
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:254
msgid "Client"
@@ -168,7 +167,7 @@ msgstr ""
"alanlarını engelleyecek şekilde yapılandırılması. Daha fazla bilgi için <a "
"href=\"https://github.com/openwrt/packages/blob/master/net/adblock/files/"
"README.md\" target=\"_blank\" rel=\"noreferrer noopener\" > çevrimiçi "
-"belgelere </a> bakın"
+"belgelere </a> bakın."
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:205
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/dnsreport.js:207
@@ -181,7 +180,7 @@ msgid ""
"Create compressed blocklist backups, they will be used in case of download "
"errors or during startup."
msgstr ""
-"Sıkıştırılmış blok listesi yedekleri oluşturun, indirme hataları veya "
+"Sıkıştırılmış kara liste yedekleri oluşturun, bunlar indirme hataları ve "
"başlatma sırasında kullanılacaktır."
#: applications/luci-app-adblock/htdocs/luci-static/resources/view/adblock/overview.js:219
diff --git a/applications/luci-app-banip/po/tr/banip.po b/applications/luci-app-banip/po/tr/banip.po
index ff3038f191..ebf97c5170 100644
--- a/applications/luci-app-banip/po/tr/banip.po
+++ b/applications/luci-app-banip/po/tr/banip.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-28 13:26+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: Mehmet Çetin <excom_zkko@hotmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsbanip/tr/>\n"
@@ -37,7 +37,7 @@ msgstr ""
#: applications/luci-app-banip/luasrc/model/cbi/banip/overview_tab.lua:94
#: applications/luci-app-banip/luasrc/view/banip/runtime.htm:138
msgid "Backup Directory"
-msgstr "Yedek Dizini"
+msgstr "Yedekleme Dizini"
#: applications/luci-app-banip/luasrc/model/cbi/banip/overview_tab.lua:115
msgid ""
diff --git a/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js b/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js
index 46f33d0923..28c96da381 100644
--- a/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js
+++ b/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js
@@ -1,4 +1,5 @@
'use strict';
+'require ui';
'require view';
'require dom';
'require poll';
@@ -8,43 +9,40 @@
'require form';
'require tools.widgets as widgets';
-var callGetLogServices, callInitAction, callDDnsGetStatus;
-
-var NextUpdateStrings = {};
-
-NextUpdateStrings = {
- 'Verify' : _("Verify"),
- 'Run once' : _("Run once"),
- 'Disabled' : _("Disabled"),
- 'Stopped' : _("Stopped")
-}
+return view.extend({
-var time_res = {};
-time_res['seconds'] = 1;
-time_res['minutes'] = 60;
-time_res['hours'] = 3600;
+ NextUpdateStrings : {
+ 'Verify' : _("Verify"),
+ 'Run once' : _("Run once"),
+ 'Disabled' : _("Disabled"),
+ 'Stopped' : _("Stopped")
+ },
-callGetLogServices = rpc.declare({
- object: 'luci.ddns',
- method: 'get_services_log',
- params: [ 'service_name' ],
- expect: { },
-});
+ time_res : {
+ seconds : 1,
+ minutes : 60,
+ hours : 3600,
+ },
-callInitAction = rpc.declare({
- object: 'luci',
- method: 'setInitAction',
- params: [ 'name', 'action' ],
- expect: { result: false }
-});
+ callGetLogServices: rpc.declare({
+ object: 'luci.ddns',
+ method: 'get_services_log',
+ params: [ 'service_name' ],
+ expect: { },
+ }),
-callDDnsGetStatus = rpc.declare({
- object: 'luci.ddns',
- method: 'get_ddns_state',
- expect: { }
-});
+ callInitAction: rpc.declare({
+ object: 'luci',
+ method: 'setInitAction',
+ params: [ 'name', 'action' ],
+ expect: { result: false }
+ }),
-return view.extend({
+ callDDnsGetStatus: rpc.declare({
+ object: 'luci.ddns',
+ method: 'get_ddns_state',
+ expect: { }
+ }),
callDDnsGetEnv: rpc.declare({
object: 'luci.ddns',
@@ -58,14 +56,137 @@ return view.extend({
expect: { }
}),
+ services: {},
+
+ /*
+ * Services list is gen by 3 different source:
+ * 1. /usr/share/ddns/default contains the service installed by opkg
+ * 2. /usr/share/ddns/custom contains any service installed by the
+ * user or the ddns script (for example when service are
+ * downloaded)
+ * 3. /usr/share/ddns/list contains all the service that can be
+ * downloaded by using the ddns script ('service on demand' feature)
+ *
+ * (Special services that requires a dedicated package ARE NOT
+ * supported by the 'service on demand' feature)
+ */
+ callGenServiceList: function(m, ev) {
+ return Promise.all([
+ L.resolveDefault(fs.list('/usr/share/ddns/default'), []),
+ L.resolveDefault(fs.list('/usr/share/ddns/custom'), []),
+ L.resolveDefault(fs.read('/usr/share/ddns/list'), null)
+ ]).then(L.bind(function (data) {
+ var default_service = data[0],
+ custom_service = data[1],
+ list_service = data[2] && data[2].split("\n") || [],
+ _this = this;
+
+ this.services = {};
+
+ default_service.forEach(function (service) {
+ _this.services[service.name.replace('.json','')] = true
+ });
+
+ custom_service.forEach(function (service) {
+ _this.services[service.name.replace('.json','')] = true
+ });
+
+ list_service.forEach(function (service) {
+ if (!_this.services[service])
+ _this.services[service] = false;
+ });
+ }, this))
+ },
+
+ /*
+ * Check if the service is supported.
+ * If the script doesn't find any json assume a 'service on demand' install.
+ * If a json is found check if the ip type is supported.
+ * Invalidate the service_name if is not supported.
+ */
+ handleCheckService : function(s, service_name, ipv6, ev, section_id) {
+
+ var value = service_name.formvalue(section_id);
+ s.service_supported = null;
+ service_name.triggerValidation(section_id);
+
+ return this.handleGetServiceData(value)
+ .then(L.bind(function (service_data) {
+ if (value != '-' && service_data) {
+ service_data = JSON.parse(service_data);
+ if (ipv6.formvalue(section_id) == "1" && !service_data.ipv6) {
+ s.service_supported = false;
+ return;
+ }
+ }
+ s.service_supported = true;
+ }, service_name))
+ .then(L.bind(service_name.triggerValidation, service_name, section_id))
+ },
+
+ handleGetServiceData: function(service) {
+ return Promise.all([
+ L.resolveDefault(fs.read('/usr/share/ddns/custom/'+service+'.json'), null),
+ L.resolveDefault(fs.read('/usr/share/ddns/default/'+service+'.json'), null)
+ ]).then(function(data) {
+ return data[0] || data[1] || null;
+ })
+ },
+
+ handleInstallService: function(m, service_name, section_id, section, _this, ev) {
+ var service = service_name.formvalue(section_id)
+ return fs.exec('/usr/bin/ddns', ['service', 'install', service])
+ .then(L.bind(_this.callGenServiceList, _this))
+ .then(L.bind(m.render, m))
+ .then(L.bind(this.renderMoreOptionsModal, this, section))
+ .catch(function(e) { ui.addNotification(null, E('p', e.message)) });
+ },
+
+ handleRefreshServicesList: function(m, ev) {
+ return fs.exec('/usr/bin/ddns', ['service', 'update'])
+ .then(L.bind(this.load, this))
+ .then(L.bind(this.render, this))
+ .catch(function(e) { ui.addNotification(null, E('p', e.message)) });
+ },
+
+ handleReloadDDnsRule: function(m, section_id, ev) {
+ return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh',
+ [ '-S', section_id, '--', 'start' ])
+ .then(L.bind(m.load, m))
+ .then(L.bind(m.render, m))
+ .catch(function(e) { ui.addNotification(null, E('p', e.message)) });
+ },
+
+ HandleStopDDnsRule: function(m, section_id, ev) {
+ return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh',
+ [ '-S', section_id, '--', 'start' ])
+ .then(L.bind(m.render, m))
+ .catch(function(e) { ui.addNotification(null, E('p', e.message)) });
+ },
+
+ handleToggleDDns: function(m, ev) {
+ return this.callInitAction('ddns', 'enabled')
+ .then(L.bind(function (action) { return this.callInitAction('ddns', action ? 'disable' : 'enable')}, this))
+ .then(L.bind(function (action) { return this.callInitAction('ddns', action ? 'stop' : 'start')}, this))
+ .then(L.bind(m.render, m))
+ .catch(function(e) { ui.addNotification(null, E('p', e.message)) });
+ },
+
+ handleRestartDDns: function(m, ev) {
+ return this.callInitAction('ddns', 'restart')
+ .then(L.bind(m.render, m));
+ },
+
poll_status: function(map, data) {
var status = data[1] || [], service = data[0] || [], rows = map.querySelectorAll('.cbi-section-table-row[data-sid]'),
section_id, cfg_detail_ip, cfg_update, cfg_status, host, ip, last_update,
next_update, service_status, reload, cfg_enabled, stop,
ddns_enabled = map.querySelector('[data-name="_enabled"]').querySelector('.cbi-value-field'),
- ddns_toggle = map.querySelector('[data-name="_toggle"]').querySelector('button');
+ ddns_toggle = map.querySelector('[data-name="_toggle"]').querySelector('button'),
+ services_list = map.querySelector('[data-name="_services_list"]').querySelector('.cbi-value-field');
ddns_toggle.innerHTML = status['_enabled'] ? _('Stop DDNS') : _('Start DDNS')
+ services_list.innerHTML = status['_services_list'];
dom.content(ddns_enabled, function() {
return E([], [
@@ -101,7 +222,7 @@ return view.extend({
if (service[section_id].last_update)
last_update = service[section_id].last_update;
if (service[section_id].next_update)
- next_update = NextUpdateStrings[service[section_id].next_update] || service[section_id].next_update;
+ next_update = this.NextUpdateStrings[service[section_id].next_update] || service[section_id].next_update;
if (service[section_id].pid)
service_status = '<b>' + _('Running') + '</b> : ' + service[section_id].pid;
}
@@ -117,10 +238,9 @@ return view.extend({
load: function() {
return Promise.all([
this.callDDnsGetServicesStatus(),
- callDDnsGetStatus(),
+ this.callDDnsGetStatus(),
this.callDDnsGetEnv(),
- fs.lines('/etc/ddns/services'),
- fs.lines('/etc/ddns/services_ipv6'),
+ this.callGenServiceList(),
uci.load('ddns')
]);
},
@@ -131,20 +251,7 @@ return view.extend({
var env = data[2] || [];
var logdir = uci.get('ddns', 'global', 'ddns_logdir') || "/var/log/ddns";
- var services4 = [];
- var services6 = [];
-
- data[3].forEach(function(item) {
- if (!item.startsWith("#")) {
- services4.push(item.split('\t')[0].slice(1,-1));
- }
- });
-
- data[4].forEach(function(item) {
- if (!item.startsWith("#")) {
- services6.push(item.split('\t')[0].slice(1,-1));
- }
- });
+ var _this = this;
var m, s, o;
@@ -170,33 +277,29 @@ return view.extend({
return res ? _('DDNS Autostart enabled') : _('DDNS Autostart disabled')
};
- o = s.taboption('info', form.DummyValue, '_toggle', '&#160;');
- o.cfgvalue = function() {
- var action = status['_enabled'] ? 'stop' : 'start';
- return E([], [
- E('button', {
- 'class': 'cbi-button cbi-button-apply',
- 'click': L.ui.createHandlerFn(this, function() {
- return callDDnsGetStatus().then(L.bind(function(data) {
- return callInitAction('ddns', action == 'stop' ? 'disable' : 'enable').then(function() {
- return callInitAction('ddns', action);
- });
- }, this)).then(L.bind(m.render, m));
- })
- }, _(action.toUpperCase() + ' DDns'))]);
- };
+ o = s.taboption('info', form.Button, '_toggle');
+ o.title = '&#160;';
+ o.inputtitle = _((status['_enabled'] ? 'stop' : 'start').toUpperCase() + ' DDns');
+ o.inputstyle = 'apply';
+ o.onclick = L.bind(this.handleToggleDDns, this, m);
- o = s.taboption('info', form.DummyValue, '_restart', '&#160;');
+ o = s.taboption('info', form.Button, '_restart');
+ o.title = '&#160;';
+ o.inputtitle = _('Restart DDns');
+ o.inputstyle = 'apply';
+ o.onclick = L.bind(this.handleRestartDDns, this, m);
+
+ o = s.taboption('info', form.DummyValue, '_services_list', _('Services list last update'));
o.cfgvalue = function() {
- return E([], [
- E('button', {
- 'class': 'cbi-button cbi-button-apply',
- 'click': L.ui.createHandlerFn(this, function() {
- return callInitAction('ddns', 'restart').then(L.bind(m.render, m));
- })
- }, _('Restart DDns'))]);
+ return status[this.option];
};
+ o = s.taboption('info', form.Button, '_refresh_services');
+ o.title = '&#160;';
+ o.inputtitle = _('Update DDns Services List');
+ o.inputstyle = 'apply';
+ o.onclick = L.bind(this.handleRefreshServicesList, this, m);
+
// DDns hints
if (!env['has_ipv6']) {
@@ -344,6 +447,14 @@ return view.extend({
}
+ o = s.taboption('global', form.Value, 'cacert', _('Ca Certs path'));
+ o.description = _('Ca Certs path that will be used to download services data. Set IGNORE to skip certificate validation.');
+ o.placeholder = 'IGNORE';
+
+ o = s.taboption('global', form.Value, 'services_url', _('Services URL Download'));
+ o.description = _('Url used to download services file. By default is the master openwrt ddns package repo.');
+ o.placeholder = 'https://raw.githubusercontent.com/openwrt/packages/master/net/ddns-scripts/files';
+
// DDns services
s = m.section(form.GridSection, 'service', _('Services'));
s.anonymous = true;
@@ -354,9 +465,25 @@ return view.extend({
s.addremove = true;
s.sortable = true;
+ s.handleCreateDDnsRule = function(m, name, service_name, ipv6, ev) {
+ var section_id = name.isValid('_new_') ? name.formvalue('_new_') : null,
+ service_value = service_name.isValid('_new_') ? service_name.formvalue('_new_') : null,
+ ipv6_value = ipv6.isValid('_new_') ? ipv6.formvalue('_new_') : null;
+
+ if (section_id == null || section_id == '' || service_value == null || section_id == '' || ipv6_value == null || ipv6_value == '')
+ return;
+
+ return m.save(function() {
+ uci.add('ddns', 'service', section_id);
+ uci.set('ddns', section_id, 'service_name', service_value);
+ uci.set('ddns', section_id, 'use_ipv6', ipv6_value);
+ }).then(L.bind(m.children[1].renderMoreOptionsModal, m.children[1], section_id));
+ };
+
s.handleAdd = function(ev) {
var m2 = new form.Map('ddns'),
- s2 = m2.section(form.NamedSection, '_new_');
+ s2 = m2.section(form.NamedSection, '_new_'),
+ name, ipv6, service_name;
s2.render = function() {
return Promise.all([
@@ -376,26 +503,41 @@ return view.extend({
return true;
};
+ ipv6 = s2.option( form.ListValue, 'use_ipv6',
+ _("IP address version"),
+ _("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"));
+ ipv6.default = '0';
+ ipv6.value("0", _("IPv4-Address"))
+ if (env["has_ipv6"]) {
+ ipv6.value("1", _("IPv6-Address"))
+ }
+
+ service_name = s2.option(form.ListValue, 'service_name',
+ String.format('%s', _("DDNS Service provider")));
+ service_name.value('-',"-- " + _("custom") + " --");
+ for (var elem in _this.services)
+ service_name.value(elem);
+ service_name.validate = function(section_id, value) {
+ if (value == '') return _("Select a service");
+ if (s2.service_supported == null) return _("Checking the service support...");
+ if (!s2.service_supported) return _("Service doesn't support this ip type");
+ return true;
+ };
+
+ ipv6.onchange = L.bind(_this.handleCheckService, _this, s2, service_name, ipv6);
+ service_name.onchange = L.bind(_this.handleCheckService, _this, s2, service_name, ipv6);
+
m2.render().then(L.bind(function(nodes) {
- L.ui.showModal(_('Add new services...'), [
+ ui.showModal(_('Add new services...'), [
nodes,
E('div', { 'class': 'right' }, [
E('button', {
'class': 'btn',
- 'click': L.ui.hideModal
+ 'click': ui.hideModal
}, _('Cancel')), ' ',
E('button', {
'class': 'cbi-button cbi-button-positive important',
- 'click': L.ui.createHandlerFn(this, function(ev) {
- var nameval = name.isValid('_new_') ? name.formvalue('_new_') : null;
-
- if (nameval == null || nameval == '')
- return;
-
- return m.save(function() {
- uci.add('ddns', 'service', nameval);
- }).then(L.bind(m.children[1].renderMoreOptionsModal, m.children[1], nameval));
- })
+ 'click': ui.createHandlerFn(this, 'handleCreateDDnsRule', m, name, service_name, ipv6)
}, _('Create service'))
])
], 'cbi-modal');
@@ -409,18 +551,12 @@ return view.extend({
cfg_enabled = uci.get('ddns', section_id, 'enabled'),
reload_opt = {
'class': 'cbi-button cbi-button-neutral reload',
- 'click': L.ui.createHandlerFn(this, function() {
- return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh',
- [ '-S', section_id, '--', 'start' ]).then(L.bind(m.render, m));
- }),
+ 'click': ui.createHandlerFn(_this, 'handleReloadDDnsRule', m, section_id),
'title': _('Reload this service'),
},
stop_opt = {
'class': 'cbi-button cbi-button-neutral stop',
- 'click': L.ui.createHandlerFn(this, function() {
- return fs.exec('/usr/lib/ddns/dynamic_dns_lucihelper.sh',
- [ '-S', section_id, '--', 'start' ]).then(L.bind(m.render, m));
- }),
+ 'click': ui.createHandlerFn(_this, 'HandleStopDDnsRule', m, section_id),
'title': _('Stop this service'),
};
@@ -442,11 +578,544 @@ return view.extend({
return tdEl;
};
+ s.modaltitle = function(section_id) {
+ return _('DDns Service') + ' » ' + section_id;
+ };
+
+ s.addModalOptions = function(s, section_id) {
+
+ var service = uci.get('ddns', section_id, 'service_name') || '-',
+ ipv6 = uci.get('ddns', section_id, 'use_ipv6'), service_name, use_ipv6;
+
+ return _this.handleGetServiceData(service).then(L.bind(function (service_data) {
+ s.service_available = true;
+ s.service_supported = true;
+
+ if (service != '-') {
+ if (!service_data)
+ s.service_available = false;
+ else {
+ service_data = JSON.parse(service_data);
+ if (ipv6 == "1" && !service_data.ipv6)
+ s.service_supported = false;
+ }
+ }
+
+ s.tab('basic', _('Basic Settings'));
+ s.tab('advanced', _('Advanced Settings'));
+ s.tab('timer', _('Timer Settings'));
+ s.tab('logview', _('Log File Viewer'));
+
+ o = s.taboption('basic', form.Flag, 'enabled',
+ _('Enabled'),
+ _("If this service section is disabled it could not be started.")
+ + "<br />" +
+ _("Neither from LuCI interface nor from console."));
+ o.modalonly = true;
+ o.rmempty = false;
+ o.default = '1';
+
+ o = s.taboption('basic', form.Value, 'lookup_host',
+ _("Lookup Hostname"),
+ _("Hostname/FQDN to validate, if IP update happen or necessary"));
+ o.rmempty = false;
+ o.placeholder = "myhost.example.com";
+ o.datatype = 'and(minlength(3),hostname("strict"))';
+ o.modalonly = true;
+
+ use_ipv6 = s.taboption('basic', form.ListValue, 'use_ipv6',
+ _("IP address version"),
+ _("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"));
+ use_ipv6.default = '0';
+ use_ipv6.modalonly = true;
+ use_ipv6.rmempty = false;
+ use_ipv6.value("0", _("IPv4-Address"))
+ if (env["has_ipv6"]) {
+ use_ipv6.value("1", _("IPv6-Address"))
+ }
+
+ service_name = s.taboption('basic', form.ListValue, 'service_name',
+ String.format('%s', _("DDNS Service provider")));
+ service_name.modalonly = true;
+ service_name.value('-',"-- " + _("custom") + " --");
+ for (var elem in _this.services)
+ service_name.value(elem);
+ service_name.cfgvalue = function(section_id) {
+ return uci.get('ddns', section_id, 'service_name') || '-';
+ };
+ service_name.write = function(section_id, service) {
+ if (service != '-') {
+ uci.set('ddns', section_id, 'update_url', null);
+ uci.set('ddns', section_id, 'update_script', null);
+ return uci.set('ddns', section_id, 'service_name', service);
+ }
+ return uci.set('ddns', section_id, 'service_name', null);
+ };
+ service_name.validate = function(section_id, value) {
+ if (value == '') return _("Select a service");
+ if (s.service_available == null) return _("Checking the service support...");
+ if (!s.service_available) return _('Service not installed');
+ if (!s.service_supported) return _("Service doesn't support this ip type");
+ return true;
+ };
+
+ service_name.onchange = L.bind(_this.handleCheckService, _this, s, service_name, use_ipv6);
+ use_ipv6.onchange = L.bind(_this.handleCheckService, _this, s, service_name, use_ipv6);
+
+ if (!s.service_available) {
+ o = s.taboption('basic', form.Button, '_download_service');
+ o.modalonly = true;
+ o.title = _('Service not installed');
+ o.inputtitle = _('Install Service');
+ o.inputstyle = 'apply';
+ o.onclick = L.bind(_this.handleInstallService,
+ this, m, service_name, section_id, s.section, _this)
+ }
+
+ if (!s.service_supported) {
+ o = s.taboption('basic', form.DummyValue, '_not_supported', '&nbsp');
+ o.cfgvalue = function () {
+ return _("Service doesn't support this ip type")
+ };
+ }
+
+ var service_switch = s.taboption('basic', form.Button, '_switch_proto');
+ service_switch.modalonly = true;
+ service_switch.title = _('Really switch service?');
+ service_switch.inputtitle = _('Switch service');
+ service_switch.inputstyle = 'apply';
+ service_switch.onclick = L.bind(function(ev) {
+ if (!s.service_supported) return;
+
+ return s.map.save()
+ .then(L.bind(m.load, m))
+ .then(L.bind(m.render, m))
+ .then(L.bind(this.renderMoreOptionsModal, this, s.section));
+ }, this);
+
+ if (s.service_available && s.service_supported) {
+
+ o = s.taboption('basic', form.Value, 'update_url',
+ _("Custom update-URL"),
+ _("Update URL to be used for updating your DDNS Provider.")
+ + "<br />" +
+ _("Follow instructions you will find on their WEB page."));
+ o.modalonly = true;
+ o.rmempty = true;
+ o.optional = true;
+ o.depends("service_name","-");
+ o.validate = function(section_id, value) {
+ var other = this.section.children.filter(function(o) { return o.option == 'update_script' })[0].formvalue(section_id);
+
+ if ((value == "" && other == "") || (value != "" && other != "")) {
+ return _("Insert a Update Script OR a Update URL");
+ }
+
+ return true;
+ };
+
+ o = s.taboption('basic', form.Value, 'update_script',
+ _("Custom update-script"),
+ _("Custom update script to be used for updating your DDNS Provider."));
+ o.modalonly = true;
+ o.rmempty = true;
+ o.optional = true;
+ o.depends("service_name","-");
+ o.validate = function(section_id, value) {
+ var other = this.section.children.filter(function(o) { return o.option == 'update_url' })[0].formvalue(section_id);
+
+ if ((value == "" && other == "") || (value != "" && other != "")) {
+ return _("Insert a Update Script OR a Update URL");
+ }
+
+ return true;
+ };
+
+ o = s.taboption('basic', form.Value, 'domain',
+ _("Domain"),
+ _("Replaces [USERNAME] in Update-URL (URL-encoded)"));
+ o.modalonly = true;
+ o.rmempty = false;
+
+ o = s.taboption('basic', form.Value, 'username',
+ _("Username"),
+ _("Replaces [USERNAME] in Update-URL (URL-encoded)"));
+ o.modalonly = true;
+ o.rmempty = false;
+
+ o = s.taboption('basic', form.Value, 'password',
+ _("Password"),
+ _("Replaces [PASSWORD] in Update-URL (URL-encoded)"));
+ o.password = true;
+ o.modalonly = true;
+ o.rmempty = false;
+
+ o = s.taboption('basic', form.Value, 'param_enc',
+ _("Optional Encoded Parameter"),
+ _("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"));
+ o.optional = true;
+ o.modalonly = true;
+
+ o = s.taboption('basic', form.Value, 'param_opt',
+ _("Optional Parameter"),
+ _("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"));
+ o.optional = true;
+ o.modalonly = true;
+
+ if (env['has_ssl']) {
+ o = s.taboption('basic', form.Flag, 'use_https',
+ _("Use HTTP Secure"),
+ _("Enable secure communication with DDNS provider"));
+ o.optional = true;
+ o.modalonly = true;
+
+ o = s.taboption('basic', form.Value, 'cacert',
+ _("Path to CA-Certificate"),
+ _("directory or path/file")
+ + "<br />" +
+ _("or")
+ + '<b>' + " IGNORE " + '</b>' +
+ _("to run HTTPS without verification of server certificates (insecure)"));
+ o.modalonly = true;
+ o.depends("use_https", "1");
+ o.placeholder = "/etc/ssl/certs";
+ o.rmempty = false;
+ };
+
+
+ o = s.taboption('advanced', form.ListValue, 'ip_source',
+ _("IP address source"),
+ _("Defines the source to read systems IP-Address from, that will be send to the DDNS provider"));
+ o.modalonly = true;
+ o.default = "network";
+ o.value("network", _("Network"));
+ o.value("web", _("URL"));
+ o.value("interface", _("Interface"));
+ o.value("script", _("Script"));
+ o.write = function(section_id, formvalue) {
+ switch(formvalue) {
+ case 'network':
+ uci.set('ddns', section_id, "ip_url",null);
+ uci.set('ddns', section_id, "ip_interface",null);
+ uci.set('ddns', section_id, "ip_script",null);
+ break;
+ case 'web':
+ uci.set('ddns', section_id, "ip_network",null);
+ uci.set('ddns', section_id, "ip_interface",null);
+ uci.set('ddns', section_id, "ip_script",null);
+ break;
+ case 'interface':
+ uci.set('ddns', section_id, "ip_network",null);
+ uci.set('ddns', section_id, "ip_url",null);
+ uci.set('ddns', section_id, "ip_script",null);
+ break;
+ case 'script':
+ uci.set('ddns', section_id, "ip_network",null);
+ uci.set('ddns', section_id, "ip_url",null);
+ uci.set('ddns', section_id, "ip_interface",null);
+ break;
+ default:
+ break;
+ };
+
+ return uci.set('ddns', section_id, 'ip_source', formvalue )
+ };
+
+ o = s.taboption('advanced', widgets.NetworkSelect, 'ip_network',
+ _("Network"),
+ _("Defines the network to read systems IP-Address from"));
+ o.depends('ip_source','network');
+ o.modalonly = true;
+ o.default = 'wan';
+ o.multiple = false;
+
+ o = s.taboption('advanced', form.Value, 'ip_url',
+ _("URL to detect"),
+ _("Defines the Web page to read systems IP-Address from.")
+ + '<br />' +
+ String.format('%s %s', _('Example for IPv4'), ': http://checkip.dyndns.com')
+ + '<br />' +
+ String.format('%s %s', _('Example for IPv6'), ': http://checkipv6.dyndns.com'));
+ o.depends("ip_source", "web")
+ o.modalonly = true;
+
+ o = s.taboption('advanced', widgets.DeviceSelect, 'ip_interface',
+ _("Interface"),
+ _("Defines the interface to read systems IP-Address from"));
+ o.modalonly = true;
+ o.depends("ip_source", "interface")
+ o.multiple = false;
+ o.default = 'wan';
+
+ o = s.taboption('advanced', form.Value, 'ip_script',
+ _("Script"),
+ _("User defined script to read systems IP-Address"));
+ o.modalonly = true;
+ o.depends("ip_source", "script")
+ o.placeholder = "/path/to/script.sh"
+
+ o = s.taboption('advanced', widgets.DeviceSelect, 'interface',
+ _("Event Network"),
+ _("Network on which the ddns-updater scripts will be started"));
+ o.modalonly = true;
+ o.multiple = false;
+ o.default = 'wan';
+ o.depends("ip_source", "web");
+ o.depends("ip_source", "script");
+
+ o = s.taboption('advanced', form.DummyValue, '_interface',
+ _("Event Network"),
+ _("Network on which the ddns-updater scripts will be started"));
+ o.depends("ip_source", "interface");
+ o.depends("ip_source", "network");
+ o.forcewrite = true;
+ o.modalonly = true;
+ o.cfgvalue = function(section_id) {
+ return uci.get('ddns', section_id, 'interface') || _('This will be autoset to the selected interface');
+ };
+ o.write = function(section_id) {
+ var opt = this.section.children.filter(function(o) { return o.option == 'ip_source' })[0].formvalue(section_id);
+ var val = this.section.children.filter(function(o) { return o.option == 'ip_'+opt })[0].formvalue(section_id);
+ return uci.set('ddns', section_id, 'interface', val);
+ };
+
+ if (env['has_bindnet']) {
+ o = s.taboption('advanced', widgets.ZoneSelect, 'bind_network',
+ _("Bind Network"),
+ _('OPTIONAL: Network to use for communication')
+ + '<br />' +
+ _("Network on which the ddns-updater scripts will be started"));
+ o.depends("ip_source", "web");
+ o.optional = true;
+ o.rmempty = true;
+ o.modalonly = true;
+ }
+
+ if (env['has_forceip']) {
+ o = s.taboption('advanced', form.Flag, 'force_ipversion',
+ _("Force IP Version"),
+ _('OPTIONAL: Force the usage of pure IPv4/IPv6 only communication.'));
+ o.optional = true;
+ o.rmempty = true;
+ o.modalonly = true;
+ }
+
+ if (env['has_dnsserver']) {
+ o = s.taboption("advanced", form.Value, "dns_server",
+ _("DNS-Server"),
+ _("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.")
+ + "<br />" +
+ _("Format: IP or FQDN"));
+ o.placeholder = "mydns.lan"
+ o.optional = true;
+ o.rmempty = true;
+ o.modalonly = true;
+ }
+
+ if (env['has_bindhost']) {
+ o = s.taboption("advanced", form.Flag, "force_dnstcp",
+ _("Force TCP on DNS"),
+ _("OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."));
+ o.optional = true;
+ o.rmempty = true;
+ o.modalonly = true;
+ }
+
+ if (env['has_proxy']) {
+ o = s.taboption("advanced", form.Value, "proxy",
+ _("PROXY-Server"),
+ _("OPTIONAL: Proxy-Server for detection and updates.")
+ + "<br />" +
+ String.format('%s: <b>%s</b>', _("Format"), "[user:password@]proxyhost:port")
+ + "<br />" +
+ String.format('%s: <b>%s</b>', _("IPv6 address must be given in square brackets"), "[2001:db8::1]:8080"));
+ o.optional = true;
+ o.rmempty = true;
+ o.modalonly = true;
+ }
+
+ o = s.taboption("advanced", form.ListValue, "use_syslog",
+ _("Log to syslog"),
+ _("Writes log messages to syslog. Critical Errors will always be written to syslog."));
+ o.modalonly = true;
+ o.default = "2"
+ o.optional = true;
+ o.value("0", _("No logging"))
+ o.value("1", _("Info"))
+ o.value("2", _("Notice"))
+ o.value("3", _("Warning"))
+ o.value("4", _("Error"))
+
+ o = s.taboption("advanced", form.Flag, "use_logfile",
+ _("Log to file"));
+ o.default = '1';
+ o.optional = true;
+ o.modalonly = true;
+ o.cfgvalue = function(section_id) {
+ this.description = _("Writes detailed messages to log file. File will be truncated automatically.") + "<br />" +
+ _("File") + ': "' + logdir + '/' + section_id + '.log"';
+ return uci.get('ddns', section_id, 'use_logfile');
+ };
+
+
+ o = s.taboption("timer", form.Value, "check_interval",
+ _("Check Interval"));
+ o.placeholder = "30";
+ o.modalonly = true;
+ o.datatype = 'uinteger';
+ o.validate = function(section_id, formvalue) {
+ var unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id),
+ time_to_sec = _this.time_res[unit || 'minutes'] * formvalue;
+
+ if (formvalue && time_to_sec < 300)
+ return _('Values below 5 minutes == 300 seconds are not supported');
+
+ return true;
+ };
+
+ o = s.taboption("timer", form.ListValue, "check_unit",
+ _('Check Unit'),
+ _("Interval unit to check for changed IP"));
+ o.modalonly = true;
+ o.default = "minutes"
+ o.value("seconds", _("seconds"));
+ o.value("minutes", _("minutes"));
+ o.value("hours", _("hours"));
+
+ o = s.taboption("timer", form.Value, "force_interval",
+ _("Force Interval"),
+ _("Interval to force updates send to DDNS Provider")
+ + "<br />" +
+ _("Setting this parameter to 0 will force the script to only run once"));
+ o.placeholder = "72";
+ o.optional = true;
+ o.modalonly = true;
+ o.datatype = 'uinteger';
+ o.validate = function(section_id, formvalue) {
+
+ if (!formvalue)
+ return true;
+
+ var check_unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id),
+ check_val = this.section.children.filter(function(o) { return o.option == 'check_interval' })[0].formvalue(section_id),
+ force_unit = this.section.children.filter(function(o) { return o.option == 'force_unit' })[0].formvalue(section_id),
+ check_to_sec = _this.time_res[check_unit || 'minutes'] * ( check_val || '30'),
+ force_to_sec = _this.time_res[force_unit || 'minutes'] * formvalue;
+
+ if (force_to_sec != 0 && force_to_sec < check_to_sec)
+ return _("Values lower 'Check Interval' except '0' are not supported");
+
+ return true;
+ };
+
+ o = s.taboption("timer", form.ListValue, "force_unit",
+ _('Force Unit'),
+ _("Interval unit to force updates send to DDNS Provider"));
+ o.modalonly = true;
+ o.optional = true;
+ o.default = "minutes"
+ o.value("minutes", _("minutes"));
+ o.value("hours", _("hours"));
+ o.value("days", _("days"));
+
+ o = s.taboption("timer", form.Value, "retry_count",
+ _("Error Retry Counter"),
+ _("On Error the script will stop execution after given number of retrys")
+ + "<br />" +
+ _("The default setting of '0' will retry infinite."));
+ o.placeholder = "0";
+ o.optional = true;
+ o.modalonly = true;
+ o.datatype = 'uinteger';
+
+ o = s.taboption("timer", form.Value, "retry_interval",
+ _("Error Retry Interval"),
+ _("On Error the script will stop execution after given number of retrys")
+ + "<br />" +
+ _("The default setting of '0' will retry infinite."));
+ o.placeholder = "60";
+ o.optional = true;
+ o.modalonly = true;
+ o.datatype = 'uinteger';
+
+ o = s.taboption("timer", form.ListValue, "retry_unit",
+ _('Retry Unit'),
+ _("On Error the script will retry the failed action after given time"));
+ o.modalonly = true;
+ o.optional = true;
+ o.default = "seconds"
+ o.value("seconds", _("seconds"));
+ o.value("minutes", _("minutes"));
+
+ o = s.taboption('logview', form.Button, '_read_log');
+ o.title = '';
+ o.depends('use_logfile','1');
+ o.modalonly = true;
+ o.inputtitle = _('Read / Reread log file');
+ o.inputstyle = 'apply';
+ o.onclick = L.bind(function(ev, section_id) {
+ return _this.callGetLogServices(section_id).then(L.bind(log_box.update_log, log_box));
+ }, this);
+
+ var log_box = s.taboption("logview", form.DummyValue, "_logview");
+ log_box.depends('use_logfile','1');
+ log_box.modalonly = true;
+
+ log_box.update_log = L.bind(function(view, log_data) {
+ return document.getElementById('log_area').textContent = log_data.result;
+ }, o, this);
+
+ log_box.render = L.bind(function() {
+ return E([
+ E('p', {}, _('This is the current content of the log file in ') + logdir + ' for this service.'),
+ E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 20, 'readonly' : 'readonly', 'id' : 'log_area' }, _('Please press [Read] button') ))
+ ]);
+ }, o, this);
+ }
+
+ for (var i = 0; i < s.children.length; i++) {
+ o = s.children[i];
+ switch (o.option) {
+ case '_switch_proto':
+ o.depends({ service_name : service, use_ipv6: ipv6, "!reverse": true })
+ continue;
+ case 'enabled':
+ case 'service_name':
+ case 'use_ipv6':
+ case 'update_script':
+ case 'update_url':
+ case 'lookup_host':
+ continue;
+
+ default:
+ if (o.deps.length)
+ for (var j = 0; j < o.deps.length; j++) {
+ o.deps[j].service_name = service;
+ o.deps[j].use_ipv6 = ipv6;
+ }
+ else
+ o.depends({service_name: service, use_ipv6: ipv6 });
+ }
+ }
+ }, this)
+ )};
+
+ o = s.option(form.DummyValue, '_cfg_status', _('Status'));
+ o.modalonly = false;
+ o.textvalue = function(section_id) {
+ var text = '<b>' + _('Not Running') + '</b>';
+
+ if (resolved[section_id] && resolved[section_id].pid)
+ text = '<b>' + _('Running') + '</b> : ' + resolved[section_id].pid;
+
+ return text;
+ };
+
o = s.option(form.DummyValue, '_cfg_name', _('Name'));
o.modalonly = false;
o.textvalue = function(section_id) {
return '<b>' + section_id + '</b>';
- }
+ };
o = s.option(form.DummyValue, '_cfg_detail_ip', _('Lookup Hostname') + "<br />" + _('Registered IP'));
o.rawhtml = true;
@@ -474,496 +1143,17 @@ return view.extend({
if (resolved[section_id].last_update)
last_update = resolved[section_id].last_update;
if (resolved[section_id].next_update)
- next_update = NextUpdateStrings[resolved[section_id].next_update] || resolved[section_id].next_update;
+ next_update = _this.NextUpdateStrings[resolved[section_id].next_update] || resolved[section_id].next_update;
}
return last_update + '<br />' + next_update;
};
- s.modaltitle = function(section_id) {
- return _('DDns Service') + ' » ' + section_id;
- };
-
- o = s.option(form.DummyValue, '_cfg_status', _('Status'));
- o.modalonly = false;
- o.textvalue = function(section_id) {
- var text = '<b>' + _('Not Running') + '</b>';
-
- if (resolved[section_id] && resolved[section_id].pid)
- text = '<b>' + _('Running') + '</b> : ' + resolved[section_id].pid;
-
- return text;
- }
-
-
- s.tab('basic', _('Basic Settings'));
- s.tab('advanced', _('Advanced Settings'));
- s.tab('timer', _('Timer Settings'));
- s.tab('logview', _('Log File Viewer'));
-
- o = s.taboption('basic', form.Flag, 'enabled',
- _('Enabled'),
- _("If this service section is disabled it could not be started.")
- + "<br />" +
- _("Neither from LuCI interface nor from console."));
- o.modalonly = true;
- o.rmempty = false;
- o.default = '1';
-
- o = s.taboption('basic', form.Value, 'lookup_host',
- _("Lookup Hostname"),
- _("Hostname/FQDN to validate, if IP update happen or necessary"));
- o.rmempty = false;
- o.placeholder = "myhost.example.com";
- o.datatype = 'and(minlength(3),hostname("strict"))';
- o.modalonly = true;
-
- o = s.taboption('basic', form.ListValue, 'use_ipv6',
- _("IP address version"),
- _("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"));
- o.default = '0';
- o.modalonly = true;
- o.rmempty = false;
- o.value("0", _("IPv4-Address"))
- if (env["has_ipv6"]) {
- o.value("1", _("IPv6-Address"))
- }
-
- o = s.taboption('basic', form.ListValue, 'ipv4_service_name',
- String.format('%s %s', _("DDNS Service provider"), "[IPv4]"));
- o.depends("use_ipv6", "0")
- o.modalonly = true;
- o.value('-',"-- " + _("custom") + " --");
- for (var i = 0; i < services4.length; i++)
- o.value(services4[i]);
- o.cfgvalue = function(section_id) {
- return uci.get('ddns', section_id, 'service_name') || '-';
- };
- o.write = function(section_id, formvalue) {
- if (formvalue != '-') {
- uci.set('ddns', section_id, 'update_url', null);
- uci.set('ddns', section_id, 'update_script', null);
- return uci.set('ddns', section_id, 'service_name', formvalue);
- }
- return uci.set('ddns', section_id, 'service_name', null);
- };
-
- o = s.taboption('basic', form.ListValue, 'ipv6_service_name',
- String.format('%s %s', _("DDNS Service provider"), "[IPv6]"));
- o.depends("use_ipv6", "1")
- o.modalonly = true;
- o.value('-',"-- " + _("custom") + " --");
- for (var i = 0; i < services6.length; i++) {
- o.value(services6[i]);
- }
- o.cfgvalue = function(section_id) {
- var service = uci.get('ddns', section_id, 'service_name'),
- update_script = uci.get('ddns', section_id, 'update_script'),
- update_url = uci.get('ddns', section_id, 'update_url');
-
- if (!service && (update_script || update_url))
- return "-";
-
- return service;
- };
- o.write = function(section_id, formvalue) {
- if (formvalue != '-') {
- uci.set('ddns', section_id, 'update_url', null);
- uci.set('ddns', section_id, 'update_script', null);
- return uci.set('ddns', section_id, 'service_name', formvalue);
- }
- return uci.set('ddns', section_id, 'service_name', null);
- };
-
- o = s.taboption('basic', form.Value, 'update_url',
- _("Custom update-URL"),
- _("Update URL to be used for updating your DDNS Provider.")
- + "<br />" +
- _("Follow instructions you will find on their WEB page."));
- o.modalonly = true;
- o.rmempty = true;
- o.optional = true;
- o.depends("ipv6_service_name","-");
- o.depends("ipv4_service_name","-");
- o.validate = function(section_id, value) {
- var other = this.section.children.filter(function(o) { return o.option == 'update_script' })[0].formvalue(section_id);
-
- if ((value == "" && other == "") || (value != "" && other != "")) {
- return _("Insert a Update Script OR a Update URL");
- }
-
- return true;
- };
-
- o = s.taboption('basic', form.Value, 'update_script',
- _("Custom update-script"),
- _("Custom update script to be used for updating your DDNS Provider."));
- o.modalonly = true;
- o.rmempty = true;
- o.optional = true;
- o.depends("ipv6_service_name","-");
- o.depends("ipv4_service_name","-");
- o.validate = function(section_id, value) {
- var other = this.section.children.filter(function(o) { return o.option == 'update_url' })[0].formvalue(section_id);
-
- if ((value == "" && other == "") || (value != "" && other != "")) {
- return _("Insert a Update Script OR a Update URL");
- }
-
- return true;
- };
-
- o = s.taboption('basic', form.Value, 'domain',
- _("Domain"),
- _("Replaces [USERNAME] in Update-URL (URL-encoded)"));
- o.modalonly = true;
- o.rmempty = false;
-
- o = s.taboption('basic', form.Value, 'username',
- _("Username"),
- _("Replaces [USERNAME] in Update-URL (URL-encoded)"));
- o.modalonly = true;
- o.rmempty = false;
-
- o = s.taboption('basic', form.Value, 'password',
- _("Password"),
- _("Replaces [PASSWORD] in Update-URL (URL-encoded)"));
- o.password = true;
- o.modalonly = true;
- o.rmempty = false;
-
- o = s.taboption('basic', form.Value, 'param_enc',
- _("Optional Encoded Parameter"),
- _("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)"));
- o.optional = true;
- o.modalonly = true;
-
- o = s.taboption('basic', form.Value, 'param_opt',
- _("Optional Parameter"),
- _("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)"));
- o.optional = true;
- o.modalonly = true;
-
- if (env['has_ssl']) {
- o = s.taboption('basic', form.Flag, 'use_https',
- _("Use HTTP Secure"),
- _("Enable secure communication with DDNS provider"));
- o.optional = true;
- o.modalonly = true;
-
- o = s.taboption('basic', form.Value, 'cacert',
- _("Path to CA-Certificate"),
- _("directory or path/file")
- + "<br />" +
- _("or")
- + '<b>' + " IGNORE " + '</b>' +
- _("to run HTTPS without verification of server certificates (insecure)"));
- o.modalonly = true;
- o.depends("use_https", "1");
- o.placeholder = "/etc/ssl/certs";
- o.rmempty = false;
- };
-
-
- o = s.taboption('advanced', form.ListValue, 'ip_source',
- _("IP address source"),
- _("Defines the source to read systems IP-Address from, that will be send to the DDNS provider"));
- o.modalonly = true;
- o.default = "network";
- o.value("network", _("Network"));
- o.value("web", _("URL"));
- o.value("interface", _("Interface"));
- o.value("script", _("Script"));
- o.write = function(section_id, formvalue) {
- switch(formvalue) {
- case 'network':
- uci.set('ddns', section_id, "ip_url",null);
- uci.set('ddns', section_id, "ip_interface",null);
- uci.set('ddns', section_id, "ip_script",null);
- break;
- case 'web':
- uci.set('ddns', section_id, "ip_network",null);
- uci.set('ddns', section_id, "ip_interface",null);
- uci.set('ddns', section_id, "ip_script",null);
- break;
- case 'interface':
- uci.set('ddns', section_id, "ip_network",null);
- uci.set('ddns', section_id, "ip_url",null);
- uci.set('ddns', section_id, "ip_script",null);
- break;
- case 'script':
- uci.set('ddns', section_id, "ip_network",null);
- uci.set('ddns', section_id, "ip_url",null);
- uci.set('ddns', section_id, "ip_interface",null);
- break;
- default:
- break;
- };
-
- return uci.set('ddns', section_id, 'ip_source', formvalue )
- };
-
- o = s.taboption('advanced', widgets.NetworkSelect, 'ip_network',
- _("Network"),
- _("Defines the network to read systems IP-Address from"));
- o.depends('ip_source','network');
- o.modalonly = true;
- o.default = 'wan';
- o.multiple = false;
-
- o = s.taboption('advanced', form.Value, 'ip_url',
- _("URL to detect"),
- _("Defines the Web page to read systems IP-Address from.")
- + '<br />' +
- String.format('%s %s', _('Example for IPv4'), ': http://checkip.dyndns.com')
- + '<br />' +
- String.format('%s %s', _('Example for IPv6'), ': http://checkipv6.dyndns.com'));
- o.depends("ip_source", "web")
- o.modalonly = true;
-
- o = s.taboption('advanced', widgets.DeviceSelect, 'ip_interface',
- _("Interface"),
- _("Defines the interface to read systems IP-Address from"));
- o.modalonly = true;
- o.depends("ip_source", "interface")
- o.multiple = false;
- o.default = 'wan';
-
- o = s.taboption('advanced', form.Value, 'ip_script',
- _("Script"),
- _("User defined script to read systems IP-Address"));
- o.modalonly = true;
- o.depends("ip_source", "script")
- o.placeholder = "/path/to/script.sh"
-
- o = s.taboption('advanced', widgets.DeviceSelect, 'interface',
- _("Event Network"),
- _("Network on which the ddns-updater scripts will be started"));
- o.modalonly = true;
- o.multiple = false;
- o.default = 'wan';
- o.depends("ip_source", "web");
- o.depends("ip_source", "script");
-
- o = s.taboption('advanced', form.DummyValue, '_interface',
- _("Event Network"),
- _("Network on which the ddns-updater scripts will be started"));
- o.depends("ip_source", "interface");
- o.depends("ip_source", "network");
- o.forcewrite = true;
- o.modalonly = true;
- o.cfgvalue = function(section_id) {
- return uci.get('ddns', section_id, 'interface') || _('This will be autoset to the selected interface');
- };
- o.write = function(section_id) {
- var opt = this.section.children.filter(function(o) { return o.option == 'ip_source' })[0].formvalue(section_id);
- var val = this.section.children.filter(function(o) { return o.option == 'ip_'+opt })[0].formvalue(section_id);
- return uci.set('ddns', section_id, 'interface', val);
- };
-
- if (env['has_bindnet']) {
- o = s.taboption('advanced', widgets.ZoneSelect, 'bind_network',
- _("Bind Network"),
- _('OPTIONAL: Network to use for communication')
- + '<br />' +
- _("Network on which the ddns-updater scripts will be started"));
- o.depends("ip_source", "web");
- o.optional = true;
- o.rmempty = true;
- o.modalonly = true;
- }
-
- if (env['has_forceip']) {
- o = s.taboption('advanced', form.Flag, 'force_ipversion',
- _("Force IP Version"),
- _('OPTIONAL: Force the usage of pure IPv4/IPv6 only communication.'));
- o.optional = true;
- o.rmempty = true;
- o.modalonly = true;
- }
-
- if (env['has_dnsserver']) {
- o = s.taboption("advanced", form.Value, "dns_server",
- _("DNS-Server"),
- _("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.")
- + "<br />" +
- _("Format: IP or FQDN"));
- o.placeholder = "mydns.lan"
- o.optional = true;
- o.rmempty = true;
- o.modalonly = true;
- }
-
- if (env['has_bindhost']) {
- o = s.taboption("advanced", form.Flag, "force_dnstcp",
- _("Force TCP on DNS"),
- _("OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."));
- o.optional = true;
- o.rmempty = true;
- o.modalonly = true;
- }
-
- if (env['has_proxy']) {
- o = s.taboption("advanced", form.Value, "proxy",
- _("PROXY-Server"),
- _("OPTIONAL: Proxy-Server for detection and updates.")
- + "<br />" +
- String.format('%s: <b>%s</b>', _("Format"), "[user:password@]proxyhost:port")
- + "<br />" +
- String.format('%s: <b>%s</b>', _("IPv6 address must be given in square brackets"), "[2001:db8::1]:8080"));
- o.optional = true;
- o.rmempty = true;
- o.modalonly = true;
- }
-
- o = s.taboption("advanced", form.ListValue, "use_syslog",
- _("Log to syslog"),
- _("Writes log messages to syslog. Critical Errors will always be written to syslog."));
- o.modalonly = true;
- o.default = "2"
- o.optional = true;
- o.value("0", _("No logging"))
- o.value("1", _("Info"))
- o.value("2", _("Notice"))
- o.value("3", _("Warning"))
- o.value("4", _("Error"))
-
- o = s.taboption("advanced", form.Flag, "use_logfile",
- _("Log to file"));
- o.default = '1';
- o.optional = true;
- o.modalonly = true;
- o.cfgvalue = function(section_id) {
- this.description = _("Writes detailed messages to log file. File will be truncated automatically.") + "<br />" +
- _("File") + ': "' + logdir + '/' + section_id + '.log"';
- return uci.get('ddns', section_id, 'use_logfile');
- };
-
-
- o = s.taboption("timer", form.Value, "check_interval",
- _("Check Interval"));
- o.placeholder = "30";
- o.modalonly = true;
- o.datatype = 'uinteger';
- o.validate = function(section_id, formvalue) {
- var unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id),
- time_to_sec = time_res[unit || 'minutes'] * formvalue;
-
- if (formvalue && time_to_sec < 300)
- return _('Values below 5 minutes == 300 seconds are not supported');
-
- return true;
- };
-
- o = s.taboption("timer", form.ListValue, "check_unit",
- _('Check Unit'),
- _("Interval unit to check for changed IP"));
- o.modalonly = true;
- o.default = "minutes"
- o.value("seconds", _("seconds"));
- o.value("minutes", _("minutes"));
- o.value("hours", _("hours"));
-
- o = s.taboption("timer", form.Value, "force_interval",
- _("Force Interval"),
- _("Interval to force updates send to DDNS Provider")
- + "<br />" +
- _("Setting this parameter to 0 will force the script to only run once"));
- o.placeholder = "72";
- o.optional = true;
- o.modalonly = true;
- o.datatype = 'uinteger';
- o.validate = function(section_id, formvalue) {
-
- if (!formvalue)
- return true;
-
- var check_unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id),
- check_val = this.section.children.filter(function(o) { return o.option == 'check_interval' })[0].formvalue(section_id),
- force_unit = this.section.children.filter(function(o) { return o.option == 'force_unit' })[0].formvalue(section_id),
- check_to_sec = time_res[check_unit || 'minutes'] * ( check_val || '30'),
- force_to_sec = time_res[force_unit || 'minutes'] * formvalue;
-
- if (force_to_sec != 0 && force_to_sec < check_to_sec)
- return _("Values lower 'Check Interval' except '0' are not supported");
-
- return true;
- };
-
- o = s.taboption("timer", form.ListValue, "force_unit",
- _('Force Unit'),
- _("Interval unit to force updates send to DDNS Provider"));
- o.modalonly = true;
- o.optional = true;
- o.default = "minutes"
- o.value("minutes", _("minutes"));
- o.value("hours", _("hours"));
- o.value("days", _("days"));
-
- o = s.taboption("timer", form.Value, "retry_count",
- _("Error Retry Counter"),
- _("On Error the script will stop execution after given number of retrys")
- + "<br />" +
- _("The default setting of '0' will retry infinite."));
- o.placeholder = "0";
- o.optional = true;
- o.modalonly = true;
- o.datatype = 'uinteger';
-
- o = s.taboption("timer", form.Value, "retry_interval",
- _("Error Retry Interval"),
- _("On Error the script will stop execution after given number of retrys")
- + "<br />" +
- _("The default setting of '0' will retry infinite."));
- o.placeholder = "60";
- o.optional = true;
- o.modalonly = true;
- o.datatype = 'uinteger';
-
- o = s.taboption("timer", form.ListValue, "retry_unit",
- _('Retry Unit'),
- _("On Error the script will retry the failed action after given time"));
- o.modalonly = true;
- o.optional = true;
- o.default = "seconds"
- o.value("seconds", _("seconds"));
- o.value("minutes", _("minutes"));
-
-
- o = s.taboption("logview", form.DummyValue, '_read_log', '');
- o.depends('use_logfile','1');
- o.modalonly = true;
- o.cfgvalue = function(section_id) {
- return E([], [
- E('button', {
- 'class': 'cbi-button cbi-button-apply',
- 'click': L.ui.createHandlerFn(this, function() {
- var o = this.section.children.filter(function(o) { return o.option == '_logview' })[0];
- return callGetLogServices(section_id).then(L.bind(o.update_log, o));
- })
- }, _('Read / Reread log file'))]);
- };
-
- o = s.taboption("logview", form.DummyValue, "_logview");
- o.depends('use_logfile','1');
- o.modalonly = true;
-
- o.update_log = L.bind(function(view, log_data) {
- return document.getElementById('log_area').textContent = log_data.result;
- }, o, this)
-
- o.render = L.bind(function() {
- return E([
- E('p', {}, _('This is the current content of the log file in ') + logdir + ' for this service.'),
- E('p', {}, E('textarea', { 'style': 'width:100%', 'rows': 20, 'readonly' : 'readonly', 'id' : 'log_area' }, _('Please press [Read] button') ))
- ]);
- }, o, this)
-
return m.render().then(L.bind(function(m, nodes) {
poll.add(L.bind(function() {
return Promise.all([
this.callDDnsGetServicesStatus(),
- callDDnsGetStatus()
+ this.callDDnsGetStatus()
]).then(L.bind(this.poll_status, this, nodes));
}, this), 5);
return nodes;
diff --git a/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns b/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns
index 7710ee66f4..0a60142e6f 100755
--- a/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns
+++ b/applications/luci-app-ddns/root/usr/libexec/rpcd/luci.ddns
@@ -7,6 +7,7 @@ local UCI = require "luci.model.uci"
local sys = require "luci.sys"
local util = require "luci.util"
+local ddns_package_path = "/usr/share/ddns"
local luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh"
local srv_name = "ddns-scripts"
@@ -155,6 +156,7 @@ local methods = {
local ipkg = require "luci.model.ipkg"
local uci = UCI.cursor()
local dateformat = uci:get("ddns", "global", "ddns_dateformat") or "%F %R"
+ local services_mtime = fs.stat(ddns_package_path .. "/list", 'mtime')
uci:unload("ddns")
local ver, srv_ver_cmd
local res = {}
@@ -169,6 +171,7 @@ local methods = {
res['_version'] = ver and #ver > 0 and ver or nil
res['_enabled'] = sys.init.enabled("ddns")
res['_curr_dateformat'] = os.date(dateformat)
+ res['_services_list'] = services_mtime and os.date(dateformat, services_mtime) or 'NO_LIST'
return res
end
diff --git a/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json b/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json
index 94952792f0..298378452d 100644
--- a/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json
+++ b/applications/luci-app-ddns/root/usr/share/rpcd/acl.d/luci-app-ddns.json
@@ -7,8 +7,12 @@
"luci": [ "setInitAction" ]
},
"file": {
- "/etc/ddns/services": [ "read" ],
- "/etc/ddns/services_ipv6": [ "read" ],
+ "/usr/share/ddns/default": [ "list" ],
+ "/usr/share/ddns/default/*": [ "read" ],
+ "/usr/share/ddns/custom": [ "list" ],
+ "/usr/share/ddns/custom/*": [ "read" ],
+ "/usr/share/ddns/list": [ "read" ],
+ "/usr/bin/ddns": [ "exec" ],
"/usr/lib/ddns/dynamic_dns_lucihelper.sh": [ "exec" ]
},
"uci": [ "ddns" ]
diff --git a/applications/luci-app-mwan3/po/pt/mwan3.po b/applications/luci-app-mwan3/po/pt/mwan3.po
index 9443d2ac3c..810779f4de 100644
--- a/applications/luci-app-mwan3/po/pt/mwan3.po
+++ b/applications/luci-app-mwan3/po/pt/mwan3.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-07-19 09:43+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsmwan3/pt/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua:176
#: applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua:192
@@ -725,11 +725,11 @@ msgid ""
"Physical device name which interface went up or down (e.g. \"eth0\" or "
"\"wwan0\")<br /><br />"
msgstr ""
-"Esta seção permite modificar o conteúdo de \"/etc/mwan3.user\".<br />O "
+"Esta secção permite modificar o conteúdo de \"/etc/mwan3.user\".<br />O "
"ficheiro também é preservado durante o sysupgrade.<br /><br />Notas:<br /"
">Este ficheiro é interpretado como um script de shell.<br />A primeira linha "
"do script deve ser &#34;#!/bin/sh&#34; sem as aspas.<br />Linhas começando "
-"com # são comentários e não são executadas.<br />Pouse sua ação mwan3 "
+"com # são comentários e não são executadas.<br />Pouse a sua ação mwan3 "
"personalizada aqui, elas serão executadas com cada evento netifd da "
"interface hotplug<br />em interfaces para as quais o mwan3 está ativado.<br /"
"><br />Existem três variáveis de ambiente principais que são passadas a este "
@@ -737,9 +737,9 @@ msgstr ""
"mwan3track <br />* \"ifdown\" É chamado pelo netifd e mwan3track <br />** "
"\"connected\" Só é chamado pelo mwan3track se o rastreamento foi bem "
"sucedido <br />* \"disconnected\" Só é chamado pelo mwan3track se o "
-"rastreamento falhou <br />$INTERFACE Nome da interface que foi up ou down (e."
-"g. \"wan\" ou \"wwan\")<br />$DEVICE Nome do aparelho físico cuja interface "
-"foi up ou down (e.g. \"eth0\" ou \"wwan0\")<br /><br />"
+"rastreamento falhou <br />$INTERFACE Nome da interface que foi up ou down ("
+"e.g. \"wan\" ou \"wwan\")<br />$DEVICE Nome do aparelho físico cuja "
+"interface foi up ou down (e.g. \"eth0\" ou \"wwan0\")<br /><br />"
#: applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua:37
msgid "Tracking hostname or IP address"
diff --git a/applications/luci-app-nut/po/pt/nut.po b/applications/luci-app-nut/po/pt/nut.po
index 36b181fe13..04c34d63e1 100644
--- a/applications/luci-app-nut/po/pt/nut.po
+++ b/applications/luci-app-nut/po/pt/nut.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2020-05-03 18:57+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsnut/pt/>\n"
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-nut/luasrc/model/cbi/nut_server.lua:216
msgid "Additional Shutdown Time(s)"
@@ -520,7 +520,7 @@ msgstr "Comunicação Síncrona"
#: applications/luci-app-nut/luasrc/model/cbi/nut_server.lua:115
msgid "The name of this section will be used as UPS name elsewhere"
-msgstr "O nome desta seção será usado como o nome do UPS em outros lugares"
+msgstr "O nome desta secção será usado como o nome do UPS em outros lugares"
#: applications/luci-app-nut/luasrc/model/cbi/nut_server.lua:96
msgid "Time in seconds between driver start retry attempts."
diff --git a/applications/luci-app-openvpn/po/pt/openvpn.po b/applications/luci-app-openvpn/po/pt/openvpn.po
index de47bede31..7b3ce25107 100644
--- a/applications/luci-app-openvpn/po/pt/openvpn.po
+++ b/applications/luci-app-openvpn/po/pt/openvpn.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-26 19:03+0200\n"
-"PO-Revision-Date: 2020-05-02 10:21+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsopenvpn/pt/>\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:364
msgid "'net30', 'p2p', or 'subnet'"
@@ -165,7 +165,7 @@ msgstr "Parametros Diffie-Hellman"
#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:427
msgid "Directory for custom client config files"
-msgstr "Directório para configurações personalizadas dos clientes"
+msgstr "Diretório para ficheiros de configurações personalizadas de clientes"
#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:24
msgid "Disable Paging"
@@ -390,7 +390,7 @@ msgstr "Numero de buffers de broadcast alocados"
#: applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua:360
msgid "Number of lines for log file history"
-msgstr "Numero de linhas para o historico do registo"
+msgstr "Numero de linhas para o histórico de ficheiros de registo"
#: applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm:95
msgid "OVPN configuration file upload"
diff --git a/applications/luci-app-privoxy/po/pt/privoxy.po b/applications/luci-app-privoxy/po/pt/privoxy.po
index 3048966fff..e6a738f1b1 100644
--- a/applications/luci-app-privoxy/po/pt/privoxy.po
+++ b/applications/luci-app-privoxy/po/pt/privoxy.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-07-20 11:41+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsprivoxy/pt/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:236
msgid ""
@@ -65,7 +65,7 @@ msgstr "Interface de utilizador CGI"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:857
msgid "Common Log Format"
-msgstr "Formato de registros (log) comum"
+msgstr "Formato de registos (log) comum"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:92
msgid ""
@@ -209,22 +209,22 @@ msgstr "Visualizador de ficheiro de log"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:895
msgid "Log all data read from the network"
-msgstr "Registrar todos os dados lidos da rede"
+msgstr "Registar todos os dados lidos da rede"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:827
msgid "Log all data written to the network"
-msgstr "Registrar todos os dados gravados na rede"
+msgstr "Registar todos os dados gravados na rede"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:901
msgid "Log the applying actions"
-msgstr "Registrar as ações aplicadas"
+msgstr "Registar as ações aplicadas"
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:803
msgid ""
"Log the destination for each request Privoxy let through. See also 'Debug "
"1024'."
msgstr ""
-"Registrar o destino para cada pedido que o Privoxy deixou passar. Consulte "
+"Registar o destino para cada pedido que o Privoxy deixou passar. Consulte "
"também 'Debug 1024'."
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:863
@@ -232,8 +232,7 @@ msgid ""
"Log the destination for requests Privoxy didn't let through, and the reason "
"why."
msgstr ""
-"Registrar o destino para os pedidos que o Privoxy não deixou passar, e a "
-"razão pela qual."
+"Registar o destino para os pedidos que o Privoxy não deixou passar e porque."
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:104
msgid "Logging"
@@ -355,7 +354,7 @@ msgid ""
"tells Privoxy where to find those other files."
msgstr ""
"Privoxy pode (e normalmente o faz) utilizar uma série de outros ficheiros de "
-"configuração, ajuda e de registros. Esta seção do ficheiro de configuração "
+"configuração, ajuda e de registos. Esta secção do ficheiro de configuração "
"informa o Privoxy onde encontrar os outros ficheiros."
#: applications/luci-app-privoxy/luasrc/controller/privoxy.lua:32
@@ -458,7 +457,7 @@ msgid ""
"The directory where all logging takes place (i.e. where the logfile is "
"located)."
msgstr ""
-"O diretório onde todos os registros ocorrem (ex: onde o ficheiro de log está "
+"O diretório onde todos os registos ocorrem (ex: onde o ficheiro de log está "
"localizado)."
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:289
@@ -481,7 +480,7 @@ msgstr "O nome da máquina mostrado nas páginas de CGI."
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:274
msgid "The log file to use. File name, relative to log directory."
msgstr ""
-"O ficheiro de registros a ser usado. O nome do ficheiro, relativo ao "
+"O ficheiro de registos a ser usado. O nome do ficheiro, relativo ao "
"diretório de log."
#: applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua:784
diff --git a/applications/luci-app-simple-adblock/po/pl/simple-adblock.po b/applications/luci-app-simple-adblock/po/pl/simple-adblock.po
index daa5fddc45..124c4615b2 100644
--- a/applications/luci-app-simple-adblock/po/pl/simple-adblock.po
+++ b/applications/luci-app-simple-adblock/po/pl/simple-adblock.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-10 17:36+0000\n"
-"Last-Translator: Marcin Net <marcin.net@linux.pl>\n"
+"PO-Revision-Date: 2020-10-01 08:41+0000\n"
+"Last-Translator: Atrate <Atrate@protonmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssimple-adblock/pl/>\n"
"Language: pl\n"
@@ -60,7 +60,7 @@ msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:234
msgid "Automatic Config Update"
-msgstr ""
+msgstr "Automatyczna aktualizacja konfiguracji"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:232
msgid "Basic Configuration"
@@ -261,6 +261,7 @@ msgstr "Ustawienia szczegółowości danych wyjściowych"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:234
msgid "Perform config update before downloading the block/allow-lists."
msgstr ""
+"Wykonaj aktualizację konfiguracji przed pobraniem list blokowania/zezwoleń."
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:267
msgid ""
@@ -412,7 +413,7 @@ msgstr "nie udało się pobrać"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:156
msgid "failed to download Config Update file"
-msgstr ""
+msgstr "nie udało się pobrać pliku aktualizacji konfiguracji"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:147
msgid "failed to format data file"
@@ -436,7 +437,7 @@ msgstr "nie można przeanalizować"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:158
msgid "failed to parse Config Update file"
-msgstr ""
+msgstr "nie udało się przetworzyć pliku aktualizacji konfiguracji"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:146
msgid "failed to process allow-list"
diff --git a/applications/luci-app-statistics/po/pt/statistics.po b/applications/luci-app-statistics/po/pt/statistics.po
index 12bc60e84c..0bc4f535d2 100644
--- a/applications/luci-app-statistics/po/pt/statistics.po
+++ b/applications/luci-app-statistics/po/pt/statistics.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-26 19:03+0200\n"
-"PO-Revision-Date: 2020-08-04 18:32+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsstatistics/pt/>\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-statistics/htdocs/luci-static/resources/statistics/rrdtool/definitions/apcups.js:7
#: applications/luci-app-statistics/root/usr/share/luci/statistics/plugins/apcups.json:2
@@ -195,7 +195,7 @@ msgstr "Intervalo da coleta de dados"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/collectd.js:71
msgid "Datasets definition file"
-msgstr "Arquivo com a definição de dados"
+msgstr "Ficheiro com a definição de dados"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/cpufreq.js:22
msgid "Detailled CPU frequency monitoring enabled"
@@ -571,7 +571,7 @@ msgstr "Monitoras discos e partições"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/df.js:59
msgid "Monitor filesystem types"
-msgstr "Monitorar tipos de sistemas de arquivos"
+msgstr "Monitorar tipos de sistemas de ficheiros"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/apcups.js:14
msgid "Monitor host"
@@ -1061,7 +1061,7 @@ msgstr "Diretório de armazenamento"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/csv.js:14
msgid "Storage directory for the csv files"
-msgstr "Diretório para armazenamento dos arquivos csv"
+msgstr "Diretório para armazenamento dos ficheiros csv"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/csv.js:18
msgid "Store data values as rates instead of absolute values"
@@ -1170,8 +1170,8 @@ msgid ""
"The csv plugin stores collected data in csv file format for further "
"processing by external programs."
msgstr ""
-"O plugin csv armazena os dados coletados em um arquivo no formato csv para "
-"um futuro processamento por outros programas."
+"O plugin csv armazena os dados coletados num ficheiro no formato csv para um "
+"futuro processamento por outros programas."
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/df.js:8
msgid ""
@@ -1179,7 +1179,7 @@ msgid ""
"devices, mount points or filesystem types."
msgstr ""
"O plugin df coleta estatísticas sobre a utilização de espaço em disco em "
-"diferentes dispositivos, pontos de montagem ou tipos de sistemas de arquivos."
+"diferentes aparelhos, pontos de montagem ou tipos de sistemas de ficheiros."
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/disk.js:8
msgid ""
@@ -1309,10 +1309,10 @@ msgid ""
"values will result in a very high memory consumption in the temporary "
"directory. This can render the device unusable!</strong>"
msgstr ""
-"O plugin rrdtool armazena os dados coletados no arquivo de banco de dados "
-"rrd.<br /><br /><strong>Aviso: A má configuração desses valores, resultará "
-"em um valor muito elevado no consumo de memória no diretório temporário. "
-"Isso pode tornar o equipamento inutilizável!</strong>"
+"O plugin rrdtool armazena os dados coletados no ficheiro de banco de dados "
+"rrd.<br /><br /><strong>Aviso: a má configuração desses valores, resultará "
+"num valor muito elevado no consumo de memória no diretório temporário. Isso "
+"pode tornar o equipamento inutilizável!</strong>"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/sensors.js:16
msgid ""
@@ -1391,14 +1391,14 @@ msgid ""
"This section defines on which interfaces collectd will wait for incoming "
"connections."
msgstr ""
-"Esta seção define em quais interfaces o collectd irá aguardar para receber "
+"Esta secção define em quais interfaces o collectd irá aguardar para receber "
"conexões."
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/network.js:51
msgid ""
"This section defines to which servers the locally collected data is sent to."
msgstr ""
-"Esta seção define para qual servidor os dados coletados localmente serão "
+"Esta secção define para qual servidor os dados coletados localmente serão "
"enviados."
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/collectd.js:80
@@ -1450,7 +1450,7 @@ msgstr "Use um esquema de nomeação melhorado"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/collectd.js:68
msgid "Used PID file"
-msgstr "Arquivo PID usado"
+msgstr "Ficheiro PID usado"
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/exec.js:27
#: applications/luci-app-statistics/htdocs/luci-static/resources/view/statistics/plugins/exec.js:47
diff --git a/applications/luci-app-tinyproxy/po/pt/tinyproxy.po b/applications/luci-app-tinyproxy/po/pt/tinyproxy.po
index f183b637fb..2247c3786f 100644
--- a/applications/luci-app-tinyproxy/po/pt/tinyproxy.po
+++ b/applications/luci-app-tinyproxy/po/pt/tinyproxy.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-26 19:03+0200\n"
-"PO-Revision-Date: 2020-07-20 11:41+0000\n"
+"PO-Revision-Date: 2020-10-01 08:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationstinyproxy/pt/>\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua:219
msgid ""
@@ -57,8 +57,8 @@ msgid ""
"By default, filter strings are treated as case-insensitive. Enable this to "
"make the matching case-sensitive"
msgstr ""
-"Por padrão, as regras são tratadas como insensíveis a caixa. Ative esta "
-"opção para diferenciar maiúsculas e minúsculas"
+"Por predefinição, as regras são tratadas como não sensíveis a maiúsculas e "
+"minúsculas. Ative esta opção para diferenciar maiúsculas e minúsculas"
#: applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua:145
msgid ""
diff --git a/applications/luci-app-travelmate/po/pl/travelmate.po b/applications/luci-app-travelmate/po/pl/travelmate.po
index c65b6bdcf9..d42e2b7db0 100644
--- a/applications/luci-app-travelmate/po/pl/travelmate.po
+++ b/applications/luci-app-travelmate/po/pl/travelmate.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-27 12:38+0000\n"
-"Last-Translator: Atrate <Atrate@protonmail.com>\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
+"Last-Translator: Krzysiek Fulko <kfulko@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationstravelmate/pl/>\n"
"Language: pl\n"
@@ -13,23 +13,24 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:73
msgid "-- AP Selection --"
-msgstr ""
+msgstr "-- Wybór AP --"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:261
+#, fuzzy
msgid "AP QR-Codes..."
-msgstr ""
+msgstr "Kody QR AP..."
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:823
msgid "Add Uplink %q"
-msgstr ""
+msgstr "Dodaj Uplink %q"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:679
msgid "Add Uplink..."
-msgstr ""
+msgstr "Dodaj Uplink..."
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:280
msgid "Additional Settings"
-msgstr ""
+msgstr "Ustawienia dodatkowe"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:321
msgid ""
@@ -72,8 +73,9 @@ msgid ""
msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:380
+#, fuzzy
msgid "Automatically handle VPN (re-) connections."
-msgstr ""
+msgstr "Automatyczna obsługa połączeń VPN."
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:252
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:415
@@ -121,8 +123,9 @@ msgid ""
msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:437
+#, fuzzy
msgid "Connection End"
-msgstr ""
+msgstr "Koniec połączenia"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:466
msgid "Connection End Expiry"
@@ -173,15 +176,15 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:422
msgid "E-Mail Profile"
-msgstr ""
+msgstr "Profil E-mail"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:407
msgid "E-Mail Receiver Address"
-msgstr ""
+msgstr "Adres E-mail odbiorcy"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:412
msgid "E-Mail Sender Address"
-msgstr ""
+msgstr "Adres E-mail nadawcy"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:282
msgid "E-Mail Settings"
@@ -230,12 +233,12 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:290
msgid "Enable verbose debug logging in case of any processing errors."
-msgstr ""
+msgstr "Włącz pełne rejestrowanie debugowania w przypadku błędów przetwarzania."
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:287
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:233
msgid "Enabled"
-msgstr ""
+msgstr "Włączone"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:256
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:575
@@ -262,7 +265,7 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:279
msgid "General Settings"
-msgstr ""
+msgstr "Ustawienia główne"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:314
msgid "Generate a random unicast MAC address for each uplink connection."
@@ -317,7 +320,7 @@ msgstr "Ostatnie uruchomienie"
#: applications/luci-app-travelmate/root/usr/share/luci/menu.d/luci-app-travelmate.json:35
msgid "Log View"
-msgstr ""
+msgstr "Widok dziennika"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:363
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:791
@@ -473,7 +476,7 @@ msgstr "Limit powtórzeń do połączenia."
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:241
msgid "Run Flags"
-msgstr ""
+msgstr "Uruchomione flagi"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:248
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:404
@@ -517,7 +520,7 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:277
msgid "Settings"
-msgstr ""
+msgstr "Ustawienia"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:331
msgid "Signal Quality Threshold"
@@ -549,7 +552,7 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:226
msgid "Status / Version"
-msgstr ""
+msgstr "Status/Wersja"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:571
msgid "Strength"
@@ -663,7 +666,7 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:290
msgid "Verbose Debug Logging"
-msgstr ""
+msgstr "Pełne rejestrowanie debugowania"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:271
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/stations.js:764
diff --git a/applications/luci-app-travelmate/po/pt/travelmate.po b/applications/luci-app-travelmate/po/pt/travelmate.po
index 5ba9e45566..e39c776cf2 100644
--- a/applications/luci-app-travelmate/po/pt/travelmate.po
+++ b/applications/luci-app-travelmate/po/pt/travelmate.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-29 14:41+0000\n"
+"PO-Revision-Date: 2020-10-01 08:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationstravelmate/pt/>\n"
@@ -515,7 +515,7 @@ msgstr ""
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:277
msgid "Settings"
-msgstr ""
+msgstr "Configurações"
#: applications/luci-app-travelmate/htdocs/luci-static/resources/view/travelmate/overview.js:331
msgid "Signal Quality Threshold"
diff --git a/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po b/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po
index 370936bb5e..3131f80843 100644
--- a/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po
+++ b/applications/luci-app-vpn-policy-routing/po/pl/vpn-policy-routing.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-08-18 20:32+0000\n"
-"Last-Translator: Marcin Net <marcin.net@linux.pl>\n"
+"PO-Revision-Date: 2020-10-01 08:41+0000\n"
+"Last-Translator: Atrate <Atrate@protonmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsvpn-policy-routing/pl/>\n"
"Language: pl\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:63
msgid "%s (disabled)"
@@ -186,7 +186,7 @@ msgstr "Wymuszenie interfejsu protokołu ICMP."
#: applications/luci-app-vpn-policy-routing/root/usr/share/rpcd/acl.d/luci-app-vpn-policy-routing.json:3
msgid "Grant UCI and file access for luci-app-vpn-policy-routing"
-msgstr ""
+msgstr "Przyznaj dostęp do plików i UCI dla luci-app-vpn-policy-routing"
#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:214
msgid "IP Rules Support"
@@ -429,6 +429,8 @@ msgstr "Tłumienie/Brak wyjścia"
#: applications/luci-app-vpn-policy-routing/luasrc/view/vpn-policy-routing/status-gateways.htm:15
msgid "The %s represents the default gateway. See the %sREADME%s for details."
msgstr ""
+"%s reprezentuje bramę domyślną. Szczegółowe informacje można znaleźć w "
+"%sREADME%s."
#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:186
msgid "The ipset option for local policies"
diff --git a/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po b/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po
index 42e1c137f0..e0905527dc 100644
--- a/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po
+++ b/applications/luci-app-vpn-policy-routing/po/pt/vpn-policy-routing.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-09-29 14:41+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsvpn-policy-routing/pt/>\n"
@@ -29,7 +29,7 @@ msgid ""
"caution!%s"
msgstr ""
"%sADVERTÊNCIA:%s Consulte o %sREADME%s antes de alterar qualquer coisa nesta "
-"seção! Altere qualquer uma das configurações abaixo com extrema cautela!%s"
+"secção! Altere qualquer uma das configurações abaixo com extrema cautela!%s"
#: applications/luci-app-vpn-policy-routing/luasrc/model/cbi/vpn-policy-routing.lua:214
msgid ""
diff --git a/applications/luci-app-vpnbypass/po/pl/vpnbypass.po b/applications/luci-app-vpnbypass/po/pl/vpnbypass.po
index 647080a813..627d94e5d5 100644
--- a/applications/luci-app-vpnbypass/po/pl/vpnbypass.po
+++ b/applications/luci-app-vpnbypass/po/pl/vpnbypass.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-08-18 20:32+0000\n"
-"Last-Translator: Marcin Net <marcin.net@linux.pl>\n"
+"PO-Revision-Date: 2020-10-01 08:41+0000\n"
+"Last-Translator: Atrate <Atrate@protonmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsvpnbypass/pl/>\n"
"Language: pl\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-vpnbypass/luasrc/model/cbi/vpnbypass.lua:40
msgid "%s (disabled)"
@@ -39,8 +39,9 @@ msgid "Enable"
msgstr "Włącz"
#: applications/luci-app-vpnbypass/root/usr/share/rpcd/acl.d/luci-app-vpnbypass.json:3
+#, fuzzy
msgid "Grant UCI and file access for luci-app-vpnbypass"
-msgstr ""
+msgstr "Przyznaj dostęp do plików i UCI dla luci-app-vpnbypass"
#: applications/luci-app-vpnbypass/luasrc/view/vpnbypass/js.htm:51
msgid "Loading"
diff --git a/applications/luci-app-yggdrasil/po/pt/yggdrasil.po b/applications/luci-app-yggdrasil/po/pt/yggdrasil.po
index 100dead5c8..c9f1567acf 100644
--- a/applications/luci-app-yggdrasil/po/pt/yggdrasil.po
+++ b/applications/luci-app-yggdrasil/po/pt/yggdrasil.po
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-07-17 19:42+0000\n"
+"PO-Revision-Date: 2020-10-02 14:41+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsyggdrasil/pt/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.3-dev\n"
#: applications/luci-app-yggdrasil/htdocs/luci-static/resources/view/yggdrasil/status.js:33
msgid "Active peers"
@@ -204,10 +204,10 @@ msgid ""
"that SOCKS peerings will NOT be affected by this option and should go in the "
"\"Peers\" section instead."
msgstr ""
-"Lista de cadieas de carácteres de conexão para conexões peer de saída no "
+"Lista de cadeias de caracteres de conexão para conexões peer de saída no "
"formato URI, organizada por interface de origem, por exemplo, { \"eth0\": [ "
"tcp://a.b.c.d:e ] }. Observe que as conexões SOCKS NÃO serão afetados por "
-"essa opção e devem ir na seção \"Peers\"."
+"essa opção e devem ir à secção \"Peers\"."
#: applications/luci-app-yggdrasil/htdocs/luci-static/resources/view/yggdrasil/peers.js:12
msgid ""
@@ -216,10 +216,10 @@ msgid ""
"the operating system routing table, therefore you should use this section "
"when you may connect via different interfaces."
msgstr ""
-"Lista de strings de conexão para conexões pares de saída no formato URI, por "
+"Lista de cadeias de conexão para conexões pares de saída no formato URI, por "
"exemplo, tcp://a.b.c.d:e ou meias://a.b.c.d:e/f.g.h.i:j. Essas conexões "
"obedecerão à tabela de roteamento do sistema operacional, portanto deve usar "
-"esta seção quando se pode conectar através de diferentes interfaces."
+"esta secção quando se pode conectar através de diferentes interfaces."
#: applications/luci-app-yggdrasil/htdocs/luci-static/resources/view/yggdrasil/settings.js:50
msgid "Listen addresses"