luci-app-simple-adblock: convert to js 6075/head
authorStan Grishin <stangri@melmac.ca>
Fri, 4 Nov 2022 00:10:03 +0000 (00:10 +0000)
committerStan Grishin <stangri@melmac.ca>
Fri, 4 Nov 2022 19:45:42 +0000 (19:45 +0000)
Thanks @dibdot, @jow-!

Signed-off-by: Stan Grishin <stangri@melmac.ca>
Update applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js

Co-authored-by: Vasili Sviridov <vsviridov@exceede.com>
Signed-off-by: Stan Grishin <stangri@melmac.ca>
Thanks @dibdot, @jow-, @vsviridov!

* this includes changes made during review

Co-authored-by: Vasili Sviridov <vsviridov@exceede.com>
Signed-off-by: Stan Grishin <stangri@melmac.ca>
15 files changed:
applications/luci-app-simple-adblock/Makefile
applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js [new file with mode: 0644]
applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js [new file with mode: 0644]
applications/luci-app-simple-adblock/luasrc/controller/simple-adblock.lua [deleted file]
applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua [deleted file]
applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm [deleted file]
applications/luci-app-simple-adblock/luasrc/view/simple-adblock/css.htm [deleted file]
applications/luci-app-simple-adblock/luasrc/view/simple-adblock/error.htm [deleted file]
applications/luci-app-simple-adblock/luasrc/view/simple-adblock/js.htm [deleted file]
applications/luci-app-simple-adblock/luasrc/view/simple-adblock/status.htm [deleted file]
applications/luci-app-simple-adblock/po/templates/simple-adblock.pot
applications/luci-app-simple-adblock/root/etc/uci-defaults/40_luci-simple-adblock
applications/luci-app-simple-adblock/root/usr/libexec/rpcd/luci.simple-adblock [new file with mode: 0755]
applications/luci-app-simple-adblock/root/usr/share/luci/menu.d/luci-app-simple-adblock.json
applications/luci-app-simple-adblock/root/usr/share/rpcd/acl.d/luci-app-simple-adblock.json

index 93779c2fec8786b5f3b9ce91ca3d3e6706754eae..4f1309a2d02020fbf13a3eeaedd4c872c46790ee 100644 (file)
@@ -1,15 +1,15 @@
-# Copyright 2017-2018 Stan Grishin (stangri@melmac.ca)
+# Copyright 2017-2022 Stan Grishin (stangri@melmac.ca)
 # This is free software, licensed under the GNU General Public License v3.
 
 include $(TOPDIR)/rules.mk
 
 PKG_LICENSE:=GPL-3.0-or-later
 PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca>
-PKG_VERSION:=1.9.2-3
+PKG_VERSION:=1.9.2-4
 
 LUCI_TITLE:=Simple Adblock Web UI
 LUCI_DESCRIPTION:=Provides Web UI for simple-adblock service.
-LUCI_DEPENDS:=+luci-compat +luci-mod-admin-full +simple-adblock
+LUCI_DEPENDS:=+luci-mod-admin-full +simple-adblock +jsonfilter
 LUCI_PKGARCH:=all
 
 include ../../luci.mk
