Скрипт по обновлению антивирусных баз NOD32 под Linux (PHP)

Материал из Медиа Вики
Перейти к: навигация, поиск

Вот портировал скрипты по обновлению антивирусных баз NOD32 V2* и V3* в PHP.

Версии скрипта

Буду тут выкладывать описание версий с датами для более удобного отслеживания за изменениями

  1. Версия 2.16 от 13.01.2016
    1. Добавлена V9
  2. Версия 2.15 от 20.08.2015
    1. Исправлено несколько ошибок
    2. Добавлен W10UPGRADE Module
  3. Версия 2.14a от 5.11.2014
    1. Ошибка выкачивания компонентов V8
  4. Версия 2.14 от 29.10.2014
    1. Добавил V8
  5. Версия 2.13 от 7.11.2013
    1. Исправил ошибку выкачивания баз для EAV.
    2. Исправил ошибку скачивания блоков PAGASUS1 и PAGASUS2.
  6. Версия 2.12 от 30.10.2013
    1. Добавил отдельное зеркало для V7
    2. Добавил новую секцию SPECLEAN для V7
  7. Версия 2.11 от 2.07.2013
    1. Тк версии файлов для V5 отличались от V6, то добавил отдельное зеркало для V6
    2. Добавил 2 новых модуля EHM64* и ATON32*
  8. Версия 2.10 от 15.11.2012
    1. Исправлена ошибка при закачке обновлений EAV V3.
  9. Версия 2.9 от 10.09.2012
    1. Добавил IRIS модуль.
  10. Версия 2.8 от 16.07.2012
    1. Убрал закачку V2.
  11. Версия 2.7
  12. Версия 2.6 от 20.03.2012
    1. Добавлена закачка модуля PAGASUS.
  13. Версия 2.5 от 19.01.2012
    1. Может снимать ограничение версии для V5
    2. Устранена ошибка при ошибочном файле /arc/server
  14. Версия 2.4 от 27.12.2011
    1. Добавлен путь, как в nod32View для каждой версии базы, например, для версии V5 - eset_upd/v5.
    2. Убрана опция all_in_one из настроек.
    3. Устранено несколько мелких ошибок
  15. Версия 2.3 от 14.11.2011
    1. Исправлена ошибка, при закачке файлов V5 со свободных серверов, файлы которых собраны с помощью Nod32viewer.
    2. Исправлена ошибка, при закачке c помощью wget с пустым логином.
    3. Введена проверка на длину файлов при закачке и обновлении, при этом можно указать в настройках на сколько файлы могут максимально отличаться.
  16. Версия 2.2 от 7.11.2011
    1. Добавил возможность выбора из 4 вариантов разархиватора (7zip, unrar из пакетов, free gnu unrar и rar c http://www.rarlab.com/)
  17. Версия 2.1 от 3.11.2011
    1. Заменил архиватор unrar на 7zip, тк он есть во всех дистрибутивах и работает с архивами rar.
    2. Убрал функцию parse_ini_file(), тк 3 параметр появился только в версии php 5.3, а без него нормально не работает. А у многих стоят более старые версии.
  18. Версия 2.0 от 2.11.2011
    1. Удалена загрузка файлов через php fopen(). Из-за того, что не может работать через авторизованные прокси.
    2. Настроена работа через php curl и wget.
  19. Версия 2.0b от 20.10.2011
    1. Добавлена загрузка баз V5
    2. Доработка мелких замечаний.
  20. Версия 1.22 от 4.05.2011
    1. Исправлена ошибка, если в update.ver некоторые параметры передаются в кавычках.
  21. Версия 1.21 от 12.08.2010
    1. Добавлена закачка файлов нового модуля обновлений ESET "File system protection Module".
  22. Версия 1.20 от 21.07.2010
    1. Исправлена ошибка вывода в консоль, если файл update.ver не скачен (На нормальную работу не влияет).
  23. Версия 1.19 от 25.06.2010
    1. Возвращена возможность закачки с помощью wget.
    2. Теперь можно указать в файле настроек - какие компоненты качать (пока русские и английские).
  24. Версия 1.18 от 6.04.2010
    1. Исправлена ошибка по выкачиванию программных компонентов.
    2. Теперь можно указать в файле настроек - качать или нет программные компоненты.
    3. Если у Вас пароль от EAV, а не от ESS, то указав это в файле настроек, больше не будет возникать ошибки выкачивания файлов.
  25. Версия 1.17 от 11.03.2010
    1. Добавил по просьбе Boevik с форума возможность работать и с unrar v3.91 с сайта http://rarlab.com/download.htm.
  26. Версия 1.16 от 2.02.2010
    1. Добавил по просьбе Angpeu с форума в update.ver переменную all_in_one для случая, если для доступа к файлам обновлений нужен пароль, а файл update.ver и файлы обновлений находятся в одной директории.
  27. Версия 1.15 от 25.01.2010
    1. Убрал сравнение выкаченного файла и данных из update.ver по размеру.
    2. Данные о размера файла теперь берутся не из секции update.ver, а из реального размера файла.
  28. Версия 1.14b от 5.11.2009
    1. Добавлены новые секции для SELFDEFENSE64 и необязательные секции для компонентов для V3 и V4. Те если компоненты будут лежать в директории с обновлениями, а в update.ver нет на них ссылок, то они стираться не будут и будут добавлены в update.ver.
    2. Устранена ошибка при скачивании обновлений со свободных зеркал, где update.ver лежит вместе с файлами обновлений.
    3. Добавлена проверка на наличие модулей php-rar или unrar.
  29. Версия 1.13 от 25.10.2009
    1. Добавлены новая секция для закачки MAILSERVER.
  30. Версия 1.12d от 25.09.2009
    1. Попробовал исправить большинство ошибок при error_reporting = E_ALL в php.ini.
    2. Добавлены новые секции для закачки
  31. Версия 1.11 от 10.09.2009
    1. Исправлено несколько синтаксических ошибок.
    2. Исправлена ошибка по коду возврата GNU архиватора unrar.
    3. Не работал цикл по обновлению с другого сервера, если на первом прошла ошибка.
  32. Версия 1.10b от 13.07.2009
    1. Изменен архиватор rar на GNU версию unrar путь до архиватора вынесен в setup.php.
    2. При изменении версии или ошибке, письмо приходит только одно на обе версии базы.
  33. Версия 1.9b от 11.07.2009
    1. Закачка через wget изменена на php-cURL.
    2. Добавлен тихий режим, без отправки сообщений в консоль, если критических ошибок нет
    3. Если сервер указан, то пытается обновится только с него. Если не указан сервер (это касается только тех кто обновляется с официальных серверов), то список серверов берется из update.ver и скрипт пробует обновить базы с каждого сервера из этого списка, пока не получится. А то иногда бывает проблема с серверами (похоже из-за их перегрузки) - то их видно, то нет.
  34. Версия 1.8 от 1.07.2009
    1. Добавлена возможность закачивать файлы через прокси сервер с аутентификацией и без нее.
    2. Добавлена возможность отсылки дополнительного письма об обновлении баз на указанный п/я, в случае ошибки или удачного обновления с изменением версии.
  35. Версия 1.7 от 24.06.2009
    1. Имя пользователя, от которого работает WEB сервер вынесено в setup.php
    2. В начале скрипта umask меняется на 0022, а после выполнения возвращается на ту, что была до его выполнения.
  36. Версия 1.6 от 19.06.2009
    1. Если происходит ошибка при выкачивании файла, то обновление сразу завершается и восстанавливает базу данной версии Нода, которая была до этого. Раньше скрипт пытался выкачивать остальные файлы, а потом все равно происходило восстановление.
  37. Версия 1.5 от 16.03.2009 Теперь можно обновлять базы для NOD32 V4.
    1. Добавлены секции, которых не было в вервии V3 [SYSTEMSTATUS0], [SYSTEMSTATUS1],[SYSTEMSTATUS2],[SYSTEMSTATUS640],[SYSTEMSTATUS641],[SYSTEMSTATUS642],[SELFDEFENSE0],[SELFDEFENSE1],[SELFDEFENSE2],[SELFDEFENSE640],[SELFDEFENSE641],[SELFDEFENSE642]. Обновляется только файл секций section.php.
  38. Версия 1.4 от 21.01.2009
    1. Исправлена ошибка записи имени файла в создаваемой update.ver, если этого файла еще не было.
  39. Версия 1.3 от 16.01.2009
    1. Если при обновлении NOD32 V2 происходила ошибка, то она не сбрасывалась и для NOD32 V3
    2. Не правильно формировался блок [data0001] в файле update.ver в NOD32 V3, если в этой секции встречался знак =.
    3. Убрано отображение некоторых ненужных сообщений.
  40. Версия 1.2 от 2.12.2008
    1. Исправлено удаление файла, если он уже не нужен
  41. Версия 1.1 от 18.11.2008
    1. Первая версия.

Что умеет скрипт.

Умеет все тоже, что и скрипт на bash, только работает быстрее, один скрипт может обновлять обе версии и можно использовать на любой платформе (сам не пробовал) .

  1. Обновляет базы с официальных и бесплатных серверов NOD32 (для официальных серверов нужно задать имя и пароль для обновления). Причем, при обновлении с бесплатных серверов скрипт пробует обновится со всех серверов, указанных в update.ver и прекращает работу при первом удачном обновлении.
  2. Может работать через прокси сервер с аутентификацией и без нее.
  3. Может отправлять сообщение на указанный п/я с информацией об ошибке или при удачном обновлении с изменением версии базы.
  4. Обновляет базы для V3, V5, V6 и V7 и V8.
  5. Если на сервере названия файлов не совпадают с локальными - не качает, а переименовывает файлы.
  6. Сам создает файл update.ver. Те при обновлении с зеркал обновляются только компоненты с более новыми версиями.
  7. Автоматически создает папки, нужные для работы программы, в том числе и для Web сервера.
  8. Создает папку на веб сервере с файлами обновления.
  9. При ошибке обновления восстанавливает базу в том виде, которая была до обновления.

Скрипт автоматически создает папки для временного хранения копий баз /var/lib/nod32/mirror_V2, /var/lib/nod32/mirror_V3 /var/lib/nod32/mirror_V5 и загружает туда файлы антивирусных баз. Если обновление прошло успешно, то переписывает базы в WEB директорию, а если произошла ошибка, то наоборот, восстанавливает базы, переписывая их из WEB директории в папку временного хранения.

Спасибо Kode - использовал его функции. Так как не очень большой спец в PHP, то прошу не пинать, а если можно то помочь доработать.

Из чего состоит

  1. update.php - Сам скрипт
  2. function.php - Файл функций
  3. section.php - Файл описания секций
  4. setup.php - Файл установок

Инсталяция

Установка пакетов

Для Mandriva

  1. Устанавливаем пакеты php-cli.*.rpm, php-rar*.rpm, php-curl*.rpm, unrar*.rpm и 7zip*.rpm, если не установлен.

Для Ubuntu

sudo apt-get install php5-cli php5-curl php5-dev php-pear g++
sudo pecl install rar

Создаем файл /etc/php5/mod-available/rar.so

; configuration for php rar module
; priority=20
extension=rar.so

Далее

sudo php5enmod rar
sudo service apache2 restart

Установка скрипта

  1. Выкачиваем архив nod_upd_php_v2.16.tar.bz2) и распаковываем в любой каталог, например, /etc/upd_prog/.
  2. Редактируем файл setup.php для каждого варианта антивируса - Устанавливаем:
    1. Измените, если нужно, путь до папки, где будут храниться временные файлы работы скрипта, например (define("DEFAULT_SAVE_PATH","/var/lib/nod32");).
    2. Отредактируйте, если нужно, имя пользователя от которого работает WEB сервер, например, define("HTTP_USER", "apache");.
    3. Если не установлен модуль php-rar:
      1. Разкоментируем нужную строку с переменной $unrar, где указан нужный Вам разархиватор.
      2. Разкоментируем строку с переменной $unrar[path], где указываем путь до вашего архиватора bash (можно узнать, запустив из консоли, например: whereis 7z).
    4. Если нужна закачка с помощью wget, то разкоментируем строку ($wget='/usr/bin/wget';) и указываем путь до wget в Вашей системе (можно узнать по команде из консоли: whereis wget). Если она закоментирована, будет использоваться php-curl.
    5. Если нужна, дополнительная отправка почты, то разкоментируйте строку с переменной $user_mail и укажите там нужный email. (Но при этом дб настроен и запущен почтовый сервер (postfix, sendmail или другой).)
    6. Если Вы хотите или должны использовать HTTP-Proxy, разкоментируйте строку с переменной $proxy и укажите свои параметры Прокси сервера, например, $proxy = 'http://login:passwd@www.rrr.ru:8080';.
    7. Если хотите, то можете указать, на сколько в байтах могут отличаться размер реальных файлов и размер, указанный в update.ver ($diff=1). Обычно эти размеры не отличаются более чем на 1 байт, а в 99% равны. По умолчанию принято $diff=1.
    8. Установите $quit=1 - не отображать сообщения на консоли, кроме сообщений об ошибках и $quit=0 - отображать сообщения на консоли.
    9. Имя пользователя, для всех серверов прописываем, например, $userV2='EAV-5075555'; или '$userV2=""; - для бесплатных серверов
    10. Пароль, например, $pswV2='kd3m4567'; или $pswV2=; - для бесплатных серверов
    11. Для каждой версии сервера настраиваем:
      1. Адрес сервера, например ('host'=>'http://89.202.157.139/',). Если он не указан, то список серверов берется из update.ver (для официальных серверов), если указан, то закачка происходит только с него. Адрес можно указать двумя способами, например, для версии V5 - http://host.ru/nod325/ и http://host.ru/nod325/eset_upd/v5/.
      2. Web каталог для каждой версии баз, например, 'www'=>'/var/www/nod32/',.
      3. Программные компоненты, тут комментируем строки с ненужными программными компонентами, то они выкачиваться не будут, а если были до этого выкачаны, то будут удалены. Я, например, для V2 оставил все программные компоненты, а для V3 - нет, тк размер файлов компонентов для V3 более 80Mb, а я постоянно переписываю базы на флешку и мне эти 80 Mb не нужны. Те решайте сами - нужны они или нет. К тому же на Офе лежат старые версии компонентов.
      4. Версия пароля для обновлений. Если у Вас логин и пароль для EAV - укажите 'ess'=>0, если от ESS, то 'ess'=>1.
      5. Для V5 можно указать снять ограничение версии для обновления компонентов. Но я бы не рекомендовал это делать, пока нельзя записать альтернативные сервера, без изменения реестра и перезагрузки, тк после обновления придется снова менять реестр.
  3. Пробуем из под root запустить файл update.php.
  4. Теперь в crontab прописываем запуск скрипта
