Merge pull request #6075 from stangri/master-luci-app-simple-adblock

luci-app-simple-adblock: convert to js
This commit is contained in:
Stan Grishin 2022-11-07 16:41:11 -08:00 committed by GitHub
commit 98842ccee8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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. # This is free software, licensed under the GNU General Public License v3.
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_LICENSE:=GPL-3.0-or-later PKG_LICENSE:=GPL-3.0-or-later
PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca> 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_TITLE:=Simple Adblock Web UI
LUCI_DESCRIPTION:=Provides Web UI for simple-adblock service. 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 LUCI_PKGARCH:=all
include ../../luci.mk 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 "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:250 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:90
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
msgid "%s is not installed or not found" msgid "%s is not installed or not found"
msgstr "" 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" msgid "Add IPv6 entries"
msgstr "" 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." msgid "Add IPv6 entries to block-list."
msgstr "" 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" msgid "Advanced Configuration"
msgstr "" 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" msgid "Allowed Domain URLs"
msgstr "" 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" msgid "Allowed Domains"
msgstr "" 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" msgid "Allowed and Blocked Lists Management"
msgstr "" 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 "" msgid ""
"Attempt to create a compressed cache of block-list in the persistent memory." "Attempt to create a compressed cache of block-list in the persistent memory."
msgstr "" 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" msgid "Automatic Config Update"
msgstr "" 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" msgid "Basic Configuration"
msgstr "" 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" msgid "Blocked Domain URLs"
msgstr "" 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" msgid "Blocked Domains"
msgstr "" 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" msgid "Blocked Hosts URLs"
msgstr "" 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)." msgid "Blocking %s domains (with %s)."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:221 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:129
msgid "Cache file containing %s domains found." msgid "Cache file found."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:241 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:111
msgid "Collected Errors" msgid "Compressed cache file created."
msgstr "" 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." msgid "Compressed cache file found."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:261 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:42
msgid "Configuration"
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:270
msgid "Controls system log and console output verbosity." msgid "Controls system log and console output verbosity."
msgstr "" 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" msgid "Curl download retry"
msgstr "" 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" msgid "DNS Service"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:319 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:65
msgid "DNSMASQ Additional Hosts" msgid "DNS resolution option, see the %sREADME%s for details."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:320 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:251
msgid "DNSMASQ Config" #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:37
msgstr "" #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:39
#: 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
msgid "Disable" msgid "Disable"
msgstr "" 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" msgid "Disable Debugging"
msgstr "" 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" msgid "Do not add IPv6 entries"
msgstr "" 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" msgid "Do not store compressed cache"
msgstr "" 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" msgid "Do not use simultaneous processing"
msgstr "" 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)" msgid "Download time-out (in seconds)"
msgstr "" 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" msgid "Downloading"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:267 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:240
#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/buttons.htm:65 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:38
msgid "Enable" msgid "Enable"
msgstr "" 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:134
#: 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:137
msgid "Enable Debugging" msgid "Enable Debugging"
msgstr "" 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." msgid "Enables debug output to /tmp/simple-adblock.log."
msgstr "" 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" msgid "Error"
msgstr "" 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" msgid "Fail"
msgstr "" 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" msgid "Force Re-Download"
msgstr "" 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" msgid "Force Reloading"
msgstr "" 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" msgid "Force Router DNS"
msgstr "" 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" msgid "Force Router DNS server to all local devices"
msgstr "" 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." msgid "Forces Router DNS use on local devices, also known as DNS Hijacking."
msgstr "" msgstr ""
@ -193,270 +186,287 @@ msgstr ""
msgid "Grant UCI and file access for luci-app-simple-adblock" msgid "Grant UCI and file access for luci-app-simple-adblock"
msgstr "" 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" msgid "IPv6 Support"
msgstr "" 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 "" msgid ""
"If curl is installed and detected, it would retry download this many times " "If curl is installed and detected, it would retry download this many times "
"on timeout/fail." "on timeout/fail."
msgstr "" 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." msgid "Individual domains to be allowed."
msgstr "" 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." msgid "Individual domains to be blocked."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:219 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:56
#: 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
msgid "LED to indicate status" msgid "LED to indicate status"
msgstr "" 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 "" msgid ""
"Launch all lists downloads and processing simultaneously, reducing service " "Launch all lists downloads and processing simultaneously, reducing service "
"start time." "start time."
msgstr "" 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" msgid "Let local devices use their own DNS servers if set"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/view/simple-adblock/js.htm:51 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:146
msgid "Loading" msgid "Not installed or not found"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:236 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:41
msgid "Message"
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:270
msgid "Output Verbosity Setting" msgid "Output Verbosity Setting"
msgstr "" 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." msgid "Perform config update before downloading the block/allow-lists."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:298 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:57
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
msgid "Pick the LED not already used in %sSystem LED Configuration%s." msgid "Pick the LED not already used in %sSystem LED Configuration%s."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:301 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:68
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:302 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:69
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:303 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:70
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:304 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:71
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:307 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:75
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:310 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:78
#: 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:82
msgid "Please note that %s is not supported on this system." msgid "Please note that %s is not supported on this system."
msgstr "" 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" msgid "Restarting"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:341 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:285
msgid "Run service after set delay on boot."
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:256
msgid "Service Control" msgid "Service Control"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:205 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:185
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:215 msgid "Service Errors"
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:228 msgstr ""
#: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:103
msgid "Service Status" msgid "Service Status"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:199 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/simple-adblock/status.js:154
msgid "Service Status [%s %s]" msgid "Service Warnings"
msgstr "" 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 #: applications/luci-app-simple-adblock/root/usr/share/luci/menu.d/luci-app-simple-adblock.json:3
msgid "Simple AdBlock" msgid "Simple AdBlock"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:193 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:30
msgid "Simple AdBlock Settings" msgid "Simple AdBlock - Configuration"
msgstr "" 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" msgid "Simultaneous processing"
msgstr "" 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" msgid "Some output"
msgstr "" 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" msgid "Start"
msgstr "" 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" msgid "Starting"
msgstr "" 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" msgid "Stop"
msgstr "" 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." msgid "Stop the download if it is stalled for set number of seconds."
msgstr "" 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" msgid "Stopped"
msgstr "" 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" msgid "Store compressed cache"
msgstr "" 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" msgid "Store compressed cache file on router"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:170 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:43
msgid "Success"
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:271
msgid "Suppress output" msgid "Suppress output"
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:209 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:146
msgid "Task"
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:375
msgid "URLs to lists of domains to be allowed." msgid "URLs to lists of domains to be allowed."
msgstr "" 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." msgid "URLs to lists of domains to be blocked."
msgstr "" 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." msgid "URLs to lists of hosts to be blocked."
msgstr "" msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:330 #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:125
msgid "Unbound AdBlock List" #: applications/luci-app-simple-adblock/htdocs/luci-static/resources/view/simple-adblock/overview.js:126
msgstr ""
#: applications/luci-app-simple-adblock/luasrc/model/cbi/simple-adblock.lua:355
msgid "Use simultaneous processing" msgid "Use simultaneous processing"
msgstr "" 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" msgid "Verbose output"
msgstr "" 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" msgid "Warning"
msgstr "" 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" msgid "failed to access shared memory"
msgstr "" 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" msgid "failed to create '%s' file"
msgstr "" 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" msgid "failed to create block-list or restart DNS resolver"
msgstr "" 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" msgid "failed to create compressed cache"
msgstr "" 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" msgid "failed to create output/cache/gzip file directory"
msgstr "" 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" msgid "failed to download"
msgstr "" 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" msgid "failed to download Config Update file"
msgstr "" 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" msgid "failed to format data file"
msgstr "" 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'" msgid "failed to move '%s' to '%s'"
msgstr "" 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'" msgid "failed to move temporary data file to '%s'"
msgstr "" 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" msgid "failed to optimize data file"
msgstr "" 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" msgid "failed to parse"
msgstr "" 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" msgid "failed to parse Config Update file"
msgstr "" 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" msgid "failed to process allow-list"
msgstr "" 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" msgid "failed to reload/restart DNS resolver"
msgstr "" 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" msgid "failed to remove temporary files"
msgstr "" 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" msgid "failed to restart/reload DNS resolver"
msgstr "" 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" msgid "failed to sort data file"
msgstr "" 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" msgid "failed to stop %s"
msgstr "" 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" msgid "failed to unpack compressed cache"
msgstr "" 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" msgid "no HTTPS/SSL support on device"
msgstr "" 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" msgid "none"
msgstr "" 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 #!/bin/sh
rm -rf /var/luci-modulecache/; rm -f /var/luci-indexcache; 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 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": { "admin/services/simple-adblock": {
"title": "Simple AdBlock", "title": "Simple AdBlock",
"action": { "action": {
"type": "cbi", "type": "view",
"path": "simple-adblock", "path": "simple-adblock/overview"
"post": { "cbi.submit": true }
}, },
"depends": { "depends": {
"acl": [ "luci-app-simple-adblock" ], "acl": [
"uci": { "simple-adblock": true } "luci-app-simple-adblock"
],
"uci": {
"simple-adblock": true
}
} }
} }
} }

View file

@ -2,30 +2,11 @@
"luci-app-simple-adblock": { "luci-app-simple-adblock": {
"description": "Grant UCI and file access for luci-app-simple-adblock", "description": "Grant UCI and file access for luci-app-simple-adblock",
"read": { "read": {
"cgi-io": [ "ubus": {
"exec" "luci.simple-adblock": [
], "getInitList",
"file": { "getInitStatus",
"/usr/lib/opkg/status": [ "getPlatformSupport"
"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"
] ]
}, },
"uci": [ "uci": [
@ -35,7 +16,12 @@
"write": { "write": {
"uci": [ "uci": [
"simple-adblock" "simple-adblock"
],
"ubus": {
"luci.simple-adblock": [
"setInitAction"
] ]
} }
} }
} }
}