diff --git a/applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js b/applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js
new file mode 100644 (file)
index 0000000..bde2e34
--- /dev/null
@@ -0,0 +1,305 @@
+// Copyright 2022 Stan Grishin <stangri@melmac.ca>
+// This code wouldn't have been possible without help from [@vsviridov](https://github.com/vsviridov)
+
+"require ui";
+"require rpc";
+"require form";
+"require baseclass";
+
+var pkg = {
+       get Name() { return 'simple-adblock'; },
+       get URL() { return 'https://docs.openwrt.melmac.net/' + pkg.Name + '/'; },
+};
+
+var getInitList = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "getInitList",
+       params: ["name"],
+});
+
+var getInitStatus = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "getInitStatus",
+       params: ["name"],
+});
+
+var getPlatformSupport = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "getPlatformSupport",
+       params: ["name"],
+});
+
+var _setInitAction = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "setInitAction",
+       params: ["name", "action"],
+       expect: { result: false },
+});
+
+var RPC = {
+       listeners: [],
+       on: function on(event, callback) {
+               var pair = { event: event, callback: callback }
+               this.listeners.push(pair);
+               return function unsubscribe() {
+                       this.listeners = this.listeners.filter(function (listener) {
+                               return listener !== pair;
+                       });
+               }.bind(this);
+       },
+       emit: function emit(event, data) {
+               this.listeners.forEach(function (listener) {
+                       if (listener.event === event) {
+                               listener.callback(data);
+                       }
+               });
+       },
+       getInitList: function getInitList(name) {
+               getInitList(name).then(function (result) {
+                       this.emit('getInitList', result);
+               }.bind(this));
+       },
+       getInitStatus: function getInitStatus(name) {
+               getInitStatus(name).then(function (result) {
+                       this.emit('getInitStatus', result);
+               }.bind(this));
+       },
+       getPlatformSupport: function getPlatformSupport(name) {
+               getPlatformSupport(name).then(function (result) {
+                       this.emit('getPlatformSupport', result);
+               }.bind(this));
+       },
+       setInitAction: function setInitAction(name, action) {
+               _setInitAction(name, action).then(function (result) {
+                       this.emit('setInitAction', result);
+               }.bind(this));
+       },
+}
+
+var status = baseclass.extend({
+       render: function () {
+               return Promise.all([
+                       L.resolveDefault(getInitStatus(), {}),
+               ]).then(function (data) {
+                       var replyStatus = data[0];
+                       var text ="";
+                       var status = replyStatus[pkg.Name];
+                       var outputFile = status.outputFile;
+                       var outputCache = status.outputCache;
+                       var statusTable = {
+                         statusNoInstall: _("%s is not installed or not found").format(pkg.Name),
+                         statusStopped: _("Stopped"),
+                         statusStarting: _("Starting"),
+                         statusRestarting: _("Restarting"),
+                         statusForceReloading: _("Force Reloading"),
+                         statusDownloading: _("Downloading"),
+                         statusError: _("Error"),
+                         statusWarning: _("Warning"),
+                         statusFail: _("Fail"),
+                         statusSuccess: _("Active")
+                       };
+
+                       var header = E('h2', {}, _("Simple AdBlock - Status"))
+                       var statusTitle = E('label', { class: 'cbi-value-title' }, _("Service Status"));
+                       if (status.version) {
+                               text += _("Version: %s").format(status.version) + " - ";
+                               switch (status.status) {
+                                       case 'statusSuccess':
+                                               text += statusTable[status.status] + ".";
+                                               text += "<br />" + _("Blocking %s domains (with %s).").format(status.entries, status.dns);
+                                               if (status.outputGzipExists) {
+                                                       text += "<br />" + _("Compressed cache file created.");
+                                               }
+                                               if (status.force_dns_active) {
+                                                       text += "<br />" + _("Force DNS ports:");
+                                                       status.force_dns_ports.forEach(element => {
+                                                               text += " " + element;
+                                                       });
+                                                       text += ".";
+                                               }
+                                               break;
+                                       case 'statusStopped':
+                                               if (status.enabled) {
+                                                       text += statusTable[status.status] + ".";
+                                               }
+                                               else {
+                                                       text += statusTable[status.status] + _("disabled") + "."
+                                               }
+                                               if (status.outputCacheExists) {
+                                                       text += "<br />" + _("Cache file found.");
+                                               }
+                                               else if (status.outputGzipExists) {
+                                                       text += "<br />" + _("Compressed cache file found.");
+                                               }
+                                               break;
+                                       case 'statusRestarting':
+                                       case 'statusForceReloading':
+                                       case 'statusDownloading':
+                                               text += statusTable[status.status] + "...";
+                                               break;
+                                       default:
+                                               text += statusTable[status.status] + ".";
+                                               break;
+                               }
+                       }
+                       else {
+                               text = _("Not installed or not found");
+                       }
+                       var statusText = E('div', {}, text);
+                       var statusField = E('div', { class: 'cbi-value-field' }, statusText);
+                       var statusDiv = E('div', { class: 'cbi-value' }, [statusTitle, statusField]);
+
+                       var warningsDiv = [];
+                       if (status.warnings) {
+                               var warningsTitle = E('label', { class: 'cbi-value-title' }, _("Service Warnings"));
+                               var warningsText = E('div', {}, status.warnings);
+                               var warningsField = E('div', { class: 'cbi-value-field' }, warningsText);
+                               warningsDiv = E('div', { class: 'cbi-value' }, [warningsTitle, warningsField]);
+                       }
+
+                       var errorsDiv = [];
+                       if ((status.errors).length) {
+                               var errorTable = {
+                                       errorOutputFileCreate: _("failed to create '%s' file").format(outputFile),
+                                       errorFailDNSReload: _("failed to restart/reload DNS resolver"),
+                                       errorSharedMemory: _("failed to access shared memory"),
+                                       errorSorting: _("failed to sort data file"),
+                                       errorOptimization: _("failed to optimize data file"),
+                                       errorAllowListProcessing: _("failed to process allow-list"),
+                                       errorDataFileFormatting: _("failed to format data file"),
+                                       errorMovingDataFile: _("failed to move temporary data file to '%s'").format(outputFile),
+                                       errorCreatingCompressedCache: _("failed to create compressed cache"),
+                                       errorRemovingTempFiles: _("failed to remove temporary files"),
+                                       errorRestoreCompressedCache: _("failed to unpack compressed cache"),
+                                       errorRestoreCache: _("failed to move '%s' to '%s'").format(outputCache, outputFile),
+                                       errorOhSnap: _("failed to create block-list or restart DNS resolver"),
+                                       errorStopping: _("failed to stop %s").format(pkg.Name),
+                                       errorDNSReload: _("failed to reload/restart DNS resolver"),
+                                       errorDownloadingConfigUpdate: _("failed to download Config Update file"),
+                                       errorDownloadingList: _("failed to download"),
+                                       errorParsingConfigUpdate: _("failed to parse Config Update file"),
+                                       errorParsingList: _("failed to parse"),
+                                       errorNoSSLSupport: _("no HTTPS/SSL support on device"),
+                                       errorCreatingDirectory: _("failed to create output/cache/gzip file directory")
+                               }
+                               var errorsTitle = E('label', { class: 'cbi-value-title' }, _("Service Errors"));
+                               var text = "";
+                               (status.errors).forEach(element => {
+                                       text += errorTable[element] + ".<br />";
+                               });
+                               var errorsText = E('div', {}, text);
+                               var errorsField = E('div', { class: 'cbi-value-field' }, errorsText);
+                               errorsDiv = E('div', { class: 'cbi-value' }, [errorsTitle, errorsField]);
+                       }
+
+                       var btn_gap = E('span', {}, '&#160;&#160;');
+                       var btn_gap_long = E('span', {}, '&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;');
+
+                       var btn_start = E('button', {
+                               'class': 'btn cbi-button cbi-button-apply',
+                               disabled: true,
+                               click: function (ev) {
+                                       ui.showModal(null, [
+                                               E('p', { 'class': 'spinning' }, _('Starting %s service').format(pkg.Name))
+                                       ]);
+                                       return RPC.setInitAction(pkg.Name, 'start');
+                               }
+                       }, _('Start'));
+
+                       var btn_action = E('button', {
+                               'class': 'btn cbi-button cbi-button-apply',
+                               disabled: true,
+                               click: function (ev) {
+                                       ui.showModal(null, [
+                                               E('p', { 'class': 'spinning' }, _('Force re-downloading %s block lists').format(pkg.Name))
+                                       ]);
+                                       return RPC.setInitAction(pkg.Name, 'dl');
+                               }
+                       }, _('Force Re-Download'));
+
+                       var btn_stop = E('button', {
+                               'class': 'btn cbi-button cbi-button-reset',
+                               disabled: true,
+                               click: function (ev) {
+                                       ui.showModal(null, [
+                                               E('p', { 'class': 'spinning' }, _('Stopping %s service').format(pkg.Name))
+                                       ]);
+                                       return RPC.setInitAction(pkg.Name, 'stop');
+                               }
+                       }, _('Stop'));
+
+                       var btn_enable = E('button', {
+                               'class': 'btn cbi-button cbi-button-apply',
+                               disabled: true,
+                               click: function (ev) {
+                                       ui.showModal(null, [
+                                               E('p', { 'class': 'spinning' }, _('Enabling %s service').format(pkg.Name))
+                                       ]);
+                                       return RPC.setInitAction(pkg.Name, 'enable');
+                               }
+                       }, _('Enable'));
+
+                       var btn_disable = E('button', {
+                               'class': 'btn cbi-button cbi-button-reset',
+                               disabled: true,
+                               click: function (ev) {
+                                       ui.showModal(null, [
+                                               E('p', { 'class': 'spinning' }, _('Disabling %s service').format(pkg.Name))
+                                       ]);
+                                       return RPC.setInitAction(pkg.Name, 'disable');
+                               }
+                       }, _('Disable'));
+
+                       if (status.enabled) {
+                               btn_enable.disabled = true;
+                               btn_disable.disabled = false;
+                               switch (status.status) {
+                                       case 'statusSuccess':
+                                               btn_start.disabled = true;
+                                               btn_action.disabled = false;
+                                               btn_stop.disabled = false;
+                                               break;
+                                       case 'statusStopped':
+                                               btn_start.disabled = false;
+                                               btn_action.disabled = true;
+                                               btn_stop.disabled = true;
+                                               break;
+                                       default:
+                                               btn_start.disabled = true;
+                                               btn_action.disabled = true;
+                                               btn_stop.disabled = true;
+                                               btn_enable.disabled = true;
+                                               btn_disable.disabled = true;
+                                       break;
+                               }
+                       }
+                       else {
+                               btn_start.disabled = true;
+                               btn_action.disabled = true;
+                               btn_stop.disabled = true;
+                               btn_enable.disabled = false;
+                               btn_disable.disabled = true;
+                       }
+
+                       var buttonsDiv = [];
+                       var buttonsTitle = E('label', { class: 'cbi-value-title' }, _("Service Control"))
+                       var buttonsText = E('div', {}, [btn_start, btn_gap, btn_action, btn_gap, btn_stop, btn_gap_long, btn_enable, btn_gap, btn_disable]);
+                       var buttonsField = E('div', { class: 'cbi-value-field' }, buttonsText);
+                       if (status.version) {
+                               buttonsDiv = E('div', { class: 'cbi-value' }, [buttonsTitle, buttonsField]);
+                       }
+
+                       return E('div', {}, [header, statusDiv, warningsDiv, errorsDiv, buttonsDiv]);
+               });
+       },
+});
+
+RPC.on('setInitAction', function (reply) {
+       ui.hideModal();
+       location.reload();
+});
+
+return L.Class.extend({
+       status: status,
+       getPlatformSupport: getPlatformSupport
+});
diff --git a/applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js b/applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js
new file mode 100644 (file)
index 0000000..e933465
--- /dev/null
@@ -0,0 +1,161 @@
+// Copyright 2022 Stan Grishin <stangri@melmac.ca>
+// This code wouldn't have been possible without help from [@vsviridov](https://github.com/vsviridov)
+
+'use strict';
+'require form';
+'require uci';
+'require view';
+'require simple-adblock.status as adb';
+
+var pkg = {
+       get Name() { return 'simple-adblock'; },
+       get URL() { return 'https://docs.openwrt.melmac.net/' + pkg.Name + '/'; }
+};
+
+return view.extend({
+       load: function () {
+               return Promise.all([
+                       uci.load(pkg.Name)
+               ]);
+       },
+
+       render: function () {
+               return Promise.all([
+                       L.resolveDefault(adb.getPlatformSupport(), {}),
+               ]).then(function (data) {
+                       var replyPlatform = data[0];
+                       var status, m, s, o;
+
+                       status = new adb.status();
+                       m = new form.Map(pkg.Name, _("Simple AdBlock - Configuration"));
+                       s = m.section(form.NamedSection, 'config', pkg.Name);
+                       s.tab("tab_basic", _("Basic Configuration"));
+                       s.tab("tab_advanced", _("Advanced Configuration"));
+
+                       o = s.taboption("tab_basic", form.ListValue, "config_update_enabled", _("Automatic Config Update"),
+                       _("Perform config update before downloading the block/allow-lists."));
+                       o.value("0", _("Disable"));
+                       o.value("1", _("Enable"));
+                       o.default = ("0", _("Disable"));
+
+                       o = s.taboption("tab_basic", form.ListValue, "verbosity", _("Output Verbosity Setting"),
+                       _("Controls system log and console output verbosity."));
+                       o.value("0", _("Suppress output"));
+                       o.value("1", _("Some output"));
+                       o.value("2", _("Verbose output"));
+                       o.default = ("2", _("Verbose output"));
+
+                       o = s.taboption("tab_basic", form.ListValue, "force_dns", _("Force Router DNS"),
+                       _("Forces Router DNS use on local devices, also known as DNS Hijacking."));
+                       o.value("0", _("Let local devices use their own DNS servers if set"));
+                       o.value("1", _("Force Router DNS server to all local devices"));
+                       o.default = ("1", _("Force Router DNS server to all local devices"));
+
+
+                       if ((replyPlatform[pkg.Name].leds).length) {
+                               o = s.taboption("tab_basic", form.ListValue, "led", _("LED to indicate status"),
+                                       _("Pick the LED not already used in %sSystem LED Configuration%s.").format("<a href=\"" +
+                                               L.url("admin", "system", "leds") + "\">", "</a>"));
+                               o.value("", _("none"));
+                               (replyPlatform[pkg.Name].leds).forEach(element => {
+                                       o.value(element);
+                               });
+                               o.rmempty = false;
+                       }
+                       var text = _("DNS resolution option, see the %sREADME%s for details.")
+                       .format("<a href=\"" + pkg.URL + "#dns-resolution-option\" target=\"_blank\">", "</a>");
+                       if (!(replyPlatform[pkg.Name].dnsmasq_installed)) {
+                               text += "<br />" + _("Please note that %s is not supported on this system.").format("<i>dnsmasq.addnhosts</i>");
+                               text += "<br />" + _("Please note that %s is not supported on this system.").format("<i>dnsmasq.conf</i>");
+                               text += "<br />" + _("Please note that %s is not supported on this system.").format("<i>dnsmasq.ipset</i>");
+                               text += "<br />" + _("Please note that %s is not supported on this system.").format("<i>dnsmasq.servers</i>");
+                       }
+                       else {
+                               if (!(replyPlatform[pkg.Name].dnsmasq_ipset_support)) {
+                                       text += _("Please note that %s is not supported on this system.").format("<i>dnsmasq.ipset</i>") + "<br />";
+                               }
+                               if (!(replyPlatform[pkg.Name].dnsmasq_nftset_support)) {
+                                       text += _("Please note that %s is not supported on this system.").format("<i>dnsmasq.nftset</i>") + "<br />";
+                               }
+                       }
+                       if (!(replyPlatform[pkg.Name].unbound_installed)) {
+                               text = text + "<br />" + _("Please note that %s is not supported on this system.")
+                               .format("<i>unbound.adb_list</i>");
+                       }
+
+                       o = s.taboption("tab_advanced", form.ListValue, "dns", _("DNS Service"), text);
+                       if (replyPlatform[pkg.Name].dnsmasq_installed) {
+                               o.value("dnsmasq.addnhosts", _("dnsmasq additional hosts"));
+                               o.value("dnsmasq.conf", _("dnsmasq config"));
+                               if (replyPlatform[pkg.Name].dnsmasq_ipset_support) {
+                                       o.value("dnsmasq.ipset", _("dnsmasq ipset"));
+                               }
+                               if (replyPlatform[pkg.Name].dnsmasq_nftset_support) {
+                                       o.value("dnsmasq.nftset", _("dnsmasq nft set"));
+                               }
+                               o.value("dnsmasq.servers", _("dnsmasq servers file"));
+                       }
+                       if (replyPlatform[pkg.Name].unbound_installed) {
+                               o.value("unbound.adb_list", _("unbound adblock list"));
+                       }
+                       o.default = ("dnsmasq.servers", _("dnsmasq servers file"));
+
+                       o = s.taboption("tab_advanced", form.ListValue, "ipv6_enabled", _("IPv6 Support"),
+                                _("Add IPv6 entries to block-list."));
+                       o.value("", _("Do not add IPv6 entries"));
+                       o.value("1", _("Add IPv6 entries"));
+                       o.depends('dns', 'dnsmasq.addnhosts');
+                       o.depends('dns', 'dnsmasq.nftset');
+                       o.default = ("", _("Do not add IPv6 entries"));
+                       o.rmempty = true;
+
+                       o = s.taboption("tab_advanced", form.Value, "download_timeout", _("Download time-out (in seconds)"),
+                               _("Stop the download if it is stalled for set number of seconds."));
+                       o.default = "10";
+                       o.datatype = "range(1,60)";
+
+                       o = s.taboption("tab_advanced", form.Value, "curl_retry", _("Curl download retry"),
+                               _("If curl is installed and detected, it would retry download this many times on timeout/fail."));
+                       o.default = "3";
+                       o.datatype = "range(0,30)";
+
+                       o = s.taboption("tab_advanced", form.ListValue, "parallel_downloads", _("Simultaneous processing"),
+                               _("Launch all lists downloads and processing simultaneously, reducing service start time."));
+                       o.value("0", _("Do not use simultaneous processing"));
+                       o.value("1", _("Use simultaneous processing"));
+                       o.default = ("1", _("Use simultaneous processing"));
+
+                       o = s.taboption("tab_advanced", form.ListValue, "compressed_cache", _("Store compressed cache file on router"),
+                               _("Attempt to create a compressed cache of block-list in the persistent memory."));
+                       o.value("0", _("Do not store compressed cache"));
+                       o.value("1", _("Store compressed cache"));
+                       o.default = ("0", _("Do not store compressed cache"));
+
+                       o = s.taboption("tab_advanced", form.ListValue, "debug", _("Enable Debugging"),
+                               _("Enables debug output to /tmp/simple-adblock.log."));
+                       o.value("0", _("Disable Debugging"));
+                       o.value("1", _("Enable Debugging"));
+                       o.default = ("0", _("Disable Debugging"));
+
+                       s = m.section(form.NamedSection, "config", "simple-adblock", 
+                               _("Allowed and Blocked Lists Management"));
+                       o = s.option(form.DynamicList, "allowed_domain", _("Allowed Domains"),
+                               _("Individual domains to be allowed."));
+                       o.addremove = false;
+                       o = s.option(form.DynamicList, "allowed_domains_url", _("Allowed Domain URLs"),
+                               _("URLs to lists of domains to be allowed."));
+                       o.addremove = false;
+                       o = s.option(form.DynamicList, "blocked_domain", _("Blocked Domains"),
+                               _("Individual domains to be blocked."));
+                       o.addremove = false;
+                       o = s.option(form.DynamicList, "blocked_domains_url", _("Blocked Domain URLs"),
+                               _("URLs to lists of domains to be blocked."));
+                       o.addremove = false;
+                       o = s.option(form.DynamicList, "blocked_hosts_url", _("Blocked Hosts URLs"),
+                               _("URLs to lists of hosts to be blocked."));
+                       o.addremove = false;
+
+                       return Promise.all([status.render(), m.render()]);
+               })
+       }
+});
diff --git a/applications/luci-app-simple-adblock/luasrc/controller/simple-adblock.lua b/applications/luci-app-simple-adblock/luasrc/controller/simple-adblock.lua
deleted file mode 100644 (file)
index 1c56502..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-module("luci.controller.simple-adblock", package.seeall)
-function index()
-       if nixio.fs.access("/etc/config/simple-adblock") then
-               entry({"admin", "services", "simple-adblock"}, cbi("simple-adblock"), _("Simple AdBlock")).acl_depends = { "luci-app-simple-adblock" }
-               entry({"admin", "services", "simple-adblock", "action"}, call("simple_adblock_action"), nil).leaf = true
-       end
-end
-
-function simple_adblock_action(name)
-       local packageName = "simple-adblock"
-       local http = require "luci.http"
-       local sys = require "luci.sys"
-       local uci = require "luci.model.uci".cursor()
-       local util = require "luci.util"
-       if name == "start" then
-               sys.init.start(packageName)
-       elseif name == "action" then
-               util.exec("/etc/init.d/" .. packageName .. " dl >/dev/null 2>&1")
-       elseif name == "stop" then
-               sys.init.stop(packageName)
-       elseif name == "enable" then
-               uci:set(packageName, "config", "enabled", "1")
-               uci:commit(packageName)
-       elseif name == "disable" then
-               uci:set(packageName, "config", "enabled", "0")
-               uci:commit(packageName)
-       end
-       http.prepare_content("text/plain")
-       http.write("0")
-end
diff --git a/applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua b/applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua
deleted file mode 100644 (file)
index ec04742..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
--- Copyright 2016-2018 Stan Grishin <stangri@melmac.ca>
--- Licensed to the public under the Apache License 2.0.
-
-local packageName = "simple-adblock"
-local readmeURL = "https://docs.openwrt.melmac.net/" .. packageName .. "/"
-local uci = require "luci.model.uci".cursor()
-local util = require "luci.util"
-local sys = require "luci.sys"
-local jsonc = require "luci.jsonc"
-local fs = require "nixio.fs"
-local nutil = require "nixio.util"
-local http = require "luci.http"
-local dispatcher = require "luci.dispatcher"
-
-local jsonStatusFile = "/var/run/" .. packageName .. "/" .. packageName .. ".json"
-
-function getPackageVersion()
-       local opkgFile = "/usr/lib/opkg/status"
-       local line
-       local flag = false
-       for line in io.lines(opkgFile) do
-               if flag then
-                       return line:match('[%d%.$-]+') or ""
-               elseif line:find("Package: " .. packageName:gsub("%-", "%%%-")) then
-                       flag = true
-               end
-       end
-       return ""
-end
-
-function getFileLines(file)
-       local f = io.open(file)
-       if f then
-               local t = f:read("*a")
-               local _,n = t:gsub("\n","")
-               f:close()
-               return n
-       else 
-               return "0"
-       end
-end
-
-function checkDnsmasq() return fs.access("/usr/sbin/dnsmasq") end
-function checkUnbound() return fs.access("/usr/sbin/unbound") end
-
-function checkIpset() 
-       if fs.access("/usr/sbin/ipset") and sys.call("/usr/sbin/ipset help hash:net >/dev/null 2>&1") == 0 then
-               return true
-       else
-               return false
-       end
-end
-
-function checkNftset() 
-       if sys.call("command -v nft >/dev/null 2>&1") == 0 then
-               return true
-       else
-               return false
-       end
-end
-
-function checkDnsmasqIpset()
-       if checkDnsmasq() then
-               local o = util.trim(util.exec("/usr/sbin/dnsmasq -v 2>/dev/null"))
-               if not o:match("no%-ipset") and o:match("ipset") and checkIpset() then
-                       return true
-               else
-                       return false
-               end
-       else
-               return false
-       end
-end
-
-function checkDnsmasqNftset()
-       if checkDnsmasq() then
-               local o = util.trim(util.exec("/usr/sbin/dnsmasq -v 2>/dev/null"))
-               if not o:match("no%-nftset") and o:match("nftset") and checkNftset() then
-                       return true
-               else
-                       return false
-               end
-       else
-               return false
-       end
-end
-
-local enabledFlag = uci:get(packageName, "config", "enabled")
-local command, outputFile, outputCache, outputGzip
-local targetDNS = uci:get(packageName, "config", "dns")
-
-if not targetDNS or targetDNS == "" then
-       targetDNS = "dnsmasq.servers"
-end
-
-if targetDNS ~= "dnsmasq.addnhosts" and targetDNS ~= "dnsmasq.conf" and 
-        targetDNS ~= "dnsmasq.ipset" and targetDNS ~= "dnsmasq.nftset" and 
-        targetDNS ~= "dnsmasq.servers" and targetDNS ~= "unbound.adb_list" then
-       targetDNS = "dnsmasq.servers"
-end
-
-if targetDNS == "dnsmasq.addnhosts" then
-       outputFile="/var/run/" .. packageName .. "/dnsmasq.addnhosts"
-       outputCache="/var/run/" .. packageName .. "/dnsmasq.addnhosts.cache"
-       outputGzip="/etc/" .. packageName .. ".dnsmasq.addnhosts.gz"
-elseif targetDNS == "dnsmasq.conf" then
-       outputFile="/tmp/dnsmasq.d/" .. packageName
-       outputCache="/var/run/" .. packageName .. "/dnsmasq.conf.cache"
-       outputGzip="/etc/" .. packageName .. ".dnsmasq.conf.gz"
-elseif targetDNS == "dnsmasq.ipset" then
-       outputFile="/tmp/dnsmasq.d/" .. packageName .. ".ipset"
-       outputCache="/var/run/" .. packageName .. "/dnsmasq.ipset.cache"
-       outputGzip="/etc/" .. packageName .. ".dnsmasq.ipset.gz"
-elseif targetDNS == "dnsmasq.nftset" then
-       outputFile="/tmp/dnsmasq.d/" .. packageName .. ".nftset"
-       outputCache="/var/run/" .. packageName .. "/dnsmasq.nftset.cache"
-       outputGzip="/etc/" .. packageName .. ".dnsmasq.nftset.gz"
-elseif targetDNS == "dnsmasq.servers" then
-       outputFile="/var/run/" .. packageName .. "/dnsmasq.servers"
-       outputCache="/var/run/" .. packageName .. "/dnsmasq.servers.cache"
-       outputGzip="/etc/" .. packageName .. ".dnsmasq.servers.gz"
-elseif targetDNS == "unbound.adb_list" then
-       outputFile="/var/lib/unbound/adb_list." .. packageName
-       outputCache="/var/run/" .. packageName .. "/unbound.cache"
-       outputGzip="/etc/" .. packageName .. ".unbound.gz"
-end
-
-local packageVersion = getPackageVersion()
-local tmpfs, tmpfsMessage, tmpfsError, tmpfsStats, tmpfsStatus
-
-if packageVersion == "" then
-       tmpfsStatus = "statusNoInstall"
-else
-       tmpfsStatus = "statusStopped"
-end
-
-if fs.access(jsonStatusFile) then
-       local f = io.open(jsonStatusFile)
-       local s = f:read("*a")
-       f:close()
-       tmpfs = jsonc.parse(s)
-end
-
-if tmpfs and tmpfs['data'] then
-       if tmpfs['data']['status'] and tmpfs['data']['status'] ~= "" then
-               tmpfsStatus = tmpfs['data']['status']
-       end
-       if tmpfs['data']['message'] and tmpfs['data']['message'] ~= "" then
-               tmpfsMessage = tmpfs['data']['message']
-       end
-       if tmpfs['data']['error'] and tmpfs['data']['error'] ~= "" then
-               tmpfsError = tmpfs['data']['error']
-       end
-       if tmpfs['data']['stats'] and tmpfs['data']['stats'] ~= "" then
-               tmpfsStats = tmpfs['data']['stats']
-       end
-end
-
-local statusTable = {}
-local errorTable = {}
-statusTable["statusNoInstall"] = translatef("%s is not installed or not found", packageName)
-statusTable["statusStopped"] = translate("Stopped")
-statusTable["statusStarting"] = translate("Starting")
-statusTable["statusRestarting"] = translate("Restarting")
-statusTable["statusForceReloading"] = translate("Force Reloading")
-statusTable["statusDownloading"] = translate("Downloading")
-statusTable["statusError"] = translate("Error")
-statusTable["statusWarning"] = translate("Warning")
-statusTable["statusFail"] = translate("Fail")
-statusTable["statusSuccess"] = translate("Success")
-errorTable["errorOutputFileCreate"] = translatef("failed to create '%s' file", outputFile)
-errorTable["errorFailDNSReload"] = translate("failed to restart/reload DNS resolver")
-errorTable["errorSharedMemory"] = translate("failed to access shared memory")
-errorTable["errorSorting"] = translate("failed to sort data file")
-errorTable["errorOptimization"] = translate("failed to optimize data file")
-errorTable["errorAllowListProcessing"] = translate("failed to process allow-list")
-errorTable["errorDataFileFormatting"] = translate("failed to format data file")
-errorTable["errorMovingDataFile"] = translatef("failed to move temporary data file to '%s'", outputFile)
-errorTable["errorCreatingCompressedCache"] = translate("failed to create compressed cache")
-errorTable["errorRemovingTempFiles"] = translate("failed to remove temporary files")
-errorTable["errorRestoreCompressedCache"] = translate("failed to unpack compressed cache")
-errorTable["errorRestoreCache"] = translatef("failed to move '%s' to '%s'", outputCache, outputFile)
-errorTable["errorOhSnap"] = translate("failed to create block-list or restart DNS resolver")
-errorTable["errorStopping"] = translatef("failed to stop %s", packageName)
-errorTable["errorDNSReload"] = translate("failed to reload/restart DNS resolver")
-errorTable["errorDownloadingConfigUpdate"] = translate("failed to download Config Update file")
-errorTable["errorDownloadingList"] = translate("failed to download")
-errorTable["errorParsingConfigUpdate"] = translate("failed to parse Config Update file")
-errorTable["errorParsingList"] = translate("failed to parse")
-errorTable["errorNoSSLSupport"] = translate("no HTTPS/SSL support on device")
-errorTable["errorCreatingDirectory"] = translate("failed to create output/cache/gzip file directory")
-
-m = Map("simple-adblock", translate("Simple AdBlock Settings"))
-m.apply_on_parse = true
-m.on_after_apply = function(self)
-       sys.call("/etc/init.d/simple-adblock restart")
-end
-
-h = m:section(NamedSection, "config", "simple-adblock", translatef("Service Status [%s %s]", packageName, packageVersion))
-
-if tmpfsStatus == "statusStarting" or
-        tmpfsStatus == "statusRestarting" or
-        tmpfsStatus == "statusForceReloading" or
-        tmpfsStatus == "statusDownloading" then
-       ss = h:option(DummyValue, "_dummy", translate("Service Status"))
-       ss.template = "simple-adblock/status"
-       ss.value = statusTable[tmpfsStatus] .. '...'
-       if tmpfsMessage then
-               sm = h:option(DummyValue, "_dummy", translate("Task"))
-               sm.template = "simple-adblock/status"
-               sm.value = tmpfsMessage
-       end
-else
-       if tmpfsStatus == "statusStopped" then
-               ss = h:option(DummyValue, "_dummy", translate("Service Status"))
-               ss.template = "simple-adblock/status"
-               ss.value = statusTable[tmpfsStatus]
-               if fs.access(outputCache) then
-                       sm = h:option(DummyValue, "_dummy", translate("Info"))
-                       sm.template = "simple-adblock/status"
-                       sm.value = translatef("Cache file containing %s domains found.", getFileLines(outputCache))
-               elseif fs.access(outputGzip) then
-                       sm = h:option(DummyValue, "_dummy", translate("Info"))
-                       sm.template = "simple-adblock/status"
-                       sm.value = translate("Compressed cache file found.")
-               end
-       else
-               ss = h:option(DummyValue, "_dummy", translate("Service Status"))
-               ss.template = "simple-adblock/status"
-               if tmpfsStatus == "statusSuccess" then
-                       ss.value = translatef("Blocking %s domains (with %s).", getFileLines(outputFile), targetDNS)
-               else
-                       ss.value = statusTable[tmpfsStatus]
-               end
-               if tmpfsMessage then
-                       ms = h:option(DummyValue, "_dummy", translate("Message"))
-                       ms.template = "simple-adblock/status"
-                       ms.value = tmpfsMessage
-               end
-               if tmpfsError then
-                       es = h:option(DummyValue, "_dummy", translate("Collected Errors"))
-                       es.template = "simple-adblock/status"
-                       es.value = ""
-                       local err, e, url
-                       for err in tmpfsError:gmatch("[%p%w]+") do
-                               if err:match("|") then
-                                       e,url = err:match("(.+)|(.+)")
-                                       es.value = translatef("%s Error: %s %s", es.value, errorTable[e], url) .. ".\n"
-                               else
-                                       es.value = translatef("%s Error: %s", es.value, errorTable[err]) .. ".\n"
-                               end
-                       end
-               end
-       end
-       if packageVersion ~= "" then
-               buttons = h:option(DummyValue, "_dummy", translate("Service Control"))
-               buttons.template = packageName .. "/buttons"
-       end
-end
-
-s = m:section(NamedSection, "config", "simple-adblock", translate("Configuration"))
--- General options
-s:tab("basic", translate("Basic Configuration"))
-
-o1 = s:taboption("basic", ListValue, "config_update_enabled", translate("Automatic Config Update"), translate("Perform config update before downloading the block/allow-lists."))
-o1:value("0", translate("Disable"))
-o1:value("1", translate("Enable"))
-o1.default = "0"
-
-o2 = s:taboption("basic", ListValue, "verbosity", translate("Output Verbosity Setting"), translate("Controls system log and console output verbosity."))
-o2:value("0", translate("Suppress output"))
-o2:value("1", translate("Some output"))
-o2:value("2", translate("Verbose output"))
-o2.default = "2"
-
-o3 = s:taboption("basic", ListValue, "force_dns", translate("Force Router DNS"), translate("Forces Router DNS use on local devices, also known as DNS Hijacking."))
-o3:value("0", translate("Let local devices use their own DNS servers if set"))
-o3:value("1", translate("Force Router DNS server to all local devices"))
-o3.default = "1"
-
-local sysfs_path = "/sys/class/leds/"
-local leds = {}
-if fs.access(sysfs_path) then
-       leds = nutil.consume((fs.dir(sysfs_path)))
-end
-if #leds ~= 0 then
-       o4 = s:taboption("basic", Value, "led", translate("LED to indicate status"),
-               translatef("Pick the LED not already used in %sSystem LED Configuration%s.", "<a href=\"" .. dispatcher.build_url("admin", "system", "leds") .. "\">", "</a>"))
-       o4.rmempty = false
-       o4:value("", translate("none"))
-       for k, v in ipairs(leds) do
-               o4:value(v)
-       end
-end
-
-s:tab("advanced", translate("Advanced Configuration"))
-
-local dns_descr = translatef("Pick the DNS resolution option to create the adblock list for, see the %sREADME%s for details.", "<a href=\"" .. readmeURL .. "#dns-resolution-option\" target=\"_blank\">", "</a>")
-
-if not checkDnsmasq() then
-       dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>dnsmasq.addnhosts</i>")
-       dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>dnsmasq.conf</i>")
-       dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>dnsmasq.ipset</i>")
-       dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>dnsmasq.servers</i>")
-else
-       if not checkDnsmasqIpset() then 
-               dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>dnsmasq.ipset</i>")
-       end
-       if not checkDnsmasqNftset() then 
-               dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>dnsmasq.nftset</i>")
-       end
-end
-if not checkUnbound() then 
-       dns_descr = dns_descr .. "<br />" .. translatef("Please note that %s is not supported on this system.", "<i>unbound.adb_list</i>")
-end
-
-dns = s:taboption("advanced", ListValue, "dns", translate("DNS Service"), dns_descr)
-if checkDnsmasq() then
-       dns:value("dnsmasq.addnhosts", translate("DNSMASQ Additional Hosts"))
-       dns:value("dnsmasq.conf", translate("DNSMASQ Config"))
-       if checkDnsmasqIpset() then
-               dns:value("dnsmasq.ipset", translate("DNSMASQ Ipset"))
-       end
-       if checkDnsmasqNftset() then
-               dns:value("dnsmasq.nftset", translate("DNSMASQ Nft Set"))
-       end
-       dns:value("dnsmasq.servers", translate("DNSMASQ Servers File"))
-end
-if checkUnbound() then
-       dns:value("unbound.adb_list", translate("Unbound AdBlock List"))
-end
-dns.default = "dnsmasq.servers"
-
-ipv6 = s:taboption("advanced", ListValue, "ipv6_enabled", translate("IPv6 Support"), translate("Add IPv6 entries to block-list."))
-ipv6:value("", translate("Do not add IPv6 entries"))
-ipv6:value("1", translate("Add IPv6 entries"))
-ipv6:depends({dns="dnsmasq.addnhosts"}) 
-ipv6.default = ""
-ipv6.rmempty = true
-
-o5 = s:taboption("advanced", Value, "boot_delay", translate("Delay (in seconds) for on-boot start"), translate("Run service after set delay on boot."))
-o5.default = 120
-o5.datatype = "range(1,600)"
-
-o6 = s:taboption("advanced", Value, "download_timeout", translate("Download time-out (in seconds)"), translate("Stop the download if it is stalled for set number of seconds."))
-o6.default = 10
-o6.datatype = "range(1,60)"
-
-o7 = s:taboption("advanced", Value, "curl_retry", translate("Curl download retry"), translate("If curl is installed and detected, it would retry download this many times on timeout/fail."))
-o7.default = 3
-o7.datatype = "range(0,30)"
-
-o8 = s:taboption("advanced", ListValue, "parallel_downloads", translate("Simultaneous processing"), translate("Launch all lists downloads and processing simultaneously, reducing service start time."))
-o8:value("0", translate("Do not use simultaneous processing"))
-o8:value("1", translate("Use simultaneous processing"))
-o8.default = "1"
-
-o10 = s:taboption("advanced", ListValue, "compressed_cache", translate("Store compressed cache file on router"), translate("Attempt to create a compressed cache of block-list in the persistent memory."))
-o10:value("0", translate("Do not store compressed cache"))
-o10:value("1", translate("Store compressed cache"))
-o10.default = "0"
-
-o11 = s:taboption("advanced", ListValue, "debug", translate("Enable Debugging"), translate("Enables debug output to /tmp/simple-adblock.log."))
-o11:value("0", translate("Disable Debugging"))
-o11:value("1", translate("Enable Debugging"))
-o11.default = "0"
-
-
-s2 = m:section(NamedSection, "config", "simple-adblock", translate("Allowed and Blocked Lists Management"))
--- Allowed Domains
-d1 = s2:option(DynamicList, "allowed_domain", translate("Allowed Domains"), translate("Individual domains to be allowed."))
-d1.addremove = false
-
--- Allowed Domains URLs
-d2 = s2:option(DynamicList, "allowed_domains_url", translate("Allowed Domain URLs"), translate("URLs to lists of domains to be allowed."))
-d2.addremove = false
-
--- Blocked Domains
-d3 = s2:option(DynamicList, "blocked_domain", translate("Blocked Domains"), translate("Individual domains to be blocked."))
-d3.addremove = false
-
--- Blocked Domains URLs
-d4 = s2:option(DynamicList, "blocked_domains_url", translate("Blocked Domain URLs"), translate("URLs to lists of domains to be blocked."))
-d4.addremove = false
-
--- Blocked Hosts URLs
-d5 = s2:option(DynamicList, "blocked_hosts_url", translate("Blocked Hosts URLs"), translate("URLs to lists of hosts to be blocked."))
-d5.addremove = false
-
-return m
diff --git a/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm b/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm
deleted file mode 100644 (file)
index c8d4e5e..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<%# Copyright 2020 Stan Grishin <stangri@melmac.ca> -%>
-
-<%+simple-adblock/css%>
-<%+simple-adblock/js%>
-
-<%-
-       local packageName = "simple-adblock"
-       local serviceRunning, serviceEnabled = false, false;
-       local tmpfs, tmpfsStatus;
-       local jsonStatusFile = "/var/run/" .. packageName .. "/" .. packageName .. ".json"
-       if nixio.fs.access(jsonStatusFile) then
-               tmpfs = luci.jsonc.parse(luci.util.trim(luci.sys.exec("cat " .. jsonStatusFile)))
-               if tmpfs and tmpfs['data'] and tmpfs['data']['status'] then
-                       tmpfsStatus = tmpfs['data']['status']
-               end
-       end
-       if tmpfsStatus == "statusStarting" or tmpfsStatus == "statusRestarting" or 
-                       tmpfsStatus == "statusForceReloading" or tmpfsStatus == "statusDownloading" or 
-                       tmpfsStatus == "statusError" or tmpfsStatus == "statusWarning"
-                       or tmpfsStatus == "statusSuccess" then
-               serviceRunning = true
-       end
-
-       if luci.model.uci.cursor():get(packageName, "config", "enabled") == "1" then
-               serviceEnabled = true
-       end
-
-       if serviceEnabled then
-               btn_start_status = true
-               btn_action_status = true
-               btn_stop_status = true
-               btn_enable_status = false
-               btn_disable_status = true
-       else
-               btn_start_status = false
-               btn_action_status = false
-               btn_stop_status = false
-               btn_enable_status = true
-               btn_disable_status = false
-       end
-       if serviceRunning then
-               btn_start_status = false
-               btn_action_status = true
-               btn_stop_status = true
-       else
-               btn_action_status = false
-               btn_stop_status = false
-       end
--%>
-
-<%+cbi/valueheader%>
-       <input type="button" class="btn cbi-button cbi-button-apply" id="btn_start" name="start" value="<%:Start%>"
-               onclick="button_action(this)" />
-       <span id="btn_start_spinner" class="btn_spinner"></span>
-       <input type="button" class="btn cbi-button cbi-button-apply" id="btn_action" name="action" value="<%:Force Re-Download%>"
-               onclick="button_action(this)" />
-       <span id="btn_action_spinner" class="btn_spinner"></span>
-       <input type="button" class="btn cbi-button cbi-button-reset" id="btn_stop" name="stop" value="<%:Stop%>"
-               onclick="button_action(this)" />
-       <span id="btn_stop_spinner" class="btn_spinner"></span>
-       &#160;
-       &#160;
-       &#160;
-       &#160;
-       <input type="button" class="btn cbi-button cbi-button-apply" id="btn_enable" name="enable" value="<%:Enable%>"
-               onclick="button_action(this)" />
-       <span id="btn_enable_spinner" class="btn_spinner"></span>
-       <input type="button" class="btn cbi-button cbi-button-reset" id="btn_disable" name="disable" value="<%:Disable%>"
-               onclick="button_action(this)" />
-       <span id="btn_disable_spinner" class="btn_spinner"></span>
-<%+cbi/valuefooter%>
-
-<%-if not btn_start_status then%>
-<script type="text/javascript">document.getElementById("btn_start").disabled = true;</script>
-<%-end%>
-<%-if not btn_action_status then%>
-<script type="text/javascript">document.getElementById("btn_action").disabled = true;</script>
-<%-end%>
-<%-if not btn_stop_status then%>
-<script type="text/javascript">document.getElementById("btn_stop").disabled = true;</script>
-<%-end%>
-<%-if not btn_enable_status then%>
-<script type="text/javascript">document.getElementById("btn_enable").disabled = true;</script>
-<%-end%>
-<%-if not btn_disable_status then%>
-<script type="text/javascript">document.getElementById("btn_disable").disabled = true;</script>
-<%-end%>
diff --git a/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/css.htm b/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/css.htm
deleted file mode 100644 (file)
index 6fb3d51..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<style type="text/css">
-       .btn_spinner
-       {
-               display: inline-block;
-               width: 0px;
-               height: 16px;
-               margin: 0 0px;
-       }
-</style>
diff --git a/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/error.htm b/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/error.htm
deleted file mode 100644 (file)
index 4ab2e11..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<%#
-Copyright 2017-2019 Stan Grishin (stangri@melmac.net)
-This is free software, licensed under the Apache License, Version 2.0
--%>
-
-<%+cbi/valueheader%>
-
-<textarea rows="<%=select(2, self:cfgvalue(section):gsub('\n', '\n'))%>"
-       style="border:none;box-shadow:none;background:transparent;font-weight:bold;line-height:20px;width:50em;padding:none;margin:6px;resize:none;overflow:hidden;"
-       disabled="disabled"><%=self:cfgvalue(section):gsub('\n', '\n')%>
-</textarea>
-
-<%+cbi/valuefooter%>
diff --git a/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/js.htm b/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/js.htm
deleted file mode 100644 (file)
index 5119829..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
- function button_action(action) {
-       var xhr = new XHR(false);
-       var btn_start = document.getElementById("btn_start");
-       var btn_action = document.getElementById("btn_action");
-       var btn_stop = document.getElementById("btn_stop");
-       var btn_enable = document.getElementById("btn_enable");
-       var btn_disable = document.getElementById("btn_disable");
-       var btn_spinner;
-       switch (action.name) {
-               case "start":
-                       btn_spinner = document.getElementById("btn_start_spinner");
-                       break;
-               case "action":
-                       btn_spinner = document.getElementById("btn_action_spinner");
-                       break;
-               case "stop":
-                       btn_spinner = document.getElementById("btn_stop_spinner");
-                       break;
-               case "enable":
-                       btn_spinner = document.getElementById("btn_enable_spinner");
-                       break;
-               case "disable":
-                       btn_spinner = document.getElementById("btn_disable_spinner");
-                       break;
-       }
-       btn_start.disabled = true;
-       btn_action.disabled = true;
-       btn_stop.disabled = true;
-       btn_enable.disabled = true;
-       btn_disable.disabled = true;
-       spinner(btn_spinner, 1);
-       xhr.get('<%=luci.dispatcher.build_url("admin", "services", "simple-adblock", "action")%>/' + action.name, null,
-               function (x) {
-                       if (!x) {
-                               return;
-                       }
-                       btn_start.disabled = false;
-                       btn_action.disabled = false;
-                       btn_stop.disabled = false;
-                       btn_enable.disabled = false;
-                       btn_disable.disabled = false;
-                       spinner(btn_spinner, 0);
-                       location.reload();
-                });
-}
-function spinner(element, state) {
-       if (state === 1) {
-               element.style.width = "16px";
-               element.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" />';
-       }
-       else {
-               element.style.width = "0px";
-               element.innerHTML = '';
-       }
-}
-//]]>
-</script>
\ No newline at end of file
diff --git a/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/status.htm b/applications/luci-app-simple-adblock/luasrc/view/simple-adblock/status.htm
deleted file mode 100644 (file)
index b02c7fa..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<%#
-Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
-This is free software, licensed under the Apache License, Version 2.0
--%>
-
-<%+cbi/valueheader%>
-
-<div style="font-weight:bold;">
-       <%=self:cfgvalue(section):gsub('\n', '<br />' )%>
-</div>
-
-<%+cbi/valuefooter%>
index 822816fd67f9189a16ff5b77a917b58a6b287741..260c11aa2638f1bfa61a91dba47e738cfda8b079 100644 (file)
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:250
-msgid "%s Error: %s"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:248
-msgid "%s Error: %s %s"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:90
+msgid "%s is not installed or not found"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:161
-msgid "%s is not installed or not found"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:99
+msgid "Active"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:336
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:106
 msgid "Add IPv6 entries"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:334
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:104
 msgid "Add IPv6 entries to block-list."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:296
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:33
 msgid "Advanced Configuration"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:375
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:145
 msgid "Allowed Domain URLs"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:371
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:142
 msgid "Allowed Domains"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:369
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:141
 msgid "Allowed and Blocked Lists Management"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:358
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:129
 msgid ""
 "Attempt to create a compressed cache of block-list in the persistent memory."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:265
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:35
 msgid "Automatic Config Update"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:263
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:32
 msgid "Basic Configuration"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:383
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:151
 msgid "Blocked Domain URLs"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:379
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:148
 msgid "Blocked Domains"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:387
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:154
 msgid "Blocked Hosts URLs"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:231
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:109
 msgid "Blocking %s domains (with %s)."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:221
