2016-12-19 19:11:25 +00:00
#!/bin/sh
# dns based ad/abuse domain blocking
# written by Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2019-08-26 12:18:40 +00:00
# (s)hellcheck exceptions
# shellcheck disable=1091 disable=2039 disable=2143 disable=2181 disable=2188
2016-12-19 19:11:25 +00:00
# set initial defaults
#
LC_ALL = C
PATH = "/usr/sbin:/usr/bin:/sbin:/bin"
2019-08-26 12:18:40 +00:00
adb_ver = "3.8.3"
adb_basever = ""
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
adb_mail = 0
adb_mcnt = 0
adb_trigger = "wan"
2017-09-09 15:35:42 +00:00
adb_triggerdelay = 0
2019-08-15 12:02:30 +00:00
adb_backupdir = "/tmp"
2018-01-10 18:33:42 +00:00
adb_fetchutil = "uclient-fetch"
2017-09-09 15:35:42 +00:00
adb_dns = "dnsmasq"
2019-08-15 12:02:30 +00:00
adb_dnsvariant = "nxdomain"
2017-02-12 07:20:10 +00:00
adb_dnsprefix = "adb_list"
2017-06-26 18:58:29 +00:00
adb_dnsfile = " ${ adb_dnsprefix } .overall "
2019-08-15 12:02:30 +00:00
adb_dnsfilereset = "false"
2017-12-28 16:55:49 +00:00
adb_dnsflush = 0
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"
2017-04-10 19:15:34 +00:00
adb_rtfile = "/tmp/adb_runtime.json"
2018-12-19 16:32:29 +00:00
adb_report = 0
adb_repiface = "br-lan"
2018-12-26 20:19:21 +00:00
adb_replisten = "53"
2018-12-19 16:32:29 +00:00
adb_repdir = "/tmp"
adb_reputil = " $( command -v tcpdump) "
adb_repchunkcnt = "5"
adb_repchunksize = "1"
2017-12-28 16:55:49 +00:00
adb_action = " ${ 1 :- "start" } "
2018-01-10 18:33:42 +00:00
adb_pidfile = "/var/run/adblock.pid"
2019-08-15 12:02:30 +00:00
adb_ubusservice = "/etc/adblock/adblock.service"
adb_mailservice = "/etc/adblock/adblock.mail"
adb_sources = ""
2019-08-26 12:18:40 +00:00
adb_cnt = ""
2016-12-19 19:11:25 +00:00
2017-12-28 16:55:49 +00:00
# load 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-26 12:18:40 +00:00
local dns_up cnt = 0
2018-09-01 06:35:35 +00:00
# get system information
#
2019-08-26 12:18:40 +00:00
adb_sysver = " $( ubus -S call system board 2>/dev/null | jsonfilter -e '@.model' -e '@.release.description' | awk '{ORS="\n";printf"%s, ",$0}' ) "
2018-09-01 06:35:35 +00:00
# parse 'global' and 'extra' section by callback
#
config_cb( )
{
local type = " ${ 1 } "
if [ " ${ type } " = "adblock" ]
then
option_cb( )
{
local option = " ${ 1 } "
local value = " ${ 2 } "
eval " ${ option } =\" ${ value } \" "
}
else
reset_cb
fi
}
# parse 'source' typed sections
#
parse_config( )
{
local value opt section = " ${ 1 } " options = "enabled adb_src adb_src_rset adb_src_cat"
eval " adb_sources=\" ${ adb_sources } ${ section } \" "
for opt in ${ options }
do
config_get value " ${ section } " " ${ opt } "
if [ -n " ${ value } " ]
then
eval " ${ opt } _ ${ section } =\" ${ value } \" "
fi
done
}
# load adblock config
#
config_load adblock
config_foreach parse_config source
2019-08-15 12:02:30 +00:00
# version check
#
if [ -z " ${ adb_basever } " ] || [ " ${ adb_ver %.* } " != " ${ adb_basever } " ]
then
f_log "info" "your adblock config seems to be too old, please update your config with the '--force-maintainer' opkg option"
exit 0
fi
# set dns backend
2018-09-01 06:35:35 +00:00
#
case " ${ adb_dns } " in
2019-08-15 12:02:30 +00:00
"dnsmasq" )
2018-09-01 06:35:35 +00:00
adb_dnsinstance = " ${ adb_dnsinstance :- "0" } "
adb_dnsuser = " ${ adb_dnsuser :- "dnsmasq" } "
adb_dnsdir = " ${ adb_dnsdir :- "/tmp" } "
adb_dnsheader = ""
2019-08-15 12:02:30 +00:00
if [ " ${ adb_dnsvariant } " = "nxdomain" ]
then
adb_dnsdeny = "awk '{print \"server=/\"\$0\"/\"}'"
adb_dnsallow = "awk '{print \"server=/\"\$0\"/#\"}'"
elif [ " ${ adb_dnsvariant } " = "null (IPv4)" ]
then
adb_dnsdeny = "awk '{print \"0.0.0.0\\t\"\$0\"\"}'"
elif [ " ${ adb_dnsvariant } " = "null (IPv4/IPv6)" ]
then
adb_dnsdeny = "awk '{print \"0.0.0.0\\t\"\$0\"\\n::\\t\"\$0\"\"}'"
fi
adb_dnsallow = ""
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"unbound" )
2018-09-01 06:35:35 +00:00
adb_dnsuser = " ${ adb_dnsuser :- "unbound" } "
adb_dnsdir = " ${ adb_dnsdir :- "/var/lib/unbound" } "
adb_dnsheader = ""
2019-08-15 12:02:30 +00:00
adb_dnsdeny = "awk '{print \"local-zone: \\042\"\$0\"\\042 static\"}'"
adb_dnsallow = "awk '{print \"local-zone: \\042\"\$0\"\\042 transparent\"}'"
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"named" )
2018-09-01 06:35:35 +00:00
adb_dnsuser = " ${ adb_dnsuser :- "bind" } "
adb_dnsdir = " ${ adb_dnsdir :- "/var/lib/bind" } "
adb_dnsheader = "\$TTL 2h" $'\n' "@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)" $'\n' " IN NS localhost."
2019-08-15 12:02:30 +00:00
adb_dnsdeny = "awk '{print \"\"\$0\" CNAME .\\n*.\"\$0\" CNAME .\"}'"
adb_dnsallow = "awk '{print \"\"\$0\" CNAME rpz-passthru.\\n*.\"\$0\" CNAME rpz-passthru.\"}'"
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"kresd" )
2018-09-01 06:35:35 +00:00
adb_dnsuser = " ${ adb_dnsuser :- "root" } "
adb_dnsdir = " ${ adb_dnsdir :- "/etc/kresd" } "
adb_dnsheader = "\$TTL 2h" $'\n' "@ IN SOA localhost. root.localhost. (1 6h 1h 1w 2h)" $'\n' " IN NS localhost."
2019-08-15 12:02:30 +00:00
adb_dnsdeny = "awk '{print \"\"\$0\" CNAME .\\n*.\"\$0\" CNAME .\"}'"
adb_dnsallow = "awk '{print \"\"\$0\" CNAME rpz-passthru.\\n*.\"\$0\" CNAME rpz-passthru.\"}'"
2018-09-01 06:35:35 +00:00
; ;
esac
2019-08-15 12:02:30 +00:00
# status check
2018-09-01 06:35:35 +00:00
#
2019-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
f_extconf
f_temp
f_rmdns
f_jsnup "disabled"
2019-08-15 12:02:30 +00:00
f_log "info" "adblock is currently disabled, please set the config option 'adb_enabled' to '1' to use this service"
2018-09-01 06:35:35 +00:00
exit 0
fi
2019-08-15 12:02:30 +00:00
# dns backend check
#
2018-09-01 06:35:35 +00:00
if [ -d " ${ adb_dnsdir } " ] && [ ! -f " ${ adb_dnsdir } / ${ adb_dnsfile } " ]
then
2019-08-15 12:02:30 +00:00
printf "%s\\n" " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
fi
if [ " ${ adb_action } " = "start" ] && [ " ${ adb_trigger } " = "timed" ]
then
2019-08-26 12:18:40 +00:00
sleep " ${ adb_triggerdelay } "
2018-09-01 06:35:35 +00:00
fi
2019-08-15 12:02:30 +00:00
while [ " ${ cnt } " -le 30 ]
2018-09-01 06:35:35 +00:00
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
2019-08-26 12:18:40 +00:00
if [ " ${ dns_up } " != "true" ] || [ -z " ${ adb_dns } " ] || [ ! -x " $( command -v " ${ adb_dns } " ) " ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
f_log "err" " ' ${ adb_dns } ' not running or executable "
2018-09-01 06:35:35 +00:00
elif [ ! -d " ${ adb_dnsdir } " ]
then
f_log "err" " ' ${ adb_dnsdir } ' backend directory not found "
fi
2016-12-19 19:11:25 +00:00
}
2019-08-15 12:02:30 +00:00
# check & set environment
2016-12-19 19:11:25 +00:00
#
2019-08-15 12:02:30 +00:00
f_env( )
2016-12-19 19:11:25 +00:00
{
2018-09-01 06:35:35 +00:00
local ssl_lib
f_log "info" " adblock instance started ::: action: ${ adb_action } , priority: ${ adb_nice :- "0" } , pid: ${ $} "
f_jsnup "running"
2019-08-15 12:02:30 +00:00
f_extconf
2018-09-01 06:35:35 +00:00
2019-08-15 12:02:30 +00:00
# check backup directory
2018-09-01 06:35:35 +00:00
#
2019-08-15 12:02:30 +00:00
if [ ! -d " ${ adb_backupdir } " ]
then
f_log "err" " the backup directory ' ${ adb_backupdir } ' does not exist/is not mounted yet, please create the directory or raise the 'adb_triggerdelay' to defer the adblock start "
fi
2018-09-01 06:35:35 +00:00
# check fetch utility
#
case " ${ adb_fetchutil } " in
2019-08-26 12:18:40 +00:00
"uclient-fetch" )
2018-09-01 06:35:35 +00:00
if [ -f "/lib/libustream-ssl.so" ]
then
adb_fetchparm = " ${ adb_fetchparm :- "--timeout=10 --no-check-certificate -O" } "
ssl_lib = "libustream-ssl"
else
adb_fetchparm = " ${ adb_fetchparm :- "--timeout=10 -O" } "
fi
; ;
2019-08-26 12:18:40 +00:00
"wget" )
2018-09-01 06:35:35 +00:00
adb_fetchparm = " ${ adb_fetchparm :- "--no-cache --no-cookies --max-redirect=0 --timeout=10 --no-check-certificate -O" } "
ssl_lib = "built-in"
; ;
2019-08-26 12:18:40 +00:00
"wget-nossl" )
2018-09-01 06:35:35 +00:00
adb_fetchparm = " ${ adb_fetchparm :- "--no-cache --no-cookies --max-redirect=0 --timeout=10 -O" } "
; ;
2019-08-26 12:18:40 +00:00
"busybox" )
2018-09-01 06:35:35 +00:00
adb_fetchparm = " ${ adb_fetchparm :- "-O" } "
; ;
2019-08-26 12:18:40 +00:00
"curl" )
2018-09-01 06:35:35 +00:00
adb_fetchparm = " ${ adb_fetchparm :- "--connect-timeout 10 --insecure -o" } "
ssl_lib = "built-in"
; ;
2019-08-26 12:18:40 +00:00
"aria2c" )
2018-09-01 06:35:35 +00:00
adb_fetchparm = " ${ adb_fetchparm :- "--timeout=10 --allow-overwrite=true --auto-file-renaming=false --check-certificate=false -o" } "
ssl_lib = "built-in"
; ;
esac
adb_fetchutil = " $( command -v " ${ adb_fetchutil } " ) "
if [ ! -x " ${ adb_fetchutil } " ] || [ -z " ${ adb_fetchutil } " ] || [ -z " ${ adb_fetchparm } " ]
then
f_log "err" "download utility not found, please install 'uclient-fetch' with 'libustream-mbedtls' or the full 'wget' package"
fi
adb_fetchinfo = " ${ adb_fetchutil } ( ${ ssl_lib :- "-" } ) "
f_temp
2018-01-10 18:33:42 +00:00
}
2018-07-21 20:27:04 +00:00
# create temporary files and directories
2018-01-10 18:33:42 +00:00
#
f_temp( )
{
2019-08-15 12:02:30 +00:00
if [ -d "/tmp" ] && [ -z " ${ adb_tmpdir } " ]
2018-09-01 06:35:35 +00:00
then
adb_tmpdir = " $( mktemp -p /tmp -d) "
2019-08-15 12:02:30 +00:00
adb_tmpload = " $( mktemp -p " ${ adb_tmpdir } " -tu) "
adb_tmpfile = " $( mktemp -p " ${ adb_tmpdir } " -tu) "
elif [ ! -d "/tmp" ]
then
f_log "err" "the temp directory '/tmp' does not exist/is not mounted yet, please create the directory or raise the 'adb_triggerdelay' to defer the adblock start"
2018-09-01 06:35:35 +00:00
fi
if [ ! -s " ${ adb_pidfile } " ]
then
2019-08-15 12:02:30 +00:00
printf "%s" " ${ $} " > " ${ adb_pidfile } "
2018-09-01 06:35:35 +00:00
fi
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
> " ${ adb_pidfile } "
2017-12-28 16:55:49 +00:00
}
2019-08-15 12:02:30 +00:00
# remove dns related files, services and directories
2017-12-28 16:55:49 +00:00
#
f_rmdns( )
{
2018-09-01 06:35:35 +00:00
if [ -n " ${ adb_dns } " ]
then
2019-08-26 12:18:40 +00:00
printf "%s\\n" " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
> " ${ adb_rtfile } "
2019-08-26 12:18:40 +00:00
rm -f " ${ adb_backupdir } / ${ adb_dnsprefix } " *.gz
f_dnsup 4
2018-09-01 06:35:35 +00:00
f_rmtemp
fi
2019-08-26 12:18:40 +00:00
f_log "debug" " f_rmdns ::: dns: ${ adb_dns } , 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
change = " $( uci -q changes " ${ config } " | awk '{ORS=" "; print $0}' ) "
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
; ;
2019-08-26 12:18:40 +00:00
"dhcp" | "resolver" )
printf "%s\\n" " ${ 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
}
2019-08-26 12:18:40 +00:00
# set/reset the global counter
2017-12-28 16:55:49 +00:00
#
f_count( )
{
2018-09-01 06:35:35 +00:00
local mode = " ${ 1 } "
adb_cnt = 0
2019-08-26 12:18:40 +00:00
case " ${ mode } " in
"blacklist" )
if [ -s " ${ adb_tmpfile } .blacklist " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpfile } .blacklist " ) "
fi
; ;
"whitelist" )
if [ -s " ${ adb_tmpdir } /tmp.raw.whitelist " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpdir } /tmp.raw.whitelist " ) "
fi
; ;
"merge" )
if [ -s " ${ adb_tmpdir } / ${ adb_dnsfile } " ]
then
adb_cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpdir } / ${ adb_dnsfile } " ) "
fi
; ;
"download" | "restore" )
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
adb_cnt = " $(( adb_cnt-$( wc -l 2>/dev/null < " ${ adb_tmpdir } /tmp.add.whitelist " ) )) "
fi
if [ " ${ adb_dns } " = "named" ] || [ " ${ adb_dns } " = "kresd" ] || { [ " ${ adb_dns } " = "dnsmasq" ] && [ " ${ adb_dnsvariant } " = "null (IPv4/IPv6)" ] ; }
then
adb_cnt = " $(( ( adb_cnt-$( printf "%s" " ${ adb_dnsheader } " | grep -c "^" ) ) / 2 )) "
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( )
{
2019-08-26 12:18:40 +00:00
local config port port_list = "53 853 5353"
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"
2019-08-15 12:02:30 +00:00
if [ " ${ adb_dnsvariant } " = "nxdomain" ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 1 ] && [ -z " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " serversfile | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
then
uci_set dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " serversfile " ${ adb_dnsdir } / ${ adb_dnsfile } "
2019-08-21 09:16:43 +00:00
if [ -n " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " addnhosts | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
2019-08-15 12:02:30 +00:00
then
uci -q del_list dhcp.@dnsmasq[ ${ adb_dnsinstance } ] .addnhosts= " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
elif [ " ${ adb_enabled } " -eq 0 ] && [ -n " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " serversfile | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
then
uci_remove dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " serversfile
fi
elif [ " ${ adb_dnsvariant % * } " = "null" ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 1 ] && [ -z " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " addnhosts | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
then
uci -q add_list dhcp.@dnsmasq[ ${ adb_dnsinstance } ] .addnhosts= " ${ adb_dnsdir } / ${ adb_dnsfile } "
2019-08-21 09:16:43 +00:00
if [ -n " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " serversfile | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
2019-08-15 12:02:30 +00:00
then
uci_remove dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " serversfile
fi
elif [ " ${ adb_enabled } " -eq 0 ] && [ -n " $( uci_get dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " addnhosts | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
then
uci_remove dhcp " @dnsmasq[ ${ adb_dnsinstance } ] " addnhosts
fi
2018-09-01 06:35:35 +00:00
fi
; ;
2019-08-15 12:02:30 +00:00
"kresd" )
2019-08-26 12:18:40 +00:00
config = "resolver"
2019-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 1 ] && [ -z " $( uci_get resolver kresd rpz_file | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
2018-09-01 06:35:35 +00:00
then
uci -q add_list resolver.kresd.rpz_file= " ${ adb_dnsdir } / ${ adb_dnsfile } "
2019-08-15 12:02:30 +00:00
elif [ " ${ adb_enabled } " -eq 0 ] && [ -n " $( uci_get resolver kresd rpz_file | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) " ]
2018-09-01 06:35:35 +00:00
then
uci -q del_list resolver.kresd.rpz_file= " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
2019-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 1 ] && [ " ${ adb_dnsflush } " -eq 0 ] && [ " $( uci_get resolver kresd keep_cache) " != "1" ]
2018-09-01 06:35:35 +00:00
then
2018-09-05 15:39:57 +00:00
uci_set resolver kresd keep_cache "1"
2019-08-15 12:02:30 +00:00
elif [ " ${ adb_enabled } " -eq 0 ] || { [ " ${ adb_dnsflush } " -eq 1 ] && [ " $( uci_get resolver kresd keep_cache) " = "1" ] ; }
2018-09-01 06:35:35 +00:00
then
2018-09-05 15:39:57 +00:00
uci_set resolver kresd keep_cache "0"
2018-09-01 06:35:35 +00:00
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-08-15 12:02:30 +00:00
if [ " ${ adb_enabled } " -eq 1 ] && [ " ${ adb_forcedns } " -eq 1 ] && \
[ -z " $( uci_get firewall adblock_dns_53) " ] && [ " $( /etc/init.d/firewall enabled; printf "%u" ${ ? } ) " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
for port in ${ port_list }
do
uci_add firewall "redirect" " adblock_dns_ ${ port } "
uci_set firewall " adblock_dns_ ${ port } " "name" " Adblock DNS, port ${ port } "
uci_set firewall " adblock_dns_ ${ port } " "src" "lan"
uci_set firewall " adblock_dns_ ${ port } " "proto" "tcp udp"
uci_set firewall " adblock_dns_ ${ port } " "src_dport" " ${ port } "
uci_set firewall " adblock_dns_ ${ port } " "dest_port" " ${ port } "
uci_set firewall " adblock_dns_ ${ port } " "target" "DNAT"
done
2019-08-15 12:02:30 +00:00
elif [ -n " $( uci_get firewall adblock_dns_53) " ] && { [ " ${ adb_enabled } " -eq 0 ] || [ " ${ adb_forcedns } " -eq 0 ] ; }
2018-09-01 06:35:35 +00:00
then
for port in ${ port_list }
do
uci_remove firewall " adblock_dns_ ${ port } "
done
fi
2019-08-26 12:18:40 +00:00
f_uci " ${ config } "
2017-12-02 17:39:03 +00:00
}
2017-12-28 16:55:49 +00:00
# restart of the 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
{
2019-08-26 12:18:40 +00:00
local dns_service dns_up dns_pid dns_procfile cache_util cache_rc cnt = 0 out_rc = 4 in_rc = " ${ 1 :- 0 } "
2018-09-01 06:35:35 +00:00
2019-08-26 12:18:40 +00:00
if [ " ${ in_rc } " -eq 0 ] && [ " ${ adb_dnsflush } " -eq 0 ] && [ " ${ adb_enabled } " -eq 1 ]
2018-09-01 06:35:35 +00:00
then
case " ${ adb_dns } " in
2019-08-15 12:02:30 +00:00
"dnsmasq" )
2019-08-19 21:34:31 +00:00
killall -q -HUP " ${ adb_dns } "
2019-08-26 12:18:40 +00:00
cache_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"unbound" )
2018-09-01 06:35:35 +00:00
cache_util = " $( command -v unbound-control) "
2019-08-26 12:18:40 +00:00
if [ -x " ${ cache_util } " ] && [ -d " ${ adb_tmpdir } " ] && [ -f " ${ adb_dnsdir } /unbound.conf " ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
" ${ cache_util } " -c " ${ adb_dnsdir } /unbound.conf " dump_cache > " ${ adb_tmpdir } /adb_cache.dump " 2>/dev/null
2018-09-01 06:35:35 +00:00
fi
" /etc/init.d/ ${ adb_dns } " restart >/dev/null 2>& 1
; ;
2019-08-15 12:02:30 +00:00
"kresd" )
2018-09-01 06:35:35 +00:00
" /etc/init.d/ ${ adb_dns } " restart >/dev/null 2>& 1
2019-08-26 12:18:40 +00:00
cache_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
; ;
2019-08-15 12:02:30 +00:00
"named" )
2018-09-01 06:35:35 +00:00
cache_util = " $( command -v rndc) "
2019-08-26 12:18:40 +00:00
if [ -x " ${ cache_util } " ] && [ -f "/etc/bind/rndc.conf" ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
" ${ cache_util } " -c "/etc/bind/rndc.conf" reload >/dev/null 2>& 1
cache_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
else
" /etc/init.d/ ${ adb_dns } " restart >/dev/null 2>& 1
fi
; ;
esac
2019-08-26 12:18:40 +00:00
else
" /etc/init.d/ ${ adb_dns } " restart >/dev/null 2>& 1
2018-09-01 06:35:35 +00:00
fi
2019-08-15 12:02:30 +00:00
while [ " ${ cnt } " -le 10 ]
2018-09-01 06:35:35 +00:00
do
2019-08-19 21:34:31 +00:00
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 " ) "
2019-08-26 12:18:40 +00:00
dns_procfile = " $( ls -l " /proc/ ${ dns_pid } /fd " 2>/dev/null | grep -Fo " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
2019-08-19 21:34:31 +00:00
if [ " ${ dns_up } " = "true" ] && [ -n " ${ dns_pid } " ] && [ -z " ${ dns_procfile } " ]
2018-09-01 06:35:35 +00:00
then
case " ${ adb_dns } " in
2019-08-15 12:02:30 +00:00
"unbound" )
2018-09-01 06:35:35 +00:00
cache_util = " $( command -v unbound-control) "
2019-08-26 12:18:40 +00:00
if [ -x " ${ cache_util } " ] && [ -d " ${ adb_tmpdir } " ] && [ -s " ${ adb_tmpdir } /adb_cache.dump " ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
while [ " ${ cnt } " -le 10 ]
2018-09-01 06:35:35 +00:00
do
2019-08-26 12:18:40 +00:00
" ${ cache_util } " -c " ${ adb_dnsdir } /unbound.conf " load_cache < " ${ adb_tmpdir } /adb_cache.dump " >/dev/null 2>& 1
cache_rc = " ${ ? } "
2019-08-15 12:02:30 +00:00
if [ " ${ cache_rc } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
break
fi
cnt = $(( cnt+1))
sleep 1
done
fi
; ;
esac
2019-08-26 12:18:40 +00:00
out_rc = 0
2018-09-01 06:35:35 +00:00
break
fi
cnt = $(( cnt+1))
sleep 1
done
2019-08-26 12:18:40 +00:00
f_log "debug" " f_dnsup ::: cache_util: ${ cache_util :- "-" } , cache_flush: ${ adb_dnsflush } , cache_rc: ${ cache_rc :- 0 } , dns_cnt: ${ 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
# backup/restore/remove blocklists
2016-12-19 19:11:25 +00:00
#
f_list( )
{
2019-08-26 12:18:40 +00:00
local file name out_rc mode = " ${ 1 } " in_rc = " ${ src_rc :- 0 } "
2018-09-01 06:35:35 +00:00
case " ${ mode } " in
2019-08-26 12:18:40 +00:00
"blacklist" | "whitelist" )
if [ " ${ mode } " = "blacklist" ] && [ -s " ${ adb_blacklist } " ]
2019-08-15 12:02:30 +00:00
then
adb_blacklist_rset = " /^([[:alnum:]_-]+\\.)+[[:alpha:]]+([[:space:]]| $)/{print tolower(\$1)} "
2019-08-26 12:18:40 +00:00
awk " ${ adb_blacklist_rset } " " ${ adb_blacklist } " > " ${ adb_tmpfile } . ${ mode } "
out_rc = " ${ ? } "
elif [ " ${ mode } " = "whitelist" ] && [ -s " ${ adb_whitelist } " ]
2019-08-15 12:02:30 +00:00
then
adb_whitelist_rset = " /^([[:alnum:]_-]+\\.)+[[:alpha:]]+([[:space:]]| $)/{print tolower(\$1)} "
2019-08-26 12:18:40 +00:00
awk " ${ adb_whitelist_rset } " " ${ adb_whitelist } " > " ${ adb_tmpdir } /tmp.raw. ${ mode } "
out_rc = " ${ ? } "
if [ " ${ out_rc } " -eq 0 ]
2019-08-15 12:02:30 +00:00
then
2019-08-26 12:18:40 +00:00
adb_whitelist_rset = " /^([[:alnum:]_-]+\\.)+[[:alpha:]]+([[:space:]]| $)/{gsub(\"\\\\.\",\"\\\\.\",\$1);print tolower(\"^\"\$1\"\\\\|\\\\.\"\$1)} "
awk " ${ adb_whitelist_rset } " " ${ adb_tmpdir } /tmp.raw. ${ mode } " > " ${ adb_tmpdir } /tmp.rem. ${ mode } "
out_rc = " ${ ? } "
if [ " ${ out_rc } " -eq 0 ] && [ -n " ${ adb_dnsallow } " ]
then
eval " ${ adb_dnsallow } " " ${ adb_tmpdir } /tmp.raw. ${ mode } " > " ${ adb_tmpdir } /tmp.add. ${ mode } "
out_rc = " ${ ? } "
fi
2019-08-15 12:02:30 +00:00
fi
fi
; ;
"backup" )
2018-09-01 06:35:35 +00:00
if [ -d " ${ adb_backupdir } " ]
then
2019-08-26 12:18:40 +00:00
gzip -cf " ${ src_tmpfile } " 2>/dev/null > " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz "
out_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
fi
; ;
2019-08-15 12:02:30 +00:00
"restore" )
if [ -d " ${ adb_backupdir } " ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
if [ -n " ${ src_name } " ] && [ -s " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz " ]
2019-08-15 12:02:30 +00:00
then
2019-08-26 12:18:40 +00:00
zcat " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz " 2>/dev/null > " ${ src_tmpfile } "
out_rc = " ${ ? } "
elif [ -z " ${ src_name } " ]
then
for file in " ${ adb_backupdir } / ${ adb_dnsprefix } " .*.gz
2019-08-15 12:02:30 +00:00
do
name = " ${ file ##*/ } "
name = " ${ name %.* } "
2019-08-26 12:18:40 +00:00
zcat " ${ file } " 2>/dev/null > " ${ adb_tmpfile } . ${ name } "
out_rc = " ${ ? } "
if [ " ${ out_rc } " -ne 0 ]
then
break
fi
2019-08-15 12:02:30 +00:00
done
fi
2018-09-01 06:35:35 +00:00
fi
; ;
2019-08-15 12:02:30 +00:00
"remove" )
2019-08-26 12:18:40 +00:00
if [ -d " ${ adb_backupdir } " ] && [ -f " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz " ]
2018-09-01 06:35:35 +00:00
then
rm -f " ${ adb_backupdir } / ${ adb_dnsprefix } . ${ src_name } .gz "
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
fi
; ;
2019-08-15 12:02:30 +00:00
"merge" )
2018-09-01 06:35:35 +00:00
for file in " ${ adb_tmpfile } " .*
do
cat " ${ file } " 2>/dev/null >> " ${ adb_tmpdir } / ${ adb_dnsfile } "
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
if [ " ${ out_rc } " -ne 0 ]
2018-09-01 06:35:35 +00:00
then
break
fi
rm -f " ${ file } "
done
; ;
2019-08-15 12:02:30 +00:00
"final" )
2018-09-01 06:35:35 +00:00
> " ${ adb_dnsdir } / ${ adb_dnsfile } "
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
2019-08-15 12:02:30 +00:00
if [ -s " ${ adb_tmpdir } /tmp.rem.whitelist " ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
grep -vf " ${ adb_tmpdir } /tmp.rem.whitelist " " ${ adb_tmpdir } / ${ adb_dnsfile } " | eval " ${ adb_dnsdeny } " >> " ${ adb_dnsdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
else
eval " ${ adb_dnsdeny } " " ${ adb_tmpdir } / ${ adb_dnsfile } " >> " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
2019-08-26 12:18:40 +00:00
if [ -n " ${ adb_dnsheader } " ]
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s\\n" " ${ adb_dnsheader } " | cat - " ${ adb_dnsdir } / ${ adb_dnsfile } " > " ${ adb_tmpdir } / ${ adb_dnsfile } "
2018-09-01 06:35:35 +00:00
mv -f " ${ adb_tmpdir } / ${ adb_dnsfile } " " ${ adb_dnsdir } / ${ adb_dnsfile } "
fi
2019-08-26 12:18:40 +00:00
out_rc = " ${ ? } "
2018-09-01 06:35:35 +00:00
; ;
esac
2019-08-26 12:18:40 +00:00
if [ -z " ${ out_rc } " ]
then
out_rc = " ${ in_rc } "
fi
2018-09-01 06:35:35 +00:00
f_count " ${ mode } "
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
{
2019-08-15 12:02:30 +00:00
local cnt cnt_srt cnt_tld source = " ${ 1 } " temp_tld = " ${ 1 } .tld " tld_ok = "false"
2018-09-01 06:35:35 +00:00
2019-08-15 12:02:30 +00:00
cnt = " $( wc -l 2>/dev/null < " ${ source } " ) "
if [ " ${ adb_dns } " != "dnsmasq" ] && [ " ${ adb_dnsvariant % * } " != "null" ]
then
2019-01-09 10:52:19 +00:00
awk 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' " ${ source } " > " ${ temp_tld } "
2019-08-15 12:02:30 +00:00
if [ " ${ ? } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2019-01-09 10:52:19 +00:00
sort -u " ${ temp_tld } " > " ${ source } "
2019-08-15 12:02:30 +00:00
if [ " ${ ? } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2019-01-09 10:52:19 +00:00
cnt_srt = " $( wc -l 2>/dev/null < " ${ source } " ) "
awk '{if(NR==1){tld=$NF};while(getline){if($NF!~tld"\\."){print tld;tld=$NF}}print tld}' " ${ source } " > " ${ temp_tld } "
2019-08-15 12:02:30 +00:00
if [ " ${ ? } " -eq 0 ]
2018-09-01 06:35:35 +00:00
then
2019-01-09 10:52:19 +00:00
awk 'BEGIN{FS="."}{for(f=NF;f>1;f--)printf "%s.",$f;print $1}' " ${ temp_tld } " > " ${ source } "
2019-08-15 12:02:30 +00:00
if [ " ${ ? } " -eq 0 ]
2019-01-09 10:52:19 +00:00
then
2019-08-26 12:18:40 +00:00
rm -f " ${ temp_tld } "
2019-01-09 10:52:19 +00:00
cnt_tld = " $( wc -l 2>/dev/null < " ${ source } " ) "
tld_ok = "true"
fi
2018-09-01 06:35:35 +00:00
fi
fi
fi
2019-08-15 12:02:30 +00:00
else
sort -u " ${ source } " > " ${ temp_tld } "
if [ " ${ ? } " -eq 0 ]
then
mv -f " ${ temp_tld } " " ${ source } "
cnt_srt = " $( wc -l 2>/dev/null < " ${ source } " ) "
tld_ok = "true"
fi
2018-09-01 06:35:35 +00:00
fi
2019-01-09 10:52:19 +00:00
if [ " ${ tld_ok } " = "false" ]
then
2019-08-15 12:02:30 +00:00
unset cnt_srt cnt_tld
2019-01-09 10:52:19 +00:00
rm -f " ${ temp_tld } "
2019-08-15 12:02:30 +00:00
f_list blacklist
f_list whitelist
f_list restore
f_list merge
f_list final
2019-08-26 12:18:40 +00:00
cnt = " $( wc -l 2>/dev/null < " ${ adb_tmpdir } / ${ adb_dnsfile } " ) "
2019-01-09 10:52:19 +00:00
fi
f_log "debug" " f_tld ::: source: ${ source } , cnt: ${ cnt :- "-" } , cnt_srt: ${ cnt_srt :- "-" } , cnt_tld: ${ cnt_tld :- "-" } , tld_ok: ${ tld_ok } "
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( )
{
2019-08-15 12:02:30 +00:00
local status 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"
2019-08-26 12:18:40 +00:00
f_jsnup "running"
2019-08-15 12:02:30 +00:00
f_temp
2018-11-30 19:04:16 +00:00
if [ " ${ mode } " = "suspend" ] && [ " ${ status } " = "enabled" ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
printf "%s\\n" " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
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
2019-08-15 12:02:30 +00:00
f_list blacklist
f_list whitelist
f_list restore
f_list merge
2019-08-26 12:18:40 +00:00
f_tld " ${ adb_tmpdir } / ${ adb_dnsfile } "
2019-08-15 12:02:30 +00:00
f_list final
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"
fi
2018-09-01 06:35:35 +00:00
f_dnsup
2019-08-15 12:02:30 +00:00
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
2019-08-15 12:02:30 +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( )
{
2018-09-01 06:35:35 +00:00
local search result prefix suffix field domain = " ${ 1 } " tld = " ${ 1 #*. } "
if [ -z " ${ domain } " ] || [ " ${ domain } " = " ${ tld } " ]
then
2019-08-15 12:02:30 +00:00
printf "%s\\n" "::: invalid domain input, please submit a single domain, e.g. 'doubleclick.net'"
2018-09-01 06:35:35 +00:00
else
case " ${ adb_dns } " in
2019-08-15 12:02:30 +00:00
"dnsmasq" )
if [ " ${ adb_dnsvariant } " = "nxdomain" ]
then
prefix = ".*[\\/\\.]"
suffix = "(\\/)"
field = 2
elif [ " ${ adb_dnsvariant % * } " = "null" ]
then
2019-08-21 09:16:43 +00:00
prefix = "0\\..*[\\t\\.]"
2019-08-15 12:02:30 +00:00
suffix = ""
field = 2
fi
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
; ;
esac
2019-08-15 12:02:30 +00:00
if [ " ${ adb_dnsfilereset } " = "false" ]
then
while [ " ${ domain } " != " ${ tld } " ]
do
2019-08-26 12:18:40 +00:00
search = " ${ domain //[+*~% \$ & \" \' ]/ } "
search = " ${ search //./ \\ . } "
result = " $( awk -F '/|\"|\t| ' " /^( ${ search } | ${ prefix } + ${ search } .* ${ suffix } $)/{i++;{printf(\" + %s\\n\",\$ ${ field } )};if(i>9){printf(\" + %s\\n\",\"[...]\");exit}} " " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" " ::: results for 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
if [ -d " ${ adb_backupdir } " ]
2019-01-09 10:52:19 +00:00
then
2019-08-26 12:18:40 +00:00
search = " ${ 1 //[+*~% \$ & \" \' ]/ } "
search = " ${ search //./ \\ . } "
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" " ::: results for 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
zcat " ${ file } " 2>/dev/null | awk -v f = " ${ file ##*/ } " " /^( $search |.*\\. ${ search } )/{i++;{printf(\" + %-30s%s\\n\",f,\$1)};if(i>=3){printf(\" + %-30s%s\\n\",f,\"[...]\");exit}} "
else
2019-08-26 12:18:40 +00:00
awk -v f = " ${ file ##*/ } " " /^( $search |.*\\. ${ search } )/{i++;{printf(\" + %-30s%s\\n\",f,\$1)};if(i>=3){printf(\" + %-30s%s\\n\",f,\"[...]\");exit}} " " ${ file } "
2019-08-15 12:02:30 +00:00
fi
2019-01-09 10:52:19 +00:00
done
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
{
2019-08-15 12:02:30 +00:00
local run_time 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" )
run_time = " $( /bin/date "+%d.%m.%Y %H:%M:%S" ) "
; ;
"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
2018-12-26 20:19:21 +00:00
if [ -z " ${ adb_fetchinfo } " ]
then
json_get_var adb_fetchinfo "fetch_utility"
fi
if [ -z " ${ adb_cnt } " ]
then
json_get_var adb_cnt "overall_domains"
adb_cnt = " ${ adb_cnt %% * } "
fi
if [ -z " ${ run_time } " ]
then
json_get_var run_time "last_rundate"
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 } "
2019-08-15 12:02:30 +00:00
json_add_string "overall_domains" " ${ adb_cnt :- 0 } "
2018-09-01 06:35:35 +00:00
json_add_string "fetch_utility" " ${ adb_fetchinfo :- "-" } "
2019-08-15 12:02:30 +00:00
json_add_string "dns_backend" " ${ adb_dns } , ${ adb_dnsdir } "
json_add_string "dns_variant" " ${ adb_dnsvariant } , ${ adb_dnsfilereset :- "false" } "
json_add_string "backup_dir" " ${ adb_backupdir } "
2018-09-01 06:35:35 +00:00
json_add_string "last_rundate" " ${ run_time :- "-" } "
json_add_string "system_release" " ${ 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 } " ] && \
2019-08-15 12:02:30 +00:00
{ [ " ${ status } " = "error" ] || { [ " ${ status } " = "enabled" ] && [ " ${ adb_cnt } " -le " ${ adb_mcnt } " ] ; } }
2018-09-01 06:35:35 +00:00
then
2019-08-15 12:02:30 +00:00
( " ${ adb_mailservice } " >/dev/null 2>& 1) &
2019-08-26 12:18:40 +00:00
bg_pid = " ${ ! } "
2018-09-01 06:35:35 +00:00
fi
2019-08-15 12:02:30 +00:00
f_log "debug" " f_jsnup ::: status: ${ status :- "-" } , cnt: ${ adb_cnt } , mail: ${ adb_mail } , mail_service: ${ adb_mailservice } , mail_cnt: ${ adb_mcnt } , 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
logger -p " ${ class } " -t " adblock- ${ adb_ver } [ ${ $} ] " " ${ log_msg } "
if [ " ${ class } " = "err" ]
then
f_rmdns
2019-08-26 12:18:40 +00:00
f_jsnup "error"
2018-09-01 06:35:35 +00:00
logger -p " ${ class } " -t " adblock- ${ adb_ver } [ ${ $} ] " "Please also check 'https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md'"
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 } "
bg_pid = " $( pgrep -f " ^/bin/sh ${ adb_ubusservice } |^/bin/ubus -S -M r -m invoke monitor|^grep -qF \"method\":\"set\",\"data\":\\{\"name\":\" ${ adb_dns } \" " | awk '{ORS=" "; print $1}' ) "
if [ -z " ${ bg_pid } " ] && [ " ${ status } " = "start" ] \
&& [ -x " ${ adb_ubusservice } " ] && [ " ${ adb_dnsfilereset } " = "true" ]
then
( " ${ adb_ubusservice } " & )
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( )
{
2019-08-26 12:18:40 +00:00
local src_tmpload src_tmpfile src_name src_rset src_url src_log src_arc src_cat src_item src_rc list entry suffix mem_total mem_free enabled cnt = 1
2018-09-01 06:35:35 +00:00
mem_total = " $( awk '/^MemTotal/ {print int($2/1000)}' "/proc/meminfo" 2>/dev/null) "
mem_free = " $( awk '/^MemFree/ {print int($2/1000)}' "/proc/meminfo" 2>/dev/null) "
2019-08-15 12:02:30 +00:00
f_log "debug" " f_main ::: dns: ${ adb_dns } , fetch_util: ${ adb_fetchinfo } , force_dns: ${ adb_forcedns } , mem_total: ${ mem_total :- 0 } , mem_free: ${ mem_free :- 0 } , max_queue: ${ adb_maxqueue } "
2018-09-01 06:35:35 +00:00
# main loop
#
2019-08-15 12:02:30 +00:00
f_list blacklist
f_list whitelist
2018-09-01 06:35:35 +00:00
for src_name in ${ adb_sources }
do
2019-08-15 12:02:30 +00:00
enabled = " $( eval printf "%s" \" \$ \{ enabled_${ src_name } \} \" ) "
src_url = " $( eval printf "%s" \" \$ \{ adb_src_${ src_name } \} \" ) "
src_rset = " $( eval printf "%s" \" \$ \{ adb_src_rset_${ src_name } \} \" ) "
src_cat = " $( eval printf "%s" \" \$ \{ adb_src_cat_${ src_name } \} \" ) "
2019-08-26 12:18:40 +00:00
src_tmpload = " ${ adb_tmpload } . ${ src_name } "
src_tmpfile = " ${ adb_tmpfile } . ${ src_name } "
src_rc = 4
2018-09-01 06:35:35 +00:00
# basic pre-checks
#
2018-12-19 16:32:29 +00:00
f_log "debug" " f_main ::: name: ${ src_name } , enabled: ${ enabled } "
2019-08-15 12:02:30 +00:00
if [ " ${ enabled } " != "1" ] || [ -f " ${ src_url } " ] || [ -z " ${ src_url } " ] || [ -z " ${ src_rset } " ]
2018-09-01 06:35:35 +00:00
then
f_list remove
continue
fi
# backup mode
#
2019-08-15 12:02:30 +00:00
if [ " ${ adb_action } " = "start" ]
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
list = " $( tar -tzf " ${ src_arc } " ) "
2019-08-15 12:02:30 +00:00
suffix = " $( eval printf "%s" \" \$ \{ adb_src_suffix_${ src_name } :-\" domains\" \} \" ) "
2019-08-26 12:18:40 +00:00
for src_item in ${ src_cat }
2018-09-01 06:35:35 +00:00
do
2019-08-26 12:18:40 +00:00
entry = " $( printf "%s" " ${ list } " | grep -E " [\\^/]+ ${ src_item } / ${ suffix } " ) "
2018-09-01 06:35:35 +00:00
if [ -n " ${ entry } " ]
then
2019-08-26 12:18:40 +00:00
tar -xOzf " ${ src_arc } " " ${ entry } " >> " ${ src_tmpload } "
src_rc = " ${ ? } "
if [ " ${ src_rc } " -ne 0 ]
2018-09-01 06:35:35 +00:00
then
break
fi
fi
done
else
2019-08-15 12:02:30 +00:00
src_log = " $( printf "%s" " ${ src_log } " | awk '{ORS=" ";print $0}' ) "
2019-08-26 12:18:40 +00:00
f_log "debug" " f_main ::: name: ${ src_name } , url: ${ src_url } , 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
rm -f " ${ src_arc } "
2019-08-26 12:18:40 +00:00
awk " ${ src_rset } " " ${ src_tmpload } " 2>/dev/null > " ${ src_tmpfile } "
src_rc = " ${ ? } "
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_tmpfile } " ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
rm -f " ${ src_tmpload } "
2018-09-01 06:35:35 +00:00
f_list download
2019-08-15 12:02:30 +00:00
f_list backup
2019-08-26 12:18:40 +00:00
elif [ " ${ adb_action } " != "start" ]
then
2018-09-01 06:35:35 +00:00
f_list restore
fi
2019-08-26 12:18:40 +00:00
elif [ " ${ adb_action } " != "start" ]
then
2018-09-01 06:35:35 +00:00
f_list restore
fi
2019-08-26 12:18:40 +00:00
) &
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
2019-08-26 12:18:40 +00:00
awk " ${ src_rset } " " ${ src_tmpload } " 2>/dev/null > " ${ src_tmpfile } "
src_rc = " ${ ? } "
if [ " ${ src_rc } " -eq 0 ] && [ -s " ${ src_tmpfile } " ]
2018-09-01 06:35:35 +00:00
then
2019-08-26 12:18:40 +00:00
rm -f " ${ src_tmpload } "
2018-09-01 06:35:35 +00:00
f_list download
2019-08-15 12:02:30 +00:00
f_list backup
2019-08-26 12:18:40 +00:00
elif [ " ${ adb_action } " != "start" ]
then
2018-09-01 06:35:35 +00:00
f_list restore
fi
else
2019-08-15 12:02:30 +00:00
src_log = " $( printf "%s" " ${ src_log } " | awk '{ORS=" ";print $0}' ) "
2019-08-26 12:18:40 +00:00
f_log "debug" " f_main ::: name: ${ src_name } , url: ${ src_url } , rc: ${ src_rc } , log: ${ src_log :- "-" } "
if [ " ${ adb_action } " != "start" ]
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
# list merge
#
wait
src_name = "overall"
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
2019-08-26 12:18:40 +00:00
> " ${ 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
2019-08-26 12:18:40 +00:00
f_jsnup "enabled"
2019-08-15 12:02:30 +00:00
if [ " ${ adb_dnsfilereset } " = "true" ]
then
2019-08-26 12:18:40 +00:00
printf "%s\\n" " ${ adb_dnsheader } " > " ${ adb_dnsdir } / ${ adb_dnsfile } "
2019-08-15 12:02:30 +00:00
f_log "info" " blocklist with overall ${ adb_cnt } 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
f_log "info" " blocklist with overall ${ adb_cnt } domains loaded successfully ( ${ adb_sysver } ) "
fi
2018-09-01 06:35:35 +00:00
else
f_log "err" "dns backend restart with active blocklist failed"
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( )
{
2019-08-15 12:02:30 +00:00
local bg_pid status total blocked percent rep_clients rep_domains rep_blocked index hold ports cnt = 0 search = " ${ 1 } " count = " ${ 2 } " filter = " ${ 3 } " print = " ${ 4 } "
2018-12-19 16:32:29 +00:00
2019-08-15 12:02:30 +00:00
if [ " ${ adb_report } " -eq 1 ] && [ ! -x " ${ adb_reputil } " ]
2018-12-19 16:32:29 +00:00
then
2019-02-02 07:38:56 +00:00
f_log "info" "Please install the package 'tcpdump' or 'tcpdump-mini' to use the adblock 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
2019-01-24 11:31:47 +00:00
f_log "info" "Please enable the extra option 'adb_report' to use the adblock reporting feature!"
2018-12-19 16:32:29 +00:00
fi
2019-01-14 14:58:13 +00:00
2019-01-24 11:31:47 +00:00
if [ -x " ${ adb_reputil } " ]
2018-12-19 16:32:29 +00:00
then
2019-08-15 12:02:30 +00:00
bg_pid = " $( pgrep -f " ^ ${ adb_reputil } .*adb_report\\.pcap $" | awk '{ORS=" "; print $1}' ) "
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
2019-08-15 12:02:30 +00:00
if [ -x " ${ adb_reputil } " ] && [ " ${ 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
2019-08-26 12:18:40 +00:00
( " ${ adb_reputil } " -nn -s0 -l -i ${ adb_repiface } ${ ports } -C${ adb_repchunksize } -W${ adb_repchunkcnt } -w " ${ adb_repdir } /adb_report.pcap " >/dev/null 2>& 1 & )
2019-08-15 12:02:30 +00:00
bg_pid = " $( pgrep -f " ^ ${ adb_reputil } .*adb_report\\.pcap $" | awk '{ORS=" "; print $1}' ) "
2019-01-14 14:58:13 +00:00
fi
2019-01-24 11:31:47 +00:00
if [ " ${ adb_action } " = "report" ] && [ " ${ filter } " = "false" ]
2019-01-14 14:58:13 +00:00
then
2019-08-26 12:18:40 +00:00
> " ${ adb_repdir } /adb_report.raw "
for file in " ${ adb_repdir } /adb_report.pcap " *
2019-01-14 14:58:13 +00:00
do
2019-01-24 11:31:47 +00:00
(
2019-08-15 12:02:30 +00:00
" ${ adb_reputil } " -tttt -r " ${ file } " 2>/dev/null | \
2019-08-26 12:18:40 +00:00
awk -v cnt = " ${ cnt } " ' !/\. lan\. /&& / A[ \? ] +| NXDomain| 0\. 0\. 0\. 0/{ a = $1 ; b = substr( $2 ,0,8) ; c = $4 ; sub( /\. [ 0-9] +$/,"" ,c) ; \
2019-08-15 12:02:30 +00:00
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" , a,b,c,d,e) } ' >> " ${ adb_repdir } /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
2019-08-26 12:18:40 +00:00
if [ -s " ${ adb_repdir } /adb_report.raw " ]
2018-12-19 16:32:29 +00:00
then
2019-01-24 11:31:47 +00:00
awk '{printf("%s\t%s\t%s\t%s\t%s\t%s\n", $4,$5,$1,$2,$3,$4)}' " ${ adb_repdir } /adb_report.raw " | \
sort -ur | uniq -uf2 | awk ' { currA = ( $6 +0) ; currB = $6 ; currC = substr( $6 ,length( $6 ) ,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 -ur > " ${ adb_repdir } /adb_report "
2019-01-14 14:58:13 +00:00
fi
2019-01-24 11:31:47 +00:00
2019-08-26 12:18:40 +00:00
if [ -s " ${ adb_repdir } /adb_report " ]
2019-01-14 14:58:13 +00:00
then
2019-08-26 12:18:40 +00:00
total = " $( wc -l < " ${ adb_repdir } /adb_report " ) "
blocked = " $( awk '{if($5=="NX")print $4}' " ${ adb_repdir } /adb_report " | wc -l) "
2019-08-15 12:02:30 +00:00
percent = " $( awk -v t = " ${ total } " -v b = " ${ blocked } " 'BEGIN{printf("%.2f %s\n",b/t*100, "%")}' ) "
2019-08-26 12:18:40 +00:00
rep_clients = " $( awk '{print $3}' " ${ adb_repdir } /adb_report " | sort | uniq -c | sort -r | awk '{ORS=" ";if(NR<=10) printf("%s_%s ",$1,$2)}' ) "
rep_domains = " $( awk '{if($5!="NX")print $4}' " ${ adb_repdir } /adb_report " | sort | uniq -c | sort -r | awk '{ORS=" ";if(NR<=10)printf("%s_%s ",$1,$2)}' ) "
rep_blocked = " $( awk '{if($5=="NX")print $4}' " ${ adb_repdir } /adb_report " | sort | uniq -c | sort -r | awk '{ORS=" ";if(NR<=10)printf("%s_%s ",$1,$2)}' ) "
2019-08-15 12:02:30 +00:00
2019-08-26 12:18:40 +00:00
> " ${ adb_repdir } /adb_report.json "
json_load_file " ${ adb_repdir } /adb_report.json " >/dev/null 2>& 1
2019-01-24 11:31:47 +00:00
json_init
json_add_object "data"
2019-08-26 12:18:40 +00:00
json_add_string "start_date" " $( awk 'END{printf("%s",$1)}' " ${ adb_repdir } /adb_report " ) "
json_add_string "start_time" " $( awk 'END{printf("%s",$2)}' " ${ adb_repdir } /adb_report " ) "
json_add_string "end_date" " $( awk 'NR==1{printf("%s",$1)}' " ${ adb_repdir } /adb_report " ) "
json_add_string "end_time" " $( awk 'NR==1{printf("%s",$2)}' " ${ adb_repdir } /adb_report " ) "
2019-01-24 11:31:47 +00:00
json_add_string "total" " ${ total } "
json_add_string "blocked" " ${ blocked } "
json_add_string "percent" " ${ percent } "
json_close_array
json_add_array "top_clients"
for client in ${ rep_clients }
2019-01-14 14:58:13 +00:00
do
2019-01-24 11:31:47 +00:00
json_add_object
2019-02-02 07:38:56 +00:00
json_add_string "count" " ${ client %%_* } "
2019-01-24 11:31:47 +00:00
json_add_string "address" " ${ client #*_ } "
json_close_object
2019-01-14 14:58:13 +00:00
done
2019-01-24 11:31:47 +00:00
json_close_array
json_add_array "top_domains"
for domain in ${ rep_domains }
2019-01-14 14:58:13 +00:00
do
2019-01-24 11:31:47 +00:00
json_add_object
2019-02-02 07:38:56 +00:00
json_add_string "count" " ${ domain %%_* } "
2019-01-24 11:31:47 +00:00
json_add_string "address" " ${ domain #*_ } "
json_close_object
2019-01-14 14:58:13 +00:00
done
2019-01-24 11:31:47 +00:00
json_close_array
json_add_array "top_blocked"
for block in ${ rep_blocked }
do
json_add_object
2019-02-02 07:38:56 +00:00
json_add_string "count" " ${ block %%_* } "
2019-01-24 11:31:47 +00:00
json_add_string "address" " ${ block #*_ } "
json_close_object
done
json_close_object
2019-08-26 12:18:40 +00:00
json_dump > " ${ adb_repdir } /adb_report.json "
2019-01-14 14:58:13 +00:00
fi
2019-08-26 12:18:40 +00:00
rm -f " ${ adb_repdir } /adb_report.raw "
2019-01-24 11:31:47 +00:00
fi
2019-08-26 12:18:40 +00:00
if [ -s " ${ adb_repdir } /adb_report " ]
2019-01-24 11:31:47 +00:00
then
search = " ${ search //./ \\ . } "
search = " ${ search //[+*~% \$ & \" \' ]/ } "
2019-08-26 12:18:40 +00:00
> " ${ adb_repdir } /adb_report.final "
awk " BEGIN{i=0}/( ${ search } )/{i++;if(i<= ${ count } ){printf \"%s\\t%s\\t%s\\t%s\\t%s\\n\",\$1,\$2,\$3,\$4,\$5}} " " ${ adb_repdir } /adb_report " > " ${ adb_repdir } /adb_report.final "
if [ ! -s " ${ adb_repdir } /adb_report.final " ]
2019-01-14 14:58:13 +00:00
then
2019-08-26 12:18:40 +00:00
printf "%s\\t%s\\t%s\\t%s\\t%s\\n" "-" "-" "-" "-" "-" > " ${ adb_repdir } /adb_report.final "
2019-01-24 11:31:47 +00:00
fi
fi
if [ " ${ print } " = "true" ]
then
2019-08-26 12:18:40 +00:00
if [ -s " ${ adb_repdir } /adb_report.json " ]
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" ":::"
2019-08-26 12:18:40 +00:00
json_load_file " ${ adb_repdir } /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 } ) "
2019-01-24 11:31:47 +00:00
json_select ".."
2019-08-15 12:02:30 +00:00
if json_get_type status "top_clients" && [ " ${ status } " = "array" ]
2019-01-24 11:31:47 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" "::: Top 10 Clients" ":::"
2019-01-24 11:31:47 +00:00
json_select "top_clients"
index = 1
2019-08-15 12:02:30 +00:00
while json_get_type status " ${ index } " && [ " ${ status } " = "object" ]
2019-01-24 11:31:47 +00:00
do
2019-08-15 12:02:30 +00:00
json_get_values client " ${ index } "
printf " + %-9s::: %s\\n" ${ client }
index = $(( index+1))
2019-01-24 11:31:47 +00:00
done
fi
json_select ".."
2019-08-15 12:02:30 +00:00
if json_get_type status "top_domains" && [ " ${ status } " = "array" ]
2019-01-24 11:31:47 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" "::: Top 10 Domains" ":::"
2019-01-24 11:31:47 +00:00
json_select "top_domains"
index = 1
2019-08-15 12:02:30 +00:00
while json_get_type status " ${ index } " && [ " ${ status } " = "object" ]
2019-01-24 11:31:47 +00:00
do
2019-08-15 12:02:30 +00:00
json_get_values domain " ${ index } "
printf " + %-9s::: %s\\n" ${ domain }
index = $(( index+1))
2019-01-24 11:31:47 +00:00
done
fi
json_select ".."
2019-08-15 12:02:30 +00:00
if json_get_type status "top_blocked" && [ " ${ status } " = "array" ]
2019-01-24 11:31:47 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" "::: Top 10 Blocked Domains" ":::"
2019-01-24 11:31:47 +00:00
json_select "top_blocked"
index = 1
2019-08-15 12:02:30 +00:00
while json_get_type status " ${ index } " && [ " ${ status } " = "object" ]
2019-01-24 11:31:47 +00:00
do
2019-08-15 12:02:30 +00:00
json_get_values blocked " ${ index } "
printf " + %-9s::: %s\\n" ${ blocked }
index = $(( index+1))
2019-01-24 11:31:47 +00:00
done
fi
2019-08-26 12:18:40 +00:00
if [ -s " ${ adb_repdir } /adb_report.final " ]
2019-01-24 11:31:47 +00:00
then
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" "::: Latest DNS Queries" ":::"
printf "%-15s%-15s%-45s%-50s%s\\n" "Date" "Time" "Client" "Domain" "Answer"
2019-08-26 12:18:40 +00:00
awk '{printf "%-15s%-15s%-45s%-50s%s\n",$1,$2,$3,$4,$5}' " ${ adb_repdir } /adb_report.final "
2019-01-24 11:31:47 +00:00
fi
else
2019-08-15 12:02:30 +00:00
printf "%s\\n%s\\n%s\\n" ":::" "::: no reporting data available yet" ":::"
2018-12-19 16:32:29 +00:00
fi
fi
fi
2019-01-14 14:58:13 +00:00
f_log "debug" " f_report ::: action: ${ adb_action } , report: ${ adb_report } , search: ${ 1 } , count: ${ 2 } , filter: ${ 3 } , print: ${ 4 } , reputil: ${ adb_reputil } , repdir: ${ adb_repdir } , repiface: ${ adb_repiface } , replisten: ${ adb_replisten } , repchunksize: ${ adb_repchunksize } , repchunkcnt: ${ adb_repchunkcnt } , bg_pid: ${ bg_pid } "
2018-12-19 16:32:29 +00:00
}
2018-09-01 06:35:35 +00:00
# source required system libraries
#
if [ -r "/lib/functions.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ]
then
. "/lib/functions.sh"
. "/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" )
2018-09-01 06:35:35 +00:00
f_switch suspend
; ;
2019-08-26 12:18:40 +00:00
"resume" )
2018-09-01 06:35:35 +00:00
f_switch resume
; ;
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