luci-app-simple-adblock: convert to js

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>
This commit is contained in:
Stan Grishin 2022-11-04 00:10:03 +00:00
parent 0dd0114a9d
commit 0b895b1794
15 changed files with 987 additions and 810 deletions

View 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

View file

@ -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
});

View file

@ -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()]);
})
}
});

View file

@ -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

View file

@ -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

View file

@ -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%>

View file

@ -1,9 +0,0 @@
<style type="text/css">
.btn_spinner
{
display: inline-block;
width: 0px;
height: 16px;
margin: 0 0px;
}
</style>

View file

@ -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%>

View file

@ -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>

View file

@ -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%>

View file

@ -1,191 +1,184 @@
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"
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:161
#: 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:336
#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:99
msgid "Active"
msgstr ""
#: 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"
#: 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: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"
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"
#: 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:236
msgid "Message"
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."
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:256
#: 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: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:185
msgid "Service Errors"
msgstr ""
#: 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/luasrc/model/cbi/simple-adblock.lua:353
#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:102
msgid "Simple AdBlock - Status"
msgstr ""
#: 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
#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:225
msgid "Stopping %s service"
msgstr ""
#: 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:358
#: 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:170
msgid "Success"
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 ""

View 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

View file

@ -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

View 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
}
}
}
}

View 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"
]
}
}
}
}
}