-msgid "Cache file containing %s domains found."
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:129
+msgid "Cache file found."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:241
-msgid "Collected Errors"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:111
+msgid "Compressed cache file created."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:225
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:132
 msgid "Compressed cache file found."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:261
-msgid "Configuration"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:270
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:42
 msgid "Controls system log and console output verbosity."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:349
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:117
 msgid "Curl download retry"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:317
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:86
 msgid "DNS Service"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:319
-msgid "DNSMASQ Additional Hosts"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:320
-msgid "DNSMASQ Config"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:322
-msgid "DNSMASQ Ipset"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:325
-msgid "DNSMASQ Nft Set"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:327
-msgid "DNSMASQ Servers File"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:341
-msgid "Delay (in seconds) for on-boot start"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:65
+msgid "DNS resolution option, see the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:266
-#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm:68
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:251
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:37
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:39
 msgid "Disable"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:364
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:136
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:138
 msgid "Disable Debugging"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:335
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:247
+msgid "Disabling %s service"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:105
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:109
 msgid "Do not add IPv6 entries"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:359
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:130
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:132
 msgid "Do not store compressed cache"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:354
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:124
 msgid "Do not use simultaneous processing"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:345
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:112
 msgid "Download time-out (in seconds)"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:166
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:95
 msgid "Downloading"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:267
