Сервер обновлений DrWeb в локальной сети и не только: часть 2


Внимание: скрипты, опубликованные в этой заметке, использовать не рекомендуется. Они не обеспечивают целостности зеркала баз, к тому же не работают с базами от версии 9.0. Улучшенное средство для создания зеркал можно взять здесь.

Старые хаки для обновления, описанные в этой заметке более не работают, к тому же тот способ без напильника не пригоден для других, более новых версий антивируса. А это значит, что пора описать новый способ, полностью лишенный тех недостатков.
Итак, требования к будущему серверу обновлений:
Что имеем: сервер в локальной сети под управлением Debian 6.0.6 с установленным и настроенным Apache, клиенты с DrWeb разнообразных версий.
Что хотим: обновлять базы клиентов с сервера.

Поехали!
Сначала настроим сервер. Из необходимых пакетов только sed:
sudo apt-get install sed

Пусть базы будут складываться в /media/archive/mirrors/drweb, дабы не захламлять корень web-сервера. Для этого настроим виртуальный хост: в /etc/apache2/sites-enabled поместим файл 001-drweb следующего содержания:
<VirtualHost *:80>
	ServerName update.drweb.com
	ServerAlias *.drweb.com 81.176.67.* 81.177.37.* 83.222.3.* 87.242.75.* 89.111.188.* 91.121.123.* 92.46.53.* 95.172.148.* 209.160.24.* 213.59.1.* 213.59.3.*
	DocumentRoot /media/archive/mirrors/drweb
	<Directory /media/archive/mirrors/drweb/>
		Options -Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>
</VirtualHost>

