AdBlock with dnsmasq and pixelserv on tomato

По следам 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