-#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm:65
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:240
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:38
 msgid "Enable"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:363
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:365
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:134
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:137
 msgid "Enable Debugging"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:363
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:135
 msgid "Enables debug output to /tmp/simple-adblock.log."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:167
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:236
+msgid "Enabling %s service"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:96
 msgid "Error"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:169
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:98
 msgid "Fail"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm:55
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:114
+msgid "Force DNS ports:"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:218
 msgid "Force Re-Download"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:165
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:94
 msgid "Force Reloading"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:276
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:48
 msgid "Force Router DNS"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:278
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:51
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:52
 msgid "Force Router DNS server to all local devices"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:276
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:214
+msgid "Force re-downloading %s block lists"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:49
 msgid "Forces Router DNS use on local devices, also known as DNS Hijacking."
 msgstr ""
 
@@ -193,270 +186,287 @@ msgstr ""
 msgid "Grant UCI and file access for luci-app-simple-adblock"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:334
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:103
 msgid "IPv6 Support"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:349
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:118
 msgid ""
 "If curl is installed and detected, it would retry download this many times "
 "on timeout/fail."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:371
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:143
 msgid "Individual domains to be allowed."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:379
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:149
 msgid "Individual domains to be blocked."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:219
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:223
-msgid "Info"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:287
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:56
 msgid "LED to indicate status"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:353
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:123
 msgid ""
 "Launch all lists downloads and processing simultaneously, reducing service "
 "start time."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:277
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:50
 msgid "Let local devices use their own DNS servers if set"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/js.htm:51
