luci-app-adblock-fast: update to 1.2.2-r14
authorStan Grishin <redacted>
Sat, 21 Mar 2026 01:14:37 +0000 (01:14 +0000)
committerStan Grishin <redacted>
Wed, 25 Mar 2026 21:10:11 +0000 (14:10 -0700)
* fix: ensure API account setup runs late in uci-defaults to allow for
  custom values to be set in other scripts
* add: DNS Query Logging tab/functionality

Signed-off-by: Stan Grishin <redacted>
applications/luci-app-adblock-fast/Makefile
applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js
applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js
applications/luci-app-adblock-fast/po/templates/adblock-fast.pot
applications/luci-app-adblock-fast/root/etc/uci-defaults/95_adblock-fast-api [moved from applications/luci-app-adblock-fast/root/etc/uci-defaults/41_adblock-fast-api with 100% similarity]
applications/luci-app-adblock-fast/root/usr/share/rpcd/acl.d/luci-app-adblock-fast.json
applications/luci-app-adblock-fast/root/usr/share/rpcd/ucode/luci.adblock-fast

index ac92c61adc061f6ff7653bca82240fe6372ec62c..4707415dc948d1075641a9bd6fdfe2a2ee55d531 100644 (file)
@@ -7,7 +7,7 @@ PKG_NAME:=luci-app-adblock-fast
 PKG_LICENSE:=AGPL-3.0-or-later
 PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca>
 PKG_VERSION:=1.2.2
-PKG_RELEASE:=12
+PKG_RELEASE:=14
 
 LUCI_TITLE:=AdBlock-Fast Web UI
 LUCI_URL:=https://github.com/mossdef-org/luci-app-adblock-fast/
index 092ae7cc5841a7c7606497c54631d72cab71aeb2..72cc294f7895a958c08a37fdfd1fa1f34136cc9a 100644 (file)
@@ -234,6 +234,26 @@ var _setRpcdToken = rpc.declare({
        expect: { result: false },
 });
 
