Сервер обновлений DrWeb for Linux в локальной сети


Внимание: заметка устарела. Используемые здесь хаки более не работают. См. сюда.

Стоит ли иметь на компьютере с Linux антивирус? Многие, наверное, скажут "А нафига?" и будут правы (в какой-то степени). Но если через этот компьютер проходит файловый поток, который затем попадает к Windows-пользователям без антивируса (в силу разных обстоятельств), то лишним не будет. Одним из антивирусов, имеющих Linux-версию, является DrWeb, его мы и рассмотрим.
Известно, что многие Windows-пользователи (в силу разных причин) используют неофициальные программы для обновления антивирусных баз. Это очень удобно в локальных сетях, так как официальные зеркала не отличаются быстротой. Можно создать локальный сервер с обновлениями, базы будут скачиваться один раз на него, а затем раздаваться всей сети.
Под Linux же программ для неофициального обновления, насколько мне известно, нет. Будем выходить из ситуации подручными средствами.

Что имеем: сервер в локальной сети под управлением Debian 6.0.6 с установленным и настроенным web-сервером, клиенты с DrWeb for Linux 6.0.1.2.
Что хотим: обновлять базы клиентов с сервера в локальной сети.

Поехали!
Предупреждение: В скрипте обновления присутствует немного грязных хаков!

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

Создадим каталоги для хранения баз:
mkdir -p /var/www/unix/500

И поместим в удобное место (для примера - /home/user/scripts/) следующий скрипт update.sh:
#!/bin/bash
# куда будут скачиваться базы
UDPLOCDIR="/var/www/unix/500"
# откуда будут скачиваться базы
UPDSRVDIR="http://update.drweb.com/unix/500/"
# переходим в каталог
cd $UDPLOCDIR
# скачиваем файл drweb32.lst и сохраняем в drweb32.lst.orig (там хранится список всех скачиваемых файлов и их CRC32)
wget -q $UPDSRVDIR"drweb32.lst" -O drweb32.lst.orig
# скачиваем все изменившиеся файлы из drweb32.lst
cat drweb32.lst.orig | cut -c 2- | sed "s/,[^,]*//g" | grep -v '*' | grep -v timestamp | sed "s|^|`echo $UPDSRVDIR | sed 's|\/|\\\/|g'`|g" | wget -q -N -i -
# грязный хак! сервер обновлений не отдает timestamp без авторизации - создадим свой
date +%s > timestamp
# вычислим CRC32 для timestamp и запишем в новый drweb32.lst.new (позже будет переименован в drweb32.lst)
echo '+timestamp, '`crc32 timestamp | tr a-z A-Z` > drweb32.lst.new
# список файлов, подлежащих удалению на клиентских компьютерах, заносим без изменения в drweb32.lst.new
cat drweb32.lst.orig | grep '*' >> drweb32.lst.new
# для всех остальных файлов пересчитаем CRC32 (из-за несовершенства механизма обновлений базы и drweb32.lst могут оказаться разных версий)
for FNAME in $(cat drweb32.lst.orig | cut -c 2- | sed "s/,[^,]*//g" | grep -v '*' | grep -v timestamp); do echo '+'$FNAME', '`crc32 $FNAME | tr a-z A-Z` >> drweb32.lst.new; done
# удаляем временный файл и старый drweb32.lst
rm drweb32.lst.orig drweb32.lst
# переименовываем drweb32.lst.new в drweb32.lst
mv drweb32.lst.new drweb32.lst
# устанавливаем права
chmod 644 ./*

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

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

У клиентов требуется занести в файл /etc/hosts следующие строки (10.103.115.101 - IP-адрес сервера):
10.103.115.101 update.drweb.com
10.103.115.101 update.fr1.drweb.com
10.103.115.101 update.msk3.drweb.com
10.103.115.101 update.msk5.drweb.com
10.103.115.101 update.msk6.drweb.com
10.103.115.101 update.msk.drweb.com
10.103.115.101 update.nsk1.drweb.com
10.103.115.101 update.us1.drweb.com
10.103.115.101 update.us.drweb.com

И запустить обновление.


Как видим, timestamp баз соответствует времени запуска обновления на сервере.

Аналогичным образом можно обновлять и Windows-версии антивируса через стандартную программу для обновления. Для этого нужно всего лишь соответствующим образом задать переменные $UDPLOCDIR и $UPDSRVDIR.
На этом и все.

Peter , 06.02.2013


#1 MrFeod Tuesday, 12-Feb-13 22:35:34 NOVT
О, Пётр блог завел! С почином!