По следам Set Up Universal Ad Blocking Through Your Router, Adblock for Tomato Routers, ALL-U-NEED Ad Blocking v3.9e, Adblock setup & install package
Исходные данные:
В наличие asus rt-n16 с прошивкой tomato либо tomatousb и доступом к роутеру по ssh.
Задача:
Настроить dnsmasq на блокировку любых нежелательных хостов а pixelserv на показ картинки (одного пустого пикселя) вместо баннеров.
Решение:
Не претендует на идеал. Но тем не менее… Значит после изучения материалов представленных и не представленных в шапке остановился на доработке скрипта из и Adblock setup & install package.
Он меня почти полностью устроил за исключением нескольких моментов.
Во первых я не понял зачем нужна реализация обновления скрипта по крону внитри самого скрипта.
Во вторых несколько зверская проверка наличия интернета
# Check to see if the network is up and we can reach the external
world.
# If not, retry once a minute.
if ! ping -c1 -w1 4.2.2.5 ; then
logger Ping failed
cru a update-adblock "\* \* \* \* \* $0"
exit
fi
у меня при включении всех чорных списков вызывала запуск нескольких
копий скрипта.
И самое главное возникло желание упростить расширение и настройку списка
чорных листов.
Самое обидное что multi-dimensional associative arrays in bash…
are not implemented
Круто! И конечно можно сделать велосипед на базе простого массива… Что я и пытался делать пока случайно не наткнулся на запись Multi-Dimensional Associative Arrays in BASH … Sort of… thx Ben
И это все изменило. Итак имеем два файла url_list.csv список зеркал плюс флаг необходимости {качать}/{не качать} и собственно adblock.sh сам скрипт
# cat url_list.csv
1,http://www.mvps.org/winhelp2002/hosts.txt
1,http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
0,http://www.it-mate.co.uk/downloads/hosts.txt
1,http://securemecca.com/Downloads/hosts.txt
0,http://hostsfile.mine.nu/Hosts
Формат элементарный - обычный текстовой файл, первый параметр {0/1} флаг необходимости закачки далее через запятую url на список.
И собственно сам скрипт adblock.sh
# cat adblock.sh
#!/bin/sh
# Местоположение временного файла
eval GENFILE="/tmp/hosts"
# redirect ip, (0.0.0.0)
eval REDIRECTIP="192.168.1.2"
# Путь к этому скрипту
# Add the directory where pixelserv is installed, if it's not in
/opt/bin.
eval PATH=/tmp/bin:/opt/usr/bin:/opt/etc/init.d:$PATH
# This effectuates the "method 1b" startup.
if [ -f $(dirname $0)/pixelserv_install ] ; then
killall pixelserv
mkdir -p /tmp/bin
cp -p $0 /tmp/bin
cp -p $(dirname $0)/pixelserv_install /tmp/bin/pixelserv
rm -f /tmp/bin/pixelserv_install
/tmp/bin/$(basename $0)
exit
fi
if ping -c 1 yahoo.com ; then
eval GOTSOURCE="0"
# Очищаем файл для чёрного списка
echo "" > $GENFILE
# Скачиваем списки и сохраняем всё в один файл
OLD_IFS=$IFS
IFS=','
while read switch url # these are the various items in the
url_list.csv
do
if [ $switch -eq 1 ]; then
# download list
if wget ${url} -O - >> $GENFILE ; then
logger "AdBlock Downloading ${url} ..." 0
GOTSOURCE="1"
else
logger AdBlock Failed ${url}
fi
fi
done \< url_list.csv
IFS=$OLD_IFS
if [ "$GOTSOURCE" = "1" ]; then
logger AdBlock Got Source Files
#Выбираем только нужные строки из чёрного списка
sed -i -e '/\^[0-9A-Za-z]/!d' $GENFILE
sed -i -e '/%/d' $GENFILE
sed -i -e 's/[[:cntrl:][:blank:]]//g' $GENFILE
sed -i -e 's/\^[ \\t]\*//;s/[ \\t]\*$//' $GENFILE
# dnsmasq, чистим, оптимизируем
sed -i -e 's/[[:space:]]\*\\[.\*$//' $GENFILE
sed -i -e 's/[[:space:]]\*\\].\*$//' $GENFILE
sed -i -e '/[[:space:]]\*#.\*$/ s/[[:space:]]\*#.\*$//' $GENFILE
sed -i -e '/\^$/d' $GENFILE
sed -i -e '/127.0.0.1/ s/127.0.0.1//' $GENFILE
sed -i -e '/\^www[0-9]./ s/\^www[0-9].//' $GENFILE
sed -i -e '/\^www./ s/\^www.//' $GENFILE
# удаляем дубликаты
cat $GENFILE | sort -u > $GENFILE.new
mv $GENFILE.new $GENFILE
# remove/whitelist websites
# removes 3 websites (aa.com, bb.com, cc.com)
# remove the # and edit the website urls.
#sed -i -e '/aa.com/d' $GENFILE
#sed -i -e '/bb.com/d' $GENFILE
#sed -i -e '/cc.com/d' $GENFILE
sed -i -e '/google.com/d' $GENFILE
sed -i -e '/wordpress.com/d' $GENFILE
# Allow googleadservices--it handles google's sponsored links.
sed -i -e '/googleadservices/d' $GENFILE
# Allow this -- whatever it is.
#sed -i -e '/tradedoubler.com/d' $GENFILE
# Add any additional URLs that you want to block.
#echo "zmedia.com" >$GENFILE
## including important informations
echo "##" >>/tmp/adblock.conf
echo "##-----------------------------------------"
>>/tmp/adblock.conf
echo "## Generated by AdBlock script v1.0 " >>/tmp/adblock.conf
echo "## Grabbed on $(date)" >>/tmp/adblock.conf
echo "## "\`cat $GENFILE | wc -l\`" blocked hosts" >>
/tmp/adblock.conf
echo "##-----------------------------------------"
>>/tmp/adblock.conf
echo "##" >>/tmp/adblock.conf
awk 'ORS=(NR%5)?"/":"/\\n" ; BEGIN{end = 0} ; END{printf
(NR%5)?"\\n":""}' $GENFILE | sed "s_\^_address=/_ ;
s/$/$REDIRECTIP/">>/tmp/adblock.conf
rm -rf $GENFILE
# Replace the adblock stuff in the "custom" file.
sed -i "/\^#BEGIN--adblock-custom/,/\^#END--adblock-custom/d"
/etc/dnsmasq.custom
echo "#BEGIN--adblock-custom
conf-file=/etc/adblock.conf
#END--adblock-custom" >/etc/dnsmasq.custom
mv /tmp/adblock.conf /etc/adblock.conf
# Start up pixelserv.
# Start pixelserv if it isn't already running. Exit if it didn't
start.
# The pixelserv "-w" option replaces the ads with a 30x30 warning
logo,
# for testing.
# Without "-w" it replaces ads with a 1x1 empty pixel.
ifconfig br0:0 $REDIRECTIP
#if [ "$(pidof pixelserv)x" = "x" ] ; then pixelserv -w $REDIRECTIP
; sleep 1 ; fi
if [ "$(pidof pixelserv)x" = "x" ] ; then pixelserv $REDIRECTIP;
sleep 1 ; fi
if [ "$(pidof pixelserv)x" = "x" ] ; then
# Pixelserv didn't start.
# Delete the old adblock stuff.
sed -i "/\^#BEGIN--adblock-custom/,/\^#END--adblock-custom/d"
/etc/dnsmasq.custom
echo "" >>/etc/adblock.conf
exit
fi
fi
fi
logger "Updated adblock blacklist sites."
service dnsmasq restart
# Due to a timing bug, dnsmasq sometimes fails to restart on Tomato
versions
# before v49(?). The next few lines are a work-around for that.
n=10 ; while [ $n -ge 0 ] ; do
sleep 1
if nslookup nyse.com ; then
exit
fi
service dnsmasq restart
let n=n-1
done
pixelserv я брал отсюда установка и использование аналогично Adblock setup & install package
Сам скрипт adblock.sh в настройках tomato у меня живет в script_wanup=/opt/usr/bin/adblock.sh
В предложенном выше варианте растройки url_list.csv у меня блокирует:
##
##-----------------------------------------
## Generated by AdBlock script v1.0
## Grabbed on Tue Oct 11 13:10:55 DST 2011
## 15935 blocked hosts
##-----------------------------------------
##
Если задействовать еще и http://www.it-mate.co.uk/downloads/hosts.txt
(вариант для параноиков) то выходит как то так
##
##-----------------------------------------
## Generated by AdBlock script v1.0
## Grabbed on Tue Oct 11 12:54:40 DST 2011
## 181159 blocked hosts
##-----------------------------------------
##
Однако во втором случае блокируется чуть ли не весь интернет. ;) И не
говорите что я вас не предупреждал.
Используйте только на свой страх и риск.
Изменения/Улучшения/Доработка/Патчи только приветствуются.
Comments