# Обновление баз NOD32*
00 09,15 * * * root /etc/upd_prog/php/update.php
и наслаждаемся автоматическим обновлением 2 раза в сутки

Настройка сервера Apache для доступа к базам по паролю

Инструкция взята тут
Итак, если нам хочется настроить Ваше зеркало так, что бы только нужные пользователи могли обновляться с нашего сервера, то тогда нужно сделать следующее.

Создание файла с паролями

Файл с учетными данными обычно называется .htpasswd и располагается в каталоге, доступ к которому необходимо ограничить. По умолчанию в Apache запрещен доступ ко всем файлам, которые начинаются на .ht, так что файл с паролями, как и файл .htaccess, не сможет быть прочитан ни одним посетителем вашего сайта. Но для ускорения работы сервера лучше использовать конфигурационный файл apache и файл паролей.

В каждой строке файла паролей хранятся данные об одном пользователе. Логин и зашифрованный пароль разделены двоеточием. Пример:

admin:YFC5nYLiUI2ig
vasya:bnqw1eZHP2Ujs

Допустим, что мы хотим создать доступ по паролю пользователя admin.
Для шифрации паролей применяется утилита htpasswd, которая поставляется в комплекте с Apache. Чтобы создать новый файл с данными о пользователе admin, войдите в каталог, где нужно ограничить доступ и будет лежать файл паролей (я использовал каталог с настройками apache - /var/www/html/nod32 (/var/www/html/nod323) и введите команду:

$ htpasswd -c .htpasswd admin

Внимание- При использовании ключа -c будет затерт старый файл с паролями, без всякого предупреждения.
Для добавления в уже существующий файл используется команда:

$ htpasswd .htpasswd vasya

После запуска, утилита попросит дважды ввести пароль и, если они совпадут, данные о пользователе будут добавлены.

Настройка сервера Apache

Теперь, чтобы включить запрос на авторизацию при попытке доступа, необходимо внести изменения в файл конфигурации.
Эти строки нужно вставить в файл конфигурации вашего сервера:

<Directory "/var/www/html/nod32">
      AllowOverride  All  
</Directory>
<Directory "/var/www/html/nod323">
       AllowOverride  All
</Directory>

AllowOverride AuthConfig или AllowOverride All - необходимо, что бы сервер при работе учитывал параметры файла .htaccess
Если данные параметры установлены на весь сервер, то тут их вписывать необязательно.
После внесения изменений в файл конфигурации, не забудьте перезагрузить Apache.

Создание файлов .htaccess

Интересное описание структуры .htaccess с примерами я нашел тут.
В директориях с файлами баз (/var/www/html/nod32 и /var/www/html/nod323, в моем случае) создаем файлы .htaccess, следующего содержания

<FilesMatch  "\.(nup)$">
    AuthName "Private zone"
    AuthType Basic
    require valid-user
    AuthUserFile  /var/www/nod323/.htpasswd
    Order deny,allow
    Deny from all
    Allow from 172.16.130.0/24
    Satisfy Any
</FilesMatch>

FilesMatch "\.(nup)$" - означает, что на все файлы в данной директории с расширением .nup, сервер будет запрашивать пароль.
Вам необходимо изменить путь к файлу с паролями (AuthUserFile)- путь должен быть полным и строку-приглашение (AuthName), которая выдается на экран пользователю при запросе пароля.
Если Вы хотите, что бы в вашей локальной сети (172.16.130.0/24 - в моем случае) все обновлялись без пароля, добавьте еще три строки

    Order deny,allow
    Deny from all
    Allow from 172.16.130.0/24
    Satisfy Any

Я их показал снова, что бы было понятно, что за что отвечает.

Значение других директив вы можете узнать из документации Apache.