-msgid "Loading"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:236
-msgid "Message"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:146
+msgid "Not installed or not found"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:270
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:41
 msgid "Output Verbosity Setting"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:265
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:36
 msgid "Perform config update before downloading the block/allow-lists."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:298
-msgid ""
-"Pick the DNS resolution option to create the adblock list for, see the "
-"%sREADME%s for details."
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:288
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:57
 msgid "Pick the LED not already used in %sSystem LED Configuration%s."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:301
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:302
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:303
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:304
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:307
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:310
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:314
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:68
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:69
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:70
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:71
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:75
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:78
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:82
 msgid "Please note that %s is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:164
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:93
 msgid "Restarting"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:341
-msgid "Run service after set delay on boot."
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:285
+msgid "Service Control"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:256
-msgid "Service Control"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:185
+msgid "Service Errors"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:205
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:215
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:228
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:103
 msgid "Service Status"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:199
-msgid "Service Status [%s %s]"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:154
+msgid "Service Warnings"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/controller/simple-adblock.lua:4
 #: applications/luci-app-simple-adblock/root/usr/share/luci/menu.d/luci-app-simple-adblock.json:3
 msgid "Simple AdBlock"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:193
-msgid "Simple AdBlock Settings"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:30
+msgid "Simple AdBlock - Configuration"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:102
+msgid "Simple AdBlock - Status"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:353
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:122
 msgid "Simultaneous processing"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:272
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:44
 msgid "Some output"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm:52
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:207
 msgid "Start"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:163
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:92
 msgid "Starting"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm:58
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:203
+msgid "Starting %s service"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:229
 msgid "Stop"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:345
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:113
 msgid "Stop the download if it is stalled for set number of seconds."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:162
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:91
 msgid "Stopped"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:360
