2018-07-17 00:43:16 +00:00
-- Copyright 2016-2018 Stan Grishin <stangri@melmac.net>
-- Licensed to the public under the Apache License 2.0.
2019-08-17 13:15:10 +00:00
local readmeURL = " https://github.com/openwrt/packages/tree/master/net/simple-adblock/files/README.md "
-- local readmeURL = "https://github.com/stangri/openwrt_packages/tree/master/simple-adblock/files/README.md"
2018-07-17 00:43:16 +00:00
local packageName = " simple-adblock "
local uci = require " luci.model.uci " . cursor ( )
local util = require " luci.util "
2019-07-05 15:30:48 +00:00
local sys = require " luci.sys "
local jsonc = require " luci.jsonc "
local fs = require " nixio.fs "
local http = require " luci.http "
local dispatcher = require " luci.dispatcher "
2018-07-17 00:43:16 +00:00
local enabledFlag = uci : get ( packageName , " config " , " enabled " )
2019-08-17 13:15:10 +00:00
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.servers " and targetDNS ~= " unbound.adb_list " then
targetDNS = " dnsmasq.servers "
end
if targetDNS == " dnsmasq.addnhosts " then
outputFile = " /var/run/ " .. packageName .. " .addnhosts "
outputCache = " /var/run/ " .. packageName .. " .addnhosts.cache "
outputGzip = " /etc/ " .. packageName .. " .addnhosts.gz "
elseif targetDNS == " dnsmasq.conf " then
outputFile = " /var/dnsmasq.d/ " .. packageName .. " "
outputCache = " /var/run/ " .. packageName .. " .dnsmasq.cache "
outputGzip = " /etc/ " .. packageName .. " .dnsmasq.gz "
elseif targetDNS == " dnsmasq.servers " then
outputFile = " /var/run/ " .. packageName .. " .servers "
outputCache = " /var/run/ " .. packageName .. " .servers.cache "
outputGzip = " /etc/ " .. packageName .. " .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
2019-07-05 15:30:48 +00:00
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
local tmpfs
if fs.access ( " /var/run/ " .. packageName .. " .json " ) then
tmpfs = jsonc.parse ( util.trim ( sys.exec ( " cat /var/run/ " .. packageName .. " .json " ) ) )
end
local tmpfsVersion , tmpfsStatus , tmpfsMessage , tmpfsError , tmpfsStats = " " , " Stopped "
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
if tmpfs [ ' data ' ] [ ' version ' ] and tmpfs [ ' data ' ] [ ' version ' ] ~= " " then
tmpfsVersion = " ( " .. packageName .. " " .. tmpfs [ ' data ' ] [ ' version ' ] .. " ) "
end
2018-07-17 00:43:16 +00:00
end
2019-07-05 15:30:48 +00:00
h = m : section ( NamedSection , " config " , " simple-adblock " , translate ( " Service Status " ) .. tmpfsVersion )
if tmpfsStatus and tmpfsStatus : match ( " ing " ) then
ss = h : option ( DummyValue , " _dummy " , translate ( " Service Status " ) )
ss.template = " simple-adblock/status "
ss.value = tmpfsStatus .. ' ... '
if tmpfsMessage then
sm = h : option ( DummyValue , " _dummy " , translate ( " Task " ) )
sm.template = " simple-adblock/status "
sm.value = tmpfsMessage
end
2018-07-17 00:43:16 +00:00
else
en = h : option ( Button , " __toggle " )
2019-07-05 15:30:48 +00:00
if enabledFlag ~= " 1 " or tmpfsStatus : match ( " Stopped " ) then
2018-07-17 00:43:16 +00:00
en.title = translate ( " Service is disabled/stopped " )
en.inputtitle = translate ( " Enable/Start " )
2018-07-20 02:34:49 +00:00
en.inputstyle = " apply important "
2019-08-17 13:15:10 +00:00
if fs.access ( outputCache ) then
2019-07-05 15:30:48 +00:00
sm = h : option ( DummyValue , " _dummy " , translate ( " Info " ) )
sm.template = " simple-adblock/status "
2019-08-17 13:15:10 +00:00
sm.value = " Cache file containing " .. util.trim ( sys.exec ( " wc -l < " .. outputCache ) ) .. " domains found. "
elseif fs.access ( outputGzip ) then
2019-07-05 15:30:48 +00:00
sm = h : option ( DummyValue , " _dummy " , translate ( " Info " ) )
sm.template = " simple-adblock/status "
sm.value = " Compressed cache file found. "
2018-07-17 00:43:16 +00:00
end
else
en.title = translate ( " Service is enabled/started " )
en.inputtitle = translate ( " Stop/Disable " )
2018-07-20 02:34:49 +00:00
en.inputstyle = " reset important "
2019-07-05 15:30:48 +00:00
ss = h : option ( DummyValue , " _dummy " , translate ( " Service Status " ) )
ss.template = " simple-adblock/status "
ss.value = tmpfsStatus
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 = tmpfsError
2018-07-17 00:43:16 +00:00
reload = h : option ( Button , " __reload " )
reload.title = translate ( " Service started with error " )
reload.inputtitle = translate ( " Reload " )
2018-07-20 02:34:49 +00:00
reload.inputstyle = " apply important "
2018-07-17 00:43:16 +00:00
function reload . write ( )
2019-07-05 15:30:48 +00:00
sys.exec ( " /etc/init.d/simple-adblock reload " )
http.redirect ( dispatcher.build_url ( " admin/services/ " .. packageName ) )
2018-07-17 00:43:16 +00:00
end
end
end
function en . write ( )
2019-07-05 15:30:48 +00:00
if tmpfsStatus and tmpfsStatus : match ( " Stopped " ) then
enabledFlag = " 1 "
else
enabledFlag = enabledFlag == " 1 " and " 0 " or " 1 "
end
2018-07-17 00:43:16 +00:00
uci : set ( packageName , " config " , " enabled " , enabledFlag )
uci : save ( packageName )
uci : commit ( packageName )
if enabledFlag == " 0 " then
luci.sys . init.stop ( packageName )
else
luci.sys . init.enable ( packageName )
luci.sys . init.start ( packageName )
end
luci.http . redirect ( luci.dispatcher . build_url ( " admin/services/ " .. packageName ) )
end
end
s = m : section ( NamedSection , " config " , " simple-adblock " , translate ( " Configuration " ) )
-- General options
s : tab ( " basic " , translate ( " Basic Configuration " ) )
2019-08-17 13:15:10 +00:00
o2 = s : taboption ( " basic " , ListValue , " verbosity " , translate ( " Output Verbosity Setting " ) , translate ( " Controls system log and console output verbosity. " ) )
2018-07-17 00:43:16 +00:00
o2 : value ( " 0 " , translate ( " Suppress output " ) )
o2 : value ( " 1 " , translate ( " Some output " ) )
o2 : value ( " 2 " , translate ( " Verbose output " ) )
o2.default = 2
2019-08-17 13:15:10 +00:00
o3 = s : taboption ( " basic " , ListValue , " force_dns " , translate ( " Force Router DNS " ) , translate ( " Forces Router DNS use on local devices, also known as DNS Hijacking. " ) )
2018-07-17 00:43:16 +00:00
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 nixio.fs . access ( sysfs_path ) then
leds = nixio.util . consume ( ( nixio.fs . dir ( sysfs_path ) ) )
end
if # leds ~= 0 then
2019-07-05 15:30:48 +00:00
o4 = s : taboption ( " basic " , Value , " led " , translate ( " LED to indicate status " ) , translate ( " Pick the LED not already used in " )
2018-07-17 00:43:16 +00:00
.. [[ <a href="]] .. luci.dispatcher . build_url ( " admin/system/leds " ) .. [[">]]
2019-08-17 13:15:10 +00:00
.. translate ( " System LED Configuration " ) .. [[</a>]] .. " . " )
2019-07-05 15:30:48 +00:00
o4.rmempty = false
o4 : value ( " " , translate ( " none " ) )
2018-07-17 00:43:16 +00:00
for k , v in ipairs ( leds ) do
2019-07-05 15:30:48 +00:00
o4 : value ( v )
2018-07-17 00:43:16 +00:00
end
end
s : tab ( " advanced " , translate ( " Advanced Configuration " ) )
2019-08-17 13:15:10 +00:00
dns = s : taboption ( " advanced " , ListValue , " dns " , translate ( " DNS Service " ) , translate ( " Pick the DNS resolution option to create the adblock list for, see the " ) .. " "
.. [[<a href="]] .. readmeURL .. [[#dns-resolution-option" target="_blank">]]
.. translate ( " README " ) .. [[</a>]] .. " " .. translate ( " for details. " ) )
dns : value ( " dnsmasq.addnhosts " , translate ( " DNSMASQ Additional Hosts " ) )
2019-08-29 13:21:20 +00:00
dns : value ( " dnsmasq.conf " , translate ( " DNSMASQ Config " ) )
2019-08-17 13:15:10 +00:00
dns : value ( " dnsmasq.servers " , translate ( " DNSMASQ Servers File " ) )
dns : value ( " unbound.adb_list " , translate ( " Unbound AdBlock List " ) )
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
2019-07-05 15:30:48 +00:00
o9 = s : taboption ( " advanced " , ListValue , " allow_non_ascii " , translate ( " Allow Non-ASCII characters in DNSMASQ file " ) , translate ( " Only enable if your version of DNSMASQ supports the use of Non-ASCII characters, otherwise DNSMASQ will fail to start. " ) )
o9 : value ( " 0 " , translate ( " Do not allow Non-ASCII " ) )
o9 : value ( " 1 " , translate ( " Allow Non-ASCII " ) )
o9.default = " 0 "
2019-08-17 13:15:10 +00:00
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. " ) )
2019-07-05 15:30:48 +00:00
o10 : value ( " 0 " , translate ( " Do not store compressed cache " ) )
o10 : value ( " 1 " , translate ( " Store compressed cache " ) )
o10.default = " 0 "
2019-08-17 13:15:10 +00:00
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 "
2018-07-17 00:43:16 +00:00
s2 = m : section ( NamedSection , " config " , " simple-adblock " , translate ( " Whitelist and Blocklist Management " ) )
-- Whitelisted Domains
2019-08-17 13:15:10 +00:00
d1 = s2 : option ( DynamicList , " whitelist_domain " , translate ( " Whitelisted Domains " ) , translate ( " Individual domains to be whitelisted. " ) )
2018-07-17 00:43:16 +00:00
d1.addremove = false
d1.optional = false
-- Blacklisted Domains
2019-08-17 13:15:10 +00:00
d3 = s2 : option ( DynamicList , " blacklist_domain " , translate ( " Blacklisted Domains " ) , translate ( " Individual domains to be blacklisted. " ) )
2018-07-17 00:43:16 +00:00
d3.addremove = false
d3.optional = false
-- Whitelisted Domains URLs
2019-08-17 13:15:10 +00:00
d2 = s2 : option ( DynamicList , " whitelist_domains_url " , translate ( " Whitelisted Domain URLs " ) , translate ( " URLs to lists of domains to be whitelisted. " ) )
2018-07-17 00:43:16 +00:00
d2.addremove = false
d2.optional = false
-- Blacklisted Domains URLs
2019-08-17 13:15:10 +00:00
d4 = s2 : option ( DynamicList , " blacklist_domains_url " , translate ( " Blacklisted Domain URLs " ) , translate ( " URLs to lists of domains to be blacklisted. " ) )
2018-07-17 00:43:16 +00:00
d4.addremove = false
d4.optional = false
-- Blacklisted Hosts URLs
2019-08-17 13:15:10 +00:00
d5 = s2 : option ( DynamicList , " blacklist_hosts_url " , translate ( " Blacklisted Hosts URLs " ) , translate ( " URLs to lists of hosts to be blacklisted. " ) )
2018-07-17 00:43:16 +00:00
d5.addremove = false
d5.optional = false
return m