2016-12-19 19:11:25 +00:00
#!/bin/sh
# dns based ad/abuse domain blocking
2020-04-07 20:18:00 +00:00
# Copyright (c) 2015-2020 Dirk Brenken (dev@brenken.org)
2016-12-19 19:11:25 +00:00
# This is free software, licensed under the GNU General Public License v3.
2020-04-07 20:18:00 +00:00
# set (s)hellcheck exceptions
# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188
2019-08-26 12:18:40 +00:00
2016-12-19 19:11:25 +00:00
# set initial defaults
#
2020-04-07 20:18:00 +00:00
export LC_ALL = C
export PATH = "/usr/sbin:/usr/bin:/sbin:/bin"
set -o pipefail
2020-06-12 20:58:44 +00:00
adb_ver = "4.0.6"
2017-09-09 15:35:42 +00:00
adb_enabled = 0
2016-12-19 19:11:25 +00:00
adb_debug = 0
2017-04-25 20:42:12 +00:00
adb_forcedns = 0
2019-08-15 12:02:30 +00:00
adb_maxqueue = 4
2020-04-07 20:18:00 +00:00
adb_dnsfilereset = 0
adb_dnsflush = 0
adb_dnstimeout = 20
adb_safesearch = 0
2020-06-12 20:58:44 +00:00
adb_safesearchlist = ""
2020-04-07 20:18:00 +00:00
adb_safesearchmod = 0
adb_report = 0
adb_trigger = ""
2017-09-09 15:35:42 +00:00
adb_triggerdelay = 0
2020-04-07 20:18:00 +00:00
adb_backup = 1
adb_mail = 0
adb_mailcnt = 0
adb_jail = 0
adb_dns = ""
2017-02-12 07:20:10 +00:00
adb_dnsprefix = "adb_list"
2020-06-12 20:58:44 +00:00
adb_locallist = "blacklist whitelist"
2020-04-07 20:18:00 +00:00
adb_tmpbase = "/tmp"
adb_backupdir = "/tmp"
adb_reportdir = "/tmp"
adb_jaildir = "/tmp"
adb_pidfile = "/var/run/adblock.pid"
2019-08-15 12:02:30 +00:00
adb_blacklist = "/etc/adblock/adblock.blacklist"
2017-11-04 13:00:20 +00:00
adb_whitelist = "/etc/adblock/adblock.whitelist"
2020-04-07 20:18:00 +00:00
adb_ubusservice = "/etc/adblock/adblock.monitor"
adb_mailservice = "/etc/adblock/adblock.mail"
adb_dnsfile = " ${ adb_dnsprefix } .overall "
adb_dnsjail = " ${ adb_dnsprefix } .jail "
adb_srcarc = "/etc/adblock/adblock.sources.gz"
adb_srcfile = " ${ adb_tmpbase } /adb_sources.json "
adb_rtfile = " ${ adb_tmpbase } /adb_runtime.json "
adb_loggercmd = " $( command -v logger) "
adb_dumpcmd = " $( command -v tcpdump) "
adb_lookupcmd = " $( command -v nslookup) "
adb_fetchutil = ""
2019-09-06 08:18:05 +00:00
adb_portlist = "53 853 5353"
2020-04-07 20:18:00 +00:00
adb_repiface = ""
2018-12-26 20:19:21 +00:00
adb_replisten = "53"
2018-12-19 16:32:29 +00:00
adb_repchunkcnt = "5"
adb_repchunksize = "1"
2020-04-07 20:18:00 +00:00
adb_lookupdomain = "example.com"
2017-12-28 16:55:49 +00:00
adb_action = " ${ 1 :- "start" } "
2020-04-07 20:18:00 +00:00
adb_packages = ""
2019-08-15 12:02:30 +00:00
adb_sources = ""
2019-08-26 12:18:40 +00:00
adb_cnt = ""
2016-12-19 19:11:25 +00:00
2020-04-07 20:18:00 +00:00
# load & check adblock environment
2016-12-19 19:11:25 +00:00
#
2019-08-15 12:02:30 +00:00
f_load( )
2016-12-19 19:11:25 +00:00
{
2019-08-29 12:45:01 +00:00
adb_sysver = " $( ubus -S call system board 2>/dev/null | jsonfilter -e '@.model' -e '@.release.description' | \
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " 'BEGIN{ORS=", "}{print $0}' | " ${ adb_awk } " '{print substr($0,1,length($0)-2)}' ) "
f_conf
if [ " ${ adb_action } " != "report" ]
then
f_dns
f_fetch
fi
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
if [ " ${ adb_enabled } " -eq 0 ]
then
f_extconf
f_temp
f_rmdns
f_bgserv "stop"
f_jsnup "disabled"
f_log "info" "adblock is currently disabled, please set the config option 'adb_enabled' to '1' to use this service"
exit 0
fi
}
# check & set environment
#
f_env( )
{
adb_starttime = " $( date "+%s" ) "
f_log "info" " adblock instance started ::: action: ${ adb_action } , priority: ${ adb_nice :- "0" } , pid: ${ $} "
f_jsnup "running"
f_extconf
f_temp
if [ " ${ adb_dnsflush } " -eq 1 ]
then
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
f_dnsup
fi
if [ ! -r " ${ adb_srcfile } " ]
then
if [ -r " ${ adb_srcarc } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
zcat " ${ adb_srcarc } " > " ${ adb_srcfile } "
2018-09-01 06:35:35 +00:00
else
2020-04-07 20:18:00 +00:00
f_log "err" "adblock source archive not found"
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
fi
if [ -r " ${ adb_srcfile } " ]
then
json_load_file " ${ adb_srcfile } "
else
f_log "err" "adblock source file not found"
fi
}
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
# load adblock config
#
f_conf( )
{
local cnt = 0 cnt_max = 10
if [ ! -r "/etc/config/adblock" ] || [ -n " $( uci -q show adblock.@source[ 0] ) " ]
then
2020-05-23 19:15:52 +00:00
if { [ -r "/etc/config/adblock-opkg" ] && [ -z " $( uci -q show adblock-opkg.@source[ 0] ) " ] ; } || \
{ [ -r "/rom/etc/config/adblock" ] && [ -z " $( uci -q show /rom/etc/config/adblock.@source[ 0] ) " ] ; }
2020-04-07 20:18:00 +00:00
then
if [ -r "/etc/config/adblock" ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
cp -pf "/etc/config/adblock" "/etc/config/adblock-backup"
2018-09-01 06:35:35 +00:00
fi
2020-05-23 19:15:52 +00:00
if [ -r "/etc/config/adblock-opkg" ]
then
cp -pf "/etc/config/adblock-opkg" "/etc/config/adblock"
elif [ -r "/rom/etc/config/adblock" ]
then
cp -pf "/rom/etc/config/adblock" "/etc/config/adblock"
fi
2020-04-07 20:18:00 +00:00
f_log "info" "missing or old adblock config replaced with new valid default config"
else
f_log "err" "unrecoverable adblock config error, please re-install the package via opkg with the '--force-reinstall --force-maintainer' options"
fi
fi
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
config_cb( )
{
option_cb( )
{
local option = " ${ 1 } "
local value = " ${ 2 } "
eval " ${ option } =\" ${ value } \" "
}
list_cb( )
{
local option = " ${ 1 } "
local value = " ${ 2 } "
2020-06-12 20:58:44 +00:00
if [ " ${ option } " = "adb_sources" ]
then
eval " ${ option } =\" $( printf "%s" " ${ adb_sources } " ) ${ value } \" "
elif [ " ${ option } " = "adb_safesearchlist" ]
then
eval " ${ option } =\" $( printf "%s" " ${ adb_safesearchlist } " ) ${ value } \" "
fi
2020-04-07 20:18:00 +00:00
}
}
2018-09-01 06:35:35 +00:00
config_load adblock
2020-04-07 20:18:00 +00:00
if [ -z " ${ adb_fetchutil } " ] || [ -z " ${ adb_dns } " ]
2019-08-15 12:02:30 +00:00
then
2020-04-07 20:18:00 +00:00
while [ -z " ${ adb_packages } " ] && [ " ${ cnt } " -le " ${ cnt_max } " ]
do
adb_packages = " $( opkg list-installed 2>/dev/null) "
cnt = $(( cnt+1))
sleep 1
done
if [ -z " ${ adb_packages } " ]
then
f_log "err" "local opkg package repository is not available, please set 'adb_fetchutil' and 'adb_dns' manually"
fi
2019-08-15 12:02:30 +00:00
fi
2020-04-07 20:18:00 +00:00
}
2019-08-15 12:02:30 +00:00
2020-04-07 20:18:00 +00:00
# load dns backend config
#
f_dns( )
{
local util utils dns_up cnt = 0
if [ -z " ${ adb_dns } " ]
then
utils = "knot-resolver named unbound dnsmasq raw"
for util in ${ utils }
do
if [ " ${ util } " = "raw" ] || [ -n " $( printf "%s" " ${ adb_packages } " | grep " ^ ${ util } " ) " ]
2019-08-15 12:02:30 +00:00
then
2020-04-07 20:18:00 +00:00
if [ " ${ util } " = "knot-resolver" ]
then
util = "kresd"
fi
if [ " ${ util } " = "raw" ] || [ -x " $( command -v " ${ util } " ) " ]
then
adb_dns = " ${ util } "
uci_set adblock global adb_dns " ${ util } "
f_uci "adblock"
break
fi
2019-08-15 12:02:30 +00:00
fi
2020-04-07 20:18:00 +00:00
done
elif [ " ${ adb_dns } " != "raw" ] && [ ! -x " $( command -v " ${ adb_dns } " ) " ]
then
unset adb_dns
fi
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
if [ -n " ${ adb_dns } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
case " ${ adb_dns } " in
"dnsmasq" )
adb_dnsinotify = " ${ adb_dnsinotify :- "0" } "
adb_dnsinstance = " ${ adb_dnsinstance :- "0" } "
adb_dnsuser = " ${ adb_dnsuser :- "dnsmasq" } "
adb_dnsdir = " ${ adb_dnsdir :- "/tmp/dnsmasq.d" } "
adb_dnsheader = " ${ adb_dnsheader } "
adb_dnsdeny = " ${ adb_dnsdeny :- " ${ adb_awk } '{print \"address=/\"\$0\"/\"}' " } "
adb_dnsallow = " ${ adb_dnsallow :- " ${ adb_awk } '{print \"local=/\"\$0\"/#\"}' " } "
adb_dnssafesearch = " ${ adb_dnssafesearch :- " ${ adb_awk } -v item=\"\$item\" '{print \"address=/\"\$0\"/\"item\"\"}' " } "
adb_dnsstop = " ${ adb_dnsstop :- "address=/#/" } "
; ;
"unbound" )
adb_dnsinotify = " ${ adb_dnsinotify :- "0" } "
adb_dnsinstance = " ${ adb_dnsinstance :- "0" } "
adb_dnsuser = " ${ adb_dnsuser :- "unbound" } "
adb_dnsdir = " ${ adb_dnsdir :- "/var/lib/unbound" } "
adb_dnsheader = " ${ adb_dnsheader } "
adb_dnsdeny = " ${ adb_dnsdeny :- " ${ adb_awk } '{print \"local-zone: \\042\"\$0\"\\042 static\"}' " } "
adb_dnsallow = " ${ adb_dnsallow :- " ${ adb_awk } '{print \"local-zone: \\042\"\$0\"\\042 transparent\"}' " } "
adb_dnssafesearch = " ${ adb_dnssafesearch :- " ${ adb_awk } -v item=\"\$item\" '{type=\"AAAA\";if(match(item,/^([0-9]{1,3}\.){3}[0-9]{1,3} $/)){type=\"A\"}}{print \"local-data: \\042\"\$0\" \"type\" \"item\"\\042\"}' " } "
adb_dnsstop = " ${ adb_dnsstop :- "local-zone: \".\" static" } "
; ;
"named" )
adb_dnsinotify = " ${ adb_dnsinotify :- "0" } "
adb_dnsinstance = " ${ adb_dnsinstance :- "0" } "
adb_dnsuser = " ${ adb_dnsuser :- "bind" } "
adb_dnsdir = " ${ adb_dnsdir :- "/var/lib/bind" } "
adb_dnsheader = " ${ adb_dnsheader :- "\$TTL 2h\n@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)\n IN NS localhost.\n" } "
adb_dnsdeny = " ${ adb_dnsdeny :- " ${ adb_awk } '{print \"\"\$0\" CNAME .\\n*.\"\$0\" CNAME .\"}' " } "
adb_dnsallow = " ${ adb_dnsallow :- " ${ adb_awk } '{print \"\"\$0\" CNAME rpz-passthru.\\n*.\"\$0\" CNAME rpz-passthru.\"}' " } "
adb_dnssafesearch = " ${ adb_dnssafesearch :- " ${ adb_awk } -v item=\"\$item\" '{print \"\"\$0\" CNAME \"item\".\\n*.\"\$0\" CNAME \"item\".\"}' " } "
adb_dnsstop = " ${ adb_dnsstop :- "* CNAME ." } "
; ;
"kresd" )
adb_dnsinotify = " ${ adb_dnsinotify :- "0" } "
adb_dnsinstance = " ${ adb_dnsinstance :- "0" } "
adb_dnsuser = " ${ adb_dnsuser :- "root" } "
adb_dnsdir = " ${ adb_dnsdir :- "/etc/kresd" } "
2020-05-23 19:15:52 +00:00
adb_dnsheader = " ${ adb_dnsheader :- "\$TTL 2h\n@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)\n" } "
2020-04-07 20:18:00 +00:00
adb_dnsdeny = " ${ adb_dnsdeny :- " ${ adb_awk } '{print \"\"\$0\" CNAME .\\n*.\"\$0\" CNAME .\"}' " } "
adb_dnsallow = " ${ adb_dnsallow :- " ${ adb_awk } '{print \"\"\$0\" CNAME rpz-passthru.\\n*.\"\$0\" CNAME rpz-passthru.\"}' " } "
2020-05-30 04:10:59 +00:00
adb_dnssafesearch = " ${ adb_dnssafesearch :- " ${ adb_awk } -v item=\"\$item\" '{type=\"AAAA\";if(match(item,/^([0-9]{1,3}\.){3}[0-9]{1,3} $/)){type=\"A\"}}{print \"\"\$0\" \"type\" \"item\"\"}' " } "
2020-04-07 20:18:00 +00:00
adb_dnsstop = " ${ adb_dnsstop :- "* CNAME ." } "
; ;
"raw" )
adb_dnsinotify = " ${ adb_dnsinotify :- "0" } "
adb_dnsinstance = " ${ adb_dnsinstance :- "0" } "
adb_dnsuser = " ${ adb_dnsuser :- "root" } "
adb_dnsdir = " ${ adb_dnsdir :- "/tmp" } "
adb_dnsheader = " ${ adb_dnsheader } "
adb_dnsdeny = " ${ adb_dnsdeny :- "0" } "
adb_dnsallow = " ${ adb_dnsallow :- "1" } "
adb_dnssafesearch = " ${ adb_dnssafesearch :- "0" } "
adb_dnsstop = " ${ adb_dnsstop :- "0" } "
; ;
esac
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
if [ " ${ adb_dns } " != "raw" ] && { [ -z " ${ adb_dns } " ] || [ ! -x " $( command -v " ${ adb_dns } " ) " ] ; }
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "err" "dns backend not found, please set 'adb_dns' manually"
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
if [ " ${ adb_dns } " != "raw" ] && { [ " ${ adb_dnsdir } " = " ${ adb_tmpbase } " ] || [ " ${ adb_dnsdir } " = " ${ adb_backupdir } " ] || \
[ " ${ adb_dnsdir } " = " ${ adb_reportdir } " ] || [ " ${ adb_dnsdir } " = " ${ adb_jaildir } " ] ; }
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "err" " dns directory ' ${ adb_dnsdir } ' has been misconfigured, it must not point to the 'adb_tmpbase', 'adb_backupdir', 'adb_reportdir' or 'adb_jaildir' "
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
if [ " ${ adb_action } " = "start" ] && [ -z " ${ adb_trigger } " ]
then
sleep ${ adb_triggerdelay }
fi
if [ " ${ adb_dns } " != "raw" ] && [ " ${ adb_action } " != "stop" ]
2019-09-17 11:59:08 +00:00
then
while [ " ${ cnt } " -le 30 ]
do
dns_up = " $( ubus -S call service list " {\"name\":\" ${ adb_dns } \"} " 2>/dev/null | jsonfilter -l1 -e " @[\" ${ adb_dns } \"].instances.*.running " 2>/dev/null) "
if [ " ${ dns_up } " = "true" ]
then
break
fi
sleep 1
cnt = $(( cnt+1))
done
2020-04-07 20:18:00 +00:00
if [ -n " ${ adb_dnsdir } " ] && [ ! -d " ${ adb_dnsdir } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
mkdir -p " ${ adb_dnsdir } "
if [ " ${ ? } " -eq 0 ]
then
f_log "info" " dns backend directory ' ${ adb_dnsdir } ' created "
else
f_log "err" " dns backend directory ' ${ adb_dnsdir } ' could not be created "
fi
fi
if [ ! -f " ${ adb_dnsdir } / ${ adb_dnsfile } " ]
2019-09-17 11:59:08 +00:00
then
2020-04-07 20:18:00 +00:00
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
fi
2019-09-06 08:18:05 +00:00
2020-04-07 20:18:00 +00:00
if [ " ${ dns_up } " != "true" ]
2019-09-06 08:18:05 +00:00
then
2020-04-07 20:18:00 +00:00
f_dnsup 4
if [ " ${ ? } " -ne 0 ]
then
f_log "err" " dns backend ' ${ adb_dns } ' not running or executable "
fi
fi
if [ " ${ adb_backup } " -eq 1 ] && [ -n " ${ adb_backupdir } " ] && [ ! -d " ${ adb_backupdir } " ]
then
mkdir -p " ${ adb_backupdir } "
if [ " ${ ? } " -eq 0 ]
then
f_log "info" " backup directory ' ${ adb_backupdir } ' created "
else
f_log "err" " backup backend directory ' ${ adb_backupdir } ' could not be created "
fi
fi
if [ -n " ${ adb_jaildir } " ] && [ ! -d " ${ adb_jaildir } " ]
then
mkdir -p " ${ adb_jaildir } "
if [ " ${ ? } " -eq 0 ]
then
f_log "info" " jail directory ' ${ adb_jaildir } ' created "
else
f_log "err" " jail directory ' ${ adb_jaildir } ' could not be created "
fi
2019-09-06 08:18:05 +00:00
fi
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_dns ::: dns: ${ adb_dns } , dns_dir: ${ adb_dnsdir } , dns_file: ${ adb_dnsfile } , dns_user: ${ adb_dnsuser } , dns_inotify: ${ adb_dnsinotify } , dns_instance: ${ adb_dnsinstance } , backup: ${ adb_backup } , backup_dir: ${ adb_backupdir } , jail_dir: ${ adb_jaildir } "
2016-12-19 19:11:25 +00:00
}
2020-04-07 20:18:00 +00:00
# load fetch utility
2016-12-19 19:11:25 +00:00
#
2020-04-07 20:18:00 +00:00
f_fetch( )
2016-12-19 19:11:25 +00:00
{
2020-04-07 20:18:00 +00:00
local util utils cnt = 0
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
if [ -z " ${ adb_fetchutil } " ]
2019-08-15 12:02:30 +00:00
then
2020-04-07 20:18:00 +00:00
utils = "aria2c curl wget uclient-fetch"
for util in ${ utils }
do
if { [ " ${ util } " = "uclient-fetch" ] && [ -n " $( printf "%s" " ${ adb_packages } " | grep "^libustream-" ) " ] ; } || \
{ [ " ${ util } " = "wget" ] && [ -n " $( printf "%s" " ${ adb_packages } " | grep "^wget -" ) " ] ; } || \
[ " ${ util } " = "curl" ] || [ " ${ util } " = "aria2c" ]
then
if [ -x " $( command -v " ${ util } " ) " ]
then
adb_fetchutil = " ${ util } "
uci_set adblock global adb_fetchutil " ${ util } "
f_uci "adblock"
break
fi
fi
done
elif [ ! -x " $( command -v " ${ adb_fetchutil } " ) " ]
2019-12-10 14:01:16 +00:00
then
2020-04-07 20:18:00 +00:00
unset adb_fetchutil
2019-12-10 14:01:16 +00:00
fi
2018-09-01 06:35:35 +00:00
case " ${ adb_fetchutil } " in
2020-04-07 20:18:00 +00:00
"aria2c" )
adb_fetchparm = " ${ adb_fetchparm :- "--timeout=20 --allow-overwrite=true --auto-file-renaming=false --check-certificate=true --dir= -o" } "
2018-09-01 06:35:35 +00:00
; ;
2019-08-26 12:18:40 +00:00
"curl" )
2020-04-07 20:18:00 +00:00
adb_fetchparm = " ${ adb_fetchparm :- "--connect-timeout 20 --silent --show-error --location -o" } "
2018-09-01 06:35:35 +00:00
; ;
2020-04-07 20:18:00 +00:00
"uclient-fetch" )
adb_fetchparm = " ${ adb_fetchparm :- "--timeout=20 -O" } "
; ;
"wget" )
adb_fetchparm = " ${ adb_fetchparm :- "--no-cache --no-cookies --max-redirect=0 --timeout=20 -O" } "
2018-09-01 06:35:35 +00:00
; ;
esac
2020-04-07 20:18:00 +00:00
if [ -n " ${ adb_fetchutil } " ] && [ -n " ${ adb_fetchparm } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
adb_fetchutil = " $( command -v " ${ adb_fetchutil } " ) "
else
f_log "err" "download utility with SSL support not found, please install 'uclient-fetch' with a 'libustream-*' variant or another download utility like 'wget', 'curl' or 'aria2'"
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_fetch ::: fetch_util: ${ adb_fetchutil :- "-" } , fetch_parm: ${ adb_fetchparm :- "-" } "
2018-01-10 18:33:42 +00:00
}
2020-04-07 20:18:00 +00:00
# create temporary files, directories and set dependent options
2018-01-10 18:33:42 +00:00
#
f_temp( )
{
2020-04-07 20:18:00 +00:00
local cpu core cores
cpu = " $( grep -c '^processor' /proc/cpuinfo 2>/dev/null) "
core = " $( grep -cm1 '^core id' /proc/cpuinfo 2>/dev/null) "
if [ " ${ cpu } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
cpu = 1
fi
if [ " ${ core } " -eq 0 ]
2019-08-15 12:02:30 +00:00
then
2020-04-07 20:18:00 +00:00
core = 1
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
cores = $(( cpu*core))
if [ -d " ${ adb_tmpbase } " ]
then
adb_tmpdir = " $( mktemp -p " ${ adb_tmpbase } " -d) "
adb_tmpload = " $( mktemp -p " ${ adb_tmpdir } " -tu) "
adb_tmpfile = " $( mktemp -p " ${ adb_tmpdir } " -tu) "
adb_srtopts = " --temporary-directory= ${ adb_tmpdir } --compress-program=gzip --batch-size=32 --parallel= ${ cores } "
else
f_log "err" " the temp base directory ' ${ adb_tmpbase } ' does not exist/is not mounted yet, please create the directory or raise the 'adb_triggerdelay' to defer the adblock start "
fi
if [ ! -s " ${ adb_pidfile } " ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s" " ${ $} " > " ${ adb_pidfile } "
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_temp ::: tmp_base: ${ adb_tmpbase :- "-" } , tmp_dir: ${ adb_tmpdir :- "-" } , cores: ${ cores :- "-" } , sort_options: ${ adb_srtopts } , pid_file: ${ adb_pidfile :- "-" } "
2016-12-19 19:11:25 +00:00
}
2018-07-21 20:27:04 +00:00
# remove temporary files and directories
2017-12-02 17:39:03 +00:00
#
2017-12-28 16:55:49 +00:00
f_rmtemp( )
2017-12-02 17:39:03 +00:00
{
2018-09-01 06:35:35 +00:00
if [ -d " ${ adb_tmpdir } " ]
then
rm -rf " ${ adb_tmpdir } "
fi
2020-04-07 20:18:00 +00:00
rm -f " ${ adb_srcfile } "
2018-09-01 06:35:35 +00:00
> " ${ adb_pidfile } "
2020-04-07 20:18:00 +00:00
f_log "debug" " f_rmtemp ::: tmp_dir: ${ adb_tmpdir :- "-" } , src_file: ${ adb_srcfile :- "-" } , pid_file: ${ adb_pidfile :- "-" } "
2017-12-28 16:55:49 +00:00
}
2020-04-07 20:18:00 +00:00
# remove dns related files
2017-12-28 16:55:49 +00:00
#
f_rmdns( )
{
2020-04-07 20:18:00 +00:00
local status
2019-09-17 11:59:08 +00:00
status = " $( ubus -S call service list '{"name":"adblock"}' 2>/dev/null | jsonfilter -l1 -e '@["adblock"].instances.*.running' 2>/dev/null) "
2020-04-07 20:18:00 +00:00
if [ " ${ adb_dns } " = "raw" ] || { [ -n " ${ adb_dns } " ] && [ -n " ${ status } " ] ; }
2018-09-01 06:35:35 +00:00
then
> " ${ adb_rtfile } "
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ]
2019-09-17 11:59:08 +00:00
then
2020-04-07 20:18:00 +00:00
rm -f " ${ adb_backupdir } / ${ adb_dnsprefix } " .*.gz
2019-09-17 11:59:08 +00:00
fi
2020-04-07 20:18:00 +00:00
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
f_dnsup 4
2018-09-01 06:35:35 +00:00
fi
2019-09-17 11:59:08 +00:00
f_rmtemp
2020-04-07 20:18:00 +00:00
f_log "debug" " f_rmdns ::: dns: ${ adb_dns } , status: ${ status :- "-" } , dns_dir: ${ adb_dnsdir } , dns_file: ${ adb_dnsfile } , rt_file: ${ adb_rtfile } , backup_dir: ${ adb_backupdir :- "-" } "
2017-12-28 16:55:49 +00:00
}
# commit uci changes
#
2018-01-05 17:54:45 +00:00
f_uci( )
2017-12-28 16:55:49 +00:00
{
2018-09-01 06:35:35 +00:00
local change config = " ${ 1 } "
if [ -n " ${ config } " ]
then
2020-04-07 20:18:00 +00:00
change = " $( uci -q changes " ${ config } " | " ${ adb_awk } " '{ORS=" "; print $0}' ) "
2018-09-01 06:35:35 +00:00
if [ -n " ${ change } " ]
then
uci_commit " ${ config } "
case " ${ config } " in
2019-08-15 12:02:30 +00:00
"firewall" )
2019-08-26 12:18:40 +00:00
"/etc/init.d/firewall" reload >/dev/null 2>& 1
2018-09-01 06:35:35 +00:00
; ;
2020-04-07 20:18:00 +00:00
"resolver" )
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2019-08-21 09:16:43 +00:00
f_count
f_jsnup "running"
2019-08-26 12:18:40 +00:00
" /etc/init.d/ ${ adb_dns } " reload >/dev/null 2>& 1
2018-09-01 06:35:35 +00:00
; ;
esac
fi
2019-02-02 07:38:56 +00:00
f_log "debug" " f_uci ::: config: ${ config } , change: ${ change } "
2018-09-01 06:35:35 +00:00
fi
2017-12-28 16:55:49 +00:00
}
2020-04-07 20:18:00 +00:00
# get list counter
2017-12-28 16:55:49 +00:00
#
f_count( )
{
2020-04-07 20:18:00 +00:00
local file mode = " ${ 1 } " name = " ${ 2 } "
2018-09-01 06:35:35 +00:00
adb_cnt = 0
2019-08-26 12:18:40 +00:00
case " ${ mode } " in
"blacklist" )
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_tmpfile } . ${ name } " ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpfile } . ${ name } " ) "
2019-08-26 12:18:40 +00:00
fi
; ;
"whitelist" )
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_tmpdir } /tmp.raw. ${ name } " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpdir } /tmp.raw. ${ name } " ) "
rm -f " ${ adb_tmpdir } /tmp.raw. ${ name } "
fi
; ;
"safesearch" )
if [ -s " ${ adb_tmpdir } /tmp.safesearch. ${ name } " ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpdir } /tmp.safesearch. ${ name } " ) "
2019-08-26 12:18:40 +00:00
fi
; ;
"merge" )
if [ -s " ${ adb_tmpdir } / ${ adb_dnsfile } " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpdir } / ${ adb_dnsfile } " ) "
fi
; ;
2019-09-06 08:18:05 +00:00
"download" | "backup" | "restore" )
2019-08-26 12:18:40 +00:00
if [ -s " ${ src_tmpfile } " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ src_tmpfile } " ) "
fi
; ;
"final" )
if [ -s " ${ adb_dnsdir } / ${ adb_dnsfile } " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
if [ -s " ${ adb_tmpdir } /tmp.add.whitelist " ]
then
2020-04-07 20:18:00 +00:00
adb_cnt = $(( adb_cnt-$( wc -l 2>/dev/null < " ${ adb_tmpdir } /tmp.add.whitelist " ) ))
2019-08-26 12:18:40 +00:00
fi
2020-04-07 20:18:00 +00:00
for file in " ${ adb_tmpdir } /tmp.safesearch " .*
do
if [ -r " ${ file } " ]
then
adb_cnt = $(( adb_cnt-$( wc -l 2>/dev/null < " ${ file } " ) ))
fi
done
if [ -n " ${ adb_dnsheader } " ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
adb_cnt = $(( ( adb_cnt-$( printf " ${ adb_dnsheader } " | grep -c "^" ) ) / 2 ))
2019-08-26 12:18:40 +00:00
fi
fi
; ;
esac
2017-12-28 16:55:49 +00:00
}
2017-12-02 17:39:03 +00:00
2017-12-28 16:55:49 +00:00
# set external config options
#
f_extconf( )
{
2020-04-11 19:46:59 +00:00
local config config_dir config_file port fwcfg
2018-09-01 06:35:35 +00:00
case " ${ adb_dns } " in
2019-08-15 12:02:30 +00:00
"dnsmasq" )
2019-08-26 12:18:40 +00:00
config = "dhcp"
2020-04-11 19:46:59 +00:00
config_dir = " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " confdir | grep -Fo " ${ adb_dnsdir } " ) "
if [ " ${ adb_enabled } " -eq 1 ] && [ -z " ${ config_dir } " ]
then
uci_set dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " confdir " ${ adb_dnsdir } " 2>/dev/null
fi
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"kresd" )
2019-08-26 12:18:40 +00:00
config = "resolver"
2020-04-11 19:46:59 +00:00
config_file = " $( uci_get resolver kresd rpz_file | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
if [ " ${ adb_enabled } " -eq 1 ] && [ -z " ${ config_file } " ]
2018-09-01 06:35:35 +00:00
then
uci -q add_list resolver.kresd.rpz_file= " ${ adb_dnsdir } / ${ adb_dnsfile } "
2020-04-11 19:46:59 +00:00
elif [ " ${ adb_enabled } " -eq 0 ] && [ -n " ${ config_file } " ]
2018-09-01 06:35:35 +00:00
then
uci -q del_list resolver.kresd.rpz_file= " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
; ;
esac
2019-08-26 12:18:40 +00:00
f_uci " ${ config } "
2018-09-01 06:35:35 +00:00
2019-08-26 12:18:40 +00:00
config = "firewall"
2019-09-06 08:18:05 +00:00
fwcfg = " $( uci -qNX show " ${ config } " ) "
2019-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 1 ] && [ " ${ adb_forcedns } " -eq 1 ] && \
2019-09-06 08:18:05 +00:00
[ " $( /etc/init.d/firewall enabled; printf "%u" ${ ? } ) " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2019-09-06 08:18:05 +00:00
for port in ${ adb_portlist }
2018-09-01 06:35:35 +00:00
do
2019-09-06 08:18:05 +00:00
if [ -z " $( printf "%s" " ${ fwcfg } " | grep -Fo -m1 " adblock_dns_ ${ port } " ) " ]
then
2020-04-07 20:18:00 +00:00
uci -q batch <<-EOC
set firewall." adblock_dns_ ${ port } " = "redirect"
set firewall." adblock_dns_ ${ port } " .name= " Adblock DNS, port ${ port } "
set firewall." adblock_dns_ ${ port } " .src= "lan"
set firewall." adblock_dns_ ${ port } " .proto= "tcp udp"
set firewall." adblock_dns_ ${ port } " .src_dport= " ${ port } "
set firewall." adblock_dns_ ${ port } " .dest_port= " ${ port } "
set firewall." adblock_dns_ ${ port } " .target= "DNAT"
EOC
2019-09-06 08:18:05 +00:00
fi
2018-09-01 06:35:35 +00:00
done
2019-09-06 08:18:05 +00:00
elif [ " ${ adb_enabled } " -eq 0 ] || [ " ${ adb_forcedns } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2019-09-06 08:18:05 +00:00
for port in ${ adb_portlist }
2018-09-01 06:35:35 +00:00
do
2019-09-06 08:18:05 +00:00
if [ -n " $( printf "%s" " ${ fwcfg } " | grep -Fo -m1 " adblock_dns_ ${ port } " ) " ]
then
uci_remove firewall " adblock_dns_ ${ port } "
fi
2018-09-01 06:35:35 +00:00
done
fi
2019-08-26 12:18:40 +00:00
f_uci " ${ config } "
2017-12-02 17:39:03 +00:00
}
2020-04-07 20:18:00 +00:00
# restart dns backend
2016-12-19 19:11:25 +00:00
#
2018-01-05 17:54:45 +00:00
f_dnsup( )
2016-12-19 19:11:25 +00:00
{
2020-04-07 20:18:00 +00:00
local dns_service dns_up dns_pid dns_procfile restart_rc cnt = 0 out_rc = 4 in_rc = " ${ 1 :- 0 } "
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
if [ " ${ adb_dns } " = "raw" ] || { [ " ${ in_rc } " -eq 0 ] && [ " ${ adb_dnsinotify } " -eq 1 ] ; }
2018-09-01 06:35:35 +00:00
then
2019-09-06 08:18:05 +00:00
out_rc = 0
2019-08-26 12:18:40 +00:00
else
2020-04-07 20:18:00 +00:00
" /etc/init.d/ ${ adb_dns } " restart >/dev/null 2>& 1
restart_rc = " ${ ? } "
fi
if [ " ${ restart_rc } " = "0" ]
then
while [ " ${ cnt } " -le " ${ adb_dnstimeout } " ]
2019-09-06 08:18:05 +00:00
do
dns_service = " $( ubus -S call service list " {\"name\":\" ${ adb_dns } \"} " ) "
dns_up = " $( printf "%s" " ${ dns_service } " | jsonfilter -l1 -e " @[\" ${ adb_dns } \"].instances.*.running " ) "
dns_pid = " $( printf "%s" " ${ dns_service } " | jsonfilter -l1 -e " @[\" ${ adb_dns } \"].instances.*.pid " ) "
dns_procfile = " $( ls -l " /proc/ ${ dns_pid } /fd " 2>/dev/null | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
if [ " ${ dns_up } " = "true" ] && [ -n " ${ dns_pid } " ] && [ -z " ${ dns_procfile } " ]
then
2020-04-07 20:18:00 +00:00
if [ -x " ${ adb_lookupcmd } " ] && [ " ${ adb_lookupdomain } " != "false" ]
then
" ${ adb_lookupcmd } " " ${ adb_lookupdomain } " >/dev/null 2>& 1
if [ " ${ ? } " -eq 0 ]
then
out_rc = 0
break
fi
else
sleep ${ adb_dnstimeout }
cnt = ${ adb_dnstimeout }
out_rc = 0
break
fi
2019-09-06 08:18:05 +00:00
fi
cnt = $(( cnt+1))
sleep 1
done
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_dnsup ::: lookup_util: ${ adb_lookupcmd :- "-" } , lookup_domain: ${ adb_lookupdomain :- "-" } , restart_rc: ${ restart_rc :- "-" } , dns_timeout: ${ adb_dnstimeout } , dns_cnt: ${ cnt } , in_rc: ${ in_rc } , out_rc: ${ out_rc } "
2019-08-26 12:18:40 +00:00
return " ${ out_rc } "
2016-12-19 19:11:25 +00:00
}
2017-12-28 16:55:49 +00:00
# backup/restore/remove blocklists
2016-12-19 19:11:25 +00:00
#
f_list( )
{
2020-04-07 20:18:00 +00:00
local hold file rset item array safe_url safe_ips safe_cname safe_domains out_rc mode = " ${ 1 } " src_name = " ${ 2 :- " ${ src_name } " } " in_rc = " ${ src_rc :- 0 } " cnt = 1 ffiles = " -maxdepth 1 -name ${ adb_dnsprefix } .*.gz "
2018-09-01 06:35:35 +00:00
case " ${ mode } " in
2019-08-26 12:18:40 +00:00
"blacklist" | "whitelist" )
2020-04-07 20:18:00 +00:00
src_name = " ${ mode } "
if [ " ${ src_name } " = "blacklist" ] && [ -s " ${ adb_blacklist } " ]
2019-08-15 12:02:30 +00:00
then
2020-05-24 19:40:58 +00:00
rset = " /^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]| $)/{print tolower(\$1)} "
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " " ${ rset } " " ${ adb_blacklist } " | \
" ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' > " ${ adb_tmpdir } /tmp.raw. ${ src_name } "
sort ${ adb_srtopts } -u " ${ adb_tmpdir } /tmp.raw. ${ src_name } " 2>/dev/null > " ${ adb_tmpfile } . ${ src_name } "
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
2020-04-07 20:18:00 +00:00
rm -f " ${ adb_tmpdir } /tmp.raw. ${ src_name } "
elif [ " ${ src_name } " = "whitelist" ] && [ -s " ${ adb_whitelist } " ]
2019-08-15 12:02:30 +00:00
then
2020-05-24 19:40:58 +00:00
rset = " /^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]| $)/{print tolower(\$1)} "
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " " ${ rset } " " ${ adb_whitelist } " > " ${ adb_tmpdir } /tmp.raw. ${ src_name } "
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
if [ " ${ out_rc } " -eq 0 ]
2019-08-15 12:02:30 +00:00
then
2020-05-24 19:40:58 +00:00
rset = " /^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]| $)/{gsub(\"\\\\.\",\"\\\\.\",\$1);print tolower(\"^(|.*\\\\.)\"\$1\" $\")} "
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " " ${ rset } " " ${ adb_tmpdir } /tmp.raw. ${ src_name } " > " ${ adb_tmpdir } /tmp.rem. ${ src_name } "
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
2020-04-07 20:18:00 +00:00
if [ " ${ out_rc } " -eq 0 ] && [ " ${ adb_dnsallow } " != "1" ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
eval " ${ adb_dnsallow } " " ${ adb_tmpdir } /tmp.raw. ${ src_name } " > " ${ adb_tmpdir } /tmp.add. ${ src_name } "
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
2020-04-07 20:18:00 +00:00
if [ " ${ out_rc } " -eq 0 ] && [ " ${ adb_jail } " = "1" ] && [ " ${ adb_dnsstop } " != "0" ]
then
> " ${ adb_jaildir } / ${ adb_dnsjail } "
if [ -n " ${ adb_dnsheader } " ]
then
printf " ${ adb_dnsheader } " >> " ${ adb_jaildir } / ${ adb_dnsjail } "
fi
cat " ${ adb_tmpdir } /tmp.add. ${ src_name } " >> " ${ adb_jaildir } / ${ adb_dnsjail } "
printf "%s\n" " ${ adb_dnsstop } " >> " ${ adb_jaildir } / ${ adb_dnsjail } "
fi
2019-08-26 12:18:40 +00:00
fi
2019-08-15 12:02:30 +00:00
fi
2020-04-07 20:18:00 +00:00
fi
; ;
"safesearch" )
case " ${ src_name } " in
"google" )
2020-05-24 19:40:58 +00:00
rset = " /^(\\.[[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]| $)/{printf \"%s\n%s\n\",tolower(\"www\"\$1),tolower(substr(\$1,2,length(\$1)))} "
2020-04-07 20:18:00 +00:00
safe_url = "https://www.google.com/supported_domains"
safe_ips = "216.239.38.120 2001:4860:4802:32::78"
safe_cname = "forcesafesearch.google.com"
safe_domains = " ${ adb_tmpdir } /tmp.load.safesearch. ${ src_name } "
if [ " ${ adb_backup } " -eq 1 ] && [ -s " ${ adb_backupdir } /safesearch. ${ src_name } .gz " ]
then
zcat " ${ adb_backupdir } /safesearch. ${ src_name } .gz " > " ${ safe_domains } "
out_rc = " ${ ? } "
else
" ${ adb_fetchutil } " ${ adb_fetchparm } " ${ safe_domains } " " ${ safe_url } " 2>/dev/null
out_rc = " ${ ? } "
if [ " ${ adb_backup } " -eq 1 ] && [ " ${ out_rc } " -eq 0 ]
then
gzip -cf " ${ safe_domains } " > " ${ adb_backupdir } /safesearch. ${ src_name } .gz "
fi
fi
if [ " ${ out_rc } " -eq 0 ]
then
" ${ adb_awk } " " ${ rset } " " ${ safe_domains } " > " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
out_rc = " ${ ? } "
fi
; ;
"bing" )
safe_ips = "204.79.197.220 ::FFFF:CC4F:C5DC"
safe_cname = "strict.bing.com"
safe_domains = "www.bing.com"
printf "%s\n" ${ safe_domains } > " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
out_rc = " ${ ? } "
; ;
"duckduckgo" )
safe_ips = "50.16.250.179 54.208.102.2 52.204.96.252"
safe_cname = "safe.duckduckgo.com"
safe_domains = "duckduckgo.com"
printf "%s\n" ${ safe_domains } > " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
out_rc = " ${ ? } "
; ;
"pixabay" )
safe_ips = "104.18.82.97 2606:4700::6812:8d57 2606:4700::6812:5261"
safe_cname = "safesearch.pixabay.com"
safe_domains = "pixabay.com"
printf "%s\n" ${ safe_domains } > " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
out_rc = " ${ ? } "
; ;
"yandex" )
safe_ips = "213.180.193.56"
safe_cname = "familysearch.yandex.ru"
safe_domains = "ya.ru yandex.ru yandex.com yandex.com.tr yandex.ua yandex.by yandex.ee yandex.lt yandex.lv yandex.md yandex.uz yandex.tm yandex.tj yandex.az"
printf "%s\n" ${ safe_domains } > " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
out_rc = " ${ ? } "
; ;
"youtube" )
if [ " ${ adb_safesearchmod } " -eq 0 ]
then
safe_ips = "216.239.38.120 2001:4860:4802:32::78"
safe_cname = "restrict.youtube.com"
else
safe_ips = "216.239.38.119 2001:4860:4802:32::77"
safe_cname = "restrictmoderate.youtube.com"
fi
safe_domains = "www.youtube.com m.youtube.com youtubei.googleapis.com youtube.googleapis.com www.youtube-nocookie.com"
printf "%s\n" ${ safe_domains } > " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
out_rc = " ${ ? } "
; ;
esac
if [ " ${ out_rc } " -eq 0 ]
then
> " ${ adb_tmpdir } /tmp.safesearch. ${ src_name } "
2020-05-30 04:10:59 +00:00
if [ " ${ adb_dns } " = "named" ]
2020-04-07 20:18:00 +00:00
then
array = " ${ safe_cname } "
else
array = " ${ safe_ips } "
fi
for item in ${ array }
do
eval " ${ adb_dnssafesearch } " " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } " >> " ${ adb_tmpdir } /tmp.safesearch. ${ src_name } "
if [ " ${ ? } " -ne 0 ]
then
rm -f " ${ adb_tmpdir } /tmp.safesearch. ${ src_name } "
break
fi
done
out_rc = " ${ ? } "
rm -f " ${ adb_tmpdir } /tmp.raw.safesearch. ${ src_name } "
2019-08-15 12:02:30 +00:00
fi
; ;
"backup" )
2020-04-07 20:18:00 +00:00
(
gzip -cf " ${ src_tmpfile } " > " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz "
out_rc = " ${ ? } "
) &
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"restore" )
2019-09-06 08:18:05 +00:00
if [ -n " ${ src_name } " ] && [ -s " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
zcat " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz " > " ${ src_tmpfile } "
2019-09-06 08:18:05 +00:00
out_rc = " ${ ? } "
elif [ -z " ${ src_name } " ]
then
for file in " ${ adb_backupdir } / ${ adb_dnsprefix } " .*.gz
do
2020-04-07 20:18:00 +00:00
if [ -r " ${ file } " ]
2019-09-06 08:18:05 +00:00
then
2020-04-07 20:18:00 +00:00
name = " ${ file ##*/ } "
name = " ${ name %.* } "
zcat " ${ file } " > " ${ adb_tmpfile } . ${ name } " &
hold = $(( cnt%adb_maxqueue))
if [ " ${ hold } " -eq 0 ]
then
wait
fi
cnt = $(( cnt+1))
2019-09-06 08:18:05 +00:00
fi
done
wait
out_rc = " ${ ? } "
2020-04-07 20:18:00 +00:00
else
out_rc = 4
fi
if [ " ${ adb_action } " != "start" ] && [ " ${ adb_action } " != "resume" ] && [ -n " ${ src_name } " ] && [ " ${ out_rc } " -ne 0 ]
then
adb_sources = " ${ adb_sources / ${ src_name } } "
2018-09-01 06:35:35 +00:00
fi
; ;
2019-08-15 12:02:30 +00:00
"remove" )
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
rm " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz " 2>/dev/null
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
out_rc = " ${ ? } "
adb_sources = " ${ adb_sources / ${ src_name } } "
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"merge" )
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ]
then
for src_name in ${ adb_sources }
do
ffiles = " ${ ffiles } -a ! -name ${ adb_dnsprefix } . ${ src_name } .gz "
done
if [ " ${ adb_safesearch } " -eq 1 ] && [ " ${ adb_dnssafesearch } " != "0" ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
ffiles = " ${ ffiles } -a ! -name safesearch.google.gz "
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
find " ${ adb_backupdir } " ${ ffiles } -print0 2>/dev/null | xargs -0 rm 2>/dev/null
fi
unset src_name
sort ${ adb_srtopts } -mu " ${ adb_tmpfile } " .* 2>/dev/null > " ${ adb_tmpdir } / ${ adb_dnsfile } "
out_rc = " ${ ? } "
2019-09-06 08:18:05 +00:00
rm -f " ${ adb_tmpfile } " .*
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"final" )
2020-04-07 20:18:00 +00:00
unset src_name
if [ -n " ${ adb_dnsheader } " ]
then
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
else
> " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
2019-08-15 12:02:30 +00:00
if [ -s " ${ adb_tmpdir } /tmp.add.whitelist " ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
cat " ${ adb_tmpdir } /tmp.add.whitelist " >> " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
for file in " ${ adb_tmpdir } /tmp.safesearch " .*
do
if [ -r " ${ file } " ]
then
cat " ${ file } " >> " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
done
if [ " ${ adb_dnsdeny } " != "0" ]
2018-09-01 06:35:35 +00:00
then
eval " ${ adb_dnsdeny } " " ${ adb_tmpdir } / ${ adb_dnsfile } " >> " ${ adb_dnsdir } / ${ adb_dnsfile } "
2020-04-07 20:18:00 +00:00
else
mv " ${ adb_tmpdir } / ${ adb_dnsfile } " " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
fi
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
; ;
esac
2020-04-07 20:18:00 +00:00
f_count " ${ mode } " " ${ src_name } "
2019-09-06 08:18:05 +00:00
out_rc = " ${ out_rc :- " ${ in_rc } " } "
2019-08-26 12:18:40 +00:00
f_log "debug" " f_list ::: name: ${ src_name :- "-" } , mode: ${ mode } , cnt: ${ adb_cnt } , in_rc: ${ in_rc } , out_rc: ${ out_rc } "
return " ${ out_rc } "
2016-12-19 19:11:25 +00:00
}
2017-12-28 16:55:49 +00:00
# top level domain compression
2017-08-04 09:01:15 +00:00
#
2018-01-05 17:54:45 +00:00
f_tld( )
2017-08-04 09:01:15 +00:00
{
2020-04-07 20:18:00 +00:00
local cnt cnt_tld source = " ${ 1 } " temp_tld = " ${ 1 } .tld "
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " '{if(NR==1){tld=$NF};while(getline){if(index($NF,tld".")==0){print tld;tld=$NF}}print tld}' " ${ source } " | \
" ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' > " ${ temp_tld } "
if [ " ${ ? } " -eq 0 ]
2019-08-15 12:02:30 +00:00
then
2020-04-07 20:18:00 +00:00
mv -f " ${ temp_tld } " " ${ source } "
cnt_tld = " $( wc -l 2>/dev/null < " ${ source } " ) "
2019-08-15 12:02:30 +00:00
else
2020-04-07 20:18:00 +00:00
rm -f " ${ temp_tld } "
2019-01-09 10:52:19 +00:00
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_tld ::: source: ${ source } , cnt: ${ adb_cnt :- "-" } , cnt_tld: ${ cnt_tld :- "-" } "
2017-08-04 09:01:15 +00:00
}
2017-12-28 16:55:49 +00:00
# suspend/resume adblock processing
2016-12-19 19:11:25 +00:00
#
f_switch( )
{
2020-06-12 20:58:44 +00:00
local status entry done = "false" mode = " ${ 1 } "
2018-11-30 19:04:16 +00:00
2018-12-19 16:32:29 +00:00
json_load_file " ${ adb_rtfile } " >/dev/null 2>& 1
2019-08-15 12:02:30 +00:00
json_select "data" >/dev/null 2>& 1
2018-11-30 19:04:16 +00:00
json_get_var status "adblock_status"
if [ " ${ mode } " = "suspend" ] && [ " ${ status } " = "enabled" ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
f_env
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2019-08-26 12:18:40 +00:00
f_count
2019-08-15 12:02:30 +00:00
done = "true"
2018-11-30 19:04:16 +00:00
elif [ " ${ mode } " = "resume" ] && [ " ${ status } " = "paused" ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
f_env
f_main
2019-08-15 12:02:30 +00:00
done = "true"
2018-09-01 06:35:35 +00:00
fi
2019-08-15 12:02:30 +00:00
if [ " ${ done } " = "true" ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
if [ " ${ mode } " = "suspend" ]
then
f_bgserv "stop"
2020-04-07 20:18:00 +00:00
f_dnsup
2019-08-15 12:02:30 +00:00
fi
if [ " ${ mode } " = "resume" ]
then
f_bgserv "start"
fi
2018-09-01 06:35:35 +00:00
f_jsnup " ${ mode } "
f_log "info" " ${ mode } adblock processing "
fi
2020-04-07 20:18:00 +00:00
f_rmtemp
2016-12-19 19:11:25 +00:00
}
2017-12-28 16:55:49 +00:00
# query blocklist for certain (sub-)domains
2016-12-23 06:15:11 +00:00
#
f_query( )
{
2020-04-07 20:18:00 +00:00
local search result prefix suffix field query_start query_end query_timeout = 30 domain = " ${ 1 } " tld = " ${ 1 #*. } "
2018-09-01 06:35:35 +00:00
if [ -z " ${ domain } " ] || [ " ${ domain } " = " ${ tld } " ]
then
2020-04-07 20:18:00 +00:00
printf "%s\\n" "::: invalid input, please submit a single (sub-)domain :::"
2018-09-01 06:35:35 +00:00
else
case " ${ adb_dns } " in
2019-08-15 12:02:30 +00:00
"dnsmasq" )
2020-04-07 20:18:00 +00:00
prefix = ".*[\\/\\.]"
suffix = "(\\/)"
field = 2
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"unbound" )
prefix = ".*[\"\\.]"
2018-09-01 06:35:35 +00:00
suffix = "(static)"
field = 3
; ;
2019-08-15 12:02:30 +00:00
"named" )
prefix = "[^\\*].*[\\.]"
suffix = "( \\.)"
2018-09-01 06:35:35 +00:00
field = 1
; ;
2019-08-15 12:02:30 +00:00
"kresd" )
prefix = "[^\\*].*[\\.]"
suffix = "( \\.)"
2018-09-01 06:35:35 +00:00
field = 1
; ;
2020-04-07 20:18:00 +00:00
"raw" )
prefix = ".*[\\.]"
suffix = ""
field = 1
; ;
2018-09-01 06:35:35 +00:00
esac
2020-04-07 20:18:00 +00:00
query_start = " $( date "+%s" ) "
if [ " ${ adb_dnsfilereset } " -eq 0 ]
2019-08-15 12:02:30 +00:00
then
while [ " ${ domain } " != " ${ tld } " ]
do
2019-08-26 12:18:40 +00:00
search = " ${ domain //[+*~% \$ & \" \' ]/ } "
search = " ${ search //./ \\ . } "
2020-04-07 20:18:00 +00:00
result = " $( " ${ adb_awk } " -F '/|\"|\t| ' " /^( ${ search } | ${ prefix } + ${ search } .* ${ suffix } ) $/{i++;if(i<=9){printf \" + %s\\n\",\$ ${ field } }else if(i==10){printf \" + %s\\n\",\"[...]\";exit}} " " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
printf "%s\\n%s\\n%s\\n" ":::" " ::: domain ' ${ domain } ' in active blocklist " ":::"
2019-08-26 12:18:40 +00:00
printf "%s\\n\\n" " ${ result :- " - no match" } "
2019-08-15 12:02:30 +00:00
domain = " ${ tld } "
tld = " ${ domain #*. } "
done
fi
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ] && [ -d " ${ adb_backupdir } " ]
2019-01-09 10:52:19 +00:00
then
2019-08-26 12:18:40 +00:00
search = " ${ 1 //[+*~% \$ & \" \' ]/ } "
search = " ${ search //./ \\ . } "
2020-04-07 20:18:00 +00:00
printf "%s\\n%s\\n%s\\n" ":::" " ::: domain ' ${ 1 } ' in backups and black-/whitelist " ":::"
2019-08-26 12:18:40 +00:00
for file in " ${ adb_backupdir } / ${ adb_dnsprefix } " .*.gz " ${ adb_blacklist } " " ${ adb_whitelist } "
2019-01-09 10:52:19 +00:00
do
2019-08-15 12:02:30 +00:00
suffix = " ${ file ##*. } "
if [ " ${ suffix } " = "gz" ]
then
2020-04-07 20:18:00 +00:00
zcat " ${ file } " 2>/dev/null | \
" ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' | " ${ adb_awk } " -v f = " ${ file ##*/ } " " BEGIN{rc=1};/^( $search |.*\\. ${ search } ) $/{i++;if(i<=3){printf \" + %-30s%s\\n\",f,\$1;rc=0}else if(i==4){printf \" + %-30s%s\\n\",f,\"[...]\"}};END{exit rc} "
2019-08-15 12:02:30 +00:00
else
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " -v f = " ${ file ##*/ } " " BEGIN{rc=1};/^( $search |.*\\. ${ search } ) $/{i++;if(i<=3){printf \" + %-30s%s\\n\",f,\$1;rc=0}else if(i==4){printf \" + %-30s%s\\n\",f,\"[...]\"}};END{exit rc} " " ${ file } "
fi
if [ " ${ ? } " -eq 0 ]
then
result = "true"
query_end = " $( date "+%s" ) "
if [ " $(( query_end-query_start)) " -gt " ${ query_timeout } " ]
then
printf "%s\\n\\n" " - [...]"
break
fi
2019-08-15 12:02:30 +00:00
fi
2019-01-09 10:52:19 +00:00
done
2020-04-07 20:18:00 +00:00
if [ " ${ result } " != "true" ]
then
printf "%s\\n\\n" " - no match"
fi
2019-01-09 10:52:19 +00:00
fi
2018-09-01 06:35:35 +00:00
fi
2016-12-23 06:15:11 +00:00
}
2017-12-28 16:55:49 +00:00
# update runtime information
2017-09-09 15:35:42 +00:00
#
2018-01-05 17:54:45 +00:00
f_jsnup( )
2017-09-09 15:35:42 +00:00
{
2020-04-07 20:18:00 +00:00
local runtime utils memory bg_pid status = " ${ 1 :- "enabled" } "
2018-09-01 06:35:35 +00:00
2019-08-26 12:18:40 +00:00
case " ${ status } " in
"enabled" | "error" )
2020-04-07 20:18:00 +00:00
adb_endtime = " $( date "+%s" ) "
memory = " $( " ${ adb_awk } " '/^MemTotal|^MemFree|^MemAvailable/{ORS="/"; print int($2/1000)}' "/proc/meminfo" 2>/dev/null | " ${ adb_awk } " '{print substr($0,1,length($0)-1)}' ) "
if [ " $(( ( adb_endtime-adb_starttime) / 60 )) " -lt 60 ]
then
runtime = " ${ adb_action } , $(( ( adb_endtime-adb_starttime) / 60 )) m $(( ( adb_endtime-adb_starttime) % 60 )) s, ${ memory :- 0 } , $( date "+%d.%m.%Y %H:%M:%S" ) "
else
runtime = " ${ adb_action } , n/a, ${ memory :- 0 } , $( date "+%d.%m.%Y %H:%M:%S" ) "
fi
if [ " ${ status } " = "error" ]
then
adb_cnt = 0
fi
2019-08-26 12:18:40 +00:00
; ;
"suspend" )
status = "paused"
; ;
"resume" )
status = ""
; ;
esac
2018-12-19 16:32:29 +00:00
json_load_file " ${ adb_rtfile } " >/dev/null 2>& 1
2018-12-26 20:19:21 +00:00
json_select "data" >/dev/null 2>& 1
2019-08-15 12:02:30 +00:00
if [ " ${ ? } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
if [ -z " ${ adb_fetchutil } " ] || [ -z " ${ adb_awk } " ]
2018-12-26 20:19:21 +00:00
then
2020-04-07 20:18:00 +00:00
json_get_var utils "utilities"
else
utils = " ${ adb_fetchutil } , ${ adb_awk } "
2018-12-26 20:19:21 +00:00
fi
if [ -z " ${ adb_cnt } " ]
then
2020-04-07 20:18:00 +00:00
json_get_var adb_cnt "blocked_domains"
2018-12-26 20:19:21 +00:00
adb_cnt = " ${ adb_cnt %% * } "
fi
2020-04-07 20:18:00 +00:00
if [ -z " ${ runtime } " ]
2018-12-26 20:19:21 +00:00
then
2020-04-07 20:18:00 +00:00
json_get_var runtime "last_run"
2018-12-26 20:19:21 +00:00
fi
2018-09-01 06:35:35 +00:00
fi
2018-12-19 16:32:29 +00:00
> " ${ adb_rtfile } "
json_load_file " ${ adb_rtfile } " >/dev/null 2>& 1
json_init
json_add_object "data"
2019-02-02 07:38:56 +00:00
json_add_string "adblock_status" " ${ status :- "enabled" } "
2018-09-01 06:35:35 +00:00
json_add_string "adblock_version" " ${ adb_ver } "
2020-04-07 20:18:00 +00:00
json_add_string "blocked_domains" " ${ adb_cnt :- 0 } "
json_add_array "active_sources"
for entry in ${ adb_sources }
do
json_add_object
json_add_string "source" " ${ entry } "
json_close_object
done
json_close_array
json_add_string "dns_backend" " ${ adb_dns :- "-" } , ${ adb_dnsdir :- "-" } "
json_add_string "run_utils" " ${ utils :- "-" } "
json_add_string "run_ifaces" " trigger: ${ adb_trigger :- "-" } , report: ${ adb_repiface :- "-" } "
json_add_string "run_directories" " base: ${ adb_tmpbase } , backup: ${ adb_backupdir } , report: ${ adb_reportdir } , jail: ${ adb_jaildir } "
json_add_string "run_flags" " backup: ${ adb_backup } , reset: ${ adb_dnsfilereset } , flush: ${ adb_dnsflush } , force: ${ adb_forcedns } , search: ${ adb_safesearch } , report: ${ adb_report } , mail: ${ adb_mail } , jail: ${ adb_jail } "
json_add_string "last_run" " ${ runtime :- "-" } "
json_add_string "system" " ${ adb_sysver } "
2018-12-19 16:32:29 +00:00
json_close_object
2018-09-01 06:35:35 +00:00
json_dump > " ${ adb_rtfile } "
2019-08-26 12:18:40 +00:00
if [ " ${ adb_mail } " -eq 1 ] && [ -x " ${ adb_mailservice } " ] && \
2020-04-07 20:18:00 +00:00
{ [ " ${ status } " = "error" ] || { [ " ${ status } " = "enabled" ] && [ " ${ adb_cnt } " -le " ${ adb_mailcnt } " ] ; } }
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
( " ${ adb_mailservice } " " ${ adb_ver } " >/dev/null 2>& 1 ) &
2019-08-26 12:18:40 +00:00
bg_pid = " ${ ! } "
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_jsnup ::: status: ${ status :- "-" } , cnt: ${ adb_cnt } , mail: ${ adb_mail } , mail_service: ${ adb_mailservice } , mail_cnt: ${ adb_mailcnt } , mail_pid: ${ bg_pid :- "-" } "
2017-09-09 15:35:42 +00:00
}
2018-01-05 17:54:45 +00:00
# write to syslog
2016-12-19 19:11:25 +00:00
#
f_log( )
{
2018-09-01 06:35:35 +00:00
local class = " ${ 1 } " log_msg = " ${ 2 } "
2019-08-26 12:18:40 +00:00
if [ -n " ${ log_msg } " ] && { [ " ${ class } " != "debug" ] || [ " ${ adb_debug } " -eq 1 ] ; }
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
if [ -x " ${ adb_loggercmd } " ]
2019-11-03 16:38:28 +00:00
then
2020-04-07 20:18:00 +00:00
" ${ adb_loggercmd } " -p " ${ class } " -t " adblock- ${ adb_ver } [ ${ $} ] " " ${ log_msg } "
2019-11-03 16:38:28 +00:00
else
printf "%s %s %s\\n" " ${ class } " " adblock- ${ adb_ver } [ ${ $} ] " " ${ log_msg } "
fi
2018-09-01 06:35:35 +00:00
if [ " ${ class } " = "err" ]
then
f_rmdns
2019-09-17 11:59:08 +00:00
f_bgserv "stop"
2019-08-26 12:18:40 +00:00
f_jsnup "error"
2018-09-01 06:35:35 +00:00
exit 1
fi
fi
2016-12-19 19:11:25 +00:00
}
2019-08-15 12:02:30 +00:00
# start ubus monitor service to trace dns backend events
#
f_bgserv( )
{
local bg_pid status = " ${ 1 } "
2020-04-07 20:18:00 +00:00
bg_pid = " $( pgrep -f " ^/bin/sh ${ adb_ubusservice } .*|^/bin/ubus -S -M r -m invoke monitor|^grep -qF \"method\":\"set\",\"data\":\\{\"name\":\" ${ adb_dns } \" " | " ${ adb_awk } " '{ORS=" "; print $1}' ) "
if [ " ${ adb_dns } " != "raw" ] && [ -z " ${ bg_pid } " ] && [ " ${ status } " = "start" ] \
&& [ -x " ${ adb_ubusservice } " ] && [ " ${ adb_dnsfilereset } " -eq 1 ]
2019-08-15 12:02:30 +00:00
then
2019-11-03 16:38:28 +00:00
( " ${ adb_ubusservice } " " ${ adb_ver } " & )
2019-08-15 12:02:30 +00:00
elif [ -n " ${ bg_pid } " ] && [ " ${ status } " = "stop" ]
then
2019-08-26 12:18:40 +00:00
kill -HUP " ${ bg_pid } " 2>/dev/null
2019-08-15 12:02:30 +00:00
fi
f_log "debug" " f_bgserv ::: status: ${ status :- "-" } , bg_pid: ${ bg_pid :- "-" } , dns_filereset: ${ adb_dnsfilereset :- "-" } , ubus_service: ${ adb_ubusservice :- "-" } "
}
2017-11-04 13:00:20 +00:00
# main function for blocklist processing
2016-12-19 19:11:25 +00:00
#
f_main( )
{
2020-04-07 20:18:00 +00:00
local src_tmpload src_tmpfile src_name src_rset src_url src_log src_arc src_cat src_item src_list src_entries src_suffix src_rc entry keylist memory cnt = 1
2018-09-01 06:35:35 +00:00
2020-04-07 20:18:00 +00:00
memory = " $( " ${ adb_awk } " '/^MemTotal|^MemFree|^MemAvailable/{ORS="/"; print int($2/1000)}' "/proc/meminfo" 2>/dev/null | " ${ adb_awk } " '{print substr($0,1,length($0)-1)}' ) "
f_log "debug" " f_main ::: memory: ${ memory :- 0 } , max_queue: ${ adb_maxqueue } , safe_search: ${ adb_safesearch } , force_dns: ${ adb_forcedns } , awk: ${ adb_awk } "
# white- and blacklist preparation
#
2020-06-12 20:58:44 +00:00
for entry in ${ adb_locallist }
2020-04-07 20:18:00 +00:00
do
( f_list " ${ entry } " " ${ entry } " ) &
done
# safe search preparation
#
if [ " ${ adb_safesearch } " -eq 1 ] && [ " ${ adb_dnssafesearch } " != "0" ]
then
2020-06-12 20:58:44 +00:00
if [ -z " ${ adb_safesearchlist } " ]
then
adb_safesearchlist = "google bing duckduckgo pixabay yandex youtube"
fi
for entry in ${ adb_safesearchlist }
2020-04-07 20:18:00 +00:00
do
( f_list safesearch " ${ entry } " ) &
done
fi
wait
2019-12-10 14:01:16 +00:00
2018-09-01 06:35:35 +00:00
# main loop
#
for src_name in ${ adb_sources }
do
2020-04-07 20:18:00 +00:00
json_select " ${ src_name } " >/dev/null 2>& 1
if [ " ${ ? } " -ne 0 ]
then
adb_sources = " ${ adb_sources / ${ src_name } } "
continue
fi
json_get_var src_url "url" >/dev/null 2>& 1
json_get_var src_rset "rule" >/dev/null 2>& 1
json_get_values src_cat "categories" >/dev/null 2>& 1
json_select ..
src_tmpload = " ${ adb_tmpload } . ${ src_name } .load "
src_tmpsort = " ${ adb_tmpload } . ${ src_name } .sort "
src_tmpfile = " ${ adb_tmpfile } . ${ src_name } "
2019-08-26 12:18:40 +00:00
src_rc = 4
2018-09-01 06:35:35 +00:00
# basic pre-checks
#
2020-04-07 20:18:00 +00:00
if [ -z " ${ src_url } " ] || [ -z " ${ src_rset } " ]
2018-09-01 06:35:35 +00:00
then
f_list remove
continue
fi
# backup mode
#
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ] && { [ " ${ adb_action } " = "start" ] || [ " ${ adb_action } " = "resume" ] ; }
2018-09-01 06:35:35 +00:00
then
f_list restore
2019-08-26 12:18:40 +00:00
if [ " ${ ? } " -eq 0 ] && [ -s " ${ src_tmpfile } " ]
2018-09-01 06:35:35 +00:00
then
continue
fi
fi
# download queue processing
#
2019-08-15 12:02:30 +00:00
if [ -n " ${ src_cat } " ]
2018-09-01 06:35:35 +00:00
then
(
2019-08-26 12:18:40 +00:00
src_arc = " ${ adb_tmpdir } / ${ src_url ##*/ } "
2018-09-01 06:35:35 +00:00
src_log = " $( " ${ adb_fetchutil } " ${ adb_fetchparm } " ${ src_arc } " " ${ src_url } " 2>& 1) "
2019-08-26 12:18:40 +00:00
src_rc = " ${ ? } "
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_arc } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
unset src_entries
src_suffix = " $( eval printf "%s" \" \$ \{ adb_src_suffix_${ src_name } :-\" domains\" \} \" ) "
src_list = " $( tar -tzf " ${ src_arc } " 2>/dev/null) "
2019-08-26 12:18:40 +00:00
for src_item in ${ src_cat }
2018-09-01 06:35:35 +00:00
do
2020-04-07 20:18:00 +00:00
src_entries = " ${ src_entries } $( printf "%s" " ${ src_list } " | grep -E " ${ src_item } / ${ src_suffix } $" ) "
2018-09-01 06:35:35 +00:00
done
2020-04-07 20:18:00 +00:00
if [ -n " ${ src_entries } " ]
then
tar -xOzf " ${ src_arc } " ${ src_entries } 2>/dev/null > " ${ src_tmpload } "
src_rc = " ${ ? } "
fi
rm -f " ${ src_arc } "
2018-09-01 06:35:35 +00:00
else
2020-04-07 20:18:00 +00:00
src_log = " $( printf "%s" " ${ src_log } " | " ${ adb_awk } " '{ORS=" ";print $0}' ) "
f_log "info" " download of ' ${ src_name } ' failed, url: ${ src_url } , rule: ${ src_rset :- "-" } , categories: ${ src_cat :- "-" } , rc: ${ src_rc } , log: ${ src_log :- "-" } "
2018-09-01 06:35:35 +00:00
fi
2019-08-26 12:18:40 +00:00
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_tmpload } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_tmpdir } /tmp.rem.whitelist " ]
then
2020-04-18 13:33:16 +00:00
" ${ adb_awk } " " ${ src_rset } " " ${ src_tmpload } " | sed "s/\r//g" | \
grep -Evf " ${ adb_tmpdir } /tmp.rem.whitelist " | " ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' > " ${ src_tmpsort } "
2020-04-07 20:18:00 +00:00
else
2020-04-18 13:33:16 +00:00
" ${ adb_awk } " " ${ src_rset } " " ${ src_tmpload } " | sed "s/\r//g" | \
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' > " ${ src_tmpsort } "
fi
rm -f " ${ src_tmpload } "
sort ${ adb_srtopts } -u " ${ src_tmpsort } " 2>/dev/null > " ${ src_tmpfile } "
2019-08-26 12:18:40 +00:00
src_rc = " ${ ? } "
2020-04-07 20:18:00 +00:00
rm -f " ${ src_tmpsort } "
2019-08-26 12:18:40 +00:00
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_tmpfile } " ]
2018-09-01 06:35:35 +00:00
then
f_list download
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ]
then
f_list backup
fi
elif [ " ${ adb_backup } " -eq 1 ] && [ " ${ adb_action } " != "start" ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "info" " archive preparation of ' ${ src_name } ' failed, categories: ${ src_cat :- "-" } , entries: ${ src_entries } , rc: ${ src_rc } "
2018-09-01 06:35:35 +00:00
f_list restore
2020-04-07 20:18:00 +00:00
rm -f " ${ src_tmpfile } "
2018-09-01 06:35:35 +00:00
fi
2020-04-07 20:18:00 +00:00
elif [ " ${ adb_backup } " -eq 1 ] && [ " ${ adb_action } " != "start" ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "info" " archive extraction of ' ${ src_name } ' failed, categories: ${ src_cat :- "-" } , entries: ${ src_entries } , rc: ${ src_rc } "
2018-09-01 06:35:35 +00:00
f_list restore
fi
2019-08-26 12:18:40 +00:00
) &
2020-04-07 20:18:00 +00:00
continue
2018-09-01 06:35:35 +00:00
else
(
2019-08-26 12:18:40 +00:00
src_log = " $( " ${ adb_fetchutil } " ${ adb_fetchparm } " ${ src_tmpload } " " ${ src_url } " 2>& 1) "
src_rc = " ${ ? } "
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_tmpload } " ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_tmpdir } /tmp.rem.whitelist " ]
then
2020-04-18 13:33:16 +00:00
" ${ adb_awk } " " ${ src_rset } " " ${ src_tmpload } " | sed "s/\r//g" | \
grep -Evf " ${ adb_tmpdir } /tmp.rem.whitelist " | " ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' > " ${ src_tmpsort } "
2020-04-07 20:18:00 +00:00
else
2020-04-18 13:33:16 +00:00
" ${ adb_awk } " " ${ src_rset } " " ${ src_tmpload } " | sed "s/\r//g" | \
2020-04-07 20:18:00 +00:00
" ${ adb_awk } " 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' > " ${ src_tmpsort } "
fi
rm -f " ${ src_tmpload } "
sort ${ adb_srtopts } -u " ${ src_tmpsort } " 2>/dev/null > " ${ src_tmpfile } "
2019-08-26 12:18:40 +00:00
src_rc = " ${ ? } "
2020-04-07 20:18:00 +00:00
rm -f " ${ src_tmpsort } "
2019-08-26 12:18:40 +00:00
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_tmpfile } " ]
2018-09-01 06:35:35 +00:00
then
f_list download
2020-04-07 20:18:00 +00:00
if [ " ${ adb_backup } " -eq 1 ]
then
f_list backup
fi
elif [ " ${ adb_backup } " -eq 1 ] && [ " ${ adb_action } " != "start" ]
2019-08-26 12:18:40 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "info" " preparation of ' ${ src_name } ' failed, rc: ${ src_rc } "
2018-09-01 06:35:35 +00:00
f_list restore
2020-04-07 20:18:00 +00:00
rm -f " ${ src_tmpfile } "
2018-09-01 06:35:35 +00:00
fi
else
2020-04-07 20:18:00 +00:00
src_log = " $( printf "%s" " ${ src_log } " | " ${ adb_awk } " '{ORS=" ";print $0}' ) "
f_log "info" " download of ' ${ src_name } ' failed, url: ${ src_url } , rule: ${ src_rset :- "-" } , categories: ${ src_cat :- "-" } , rc: ${ src_rc } , log: ${ src_log :- "-" } "
if [ " ${ adb_backup } " -eq 1 ] && [ " ${ adb_action } " != "start" ]
2019-08-26 12:18:40 +00:00
then
f_list restore
fi
2018-09-01 06:35:35 +00:00
fi
2019-08-26 12:18:40 +00:00
) &
2018-09-01 06:35:35 +00:00
fi
2019-08-15 12:02:30 +00:00
hold = $(( cnt%adb_maxqueue))
if [ " ${ hold } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
wait
fi
2019-08-15 12:02:30 +00:00
cnt = $(( cnt+1))
2018-09-01 06:35:35 +00:00
done
wait
f_list merge
2019-08-21 09:16:43 +00:00
# tld compression and dns restart
2018-09-01 06:35:35 +00:00
#
2019-08-26 12:18:40 +00:00
if [ " ${ ? } " -eq 0 ] && [ -s " ${ adb_tmpdir } / ${ adb_dnsfile } " ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
f_tld " ${ adb_tmpdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
f_list final
else
2020-04-07 20:18:00 +00:00
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
fi
2019-08-26 12:18:40 +00:00
chown " ${ adb_dnsuser } " " ${ adb_dnsdir } / ${ adb_dnsfile } " 2>/dev/null
2019-08-15 12:02:30 +00:00
f_dnsup
if [ " ${ ? } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2020-04-07 20:18:00 +00:00
if [ " ${ adb_action } " != "resume" ]
then
f_jsnup "enabled"
fi
if [ " ${ adb_dns } " != "raw" ] && [ " ${ adb_dnsfilereset } " -eq 1 ]
2019-08-15 12:02:30 +00:00
then
2020-04-07 20:18:00 +00:00
printf " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
f_log "info" " blocklist with overall ${ adb_cnt } blocked domains loaded successfully and reset afterwards ( ${ adb_sysver } ) "
2019-08-19 21:34:31 +00:00
f_bgserv "start"
2019-08-15 12:02:30 +00:00
else
2020-04-07 20:18:00 +00:00
f_log "info" " blocklist with overall ${ adb_cnt } blocked domains loaded successfully ( ${ adb_sysver } ) "
2019-08-15 12:02:30 +00:00
fi
2018-09-01 06:35:35 +00:00
else
2020-04-07 20:18:00 +00:00
f_log "err" "dns backend restart with adblock blocklist failed"
2018-09-01 06:35:35 +00:00
fi
f_rmtemp
2016-12-19 19:11:25 +00:00
}
2018-12-19 16:32:29 +00:00
# trace dns queries via tcpdump and prepare a report
#
f_report( )
{
2020-04-07 20:18:00 +00:00
local iface bg_pid status total start end blocked percent top_list top array item index hold ports cnt = 0 search = " ${ 1 } " count = " ${ 2 } " process = " ${ 3 } " print = " ${ 4 } "
2018-12-19 16:32:29 +00:00
2020-04-07 20:18:00 +00:00
if [ " ${ adb_report } " -eq 1 ] && [ ! -x " ${ adb_dumpcmd } " ]
2018-12-19 16:32:29 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "info" "Please install the package 'tcpdump' or 'tcpdump-mini' to use the reporting feature"
2019-08-15 12:02:30 +00:00
elif [ " ${ adb_report } " -eq 0 ] && [ " ${ adb_action } " = "report" ]
2018-12-19 16:32:29 +00:00
then
2020-04-07 20:18:00 +00:00
f_log "info" "Please enable the 'DNS Report' option to use the reporting feature"
2018-12-19 16:32:29 +00:00
fi
2019-01-14 14:58:13 +00:00
2020-04-07 20:18:00 +00:00
if [ -x " ${ adb_dumpcmd } " ]
2018-12-19 16:32:29 +00:00
then
2020-04-07 20:18:00 +00:00
bg_pid = " $( pgrep -f " ^ ${ adb_dumpcmd } .*adb_report\\.pcap $" | " ${ adb_awk } " '{ORS=" "; print $1}' ) "
2019-08-15 12:02:30 +00:00
if [ " ${ adb_report } " -eq 0 ] || { [ -n " ${ bg_pid } " ] && { [ " ${ adb_action } " = "stop" ] || [ " ${ adb_action } " = "restart" ] ; } }
2019-01-24 11:31:47 +00:00
then
if [ -n " ${ bg_pid } " ]
2018-12-26 20:19:21 +00:00
then
2019-08-26 12:18:40 +00:00
kill -HUP " ${ bg_pid } " 2>/dev/null
while $( kill -0 " ${ bg_pid } " 2>/dev/null)
2019-01-24 11:31:47 +00:00
do
sleep 1
done
unset bg_pid
2018-12-26 20:19:21 +00:00
fi
2019-01-24 11:31:47 +00:00
fi
2018-12-19 16:32:29 +00:00
fi
2019-01-14 14:58:13 +00:00
2020-04-07 20:18:00 +00:00
if [ -x " ${ adb_dumpcmd } " ] && [ " ${ adb_report } " -eq 1 ]
2018-12-19 16:32:29 +00:00
then
2019-01-24 11:31:47 +00:00
if [ -z " ${ bg_pid } " ] && [ " ${ adb_action } " != "report" ] && [ " ${ adb_action } " != "stop" ]
2018-12-19 16:32:29 +00:00
then
2019-01-24 11:31:47 +00:00
for port in ${ adb_replisten }
2018-12-19 16:32:29 +00:00
do
2019-01-24 11:31:47 +00:00
if [ -z " ${ ports } " ]
then
ports = " port ${ port } "
else
ports = " ${ ports } or port ${ port } "
fi
2018-12-19 16:32:29 +00:00
done
2020-04-07 20:18:00 +00:00
if [ -z " ${ adb_repiface } " ]
then
network_get_device iface "lan"
if [ -n " ${ iface } " ]
then
adb_repiface = " ${ iface } "
else
network_get_physdev iface "lan"
if [ -n " ${ iface } " ]
then
adb_repiface = " ${ iface } "
fi
fi
if [ -n " ${ adb_repiface } " ]
then
uci_set adblock global adb_repiface " ${ adb_repiface } "
f_uci "adblock"
fi
fi
if [ -n " ${ adb_reportdir } " ] && [ ! -d " ${ adb_reportdir } " ]
then
mkdir -p " ${ adb_reportdir } "
f_log "info" " report directory ' ${ adb_reportdir } ' created "
fi
if [ -n " ${ adb_repiface } " ] && [ -d " ${ adb_reportdir } " ]
then
( " ${ adb_dumpcmd } " -nn -s0 -l -i ${ adb_repiface } ${ ports } -C${ adb_repchunksize } -W${ adb_repchunkcnt } -w " ${ adb_reportdir } /adb_report.pcap " >/dev/null 2>& 1 & )
bg_pid = " $( pgrep -f " ^ ${ adb_dumpcmd } .*adb_report\\.pcap $" | " ${ adb_awk } " '{ORS=" "; print $1}' ) "
else
f_log "info" "Please set the name of the reporting network device 'adb_repiface' manually"
fi
2019-01-14 14:58:13 +00:00
fi
2020-04-07 20:18:00 +00:00
if [ " ${ adb_action } " = "report" ] && [ " ${ process } " = "true" ]
2019-01-14 14:58:13 +00:00
then
2020-04-07 20:18:00 +00:00
> " ${ adb_reportdir } /adb_report.raw "
for file in " ${ adb_reportdir } /adb_report.pcap " *
2019-01-14 14:58:13 +00:00
do
2019-01-24 11:31:47 +00:00
(
2020-04-07 20:18:00 +00:00
" ${ adb_dumpcmd } " -tttt -r " ${ file } " 2>/dev/null | \
2020-04-11 19:46:59 +00:00
" ${ adb_awk } " -v cnt = " ${ cnt } " ' !/\. lan\. | PTR\? | SOA\? /&& / A[ \? ] +| NXDomain| 0\. 0\. 0\. 0/{ a = $1 ; b = substr( $2 ,0,8) ; c = $4 ; sub( /\. [ 0-9] +$/,"" ,c) ; d = cnt $7 ; sub( /\* $/,"" ,d) ;
e = $( NF-1) ; sub( /[ 0-9] \/ [ 0-9] \/ [ 0-9] | 0\. 0\. 0\. 0/,"NX" ,e) ; sub( /\. $/,"" ,e) ; sub( /( [ 0-9] { 1,3} \. ) { 3} [ 0-9] { 1,3} /,"OK" ,e) ; printf "%s\t%s\t%s\t%s\t%s\n" ,d,e,a,b,c} ' >> " ${ adb_reportdir } /adb_report.raw "
2019-01-24 11:31:47 +00:00
) &
2019-08-15 12:02:30 +00:00
hold = $(( cnt%adb_maxqueue))
if [ " ${ hold } " -eq 0 ]
2019-01-24 11:31:47 +00:00
then
wait
fi
2019-08-15 12:02:30 +00:00
cnt = $(( cnt+1))
2019-01-14 14:58:13 +00:00
done
2019-01-24 11:31:47 +00:00
wait
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_reportdir } /adb_report.raw " ]
2018-12-19 16:32:29 +00:00
then
2020-04-11 19:46:59 +00:00
sort ${ adb_srtopts } -k1 -k3 -k4 -k5 -k1 -ur " ${ adb_reportdir } /adb_report.raw " | \
2020-04-13 04:16:03 +00:00
" ${ adb_awk } " '{currA=($1+0);currB=$1;currC=substr($1,length($1),1);if(reqA==currB){reqA=0;printf "%s\t%s\n",d,$2}else if(currC=="+"){reqA=currA;d=$3"\t"$4"\t"$5"\t"$2}}' | \
sort ${ adb_srtopts } -k1 -k2 -k3 -k4 -ur > " ${ adb_reportdir } /adb_report.srt "
rm -f " ${ adb_reportdir } /adb_report.raw "
2019-01-14 14:58:13 +00:00
fi
2019-01-24 11:31:47 +00:00
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_reportdir } /adb_report.srt " ]
2019-01-14 14:58:13 +00:00
then
2020-04-07 20:18:00 +00:00
start = " $( " ${ adb_awk } " 'END{printf "%s_%s",$1,$2}' " ${ adb_reportdir } /adb_report.srt " ) "
end = " $( " ${ adb_awk } " 'NR==1{printf "%s_%s",$1,$2}' " ${ adb_reportdir } /adb_report.srt " ) "
total = " $( wc -l < " ${ adb_reportdir } /adb_report.srt " ) "
blocked = " $( " ${ adb_awk } " '{if($5=="NX")cnt++}END{printf "%s",cnt}' " ${ adb_reportdir } /adb_report.srt " ) "
percent = " $( " ${ adb_awk } " -v t = " ${ total } " -v b = " ${ blocked } " 'BEGIN{printf "%.2f%s",b/t*100,"%"}' ) "
> " ${ adb_reportdir } /adb_report.json "
printf "%s" "{ \"data\": { " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"start_date\": \" ${ start %_* } \", " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"start_time\": \" ${ start #*_ } \", " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"end_date\": \" ${ end %_* } \", " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"end_time\": \" ${ end #*_ } \", " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"total\": \" ${ total } \", " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"blocked\": \" ${ blocked } \", " >> " ${ adb_reportdir } /adb_report.json "
printf "%s" " \"percent\": \" ${ percent } \", " >> " ${ adb_reportdir } /adb_report.json "
top_list = "top_clients top_domains top_blocked"
for top in ${ top_list }
2019-01-14 14:58:13 +00:00
do
2020-04-07 20:18:00 +00:00
printf "%s" " \" ${ top } \": [ " >> " ${ adb_reportdir } /adb_report.json "
case " ${ top } " in
"top_clients" )
" ${ adb_awk } " '{print $3}' " ${ adb_reportdir } /adb_report.srt " | sort ${ adb_srtopts } | uniq -c | \
2020-04-17 04:57:49 +00:00
sort ${ adb_srtopts } -nr | " ${ adb_awk } " '{ORS=" ";if(NR==1)printf "{ \"count\": \"%s\", \"address\": \"%s\" }",$1,$2; else if(NR<10)printf ", { \"count\": \"%s\", \"address\": \"%s\" }",$1,$2}' >> " ${ adb_reportdir } /adb_report.json "
2020-04-07 20:18:00 +00:00
; ;
"top_domains" )
" ${ adb_awk } " '{if($5!="NX")print $4}' " ${ adb_reportdir } /adb_report.srt " | sort ${ adb_srtopts } | uniq -c | \
2020-04-17 04:57:49 +00:00
sort ${ adb_srtopts } -nr | " ${ adb_awk } " '{ORS=" ";if(NR==1)printf "{ \"count\": \"%s\", \"address\": \"%s\" }",$1,$2; else if(NR<10)printf ", { \"count\": \"%s\", \"address\": \"%s\" }",$1,$2}' >> " ${ adb_reportdir } /adb_report.json "
2020-04-07 20:18:00 +00:00
; ;
"top_blocked" )
" ${ adb_awk } " '{if($5=="NX")print $4}' " ${ adb_reportdir } /adb_report.srt " | sort ${ adb_srtopts } | uniq -c | \
2020-04-17 04:57:49 +00:00
sort ${ adb_srtopts } -nr | " ${ adb_awk } " '{ORS=" ";if(NR==1)printf "{ \"count\": \"%s\", \"address\": \"%s\" }",$1,$2; else if(NR<10)printf ", { \"count\": \"%s\", \"address\": \"%s\" }",$1,$2}' >> " ${ adb_reportdir } /adb_report.json "
2020-04-07 20:18:00 +00:00
; ;
esac
printf "%s" " ], " >> " ${ adb_reportdir } /adb_report.json "
2019-01-14 14:58:13 +00:00
done
2020-04-07 20:18:00 +00:00
search = " ${ search //./ \\ . } "
search = " ${ search //[+*~% \$ & \" \' ]/ } "
2020-04-17 04:57:49 +00:00
" ${ adb_awk } " " BEGIN{i=0;printf \"\\\"requests\\\": [ \" }/( ${ search } )/{i++;if(i==1)printf \"{ \\\"date\\\": \\\"%s\\\", \\\"time\\\": \\\"%s\\\", \\\"client\\\": \\\"%s\\\", \\\"domain\\\": \\\"%s\\\", \\\"rc\\\": \\\"%s\\\" }\",\$1,\$2,\$3,\$4,\$5;else if(i<= ${ count } )printf \", { \\\"date\\\": \\\"%s\\\", \\\"time\\\": \\\"%s\\\", \\\"client\\\": \\\"%s\\\", \\\"domain\\\": \\\"%s\\\", \\\"rc\\\": \\\"%s\\\" }\",\$1,\$2,\$3,\$4,\$5}END{printf \" ] } }\n\"} " " ${ adb_reportdir } /adb_report.srt " >> " ${ adb_reportdir } /adb_report.json "
2020-04-13 04:16:03 +00:00
rm -f " ${ adb_reportdir } /adb_report.srt "
2019-01-24 11:31:47 +00:00
fi
fi
2020-04-07 20:18:00 +00:00
if [ -s " ${ adb_reportdir } /adb_report.json " ]
2019-01-24 11:31:47 +00:00
then
2020-04-07 20:18:00 +00:00
if [ " ${ print } " = "cli" ]
2019-01-24 11:31:47 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" "::: Adblock DNS-Query Report" ":::"
2020-04-07 20:18:00 +00:00
json_load_file " ${ adb_reportdir } /adb_report.json "
2019-01-24 11:31:47 +00:00
json_select "data"
json_get_keys keylist
for key in ${ keylist }
do
json_get_var value " ${ key } "
eval " ${ key } =\" ${ value } \" "
done
2019-08-15 12:02:30 +00:00
printf " + %s\\n + %s\\n" " Start ::: ${ start_date } , ${ start_time } " " End ::: ${ end_date } , ${ end_time } "
printf " + %s\\n + %s %s\\n" " Total ::: ${ total } " " Blocked ::: ${ blocked } " " ( ${ percent } ) "
2020-04-07 20:18:00 +00:00
top_list = "top_clients top_domains top_blocked requests"
for top in ${ top_list }
do
case " ${ top } " in
"top_clients" )
item = "::: Top 10 Clients"
; ;
"top_domains" )
item = "::: Top 10 Domains"
; ;
"top_blocked" )
item = "::: Top 10 Blocked Domains"
; ;
esac
if json_get_type status " ${ top } " && [ " ${ top } " != "requests" ] && [ " ${ status } " = "array" ]
then
printf "%s\\n%s\\n%s\\n" ":::" " ${ item } " ":::"
json_select " ${ top } "
index = 1
while json_get_type status " ${ index } " && [ " ${ status } " = "object" ]
do
json_get_values item " ${ index } "
printf " + %-9s::: %s\\n" ${ item }
index = $(( index+1))
done
elif json_get_type status " ${ top } " && [ " ${ top } " = "requests" ] && [ " ${ status } " = "array" ]
then
printf "%s\\n%s\\n%s\\n" ":::" "::: Latest DNS Queries" ":::"
printf "%-15s%-15s%-45s%-50s%s\\n" "Date" "Time" "Client" "Domain" "Answer"
json_select " ${ top } "
index = 1
while json_get_type status " ${ index } " && [ " ${ status } " = "object" ]
do
json_get_values item " ${ index } "
printf "%-15s%-15s%-45s%-50s%s\\n" ${ item }
index = $(( index+1))
done
fi
json_select ".."
done
elif [ " ${ print } " = "json" ]
then
cat " ${ adb_reportdir } /adb_report.json "
2018-12-19 16:32:29 +00:00
fi
fi
fi
2020-04-07 20:18:00 +00:00
f_log "debug" " f_report ::: action: ${ adb_action } , report: ${ adb_report } , search: ${ 1 } , count: ${ 2 } , process: ${ 3 } , print: ${ 4 } , dump_util: ${ adb_dumpcmd } , repdir: ${ adb_reportdir } , repiface: ${ adb_repiface :- "-" } , replisten: ${ adb_replisten } , repchunksize: ${ adb_repchunksize } , repchunkcnt: ${ adb_repchunkcnt } , bg_pid: ${ bg_pid } "
2018-12-19 16:32:29 +00:00
}
2020-04-07 20:18:00 +00:00
# awk selection
#
adb_awk = " $( command -v gawk) "
if [ -z " ${ adb_awk } " ]
then
adb_awk = " $( command -v awk) "
fi
2018-09-01 06:35:35 +00:00
# source required system libraries
#
2020-04-07 20:18:00 +00:00
if [ -r "/lib/functions.sh" ] && [ -r "/lib/functions/network.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ]
2018-09-01 06:35:35 +00:00
then
. "/lib/functions.sh"
2020-04-07 20:18:00 +00:00
. "/lib/functions/network.sh"
2018-09-01 06:35:35 +00:00
. "/usr/share/libubox/jshn.sh"
else
f_log "err" "system libraries not found"
fi
2016-12-19 19:11:25 +00:00
# handle different adblock actions
#
2019-08-15 12:02:30 +00:00
f_load
2017-05-08 09:19:57 +00:00
case " ${ adb_action } " in
2019-08-26 12:18:40 +00:00
"stop" )
2019-08-15 12:02:30 +00:00
f_bgserv "stop"
2019-01-14 14:58:13 +00:00
f_report "+" "50" "false" "false"
2018-09-01 06:35:35 +00:00
f_rmdns
; ;
2019-08-26 12:18:40 +00:00
"restart" )
2019-08-15 12:02:30 +00:00
f_bgserv "stop"
2019-01-14 14:58:13 +00:00
f_report "+" "50" "false" "false"
2018-09-01 06:35:35 +00:00
f_rmdns
2019-08-15 12:02:30 +00:00
f_env
2018-09-01 06:35:35 +00:00
f_main
; ;
2019-08-26 12:18:40 +00:00
"suspend" )
2020-04-07 20:18:00 +00:00
if [ " ${ adb_dns } " != "raw" ]
then
f_switch suspend
fi
2018-09-01 06:35:35 +00:00
; ;
2019-08-26 12:18:40 +00:00
"resume" )
2020-04-07 20:18:00 +00:00
if [ " ${ adb_dns } " != "raw" ]
then
f_switch resume
fi
2018-09-01 06:35:35 +00:00
; ;
2019-08-26 12:18:40 +00:00
"report" )
2019-01-14 14:58:13 +00:00
f_report " ${ 2 } " " ${ 3 } " " ${ 4 } " " ${ 5 } "
2018-12-19 16:32:29 +00:00
; ;
2019-08-26 12:18:40 +00:00
"query" )
2018-09-01 06:35:35 +00:00
f_query " ${ 2 } "
; ;
2019-08-26 12:18:40 +00:00
"start" | "reload" )
2019-08-15 12:02:30 +00:00
f_bgserv "stop"
2019-01-14 14:58:13 +00:00
f_report "+" "50" "false" "false"
2019-08-15 12:02:30 +00:00
f_env
2018-09-01 06:35:35 +00:00
f_main
; ;
2017-02-27 20:42:53 +00:00
esac