-msgid "Store compressed cache"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:225
+msgid "Stopping %s service"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:358
-msgid "Store compressed cache file on router"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:131
+msgid "Store compressed cache"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:170
-msgid "Success"
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:128
+msgid "Store compressed cache file on router"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:271
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:43
 msgid "Suppress output"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:209
-msgid "Task"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:375
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:146
 msgid "URLs to lists of domains to be allowed."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:383
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:152
 msgid "URLs to lists of domains to be blocked."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:387
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:155
 msgid "URLs to lists of hosts to be blocked."
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:330
-msgid "Unbound AdBlock List"
-msgstr ""
-
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:355
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:125
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:126
 msgid "Use simultaneous processing"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:273
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:45
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:46
 msgid "Verbose output"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:168
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:105
+msgid "Version: %s"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:97
 msgid "Warning"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:173
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:126
+msgid "disabled"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:88
+msgid "dnsmasq additional hosts"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:89
+msgid "dnsmasq config"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:91
+msgid "dnsmasq ipset"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:94
+msgid "dnsmasq nft set"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:96
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:101
+msgid "dnsmasq servers file"
+msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:165
 msgid "failed to access shared memory"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:171
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:163
 msgid "failed to create '%s' file"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:183
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:175
 msgid "failed to create block-list or restart DNS resolver"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:179
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:171
 msgid "failed to create compressed cache"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:191
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:183
 msgid "failed to create output/cache/gzip file directory"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:187
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:179
 msgid "failed to download"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:186
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:178
 msgid "failed to download Config Update file"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:177
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:169
 msgid "failed to format data file"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:182
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:174
 msgid "failed to move '%s' to '%s'"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:178
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:170
 msgid "failed to move temporary data file to '%s'"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:175
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:167
 msgid "failed to optimize data file"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:189
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:181
 msgid "failed to parse"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:188
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:180
 msgid "failed to parse Config Update file"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:176
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:168
 msgid "failed to process allow-list"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:185
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:177
 msgid "failed to reload/restart DNS resolver"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:180
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:172
 msgid "failed to remove temporary files"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:172
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:164
 msgid "failed to restart/reload DNS resolver"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:174
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:166
 msgid "failed to sort data file"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:184
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:176
 msgid "failed to stop %s"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:181
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:173
 msgid "failed to unpack compressed cache"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:190
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:182
 msgid "no HTTPS/SSL support on device"
 msgstr ""
 
