1 #!/bin/sh /etc/rc.common
8 readonly A_TMP
='/var/hosts.allowed.tmp'
9 readonly B_TMP
='/var/hosts.blocked.tmp'
10 readonly T_TMP
='/var/simple-adblock.hosts'
11 readonly dl
='wget --no-check-certificate -qO-'
12 readonly h_filter
='/localhost/d;/^#/d;/^$/d;/^[^0-9]/d;s/^0\.0\.0\.0.//;s/^127\.0\.0\.1.//;s/[[:space:]]*#.*$//;s/[[:cntrl:]]$//;s/[[:space:]]//g;'
13 readonly d_filter
='/localhost/d;/^#/d;/^$/d;s/[[:space:]]*#.*$//;s/[[:space:]]*$//;s/[[:cntrl:]]$//;/[[:space:]]/d;/^</d;'
14 readonly f_filter
='s|^|local=/|;s|$|/|'
15 readonly _ok_
='\033[0;32m\xe2\x9c\x93\033[0m'
16 readonly _fail_
='\033[0;31m\xe2\x9c\x97\033[0m'
17 readonly __ok__
='\033[0;32m[\xe2\x9c\x93]\033[0m'
18 readonly __fail__
='\033[0;31m[\xe2\x9c\x97]\033[0m'
19 readonly _error_
='\033[0;31mERROR\033[0m'
21 export verbosity
=2 force_dns
=1 bgrun
=0 hosts_file
='/var/dnsmasq.d/simple-adblock' led wan_if wan_gw wanphysdev
23 ok
() { case $verbosity in 1) output
"$_ok_";; 2) output
"$__ok__\n";; esac; }
24 okn
() { case $verbosity in 1) output
"$_ok_\n";; 2) output
"$__ok__\n";; esac; }
25 fail
() { case $verbosity in 1) output
"$_fail_";; 2) output
"$__fail__\n";; esac; }
26 failn
() { case $verbosity in 1) output
"$_fail_\n";; 2) output
"$__fail__\n";; esac; }
27 output
() { [[ $# -ne 1 ]] && { [[ ! $
((verbosity
& $1)) -gt 0 ]] && return 0 ||
shift; }; local msg
; msg
=$
(echo -n "${1/$p_name /service }" | sed 's|\\033\[[0-9]\?;\?[0-9]\?[0-9]\?m||g'); [[ -t 1 ]] && echo -e -n "$1"; [[ $(echo -e -n "$msg" | wc -l) -gt 0 ]] && logger -t "${PKG_NAME:-service} [$$]" "$(echo -e -n ${logmsg}${msg})" && logmsg='' || logmsg=${logmsg}${msg}; }
28 PKG_NAME="${PKG_NAME:-simple-adblock}"; p_name="${PKG_NAME} ${PKG_VERSION}"
30 led_on(){ [[ -n "$led" && -e "$led/trigger
" ]] && echo "default-on
" > "$led/trigger
"; }
31 led_off(){ [[ -n "$led" && -e "$led/trigger
" ]] && echo "none
" > "$led/trigger
"; }
36 config_get_bool enabled 'config' 'enabled' 1
37 config_get_bool bgrun 'config' 'run_in_background' 0
38 config_get_bool force_dns 'config' 'force_dns' 1
39 config_get verbosity 'config' 'verbosity' '2'
40 config_get hosts_file 'config' 'hosts_file' '/var/dnsmasq.d/simple-adblock'
41 config_get led 'config' 'led'
42 led="${led:+/sys/class/leds/$led}"
43 [[ $enabled -gt 0 ]] || { output "$_error_: $p_name is not enabled.
\n"; return 1; }
44 source /lib/functions/network.sh
46 network_find_wan wan_if; [ -n "$wan_if" ] && network_get_gateway wan_gw $wan_if;
47 [[ $c -ge 25 || -n "$wan_gw" ]] && break
48 output "$p_name waiting
for wan gateway...
\n"; sleep 2; network_flush_cache; let "c
+=1";
50 [ -n "$wan_gw" ] && return 0 || { output "$_error_: $p_name failed to discover WAN gateway.
\n"; return 1; }
54 [[ $force_dns -eq 0 ]] && return 0
55 [ -z "$PKG_NAME" ] && return 1
56 iptables-save | grep -Fv -- "$PKG_NAME" | iptables-restore
57 lsmod | grep -q ip6table_nat && ip6tables-save | grep -Fv -- "$PKG_NAME" | ip6tables-restore
58 [ ! "$1" == "quiet
" ] && output 'No longer forcing local DNS server.\n'
62 local ip ipv6 label ipv6wan brname
63 network_get_ipaddr ip lan; network_get_ipaddr6 ipv6 lan; network_get_device brname lan; network_get_physdev wanphysdev wan;
64 ipv6wan=$(ifconfig $wanphysdev | grep inet6 | awk '{print $3}')
66 if [[ $force_dns -ne 0 ]]; then
67 [ -n "$ip" ] && iptables -t nat -A prerouting_rule -i $brname -p tcp --dport 53 -j DNAT --to $ip -m comment --comment "$PKG_NAME"
68 [ -n "$ip" ] && iptables -t nat -A prerouting_rule -i $brname -p udp --dport 53 -j DNAT --to $ip -m comment --comment "$PKG_NAME"
69 if [[ -n "$ipv6" && -n "$ipv6wan" ]] && lsmod | grep -q ip6table_nat; then
70 ip6tables -t nat -A PREROUTING -i $brname -p tcp --dport 53 -j DNAT --to-destination [$ipv6] -m comment --comment "$PKG_NAME"
71 ip6tables -t nat -A PREROUTING -i $brname -p udp --dport 53 -j DNAT --to-destination [$ipv6] -m comment --comment "$PKG_NAME"
76 [ -n "$label" ] && output "Forcing
local DNS server
: $label.
\n" || output "$_error_: $p_name failed to obtain LAN IP address
for DNS forcing
!\n"
81 [ -f $hosts_file ] && mv $hosts_file $T_TMP
82 output 3 "Restarting dnsmasq
"
84 /etc/init.d/dnsmasq restart >/dev/null 2>&1
85 [[ $? -eq 0 ]] && { okn; output "$p_name stopped.
\n"; } || { failn; output "$_error_: $p_name failed to reload dnsmasq
!\n"; }
89 local label type D_TMP R_TMP
90 [[ -n "$1" && -n "$2" && -n "$3" ]] || return 1
92 [ "$2" == "hosts
" ] && label="Hosts
: $
(echo $1 | cut
-d'/' -f3)" filter="$h_filter" || label="Domains
: $
(echo $1 | cut
-d'/' -f3)" filter="$d_filter"
93 [ "$3" == "blocked
" ] && { type='Blocked'; D_TMP="$B_TMP"; } || { type='Allowed'; D_TMP="$A_TMP"; }
94 R_TMP="/var
/simple-adblock_$
(head /dev
/urandom |
tr -dc 'A-Za-z0-9' |
head -c10)"
95 while [ -e "$R_TMP" ]; do R_TMP="/var
/simple-adblock_$
(head /dev
/urandom |
tr -dc 'A-Za-z0-9' |
head -c10)"; done
97 output 2 "[DL
] $type $label "
98 $dl "${url}" > "$R_TMP" && ok || fail
99 { sed -i "$filter" "$R_TMP"; cat "$R_TMP" >> "$D_TMP"; rm -f "$R_TMP"; } &
102 start_adblocking () {
103 local whitelist_domains blacklist_domains whitelist_domains_urls blacklist_domains_urls blacklist_hosts_urls
104 config_get whitelist_domains 'config' 'whitelist_domain'
105 config_get blacklist_domains 'config' 'blacklist_domain'
106 config_get whitelist_domains_urls 'config' 'whitelist_domains_url'
107 config_get blacklist_domains_urls 'config' 'blacklist_domains_url'
108 config_get blacklist_hosts_urls 'config' 'blacklist_hosts_url'
112 [ ! -d ${hosts_file%/*} ] && mkdir -p ${hosts_file%/*}
113 if [[ -s $T_TMP && ! "$1" == "reload
" ]]; then
114 output 3 'Found existing data file, reusing it '
115 mv $T_TMP $hosts_file && okn || failn
117 [ -f $A_TMP ] && rm -f $A_TMP; [ -f $B_TMP ] && rm -f $B_TMP; [ -f $T_TMP ] && rm -f $T_TMP; [ -f $hosts_file ] && rm -f $hosts_file
118 touch $A_TMP; touch $B_TMP; touch $T_TMP;
120 if [ -n "$blacklist_hosts_urls" ]; then
121 output 1 '[DL] Blocked Hosts '
122 for hf in ${blacklist_hosts_urls}; do process_url "$hf" 'hosts' 'blocked'; done
126 if [ -n "$blacklist_domains_urls" ]; then
127 output 1 '[DL] Blocked Domains '
128 for hf in ${blacklist_domains_urls}; do process_url "$hf" 'domains' 'blocked'; done
132 if [ -n "$whitelist_domains_urls" ]; then
133 output 1 '[DL] Allowed Domains '
134 for hf in ${whitelist_domains_urls}; do process_url "$hf" 'domains' 'allowed'; done
137 output 3 'Waiting for background processes '
140 [ -n "$blacklist_domains" ] && for hf in ${blacklist_domains}; do echo "$hf" | sed "$d_filter" >> $B_TMP; done
141 whitelist_domains="${whitelist_domains}"$'\n'"$
(cat $A_TMP)"
142 [ -n "$whitelist_domains" ] && for hf in ${whitelist_domains}; do hf=$(echo $hf | sed 's/\./\\./g'); w_filter="$w_filter/^${hf}$/d;/\\.${hf}$/d;"; done
144 if [ -s $B_TMP ]; then
145 output
1 'Processing downloads '
146 output
2 'Sorting merged file '; sort $B_TMP |
uniq > $T_TMP && ok || fail
147 output
2 'Whitelisting domains '; sed -i "$w_filter" $T_TMP && ok || fail
148 output
2 'Formatting merged file '; sed "$f_filter" $T_TMP > $hosts_file && ok || fail
151 output
3 'Removing temporary files '
152 [ -f $A_TMP ] && rm -f $A_TMP; [ -f $B_TMP ] && rm -f $B_TMP; [ -f $T_TMP ] && rm -f $T_TMP;
157 if [ -s $hosts_file ]; then
158 output
3 'Restarting dnsmasq '
159 /etc
/init.d
/dnsmasq restart
>/dev
/null
2>&1
160 if [[ $?
-eq 0 ]]; then
162 output
"$p_name blocking $(wc -l < $hosts_file) domains $_ok_\n"
164 failn
; output
"$_error_: $p_name failed to reload dnsmasq!\n";
168 output
"$_error_: $p_name failed to create its data file!\n"
173 boot
() { sleep 10; rc_procd start_service
; rc_procd service_triggers
; }
176 is_enabled ||
return 1
177 [[ -t 1 && $bgrun -eq 1 ]] && (start_adblocking
'reload' |
cat &) || start_adblocking
'reload'
181 is_enabled ||
return 1
184 procd_set_param stdout
1
185 procd_set_param stderr
1
190 [[ -t 1 && $bgrun -eq 1 ]] && (start_adblocking
$1 |
cat &) || start_adblocking
$1
194 is_enabled ||
return 1
196 [[ -t 1 && $bgrun -eq 1 ]] && (stop_adblocking |
cat &) || stop_adblocking
199 service_triggers
() {
200 procd_add_reload_trigger
'simple-adblock'