Gentoo itself is power

15.10.2011

AdBlock with dnsmasq and pixelserv on tomato

Filed under: linux — init_6 @ 14:41

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

Однако во втором случае блокируется чуть ли не весь интернет. ;) И не говорите что я вас не предупреждал.

Используйте только на свой страх и риск.
Изменения/Улучшения/Доработка/Патчи только приветствуются.

1 комментарий »

  1. [...] половина задачи борьбы со спамом решена благодаря AdBlock with dnsmasq and pixelserv on tomato Но увы не весь спам можно победить исключительно [...]

    Уведомление от AdBlock двойной удар « Gentoo itself is power — 23.10.2011 @ 08:43


RSS-лента комментариев к этой записи. URI для обратной ссылки

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Theme: Silver is the New Black. Блог на WordPress.com.

Follow

Get every new post delivered to your Inbox.