-#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:290
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:59
 msgid "none"
 msgstr ""
+
+#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:99
+msgid "unbound adblock list"
+msgstr ""
index b42fa5859fb2691e1092d6aad5f3208b2ae4d180..080086891a6e00781a0e1f009650ab9a2a601e7e 100644 (file)
@@ -1,4 +1,4 @@
 #!/bin/sh
 rm -rf /var/luci-modulecache/; rm -f /var/luci-indexcache;
-[ -x /etc/init.d/rpcd ] && /etc/init.d/rpcd reload
+[ -x /etc/init.d/rpcd ] && /etc/init.d/rpcd reload;
 exit 0
diff --git a/applications/luci-app-simple-adblock/root/usr/libexec/rpcd/luci.simple-adblock b/applications/luci-app-simple-adblock/root/usr/libexec/rpcd/luci.simple-adblock
new file mode 100755 (executable)
index 0000000..80938a3
--- /dev/null
@@ -0,0 +1,312 @@
+#!/bin/sh
+# Copyright 2022 Stan Grishin (stangri@melmac.ca)
+# shellcheck disable=SC1091,SC2018,SC2019,SC2039,SC3043,SC3057,SC3060
+
+# TechRef: https://openwrt.org/docs/techref/rpcd
+# TESTS
+# ubus -v list luci.simple-adblock
+# ubus -S call luci.simple-adblock getInitList '{"name": "simple-adblock" }'
+# ubus -S call luci.simple-adblock getInitStatus '{"name": "simple-adblock" }'
+# ubus -S call luci.simple-adblock getPlatformSupport '{"name": "simple-adblock" }'
+
+. /lib/functions.sh
+. /lib/functions/network.sh
+. /usr/share/libubox/jshn.sh
+
+readonly packageName="simple-adblock"
+readonly dnsmasqAddnhostsFile="/var/run/${packageName}/dnsmasq.addnhosts"
+readonly dnsmasqAddnhostsCache="/var/run/${packageName}/dnsmasq.addnhosts.cache"
+readonly dnsmasqAddnhostsGzip="/etc/${packageName}.dnsmasq.addnhosts.gz"
+readonly dnsmasqConfFile="/tmp/dnsmasq.d/${packageName}"
+readonly dnsmasqConfCache="/var/run/${packageName}/dnsmasq.conf.cache"
+readonly dnsmasqConfGzip="/etc/${packageName}.dnsmasq.conf.gz"
+readonly dnsmasqIpsetFile="/tmp/dnsmasq.d/${packageName}.ipset"
+readonly dnsmasqIpsetCache="/var/run/${packageName}/dnsmasq.ipset.cache"
+readonly dnsmasqIpsetGzip="/etc/${packageName}.dnsmasq.ipset.gz"
+readonly dnsmasqNftsetFile="/tmp/dnsmasq.d/${packageName}.nftset"
+readonly dnsmasqNftsetCache="/var/run/${packageName}/dnsmasq.nftset.cache"
+readonly dnsmasqNftsetGzip="/etc/${packageName}.dnsmasq.nftset.gz"
+readonly dnsmasqServersFile="/var/run/${packageName}/dnsmasq.servers"
+readonly dnsmasqServersCache="/var/run/${packageName}/dnsmasq.servers.cache"
+readonly dnsmasqServersGzip="/etc/${packageName}.dnsmasq.servers.gz"
+readonly unboundFile="/var/lib/unbound/adb_list.${packageName}"
+readonly unboundCache="/var/run/${packageName}/unbound.cache"
+readonly unboundGzip="/etc/${packageName}.unbound.gz"
+readonly jsonFile="/var/run/${packageName}/${packageName}.json"
+
+str_contains() { [ -n "$1" ] &&[ -n "$2" ] && [ "${1//$2}" != "$1" ]; }
+str_contains_word() { echo "$1" | grep -q -w "$2"; }
+str_to_lower() { echo "$1" | tr 'A-Z' 'a-z'; }
+str_to_upper() { echo "$1" | tr 'a-z' 'A-Z'; }
+is_enabled() { uci -q get "${1}.config.enabled"; }
+get_version() { grep -m1 -A2 -w "^Package: $1$" /usr/lib/opkg/status | sed -n 's/Version: //p'; }
+print_json_bool() { json_init; json_add_boolean "$1" "$2"; json_dump; json_cleanup; }
+print_json_string() { json_init; json_add_string "$1" "$2"; json_dump; json_cleanup; }
+logger() { /usr/bin/logger -t "$packageName" "$@"; }
+ubus_get_status() { ubus call service list "{ 'name': '$packageName' }" | jsonfilter -e "@['${packageName}'].instances.main.data.${1}"; }
+ubus_get_ports() { ubus call service list "{ 'name': '$packageName' }" | jsonfilter -e "@['${packageName}'].instances.main.data.firewall.*.dest_port"; }
+json() {
+# shellcheck disable=SC2034
+       local action="$1" param="$2" value="$3" i
+       if [ -s "$jsonFile" ]; then
+               json_load_file "$jsonFile" 2>/dev/null
+               json_select 'data' 2>/dev/null
+               for i in status message error stats reload restart; do
+                       json_get_var $i "$i" 2>/dev/null
+               done
+       fi
+       case "$action" in
+               get)
+                       case "$param" in
+                               *)
+                                       printf "%b" "$(eval echo "\$$param")"; return;;
+                       esac
+               ;;
+       esac
+}
+
+get_init_list() {
+       local name
+       name="$(basename "$1")"
+       name="${name:-$packageName}" 
+       json_init
+       json_add_object "$name"
+       json_add_boolean 'enabled' "$(is_enabled "$name")"
+       if is_running "$name"; then
+               json_add_boolean 'running' '1'
+       else
+               json_add_boolean 'running' '0'
+       fi
+       json_close_object
+       json_dump
+       json_cleanup
+}
+
+set_init_action() {
+       local name action="$2" cmd
+       name="$(basename "$1")"
+       name="${name:-$packageName}" 
+       if [ ! -f "/etc/init.d/$name" ]; then
+               print_json_string 'error' 'Init script not found!'
+               return
+       fi
+       case $action in
+               enable)
+                       cmd="uci -q set ${name}.config.enabled=1 && uci commit $name";;
+               disable)
+                       cmd="uci -q set ${name}.config.enabled=0 && uci commit $name";;
+               start|stop|reload|restart)
+                       cmd="/etc/init.d/${name} ${action}";;
+       esac
+       if [ -n "$cmd" ] && eval "${cmd}" 1>/dev/null 2>&1; then
+               print_json_bool "result" '1'
+       else
+               print_json_bool "result" '0'
+       fi
+}
+
+get_init_status() {
+       local name
+       name="$(basename "$1")"
+       name="${name:-$packageName}" 
+       local errors ports dns outputFile outputCache outputGzip
+       local i
+       errors="$(ubus_get_status errors)"
+       ports="$(ubus_get_ports)"
+       dns="$(uci -q get $packageName.config.dns)"
+       case "$dns" in
+               dnsmasq.addnhosts)
+                       outputFile="$dnsmasqAddnhostsFile"
+                       outputCache="$dnsmasqAddnhostsCache"
+                       outputGzip="$dnsmasqAddnhostsGzip"
+               ;;
+               dnsmasq.conf)
+                       outputFile="$dnsmasqConfFile"
+                       outputCache="$dnsmasqConfCache"
+                       outputGzip="$dnsmasqConfGzip"
+               ;;
+               dnsmasq.ipset)
+                       outputFile="$dnsmasqIpsetFile"
+                       outputCache="$dnsmasqIpsetCache"
+                       outputGzip="$dnsmasqIpsetGzip"
+               ;;
+               dnsmasq.nftset)
+                       outputFile="$dnsmasqNftsetFile"
+                       outputCache="$dnsmasqNftsetCache"
+                       outputGzip="$dnsmasqNftsetGzip"
+               ;;
+               dnsmasq.servers)
+                       outputFile="$dnsmasqServersFile"
+                       outputCache="$dnsmasqServersCache"
+                       outputGzip="$dnsmasqServersGzip"
+               ;;
+               unbound.adb_list)
+                       outputFile="$unboundFile"
+                       outputCache="$unboundCache"
+                       outputGzip="$unboundGzip"
+               ;;
+       esac
+       json_init
+       json_add_object  "$name"
+       json_add_boolean 'enabled' "$(is_enabled "$name")"
+       i="$(json 'get' 'status')"
+       json_add_string 'status' "$i"
+       if [ "$i" = 'statusSuccess' ]; then
+               json_add_boolean 'running' '1'
+       else
+               json_add_boolean 'running' '0'
+       fi
+       json_add_string 'version' "$(get_version "$name")"
+       json_add_array 'errors'
+               for i in $errors; do json_add_string '' "$i"; done
+       json_close_array
+       if [ -n "$ports" ]; then
+               json_add_boolean 'force_dns_active' '1'
+               json_add_array 'force_dns_ports'
+                       for i in $ports; do json_add_int '' "$i"; done
+               json_close_array
+       else
+               json_add_boolean 'force_dns_active' '0'
+       fi
+       json_add_int 'entries' "$(ubus_get_status entries)"
+       json_add_string 'dns' "$dns"
+       json_add_string 'outputFile' "$outputFile"
+       json_add_string 'outputCache' "$outputCache"
+       json_add_string 'outputGzip' "$outputGzip"
+       if [ -s "$outputFile" ]; then 
+               json_add_boolean 'outputFileExists' '1'
+       else
+               json_add_boolean 'outputFileExists' '0'
+       fi
+       if [ -s "$outputCache" ]; then 
+               json_add_boolean 'outputCacheExists' '1'
+       else
+               json_add_boolean 'outputCacheExists' '0'
+       fi
+       if [ -s "$outputGzip" ]; then 
+               json_add_boolean 'outputGzipExists' '1'
+       else
+               json_add_boolean 'outputGzipExists' '0'
+       fi
+       json_add_array 'leds'
+               for i in /sys/class/leds/*; do json_add_string '' "$(basename "$i")"; done
+       json_close_array
+       json_close_object
+       json_dump
+       json_cleanup
+}
+
+check_ipset() { { command -v ipset && /usr/sbin/ipset help hash:net; } >/dev/null 2>&1; }
+check_nft() { command -v nft >/dev/null 2>&1; }
+check_dnsmasq() { command -v dnsmasq >/dev/null 2>&1; }
+check_unbound() { command -v unbound >/dev/null 2>&1; }
+check_dnsmasq_ipset() {
+       local o;
+       check_dnsmasq || return 1
+       o="$(dnsmasq -v 2>/dev/null)"
+       check_ipset && ! echo "$o" | grep -q 'no-ipset' && echo "$o" | grep -q 'ipset'
+}
+check_dnsmasq_nftset() {
+       local o;
+       check_dnsmasq || return 1
+       o="$(dnsmasq -v 2>/dev/null)"
+       check_nft && ! echo "$o" | grep -q 'no-nftset' && echo "$o" | grep -q 'nftset'
+}
+
+get_platform_support() {
+       local name
+       name="$(basename "$1")"
+       name="${name:-$packageName}" 
+       json_init
+       json_add_object "$name"
+       if check_ipset; then
+               json_add_boolean 'ipset_installed' '1'
+       else
+               json_add_boolean 'ipset_installed' '0'
+       fi
+       if check_nft; then
+               json_add_boolean 'nft_installed' '1'
+       else
+               json_add_boolean 'nft_installed' '0'
+       fi
+       if check_dnsmasq; then
+               json_add_boolean 'dnsmasq_installed' '1'
+       else
+               json_add_boolean 'dnsmasq_installed' '0'
+       fi
+       if check_unbound; then
+               json_add_boolean 'unbound_installed' '1'
+       else
+               json_add_boolean 'unbound_installed' '0'
+       fi
+       if check_dnsmasq_ipset; then
+               json_add_boolean 'dnsmasq_ipset_support' '1'
+       else
+               json_add_boolean 'dnsmasq_ipset_support' '0'
+       fi
+       if check_dnsmasq_nftset; then
+               json_add_boolean 'dnsmasq_nftset_support' '1'
+       else
+               json_add_boolean 'dnsmasq_nftset_support' '0'
+       fi
+       json_add_array 'leds'
+               for i in /sys/class/leds/*; do json_add_string '' "$(basename "$i")"; done
+       json_close_array
+       json_close_object
+       json_dump
+       json_cleanup
+}
+
+case "$1" in
+       list)
+               json_init
+               json_add_object "getInitList"
+                       json_add_string 'name' 'name'
+               json_close_object
+               json_add_object "getInitStatus"
+                       json_add_string 'name' 'name'
+               json_close_object
+               json_add_object "getPlatformSupport"
+                       json_add_string 'name' 'name'
+               json_close_object
+               json_add_object "setInitAction"
+                       json_add_string 'name' 'name'
+                       json_add_string 'action' 'action'
+               json_close_object
+               json_dump
+               json_cleanup
+               ;;
+       call)
+               case "$2" in
+                       getInitList)
+                               read -r input
+                               json_load "$input"
+                               json_get_var name 'name'
+                               json_cleanup
+                               get_init_list "$name"
+                               ;;
+                       getInitStatus)
+                               read -r input
+                               json_load "$input"
+                               json_get_var name 'name'
+                               json_cleanup
+                               get_init_status "$name"
+                               ;;
+                       getPlatformSupport)
+                               read -r input
+                               json_load "$input"
+                               json_get_var name 'name'
+                               json_cleanup
+                               get_platform_support "$name"
+                               ;;
+                       setInitAction)
+                               read -r input
+                               json_load "$input"
+                               json_get_var name 'name'
+                               json_get_var action 'action'
+                               json_cleanup
+                               set_init_action "$name" "$action"
+                               ;;
+               esac
+       ;;
+esac
index e640dbb8714469c76ebf687dfd156085dfd7d0fc..b2cdca18eb22547a715119999722ea9800b73010 100644 (file)
@@ -2,13 +2,16 @@
        "admin/services/simple-adblock": {
                "title": "Simple AdBlock",
                "action": {
-                       "type": "cbi",
-                       "path": "simple-adblock",
-                       "post": { "cbi.submit": true }
+                       "type": "view",
+                       "path": "simple-adblock/overview"
                },
                "depends": {
-                       "acl": [ "luci-app-simple-adblock" ],
-                       "uci": { "simple-adblock": true }
+                       "acl": [
+                               "luci-app-simple-adblock"
+                       ],
+                       "uci": {
+                               "simple-adblock": true
+                       }
                }
        }
 }
index 46356266150ae7fec87a6d4d88790c06cf89e98e..6aeadc9c6383ae03d54b272c37ced2fac2fe3037 100644 (file)
@@ -2,40 +2,26 @@
        "luci-app-simple-adblock": {
                "description": "Grant UCI and file access for luci-app-simple-adblock",
                "read": {
-                       "cgi-io": [
-                               "exec"
-                       ],
-                       "file": {
-                               "/usr/lib/opkg/status": [
-                                       "read"
-                               ],
-                               "/sys/class/leds/*": [
-                                       "read"
-                               ],
-                               "/var/run/simple-adblock.*": [
-                                       "read"
-                               ],
-                               "/etc/init.d/simple-adblock *": [
-                                       "exec"
-                               ],
-                               "/usr/sbin/dnsmasq *": [
-                                       "exec"
-                               ],
-                               "/usr/sbin/unbound *": [
-                                       "exec"
-                               ],
-                               "/usr/sbin/ipset *": [
-                                       "exec"
+                       "ubus": {
+                               "luci.simple-adblock": [
+                                       "getInitList",
+                                       "getInitStatus",
+                                       "getPlatformSupport"
                                ]
                        },
-                               "uci": [
+                       "uci": [
                                "simple-adblock"
                        ]
                },
                "write": {
                        "uci": [
                                "simple-adblock"
-                       ]
+                       ],
+                       "ubus": {
+                               "luci.simple-adblock": [
+                                       "setInitAction"
+                               ]
+                       }
                }
        }
-}
\ No newline at end of file
+}