@ -10,7 +10,7 @@
#
LC_ALL = C
PATH = "/usr/sbin:/usr/bin:/sbin:/bin"
adb_ver = "3.6.2 "
adb_ver = "3.6.3 "
adb_sysver = "unknown"
adb_enabled = 0
adb_debug = 0
@ -50,7 +50,7 @@ adb_pidfile="/var/run/adblock.pid"
#
f_envload( )
{
local dns_up sys_call sys_desc sys_model sys_ver cnt = 0
local dns_up sys_call sys_desc sys_model cnt = 0
# get system information
#
@ -59,11 +59,6 @@ f_envload()
then
sys_desc = " $( printf '%s' " ${ sys_call } " | jsonfilter -e '@.release.description' ) "
sys_model = " $( printf '%s' " ${ sys_call } " | jsonfilter -e '@.model' ) "
sys_ver = " $( cat /etc/turris-version 2>/dev/null) "
if [ -n " ${ sys_ver } " ]
then
sys_desc = " ${ sys_desc } / ${ sys_ver } "
fi
adb_sysver = " ${ sys_model } , ${ sys_desc } "
fi
@ -721,8 +716,9 @@ f_query()
esac
while [ " ${ domain } " != " ${ tld } " ]
do
search = " ${ domain //./ \. } "
result = " $( awk -F '/|\"| ' " /^( $search | ${ prefix } + ${ search } .* ${ suffix } $)/{i++;{printf(\" + %s\n\",\$ ${ field } )};if(i>9){printf(\" + %s\n\",\"[...]\");exit}} " " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
search = " ${ domain //./ \\ . } "
search = " ${ search //[+*~% \$ & \" \' ]/ } "
result = " $( awk -F '/|\"| ' " /^( ${ search } | ${ prefix } + ${ search } .* ${ suffix } $)/{i++;{printf(\" + %s\n\",\$ ${ field } )};if(i>9){printf(\" + %s\n\",\"[...]\");exit}} " " ${ adb_dnsdir } / ${ adb_dnsfile } " ) "
printf '%s\n%s\n%s\n' ":::" " ::: results for domain ' ${ domain } ' " ":::"
printf '%s\n' " ${ result :- " - no match" } "
domain = " ${ tld } "
@ -731,7 +727,8 @@ f_query()
if [ ${ adb_backup } -eq 1 ] && [ -d " ${ adb_backupdir } " ]
then
search = " ${ 1 //./ \. } "
search = " ${ 1 //./ \\ . } "
search = " ${ search //[+*~% \$ & \" \' ]/ } "
printf '%s\n%s\n%s\n' ":::" " ::: results for domain ' ${ 1 } ' in backups " ":::"
for file in ${ adb_backupdir } /${ adb_dnsprefix } .*.gz
do
@ -1059,7 +1056,7 @@ f_main()
#
f_report( )
{
local bg_pid total blocked percent rep_clients rep_domains rep_blocked rep_latest index hold ports cnt = 0 pri nt= " ${ 1 :- "true" } "
local bg_pid total blocked percent rep_clients rep_domains rep_blocked index hold ports cnt = 0 search = " ${ 1 } " cou nt= " ${ 2 } " filter = " ${ 3 } " print = " ${ 4 } "
if [ ! -x " ${ adb_reputil } " ]
then
@ -1080,6 +1077,7 @@ f_report()
unset bg_pid
fi
fi
if [ -z " ${ bg_pid } " ] && [ " ${ adb_action } " != "report" ] && [ " ${ adb_action } " != "stop" ]
then
for port in ${ adb_replisten }
@ -1093,13 +1091,14 @@ f_report()
done
( " ${ 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 & )
fi
if [ " ${ adb_action } " = "report" ]
if [ " ${ adb_action } " = "report" ] && [ " ${ filter } " = "false" ]
then
> " ${ adb_repdir } /adb_report.raw "
for file in " ${ adb_repdir } " /adb_report.pcap*
do
(
" ${ adb_reputil } " -nn - tttt -r $file 2>/dev/null | \
" ${ adb_reputil } " -tttt -r $file 2>/dev/null | \
awk -v cnt = ${ cnt } ' !/\. lan\. /&& / A[ \? ] +| NXDomain/{ a = $1 ; b = substr( $2 ,0,8) ; c = $4 ; sub( /\. [ 0-9] +$/,"" ,c) ; \
d = cnt $7 ; e = $( NF-1) ; sub( /[ 0-9] \/ [ 0-9] \/ [ 0-9] /,"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 "
) &
@ -1127,7 +1126,6 @@ f_report()
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)}' ) "
rep_latest = " $( awk 'BEGIN{printf(" + %-15s%-15s%-45s%-50s%s\n","Date","Time","Client","Domain","Answer")}FNR<=50{printf(" + %-15s%-15s%-45s%-50s%s\n",$1,$2,$3,$4,$5)}' ${ adb_repdir } /adb_report) "
> " ${ adb_repdir } /adb_report.json "
json_load_file " ${ adb_repdir } /adb_report.json " >/dev/null 2>& 1
@ -1171,69 +1169,85 @@ f_report()
json_dump > " ${ adb_repdir } /adb_report.json "
fi
rm -f " ${ adb_repdir } /adb_report.raw "
fi
if [ " ${ print } " = "true" ]
if [ -s " ${ adb_repdir } /adb_report " ]
then
search = " ${ search //./ \\ . } "
search = " ${ search //[+*~% \$ & \" \' ]/ } "
> " ${ 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 " ]
then
if [ -s " ${ adb_repdir } /adb_report.json " ]
printf "%s\t%s\t%s\t%s\t%s\n" "-" "-" "-" "-" "-" > " ${ adb_repdir } /adb_report.final "
fi
fi
if [ " ${ print } " = "true" ]
then
if [ -s " ${ adb_repdir } /adb_report.json " ]
then
printf "%s\n%s\n%s\n" ":::" "::: Adblock DNS-Query Report" ":::"
json_load_file " ${ adb_repdir } /adb_report.json "
json_select "data"
json_get_keys keylist
for key in ${ keylist }
do
json_get_var value " ${ key } "
eval " ${ key } =\" ${ value } \" "
done
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 } ) "
json_select ".."
if json_get_type Status "top_clients" && [ " ${ Status } " = "array" ]
then
printf "%s\n%s\n%s\n" ":::" "::: Adblock DNS-Query Report" ":::"
json_load_file " ${ adb_repdir } /adb_report.json "
json_select "data"
json_get_keys keylist
for key in ${ keylist }
printf "%s\n%s\n%s\n" ":::" "::: Top 10 Clients" ":::"
json_select "top_clients"
index = 1
while json_get_type Status ${ index } && [ " ${ Status } " = "object" ]
do
json_get_var value " ${ key } "
eval " ${ key } =\" ${ value } \" "
json_get_values client ${ index }
printf " + %-9s::: %s\n" ${ client }
index = $(( index + 1 ))
done
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 } ) "
json_select ".."
if json_get_type Status "top_clients" && [ " ${ Status } " = "array" ]
then
printf "%s\n%s\n%s\n" ":::" "::: Top 10 Clients" ":::"
json_select "top_clients"
index = 1
while json_get_type Status ${ index } && [ " ${ Status } " = "object" ]
do
json_get_values client ${ index }
printf " + %-9s::: %s\n" ${ client }
index = $(( index + 1 ))
done
fi
json_select ".."
if json_get_type Status "top_domains" && [ " ${ Status } " = "array" ]
then
printf "%s\n%s\n%s\n" ":::" "::: Top 10 Domains" ":::"
json_select "top_domains"
index = 1
while json_get_type Status ${ index } && [ " ${ Status } " = "object" ]
do
json_get_values domain ${ index }
printf " + %-9s::: %s\n" ${ domain }
index = $(( index + 1 ))
done
fi
json_select ".."
if json_get_type Status "top_blocked" && [ " ${ Status } " = "array" ]
then
printf "%s\n%s\n%s\n" ":::" "::: Top 10 Blocked Domains" ":::"
json_select "top_blocked"
index = 1
while json_get_type Status ${ index } && [ " ${ Status } " = "object" ]
do
json_get_values blocked ${ index }
printf " + %-9s::: %s\n" ${ blocked }
index = $(( index + 1 ))
done
fi
fi
json_select ".."
if json_get_type Status "top_domains" && [ " ${ Status } " = "array" ]
then
printf "%s\n%s\n%s\n" ":::" "::: Top 10 Domains" ":::"
json_select "top_domains"
index = 1
while json_get_type Status ${ index } && [ " ${ Status } " = "object" ]
do
json_get_values domain ${ index }
printf " + %-9s::: %s\n" ${ domain }
index = $(( index + 1 ))
done
fi
json_select ".."
if json_get_type Status "top_blocked" && [ " ${ Status } " = "array" ]
then
printf "%s\n%s\n%s\n" ":::" "::: Top 10 Blocked Domains" ":::"
json_select "top_blocked"
index = 1
while json_get_type Status ${ index } && [ " ${ Status } " = "object" ]
do
json_get_values blocked ${ index }
printf " + %-9s::: %s\n" ${ blocked }
index = $(( index + 1 ))
done
fi
if [ -s " ${ adb_repdir } /adb_report.final " ]
then
printf "%s\n%s\n%s\n" ":::" "::: Latest DNS Queries" ":::"
printf "%s\n" " ${ rep_latest } "
else
printf "%s\n%s\n%s\n" ":::" "::: no reporting data available yet" ":::"
printf "%-15s%-15s%-45s%-50s%s\n" "Date" "Time" "Client" "Domain" "Answer"
awk '{printf "%-15s%-15s%-45s%-50s%s\n",$1,$2,$3,$4,$5}' " ${ adb_repdir } /adb_report.final "
fi
else
printf "%s\n%s\n%s\n" ":::" "::: no reporting data available yet" ":::"
fi
fi
f_log "debug" " f_report ::: action: ${ adb_action } , report: ${ adb_report } , print : ${ print } , reputil: ${ adb_reputil } , repdir: ${ adb_repdir } , repiface: ${ adb_repiface } , replisten: ${ adb_replisten } , repchunksize: ${ adb_repchunksize } , repchunkcnt: ${ adb_repchunkcnt } , bg_pid: ${ bg_pid } "
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 } "
}
# source required system libraries
@ -1251,11 +1265,11 @@ fi
f_envload
case " ${ adb_action } " in
stop)
f_report false
f_report "+" "50" " false" "false"
f_rmdns
; ;
restart)
f_report false
f_report "+" "50" " false" "false"
f_rmdns
f_envcheck
f_main
@ -1267,13 +1281,13 @@ case "${adb_action}" in
f_switch resume
; ;
report)
f_report " ${ 2 } "
f_report " ${ 2 } " " ${ 3 } " " ${ 4 } " " ${ 5 } "
; ;
query)
f_query " ${ 2 } "
; ;
start| reload)
f_report false
f_report "+" "50" " false" "false"
f_envcheck
f_main
; ;