ServerAlias`ы из IP адресов, возможно, придется со временем подправлять, ибо они имеют тенденцию изменяться.
Создадим каталоги для хранения баз:
cd /media/archive/mirrors/drweb/
mkdir -p windows\
433/windows \
433/vr/windows \
servers/433/windows \
444/windows \
444/vr/windows \
444/servers/windows \
500/windows \
500/winold/windows \
500/sspace/windows \
500/servers/windows \
500/servers/nt4srv/windows \
x86/600/av/windows \
x64/600/av/windows \
x86/600/sspace/windows \
x64/600/sspace/windows \
x86/600/servers/windows \
x64/600/servers/windows \
unix/500 \
unix/700 \
xmlzone/release/700/av \
xmlzone/release/700/sspace \
xmlzone/release/700/servers \
xmlzone/release/800/av \
xmlzone/release/800/sspace

Теперь нам понадобится лицензионный ключ (мы же не пираты какие-нибудь), подойдет любой ключ от используемых клиентов. Для примера, поместим его в /home/user/scripts/drweb/drweb32.key .
Поместим в удобное место (для примера - /home/user/scripts/drweb/) следующий скрипт update.sh:
#!/bin/bash
HTTPDROOTDIR="/media/archive/mirrors/drweb"
UPDATESERVER="update.nsk1.drweb.com"
KEYFILE="/home/user/scripts/drweb/drweb32.key"
KEYID=`cat "${KEYFILE}" | sed '1,/\[User\]/d ; /\[/,$d ; /Number=[0-9]\{10\}/!d ; s/Number=//' | sed q`
KEYMD5=`md5sum -b "${KEYFILE}" | cut -c -32`

function update_5
{
    cd "${HTTPDROOTDIR}/$1"
    ERRN='0'
    wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N "http://${UPDATESERVER}/$1/drweb32.lst" || ERRN='1'
    if [ ${ERRN} -eq 1 ] ; then echo "[DrWeb Updater] http://${UPDATESERVER}/$1 update failed." && exit 1 ; fi
    grep '^[+=]' "drweb32.lst" | cut -c 2- | sed 's/.*\\//g ; s/<.*>//g ; s/,[^,]*//g' | sed "s|^|http://${UPDATESERVER}/$1/|g" | wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -i - || ERRN='1'
    if [ ${ERRN} -eq 1 ] ; then echo "[DrWeb Updater] http://${UPDATESERVER}/$1 update failed." && exit 1 ; fi
    rm $( grep '^[-]' "drweb32.lst" | cut -c 2- | sed 's/.*\\//g ; s/<.*>//g ; s/,[^,]*//g' ) 2>/dev/null || true
    chmod 644 ./*
}

function update_7
{
    cd "${HTTPDROOTDIR}/$1"
    ERRN='0'
    SKIPLVL=`echo "$1" | sed 's/[^\/]//g' | wc -c`
    wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -x -nH --cut-dirs=${SKIPLVL} "http://${UPDATESERVER}/$1/versions.xml" || ERRN='1'
    if [ ${ERRN} -eq 1 ] ; then echo "[DrWeb Updater] http://${UPDATESERVER}/$1 update failed." && exit 1 ; fi
    VERSIONNAME=`cat "versions.xml" | grep 'version name=' | sed 's/^.*version name="//g ; s/".*$//g'`
    for FNAME in $(cat "versions.xml" | grep '<lzma' | sed 's/^.*name="//g ; s/".*$//g'); do
        wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -x -nH --cut-dirs=${SKIPLVL} "http://${UPDATESERVER}/$1/${FNAME}"
    done
    wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -x -nH --cut-dirs=${SKIPLVL} "http://${UPDATESERVER}/$1/${VERSIONNAME}/products.xml" || ERRN='1'
    if [ ${ERRN} -eq 1 ] ; then echo "[DrWeb Updater] http://${UPDATESERVER}/$1 update failed." && exit 1 ; fi
    for PRODUCTNAME in $(cat "${VERSIONNAME}/products.xml" | grep '<component name=' | grep 'priority=' | sed 's/^.*name="//g ; s/".*$//g'); do
        wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -x -nH --cut-dirs=${SKIPLVL} "http://${UPDATESERVER}/$1/${VERSIONNAME}/${PRODUCTNAME}/revisions.xml" || ERRN='1'
        if [ ${ERRN} -eq 1 ] ; then echo "[DrWeb Updater] http://${UPDATESERVER}/$1 update failed." && exit 1 ; fi
        REVISIONNAME=`cat "${VERSIONNAME}/${PRODUCTNAME}/revisions.xml" | grep 'revision name=' | sed 's/^.*revision name="//g ; s/".*$//g'`
        wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -x -nH --cut-dirs=${SKIPLVL} "http://${UPDATESERVER}/$1/${VERSIONNAME}/${PRODUCTNAME}/${REVISIONNAME}/revision.xml" || ERRN='1'
        if [ ${ERRN} -eq 1 ] ; then echo "[DrWeb Updater] http://${UPDATESERVER}/$1 update failed." && exit 1 ; fi
        for FNAME in $(cat "${VERSIONNAME}/${PRODUCTNAME}/${REVISIONNAME}/revision.xml" | grep '<lzma' | sed 's/^.*name="//g ; s/".*$//g'); do
            wget --header="X-DrWeb-Validate: ${KEYMD5}" --header="X-DrWeb-KeyNumber: ${KEYID}" -q -N -x -nH --cut-dirs=${SKIPLVL} "http://${UPDATESERVER}/$1/${VERSIONNAME}/${PRODUCTNAME}/${REVISIONNAME}/${FNAME}" 
        done
    done
    find . -type f -exec chmod 644 \{\} \;
    find . -type d -exec chmod 755 \{\} \;
}

# DrWeb 4.33 for Windows
#update_5 "windows"
#update_5 "433/windows"
# DrWeb 4.33 for Windows + Antispam
#update_5 "433/vr/windows"
# DrWeb 4.33 for Windows Server
#update_5 "servers/433/windows"

# DrWeb 4.44 for Windows
#update_5 "444/windows"
# DrWeb 4.44 for Windows + Antispam
#update_5 "444/vr/windows"
# DrWeb 4.44 for Windows Server
#update_5 "444/servers/windows"

# DrWeb 5.0 for Windows
update_5 "500/windows"
update_5 "500/winold/windows"
# DrWeb 5.0 Security Space for Windows
update_5 "500/sspace/windows"
# DrWeb 5.0 for Windows Server
update_5 "500/servers/windows"
update_5 "500/servers/nt4srv/windows"

# DrWeb 6.0 for Windows
update_5 "x86/600/av/windows"
update_5 "x64/600/av/windows"
# DrWeb 6.0 Security Space for Windows
update_5 "x86/600/sspace/windows"
update_5 "x64/600/sspace/windows"
# DrWeb 6.0 for Windows Server
update_5 "x86/600/servers/windows"
update_5 "x64/600/servers/windows"

# DrWeb 5.0/6.0 for Unix
update_5 "unix/500"
# DrWeb 6.0 for Unix
update_5 "unix/700"

# DrWeb 7.0 for Windows
update_7 "xmlzone/release/700/av"
# DrWeb 7.0 Security Space for Windows
update_7 "xmlzone/release/700/sspace"
# DrWeb 7.0 for Windows Server
update_7 "xmlzone/release/700/servers"

# DrWeb 8.0 for Windows
update_7 "xmlzone/release/800/av"
# DrWeb 8.0 Security Space for Windows
update_7 "xmlzone/release/800/sspace"

Управление скриптом достаточно тривиальное, в HTTPDROOTDIR указываем место, куда качать базы, в UPDATESERVER - сервер обновлений, в KEYFILE - путь к ключевому файлу. Выбор версий, для которых производится зеркалирование обновлений, выполняется комментированием/раскомментированием нужных строк в конце скрипта.

Занесем в cron задание - запускать скрипт каждый час в 11 минут (почему бы и нет?):
11 */1 * * * /home/user/scripts/drweb/update.sh

На этом настройка сервера завершена.

У клиентов будем проворачивать хитрожопый трюк, найденый мною здесь: http://club.dns-shop.ru/RabinoVich/blog/Сервера-обновлений-антивирусных-баз-Часть-1-DrWeb/. Суть его в том, что для антивируса наш web-сервер будет выглядеть как прокси.
Настраивается прокси в разных версиях антивируса по-разному:
В 4.xx под Windows в настройках сканера


В 5.x и 6.x под Windows в настройках обновлений

  

В 7.x и 8.x под Windows и в 6.x под Linux в общих настройках

    

В этом и есть вся фишка. В итоге обновление возможно из произвльных мест, а не только из локальной сети (не считая мест где на самом деле стоит настоящий прокси). Впрочем, обновление через шару Samba никто не отменял.

На этом пока все.

UPD 30.05.2013:
После пользования n-го количества времени этим методом выяснилось несколько интересных подробностей.

Peter , 30.03.2013