+var getQueryLogStatus = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "getQueryLogStatus",
+       params: ["name"],
+});
+
+var setQueryLog = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "setQueryLog",
+       params: ["name", "action"],
+       expect: { result: false },
+});
+
+var callLogRead = rpc.declare({
+       object: "log",
+       method: "read",
+       params: ["lines", "stream", "oneshot"],
+       expect: { log: [] },
+});
+
 var RPC = {
        listeners: [],
        on: function (event, callback) {
@@ -814,4 +834,7 @@ return L.Class.extend({
        setCronEntry: setCronEntry,
        getPlatformSupport: getPlatformSupport,
        getServiceInfo: getServiceInfo,
+       getQueryLogStatus: getQueryLogStatus,
+       setQueryLog: setQueryLog,
+       callLogRead: callLogRead,
 });
index 99d7425bea6c2ba46c61a312b234d0619d3b361f..af341e2ea06b1f5c4410ba0fa7f0c4d6742eb662 100644 (file)
@@ -157,6 +157,7 @@ return view.extend({
                        L.resolveDefault(L.uci.load(pkg.Name), {}),
                        L.resolveDefault(L.uci.load("dhcp"), {}),
                        L.resolveDefault(L.uci.load("smartdns"), {}),
+                       L.resolveDefault(adb.getQueryLogStatus(pkg.Name), {}),
                ]);
        },
 
@@ -187,6 +188,9 @@ return view.extend({
                // Parse cron entry into virtual config values
                var cronConfig = this.parseCronEntry(reply.cronEntry);
 
+               var queryLogData =
+                       (data[5] && data[5][pkg.Name]) || {};
+
                var status, m, s1, s2, s3, o;
 
                status = new adb.status();
@@ -209,8 +213,9 @@ return view.extend({
 
                s1 = m.section(form.NamedSection, "config", pkg.Name);
                s1.tab("tab_basic", _("Basic Configuration"));
-               s1.tab("tab_schedule", _("List Updates Schedule"));
                s1.tab("tab_advanced", _("Advanced Configuration"));
+               s1.tab("tab_schedule", _("List Updates Schedule"));
+               s1.tab("tab_log", _("DNS Query Log"));
 
                var text = _(
                        "DNS resolution option, see the %sREADME%s for details.",
@@ -824,6 +829,108 @@ return view.extend({
                        return L.uci.set(pkg.Name, section_id, "rpcd_token", formvalue);
                };
 
+               o = s1.taboption("tab_log", form.DummyValue, "_log_viewer");
+               o.rawhtml = true;
+               o.cfgvalue = function () {
+                       return "";
+               };
+               o.renderWidget = function () {
+                       var resolver = queryLogData.resolver || "dnsmasq";
+                       var isLogging = queryLogData.logging_enabled || false;
+
+                       var logTag;
+                       switch (resolver) {
+                               case "smartdns":
+                                       logTag = "smartdns";
+                                       break;
+                               case "unbound":
+                                       logTag = "unbound";
+                                       break;
+                               default:
+                                       logTag = "dnsmasq";
+                                       break;
+                       }
+
+                       var statusLabel = E(
+                               "span",
+                               {
+                                       id: "query-log-status",
+                                       style: "font-weight: bold; color: " + (isLogging ? "green" : "inherit"),
+                               },
+                               isLogging ? _("Enabled") : _("Disabled"),
+                       );
+
+                       var btn_enable_log = E(
+                               "button",
+                               {
+                                       class: "btn cbi-button cbi-button-apply",
+                                       disabled: isLogging ? true : null,
+                                       click: function (ev) {
+                                               ev.target.disabled = true;
+                                               ev.target.classList.add("spinning");
+                                               return adb
+                                                       .setQueryLog(pkg.Name, "enable")
+                                                       .then(function () {
+                                                               location.reload();
+                                                       });
+                                       },
+                               },
+                               _("Enable Logging"),
+                       );
+
+                       var btn_disable_log = E(
+                               "button",
+                               {
+                                       class: "btn cbi-button cbi-button-reset",
+                                       disabled: !isLogging ? true : null,
+                                       click: function (ev) {
+                                               ev.target.disabled = true;
+                                               ev.target.classList.add("spinning");
+                                               return adb
+                                                       .setQueryLog(pkg.Name, "disable")
+                                                       .then(function () {
+                                                               location.reload();
+                                                       });
+                                       },
+                               },
+                               _("Disable Logging"),
+                       );
+
+                       var logTextarea = E("textarea", {
+                               id: "dns-query-log",
+                               style:
+                                       "min-height: 800px; max-height: 85vh; width: 100%; padding: 5px;" +
+                                       " font-family: monospace; font-size: 12px; resize: vertical;",
+                               readonly: "readonly",
+                               wrap: "off",
+                       });
+
+                       return E("div", { id: "adblock-fast-log-container" }, [
+                               E("div", { style: "margin-bottom: 10px;" }, [
+                                       E("span", {}, [
+                                               _("Query logging for %s: ").format(resolver),
+                                               statusLabel,
+                                       ]),
+                               ]),
+                               E("div", { style: "margin-bottom: 10px;" }, [
+                                       btn_enable_log,
+                                       E("span", {}, "\u00a0\u00a0"),
+                                       btn_disable_log,
+                               ]),
+                               E(
+                                       "div",
+                                       {
+                                               class: "cbi-section-descr",
+                                               style: "margin-bottom: 5px;",
+                                       },
+                                       _(
+                                               "Showing syslog entries for %s. Log refreshes automatically.",
+                                       ).format(logTag),
+                               ),
+                               logTextarea,
+                       ]);
+               };
+
                s2 = m.section(
                        form.NamedSection,
                        "config",
@@ -903,7 +1010,70 @@ return view.extend({
                o.modalonly = true;
                o.optional = false;
 
-               return Promise.all([status.render(), m.render()]);
+               return Promise.all([status.render(), m.render()]).then(function (nodes) {
+                       var mapNode = nodes[1];
+
+                       // Defer DOM modifications until after browser inserts nodes
+                       requestAnimationFrame(function () {
+                               var dns = queryLogData.resolver || "dnsmasq";
+                               var logTag = dns === "smartdns" ? "smartdns" : dns === "unbound" ? "unbound" : "dnsmasq";
+
+                               // Log fetcher
+                               var fetchLog = function () {
+                                       var el = document.getElementById("dns-query-log");
+                                       if (!el) return;
+                                       adb.callLogRead(1000, false, true).then(function (logEntries) {
+                                               var filtered = (logEntries || [])
+                                                       .filter(function (e) { return e.msg && e.msg.indexOf(logTag) >= 0; })
+                                                       .map(function (e) {
+                                                               var d = new Date(e.time);
+                                                               return "[" + d.toLocaleDateString([], { year: "numeric", month: "2-digit", day: "2-digit" })
+                                                                       + "-" + d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false })
+                                                                       + "] " + e.msg;
+                                                       });
+                                               el.value = filtered.length > 0 ? filtered.join("\n")
+                                                       : _("No %s query log entries found.").format(dns);
+                                               el.scrollTop = el.scrollHeight;
+                                       });
+                               };
+                               L.Poll.add(fetchLog, 5);
+                               L.Poll.start();
+
+                               // Make the log viewer full-width
+                               var style = document.createElement("style");
+                               style.textContent =
+                                       "#cbi-adblock-fast-config-_log_viewer { display: block !important; }";
+                               document.head.appendChild(style);
+
+                               // Hide s2/s3 sections when the log tab is active
+                               var logContainer = document.getElementById("adblock-fast-log-container");
+                               var cbiMap = logContainer && logContainer.closest(".cbi-map");
+                               if (cbiMap) {
+                                       var sections = cbiMap.querySelectorAll(":scope > .cbi-section");
+                                       var extraSections = [];
+                                       for (var i = 1; i < sections.length; i++)
+                                               extraSections.push(sections[i]);
+
+                                       var updateSections = function () {
+                                               var activeTab = cbiMap.querySelector(".cbi-tabmenu li.cbi-tab");
+                                               var isLogTab = activeTab && activeTab.getAttribute("data-tab") === "tab_log";
+                                               extraSections.forEach(function (s) {
+                                                       s.style.display = isLogTab ? "none" : "";
+                                               });
+                                       };
+
+                                       // Handle tab clicks and initial state
+                                       cbiMap.querySelectorAll(".cbi-tabmenu li[data-tab] a").forEach(function (link) {
+                                               link.addEventListener("click", function () {
+                                                       requestAnimationFrame(updateSections);
+                                               });
+                                       });
+                                       updateSections();
+                               }
+                       });
+
+                       return nodes;
+               });
        },
 
        handleSave: function (ev) {
index 4d67e93fafdaecc957bbd405bcb4b5cfc5a15b28..ff8f52b1b69809707ef6852d5802590b566c6705 100644 (file)
@@ -15,7 +15,7 @@ msgstr ""
 msgid "-"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:880
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:987
 msgid "Action"
 msgstr ""
 
@@ -23,13 +23,13 @@ msgstr ""
 msgid "Active"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:349
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:415
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:354
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:420
 msgid "Ad-blocking on all instances"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:350
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:416
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:355
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:421
 msgid "Ad-blocking on select instances"
 msgstr ""
 
@@ -41,72 +41,72 @@ msgstr ""
 msgid "AdBlock-Fast"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:831
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:938
 msgid "AdBlock-Fast - Allowed and Blocked Domains"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:855
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:962
 msgid "AdBlock-Fast - Allowed and Blocked Lists URLs"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:199
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:207
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:203
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:211
 msgid "AdBlock-Fast - Configuration"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:413
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:433
 msgid "AdBlock-Fast - Status"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:674
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:679
 msgid "Add IPv6 entries"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:671
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:676
 msgid "Add IPv6 entries to block-list."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:213
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:216
 msgid "Advanced Configuration"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:881
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:886
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:988
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:993
 msgid "Allow"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:839
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:946
 msgid "Allowed Domains"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:747
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:752
 msgid ""
 "Attempt to create a compressed cache of block-list in the persistent memory."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:659
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:664
 msgid "Automatic Config Update"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:512
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:517
 msgid "Automatic List Update"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:211
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:215
 msgid "Basic Configuration"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:882
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:886
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:989
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:993
 msgid "Block"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:847
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:954
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:42
 msgid "Blocked Domains"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:460
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:480
 msgid "Blocking %s domains (with %s)."
 msgstr ""
 
@@ -118,7 +118,7 @@ msgstr ""
 msgid "Cache file"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:477
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:497
 msgid "Cache file found."
 msgstr ""
 
@@ -130,11 +130,11 @@ msgstr ""
 msgid "Compressed cache"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:465
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:485
 msgid "Compressed cache file created."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:479
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:499
 msgid "Compressed cache file found."
 msgstr ""
 
@@ -142,7 +142,7 @@ msgstr ""
 msgid "Config (%s) validation failure!"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:484
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:489
 msgid "Controls system log and console output verbosity."
 msgstr ""
 
@@ -156,81 +156,90 @@ msgstr ""
 msgid "Cron service is not enabled or running. Enable it with: %s."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:720
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:725
 msgid "Curl download retry"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:707
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:712
 msgid "Curl maximum file size (in bytes)"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:294
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:218
+msgid "DNS Query Log"
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:299
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:41
 msgid "DNS Service"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:216
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:221
 msgid "DNS resolution option, see the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:530
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:535
 msgid "Daily"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:601
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:606
 msgid "Day of Month"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:580
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:585
 msgid "Day of Week"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:758
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:763
 msgid "Directory for compressed cache file"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:760
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:765
 msgid ""
 "Directory for compressed cache file of block-list in the persistent memory."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:722
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:515
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:662
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:778
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:791
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:742
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:520
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:667
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:783
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:796
 msgid "Disable"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:802
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:807
 msgid "Disable Debugging"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:432
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:896
+msgid "Disable Logging"
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:452
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:860
 msgid "Disabled"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:716
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:736
 msgid "Disabling %s service"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:326
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:331
 msgid "Dnsmasq Config File URL"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:673
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:678
 msgid "Do not add IPv6 entries"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:750
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:755
 msgid "Do not store compressed cache"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:737
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:742
 msgid "Do not use simultaneous processing"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:685
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:690
 msgid "Download time-out (in seconds)"
 msgstr ""
 
@@ -238,63 +247,71 @@ msgstr ""
 msgid "Downloading lists"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:703
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:516
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:663
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:779
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:792
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:876
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:723
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:521
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:668
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:784
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:797
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:983
 msgid "Enable"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:799
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:803
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:804
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:808
 msgid "Enable Debugging"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:788
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:878
+msgid "Enable Logging"
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:793
 msgid ""
 "Enable RFC 1123 compliant domain validation for dnsmasq block-lists to "
 "remove invalid entries."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:786
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:791
 msgid "Enable dnsmasq domain validation"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:773
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:778
 msgid "Enable dnsmasq sanity check"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:775
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:780
 msgid ""
 "Enable sanity check for dnsmasq block-list processing to detect and report "
 "issues."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:513
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:518
 msgid "Enable scheduled list redownloads via /etc/init.d/adblock-fast dl."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:800
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:860
+msgid "Enabled"
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:805
 msgid "Enables debug output to /tmp/adblock-fast.log."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:697
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:717
 msgid "Enabling %s service"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:560
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:580
 msgid "Errors encountered, please check the %sREADME%s"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:533
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:546
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:538
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:551
 msgid "Every N days"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:534
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:563
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:539
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:568
 msgid "Every N hours"
 msgstr ""
 
@@ -390,7 +407,7 @@ msgstr ""
 msgid "Failed to unpack compressed cache"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:945
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:1115
 msgid "Failed to update cron schedule."
 msgstr ""
 
@@ -398,7 +415,7 @@ msgstr ""
 msgid "Force DNS Ports"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:468
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:488
 msgid "Force DNS ports:"
 msgstr ""
 
@@ -406,19 +423,19 @@ msgstr ""
 msgid "Force Reloading"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:472
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:477
 msgid "Force Router DNS"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:476
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:481
 msgid "Force Router DNS server to all local devices"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:608
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:628
 msgid "Force redownloading %s block lists"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:473
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:478
 msgid "Forces Router DNS use on local devices, also known as DNS Hijacking."
 msgstr ""
 
@@ -426,7 +443,7 @@ msgstr ""
 msgid "Free ram (%s) is not enough to process all enabled block-lists"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:588
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:593
 msgid "Friday"
 msgstr ""
 
@@ -442,31 +459,31 @@ msgstr ""
 msgid "Heartbeat domain is not accessible after resolver restart"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:619
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:624
 msgid "Hour of day to run the update (0-23)."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:670
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:675
 msgid "IPv6 Support"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:709
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:714
 msgid ""
 "If curl is installed and detected, it would not download files bigger than "
 "this."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:722
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:727
 msgid ""
 "If curl is installed and detected, it would retry download this many times "
 "on timeout/fail."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:840
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:947
 msgid "Individual domains to be allowed."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:848
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:955
 msgid "Individual domains to be blocked."
 msgstr ""
 
@@ -481,25 +498,25 @@ msgstr ""
 msgid "Invalid compressed cache directory '%s'"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:496
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501
 msgid "LED to indicate status"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:734
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:739
 msgid ""
 "Launch all lists downloads and processing simultaneously, reducing service "
 "start time."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:475
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:480
 msgid "Let local devices use their own DNS servers if set"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:212
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:217
 msgid "List Updates Schedule"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:641
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:646
 msgid ""
 "Minute of hour to run the update (0-59). In 'Every N hours' mode, updates "
 "run at the selected minute within each interval."
@@ -509,27 +526,31 @@ msgstr ""
 msgid "Missing recommended package: '%s'"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:584
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:589
 msgid "Monday"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:532
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:537
 msgid "Monthly"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:898
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:1005
 msgid "Name"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:889
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:996
 msgid "Name/URL"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:417
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:1035
+msgid "No %s query log entries found."
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:422
 msgid "No Ad-blocking on SmartDNS"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:351
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:356
 msgid "No Ad-blocking on dnsmasq"
 msgstr ""
 
@@ -541,61 +562,61 @@ msgstr ""
 msgid "No blocked list URLs nor blocked-domains enabled"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:447
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:467
 msgid "Not installed or not found"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:483
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:488
 msgid "Output Verbosity Setting"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:619
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:641
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:650
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:657
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:639
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:661
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:670
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:677
 msgid "Pause"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:697
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:702
 msgid ""
 "Pause ad-blocking for the specified number of seconds when the Pause button "
 "is pressed."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:695
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:700
 msgid "Pause time-out (in seconds)"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:660
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:665
 msgid "Perform config update before downloading the block/allow-lists."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:498
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:503
 msgid "Pick the LED not already used in %sSystem LED Configuration%s."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:447
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:452
 msgid "Pick the SmartDNS instance(s) for ad-blocking"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:382
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:387
 msgid "Pick the dnsmasq instance(s) for ad-blocking"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:492
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:512
 msgid "Please %sdonate%s to support development of this project."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:224
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:229
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:234
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:239
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:246
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:253
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:262
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:269
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:276
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:285
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:244
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:251
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:258
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:267
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:274
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:281
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:290
 msgid "Please note that %s is not supported on this system."
 msgstr ""
 
@@ -603,11 +624,15 @@ msgstr ""
 msgid "Processing lists"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:614
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:911
+msgid "Query logging for %s:"
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:634
 msgid "Redownload"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:810
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:815
 msgid "Remote Access Token"
 msgstr ""
 
@@ -618,23 +643,23 @@ msgid ""
 msgstr ""
 
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:70
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:657
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:677
 msgid "Restarting"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:602
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:607
 msgid "Run on the selected day of month."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:581
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:586
 msgid "Run on the selected weekday."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:547
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:552
 msgid "Run once every N days."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:564
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:569
 msgid "Run once every N hours."
 msgstr ""
 
@@ -646,61 +671,65 @@ msgstr ""
 msgid "Sanity check discovered leading dots in %s"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:589
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:594
 msgid "Saturday"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:527
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:532
 msgid "Schedule Type"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:529
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:534
 msgid "Select how often the update should run."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:762
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:782
 msgid "Service Control"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:486
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:506
 msgid "Service Details"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:547
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:567
 msgid "Service Errors"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:417
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:437
 msgid "Service Status"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:517
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:537
 msgid "Service Warnings"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:201
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:205
 msgid ""
 "Service is disabled. Please enable the service using the Service Control "
 "button above to configure service options."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:732
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:927
+msgid "Showing syslog entries for %s. Log refreshes automatically."
+msgstr ""
+
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:737
 msgid "Simultaneous processing"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:863
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:970
 msgid "Size"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:873
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:980
 msgid "Size: %s"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:487
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:492
 msgid "Some output"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:595
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:615
 msgid "Start"
 msgstr ""
 
@@ -708,7 +737,7 @@ msgstr ""
 msgid "Starting"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:589
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:609
 msgid "Starting %s service"
 msgstr ""
 
@@ -716,11 +745,11 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:684
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:704
 msgid "Stop"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:686
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:691
 msgid "Stop the download if it is stalled for set number of seconds."
 msgstr ""
 
@@ -728,23 +757,23 @@ msgstr ""
 msgid "Stopped"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:678
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:698
 msgid "Stopping %s service"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:751
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:756
 msgid "Store compressed cache"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:745
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:750
 msgid "Store compressed cache file on router"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:583
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:588
 msgid "Sunday"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:486
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:491
 msgid "Suppress output"
 msgstr ""
 
@@ -783,28 +812,28 @@ msgstr ""
 msgid "The principal package (adblock-fast) is outdated, please update it"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:587
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:592
 msgid "Thursday"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:812
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:817
 msgid "Token for <a href=\""
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:585
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:590
 msgid "Tuesday"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:902
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:1009
 msgid "URL"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:328
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:333
 msgid ""
 "URL to the external dnsmasq config file, see the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:856
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:963
 msgid "URLs to file(s) containing lists to be allowed or blocked."
 msgstr ""
 
@@ -812,13 +841,13 @@ msgstr ""
 msgid "Unable to retrieve %s status"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:867
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:894
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:974
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:1001
 #: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/status/include/70_adblock-fast.js:50
 msgid "Unknown"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:557
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:577
 msgid "Unknown error"
 msgstr ""
 
@@ -826,23 +855,23 @@ msgstr ""
 msgid "Unknown message"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:527
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:547
 msgid "Unknown warning"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:618
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:623
 msgid "Update Hour"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:639
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:644
 msgid "Update Minute"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:407
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:412
 msgid "Use ad-blocking on the SmartDNS instance(s)"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:341
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:346
 msgid "Use ad-blocking on the dnsmasq instance(s)"
 msgstr ""
 
@@ -851,11 +880,11 @@ msgid ""
 "Use of external dnsmasq config file detected, please set '%s' option to '%s'"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:738
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:743
 msgid "Use simultaneous processing"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:488
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:493
 msgid "Verbose output"
 msgstr ""
 
@@ -863,7 +892,7 @@ msgstr ""
 msgid "Version"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:420
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/adblock-fast/status.js:440
 msgid "Version %s"
 msgstr ""
 
@@ -875,43 +904,43 @@ msgstr ""
 msgid "Waiting for trigger (on_start)"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:586
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:591
 msgid "Wednesday"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:531
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:536
 msgid "Weekly"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:409
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:414
 msgid ""
 "You can limit the ad-blocking to the specific SmartDNS instance(s) (%smore "
 "information%s)."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:343
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:348
 msgid ""
 "You can limit the ad-blocking to the specific dnsmasq instance(s) (%smore "
 "information%s)."
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:298
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:303
 msgid "dnsmasq additional hosts"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:299
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304
 msgid "dnsmasq config"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:301
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:306
 msgid "dnsmasq ipset"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:304
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:309
 msgid "dnsmasq nft set"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:306
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:311
 msgid "dnsmasq servers file"
 msgstr ""
 
@@ -931,22 +960,22 @@ msgstr ""
 msgid "failed to restore backup file %s"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:501
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:506
 msgid "none"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:309
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314
 msgid "smartdns domain set"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:311
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:316
 msgid "smartdns ipset"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:314
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:319
 msgid "smartdns nft set"
 msgstr ""
 
-#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:318
+#: applications/luci-app-adblock-fast/htdocs/luci-static/resources/view/adblock-fast/overview.js:323
 msgid "unbound adblock list"
 msgstr ""
index 1eed008f0e8ed6719bf584d9a39ad68a863ca62b..211623d83487a97b035f554f83b6e10ce9856eaf 100644 (file)
                                        "getInitStatus",
                                        "getCronStatus",
                                        "getCronEntry",
-                                       "getPlatformSupport"
+                                       "getPlatformSupport",
+                                       "getQueryLogStatus"
+                               ],
+                               "log": [
+                                       "read"
                                ],
                                "service": [
                                        "list"
                        "uci": [
                                "adblock-fast",
                                "dhcp",
-                               "smartdns"
+                               "smartdns",
+                               "unbound"
                        ]
                },
                "write": {
                        "uci": [
-                               "adblock-fast"
+                               "adblock-fast",
+                               "dhcp",
+                               "smartdns",
+                               "unbound"
                        ],
                        "ubus": {
                                "luci.adblock-fast": [
                                        "syncCron",
                                        "setCronEntry",
                                        "setInitAction",
-                                       "setRpcdToken"
+                                       "setRpcdToken",
+                                       "setQueryLog"
                                ]
                        }
                }
index 832d207064b83f7c32676c670bfcad14fde969ad..470c149d469dbee81459df79f7a98e24f80783b5 100644 (file)
@@ -15,6 +15,8 @@ ubus call luci.adblock-fast setCronEntry '{"name":"adblock-fast","entry":"0 4 *
 ubus call luci.adblock-fast setInitAction '{"name":"adblock-fast","action":"start"}'
 ubus call luci.adblock-fast syncCron '{"name":"adblock-fast","action":"start"}'
 ubus call luci.adblock-fast setRpcdToken '{"name":"adblock-fast","token":"newtoken"}'
+ubus call luci.adblock-fast getQueryLogStatus '{"name":"adblock-fast"}'
+ubus call luci.adblock-fast setQueryLog '{"name":"adblock-fast","action":"enable"}'
 */
 
 import adb from '/lib/adblock-fast/adblock-fast.uc';
@@ -36,6 +38,31 @@ function uci_bool(val) {
        }
 }
 
+// Return resolved list of selected instance section names.
+// null = all instances, [] = none, [...] = specific names.
+function get_selected_instances(uci_ctx, config, section_type, instance_option) {
+       let instances = uci_ctx.get(packageName, 'config', instance_option);
+
+       if (!instances || !length(instances))
+               return null;
+
+       if (type(instances) == 'string')
+               instances = [instances];
+
+       if (instances[0] == '*')
+               return null;
+       if (instances[0] == '-')
+               return [];
+
+       let result = [];
+       for (let inst in instances) {
+               if (!inst) continue;
+               let s = uci_ctx.get_all(config, '@' + section_type + '[' + inst + ']');
+               push(result, s?.['.name'] || inst);
+       }
+       return result;
+}
+
 // ── Cron Management ─────────────────────────────────────────────────
 
 function update_cron(action) {
@@ -463,6 +490,164 @@ const methods = {
                                        replace(token, "'", "'\\''")));
                        }
 
+                       return { result: true };
+               }
+       },
+       getQueryLogStatus: {
+               args: { name: 'name' },
+               call: function(req) {
+                       let name = req.args?.name || packageName;
+                       let uci_ctx = cursor();
+
+                       uci_ctx.load(packageName);
+                       let dns = uci_ctx.get(packageName, 'config', 'dns') || 'dnsmasq.servers';
+                       let resolver = split(dns, '.')[0];
+                       let logging_enabled = false;
+
+                       switch (resolver) {
+                       case 'dnsmasq': {
+                               uci_ctx.load('dhcp');
+                               let sel = get_selected_instances(uci_ctx, 'dhcp', 'dnsmasq', 'dnsmasq_instance');
+                               uci_ctx.foreach('dhcp', 'dnsmasq', function(s) {
+                                       if (sel != null && index(sel, s['.name']) < 0) return;
+                                       if (uci_bool(s.logqueries))
+                                               logging_enabled = true;
+                               });
+                               break;
+                       }
+                       case 'smartdns': {
+                               uci_ctx.load('smartdns');
+                               let sel = get_selected_instances(uci_ctx, 'smartdns', 'smartdns', 'smartdns_instance');
+                               uci_ctx.foreach('smartdns', 'smartdns', function(s) {
+                                       if (sel != null && index(sel, s['.name']) < 0) return;
+                                       let lvl = s.log_level;
+                                       if (lvl == 'info' || lvl == 'debug')
+                                               logging_enabled = true;
+                               });
+                               break;
+                       }
+                       case 'unbound':
+                               uci_ctx.load('unbound');
+                               uci_ctx.foreach('unbound', 'unbound', function(s) {
+                                       if (+s.verbosity >= 2)
+                                               logging_enabled = true;
+                               });
+                               break;
+                       }
+
+                       let result = {};
+                       result[name] = {
+                               resolver: resolver,
+                               dns: dns,
+                               logging_enabled: logging_enabled,
+                       };
+                       return result;
+               }
+       },
+       setQueryLog: {
+               args: { name: 'name', action: 'action' },
+               call: function(req) {
+                       let name = req.args?.name || packageName;
+                       let action = req.args?.action;
+                       if (action != 'enable' && action != 'disable')
+                               return { result: false };
+
+                       let uci_ctx = cursor();
+                       uci_ctx.load(packageName);
+                       let dns = uci_ctx.get(packageName, 'config', 'dns') || 'dnsmasq.servers';
+                       let resolver = split(dns, '.')[0];
+                       let enable = (action == 'enable');
+
+                       switch (resolver) {
+                       case 'dnsmasq': {
+                               uci_ctx.load('dhcp');
+                               let dsel = get_selected_instances(uci_ctx, 'dhcp', 'dnsmasq', 'dnsmasq_instance');
+                               uci_ctx.foreach('dhcp', 'dnsmasq', function(s) {
+                                       if (dsel != null && index(dsel, s['.name']) < 0) return;
+                                       let sect = s['.name'];
+                                       if (enable) {
+                                               if (!uci_bool(s.logqueries))
+                                                       uci_ctx.set('dhcp', sect, 'adbf_backup_logqueries', s.logqueries || '0');
+                                               uci_ctx.set('dhcp', sect, 'logqueries', '1');
+                                               if (s.logfacility) {
+                                                       uci_ctx.set('dhcp', sect, 'adbf_backup_logfacility', s.logfacility);
+                                                       uci_ctx.delete('dhcp', sect, 'logfacility');
+                                               }
+                                       } else {
+                                               let saved = s.adbf_backup_logqueries;
+                                               if (saved != null) {
+                                                       if (uci_bool(saved))
+                                                               uci_ctx.set('dhcp', sect, 'logqueries', saved);
+                                                       else
+                                                               uci_ctx.delete('dhcp', sect, 'logqueries');
+                                                       uci_ctx.delete('dhcp', sect, 'adbf_backup_logqueries');
+                                               } else {
+                                                       uci_ctx.delete('dhcp', sect, 'logqueries');
+                                               }
+                                               let saved_fac = s.adbf_backup_logfacility;
+                                               if (saved_fac != null) {
+                                                       uci_ctx.set('dhcp', sect, 'logfacility', saved_fac);
+                                                       uci_ctx.delete('dhcp', sect, 'adbf_backup_logfacility');
+                                               }
+                                       }
+                               });
+                               uci_ctx.commit('dhcp');
+                               system('/etc/init.d/dnsmasq restart >/dev/null 2>&1');
+                               break;
+                       }
+                       case 'smartdns': {
+                               uci_ctx.load('smartdns');
+                               let ssel = get_selected_instances(uci_ctx, 'smartdns', 'smartdns', 'smartdns_instance');
+                               uci_ctx.foreach('smartdns', 'smartdns', function(s) {
+                                       if (ssel != null && index(ssel, s['.name']) < 0) return;
+                                       let sect = s['.name'];
+                                       if (enable) {
+                                               let lvl = s.log_level;
+                                               if (lvl != 'info' && lvl != 'debug')
+                                                       uci_ctx.set('smartdns', sect, 'adbf_backup_log_level', lvl || 'error');
+                                               uci_ctx.set('smartdns', sect, 'log_level', 'info');
+                                       } else {
+                                               let saved = s.adbf_backup_log_level;
+                                               if (saved != null) {
+                                                       uci_ctx.set('smartdns', sect, 'log_level', saved);
+                                                       uci_ctx.delete('smartdns', sect, 'adbf_backup_log_level');
+                                               } else {
+                                                       uci_ctx.set('smartdns', sect, 'log_level', 'error');
+                                               }
+                                       }
+                                       return false;
+                               });
+                               uci_ctx.commit('smartdns');
+                               system('/etc/init.d/smartdns restart >/dev/null 2>&1');
+                               break;
+                       }
+                       case 'unbound':
+                               uci_ctx.load('unbound');
+                               uci_ctx.foreach('unbound', 'unbound', function(s) {
+                                       let sect = s['.name'];
+                                       if (enable) {
+                                               let verb = s.verbosity;
+                                               if (+verb < 2)
+                                                       uci_ctx.set('unbound', sect, 'adbf_backup_verbosity', verb || '1');
+                                               uci_ctx.set('unbound', sect, 'verbosity', '2');
+                                       } else {
+                                               let saved = s.adbf_backup_verbosity;
+                                               if (saved != null) {
+                                                       uci_ctx.set('unbound', sect, 'verbosity', saved);
+                                                       uci_ctx.delete('unbound', sect, 'adbf_backup_verbosity');
+                                               } else {
+                                                       uci_ctx.set('unbound', sect, 'verbosity', '1');
+                                               }
+                                       }
+                                       return false;
+                               });
+                               uci_ctx.commit('unbound');
+                               system('/etc/init.d/unbound restart >/dev/null 2>&1');
+                               break;
+                       default:
+                               return { result: false };
+                       }
+
                        return { result: true };
                }
        },
git clone https://git.99rst.org/PROJECT