Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Security —> NOD32 mirror

Создание локального зеркала обновлений NOD32

Автор: Andy2k.


Примерно с год назад ковырял я нодовский updater под фрю тщась заставить его тягать обновления и создавать локальное зеркало. Вроде как что-то у меня получилось, но скорее всего не так как надо, потому что до прошлой недели никакого локального зеркала у меня не было, тягал я обновы через виндовый сервак откуда придется, самим виндовым нодом создавал зеркало и раздавал в локалке. Однако, последнее время халявные сервера стали косячить, то пароли меняются, то адреса, а поскольку серверов у меня с десяток в разных конторах стоит, пользователи стали доставать звонками "...а у меня в трее красный щит!" (гы, англичанина бы удар хватил). Короче, решил я разобраться с нодом и его обновлениями раз и навсегда - чтоб качал автоматом, только то, что нужно (а не по 8 метров в час), а главное - сам искал ключи для получения обновлений.

Почему не воспользовался уже имеющимся ( в частности и на этом форуме) скриптами?

Объясняю:

Бесплатные серваки просто достали. То они прихлопываются нодовцами, то отстают от офф сереверов, то меняют логины-пароли, то вообще переезжают на другое доменное имя... И когда очередной бесплатный сервер дохнет у меня телефон раскаляется от звонков. надо опять лезть в самописные скрипты и править, править, править.... Д-О-С-Т-А-Л-О!!!!!!!!!


В итоге нарыл скрипт от Cmyker aka Igorek Vokar. Скрипт предназначен для АВТОМАТИЧЕСКОГО поиска ключей и создания зеркал обновлений для ESET NOD32 v 3.x и ESET Smart Security (антивирь, антиспам и файервол в одном флаконе)

Главное преимущество скрипта от cmyker в том, что он САМ НАХОДИТ ДЕЙСТВУЮЩУЮ ПАРУ ЛОГИН-ПАСС. И затем, с ее помощью обновляется с офф серверов, причем после моих модификаций тянет обновления ДЛЯ ВСЕХ ПРОДУКТОВ ESET - от нода 2.7 до Eset Smart Security... То есть можно на все продукты иметь один единый сервер обновления.

Разумеется, без небольшого напильника нам не обойтись, ну да ладно - не впервой!

Итак, приступаем:

1. Скачиваем скрипт
Скрипт автообновления NOD
файл скачан размер размещён примечание
nod.tar.gz
8462 164.3kb 2008-05-30 автообновлялка для антивируса NOD

2. Скачанный nod.tar.gz распаковываем куда-нибудь, ну например
/usr/local/nod32_upd_tools

3. Удаляем файл
 /usr/local/nod32_upd_tools/lib/unrar

Это линуховая версия, во фре она не работает.

4. Если unrar еще не установлен, ставим его из портов или пакетов и копируем фревый unrar в папку lib
cp /usr/local/bin/unrar /usr/local/nod32_upd_tools/lib/

5. Теперь правим сам скрипт upd.pl, а именно в параметр
$bases_path

прописываем, куда мы будем складывать обновления. Тут есть одна тонкость, связанная со структурой зеркала обновлений третьего нода - у него теперь update.ver лежит отдельно от самих файлов обновлений, поэтому если хотим раздавать получившееся зеркало по http надо либо сразу складывать все в корень web-сервера или потом делать туда симлинки.

6. Пробуем запустить
#/usr/local/nod32_upd_tools/upd.pl

и бежим смотреть в лог (nod32.log, появится в той же папке, где лежит upd.pl).
26-05-2008 18:27:48 Can't open authfile nod32.auth
26-05-2008 18:27:49 New key found! EAV-03404037 sp3j8wx5ut
26-05-2008 18:27:52 Checking http://u21.eset.com/eset_upd/
26-05-2008 18:27:53 Local bases copy is up to date
26-05-2008 18:27:53 Checking http://u23.eset.com/eset_upd/
26-05-2008 18:28:03 Local bases copy is up to date
26-05-2008 18:28:03 Checking http://u24.eset.com/eset_upd/
26-05-2008 18:28:03 Local bases copy is up to date
26-05-2008 18:28:03 Checking http://89.202.157.135/eset_upd/
26-05-2008 18:28:13 Downloading /download/engine3/em008_64_n2.nup(1038) old version (1038) from http://89.202.157.135
26-05-2008 18:28:14 Downloading /download/engine3/em003_32_n6.nup(1079) old version (1079) from http://89.202.157.135
26-05-2008 18:28:15 Downloading /download/engine3/em004_32_l1.nup(1070) old version (1070) from http://89.202.157.135
26-05-2008 18:28:15 Downloading /download/engine3/em002_32_n2.nup(3132) old version (3132) from http://89.202.157.135
26-05-2008 18:28:16 Downloading /download/engine3/em008_64_n6.nup(1038) old version (1038) from http://89.202.157.135
...

Если все до этого сделали правильно, в логе увидим, что скрипт не нашел ключей для обновления, смотался за ними в гугль, сложил в файл /lib/nod32.auth а затем с их помощью закачал обновления с оффсайта нода. Ура!
Если же после запуска скрипт ругается по-черному, поминая неких URI.pm и LWP.pm - это значит что он не обнаружил нужных ему  модулей. В этом случае берем cpan и доставляем модули. Например так:

#cpan -i URI
#cpan -if LWP

7. Но это еще не все, имеем мы только обновления для "тройки", а для полноты картины хочется еще и для "двойки". Тоже не проблема. Ищем на сайте уважаемого Лиссяры статью про установку и настроку nod32, в конце статьи есть ссылки на скачивание самого нода и (САМОЕ ГЛАВНОЕ!) файла лицензии.
Устанавливаем скачанное (можно подсматривать одним глазом в статью), не забываем кинуть в папку /usr/local/ets/esets/license скачанную лицензию. Если не планируется использовать самого фришного нода, можно выкинуть скрипт его автозапуска из /usr/local/etc/rc.d/. Лично я использую только его фирменный updater, лежит тут:
/usr/local/sbin/esets_update

8. Проверяем работу обновлялки для "двойки". Перед этим загляем в nod32.auth и посмотрим там текущий рабочий ключ (они одинаковы для "тройки" и "двойки"). Запускаем
#/usr/local/sbin/esets_update --username "имя" --password "пароль"

и видим, что обновления благополучно скачались. Далее можно подрихтовать файл
/usr/local/etc/esets/esets.cfg 

на предмет расположения скачанных обновлений и прочих доступных опций, но лично я предпочитаю все перечислять в командной строке самого updater-а, благо по нему есть подробнейший man.

9. Теперь собираем все до кучи. Правим upd.pl, вставляя после строки
chomp $password;

свою строчку
system("/usr/local/sbin/esets_update --base-dir <наш путь> 
--mirror-dir <наш путь>  --username $username --password $password  
--add-mod ENGLISH:RUSSIAN>> $path/nod27.log");

параметр --add-mod заставляет нод помимо обновления антивирусной базы скачивать еще и обновления программных модулей для двух языков - русского и английского.

10. Снова запускаем upd.pl и убеждаемся, что в этот раз обновились оба зеркала, и вдобавок появился еще один лог - nod27.log

Вот собственно и все.



размещено: 2008-05-30,
последнее обновление: 2008-05-31,
автор: Andy2k


m0ps, 2008-05-31 в 17:53:20

нехорошо это использовать нелицензионный софт в конторах... хотя для домашней локалки - самое оно. спасибо!

Angelius, 2008-05-31 в 22:53:37

хм...а у меня пока что стоял скрипт без автопоиска...надо заценить. спасибо!

Angelius, 2008-05-31 в 22:53:37

хм...а у меня пока что стоял скрипт без автопоиска...надо заценить. спасибо!

PlushevijOmsk, 2008-06-02 в 18:42:18

каммент раз - CPAN не работал, искал LWP в портах. p5-LWP-...
сделал службу из файло обновления. запускаю кроном /etc/rc.d/nod32upd start. отрабатывает и завершает процесс.
файл приоложить хотел, не знаю как. попробую в форуме
http://forum.lissyara.su/viewtopic.php?f=3&t=8964

Alexxx, 2008-06-03 в 10:55:02

А если легально? На офис одной лицензии хватит? Или нужно столько покупать, сколько компов в локалке будет использовать NOD32 и обновляться с такого зеркала?

Сколько весит такое зеркало в Мб? И каков размер обновлений ежедневных?

artem, 2008-06-11 в 1:19:47

А через прокси его реальзо зделать?

Dorlas, 2008-07-04 в 8:46:09

Ужос - ну неужели настолько все плохо в стране с лицензионным софтом...

Уж антивирусы то можно покупать или использовать бесплатные - все таки это не корпорация зла MS :)

dj_ras, 2008-07-09 в 15:02:33

При обновлении выдает ошибку
========
08-07-2008 18:06:20 Downloading /download/engine3/em004_32_n2.nup(1071) old version (1071) from http://u21.eset.com
08-07-2008 18:06:36 Connection timeout to http://u21.eset.com while checking /download/engine3/em004_32_n2.nup
========
и соответственно файл em004_32_n2.nup оказывается битым
Причем происходит это в разные моменты времени на разных файлах. Это как-то не сильно правильно я думаю...

VladVons, 2008-08-10 в 0:56:32

Надо и Нужно использовать софтину не взирая на лицензии.
Много говорится в нете о том что именно компании разработчики антивирусов всеми правдами и неправдами сначала разрабатывают вирус, а потом "успешно" лечат. Миром правит бизнес!

NiTr0, 2008-09-08 в 19:39:11

Для апдейта ставить нод - как-то неэстетично... Вот беглым поиском нарыл скрипт для апдейта 2.7 на перле... хотя и требует тщательной доработки напильником... почему - видно сразу же. осталось это все в кучу связать :)

NiTr0, 2008-09-09 в 2:35:34

Найденный скрипт - оказался полным шлаком, но дал идею. Переделал скрипт из статьи (для 2.7 отличий в логике нет - так, косметические фиксы) - пока работает, но хочу еще кое-чего подправить, сильно топорно и через анус некоторые моменты сделаны :( + сейчас качает много лишнего - делает полное зеркало, с китайскими, японскими и т.д. компонентами. Попозже выложу результат.

igor, 2008-12-12 в 16:34:26

////////////////////////////////
dj_ras, 2008-07-09 в 15:02:33

При обновлении выдает ошибку
========
08-07-2008 18:06:20 Downloading /download/engine3/em004_32_n2.nup(1071) old version (1071) from http: //u21.eset.com
08-07-2008 18:06:36 Connection timeout to http: //u21.eset.com while checking /download/engine3/em004_32_n2.nup
========
и соответственно файл em004_32_n2.nup оказывается битым
Причем происходит это в разные моменты времени на разных файлах. Это как-то не сильно правильно я думаю...
////////////////////////////////
Столкнулся с этой же проблемой. Немного подумав (не силен в перле), подравил файл upd.pl - теперь все работает вроде как нужно.

---------Исправление-------------
заменить строку  (где-то 121 по счету)

if ($status =~ /500 read/)  {logging("Connection timeout to $server while checking $file"); return 0;}

двумя строками

if (($status =~ /500 read/) && ($file eq "/update.ver" )) {logging("Connection timeout to $server while checking $file"); return 0;}

if (($status =~ /500 read/) && ($file ne "/update.ver" )) {logging("Connection timeout to $server while checking $file"); unlink(<$path/$file>); return 0;}
---------------------------------
Смысл исправления в удалении битого файла при ошибке типа Connection timeout to http://u21.eset.com while checking /download/engine3/хххх. Этот файл докачается со следующего сервера. Притом делается проверка чтоб это был не update.ver.
Если у кого-то есть лучшие варианты - пищите.

Crysler, 2009-04-28 в 14:15:06

Я так понял, что нода, для 64 Bit нет... Как быть?

gyurza2000, 2009-08-24 в 17:36:01

500 Can't connect to update.eset.com:80 (connect: timeout)

VladVons, 2009-12-10 в 9:45:46

Can\'t locate object method \"uri_canonical\" via package \"HTTP::Headers\" at (eval 35) line 1.

_SH, 2010-02-03 в 10:39:45

Доброго времени суток!
Спасибо за отличный скрипт!
Привожу свои доработки, продолжая идею igor. (Часть изменений кода взята из его поста). Строки требующие замены взяты из оригинального скрипта.
-----------------------------
1) Меняем строки
if ($status =~ /401/) {logging("Auth to $server failed searching for new key"); keys::start(); start("1"); return 0;}
на  
if ($status =~ /401/) {logging("Auth to $server failed searching for new key"); unlink(<$path/$file>); keys::start();  start("1"); return 0;}

if ($status =~ /500 read/) {logging("Connection timeout to $server while checking $file");return 0;}
на

if (($status =~ /500 read/) && ($file eq "/update.ver" )) {logging("Connection timeout to $server while checking $file"); return 0;}
if (($status =~ /500 read/) && ($file ne "/update.ver" )) {logging("Connection timeout to $server while checking $file"); unlink(<$path/$file>); return 0;}

if ($status =~ /500 Cannot/) {logging("Error writing $file: $!");return 0;}
на

if (($status =~ /500 Can/) && ($file eq "/update.ver" )) {logging("Error writing $file: $!"); return 0;}
if (($status =~ /500 Can/) && ($file ne "/update.ver" )) {logging("Error writing $file: $!"); unlink(<$path/$file>); return 0;}

2) В строке if (($updver{$filename}{version}) > ($updver_old{$filename}{version}) or !(-e $bases_path.$updver{$filename}{file}) or ($localfilesize != $serverfilesize && $updver{$filename}{version} > $updver_old{$filename}{version})) { ...
меняем знак > на >=, т.е.
&& $updver{$filename}{version} >= $updver_old{$filename}{version})) { ...
-----------------------------

_toxa, 2010-03-06 в 18:24:42

[code]Can't locate URI.pm in @INC (@INC contains: /usr/local/www/apache22/data/nod32/lib /usr/local/www/apache22/data/nod32 /usr/local/lib/perl5/5.10.1/BSDPAN /usr/local/lib/perl5/site_perl/5.10.1/mach /usr/local/lib/perl5/site_perl/5.10.1 /usr/local/lib/perl5/5.10.1/mach /usr/local/lib/perl5/5.10.1 .) at (eval 7) line 3.
Compilation failed in require at /usr/local/www/apache22/data/nod32/lib/HTTP/Request.pm line 5.
[b]Compilation failed in require at /usr/local/www/apache22/data/nod32/lib/LWP/UserAgent.pm line 12.
BEGIN failed--compilation aborted at /usr/local/www/apache22/data/nod32/lib/LWP/UserAgent.pm line 12.
Compilation failed in require at /usr/local/www/apache22/data/nod32/upd.pl line 13.
BEGIN failed--compilation aborted at /usr/local/www/apache22/data/nod32/upd.pl line 13.[/code]

_SH, 2010-03-06 в 22:55:40

TO _toxa
Проверь, установлены ли модули Perl. LWP и URI. Как их установить написано в статье.

_SH, 2010-05-13 в 10:03:58

Продолжаю допиливать скрипт. Потребовалось скачивать обновления через прокси. Решение уложилось в две новых строки. А именно: находим в скрипте строку

my $ua = LWP::UserAgent->new;

и после неё вставляем следующую

if ($proxy) { $ua->proxy(["http","ftp"], $proxy);}

В начале скрипта задаём значение переменной $proxy

our $proxy = "http://192.168.11.3:1080/";

Эту строку вставляем после строки our $bases_path = ...

Прим. При указании адреса прокси обязателен слеш в конце адреса. Объекту $ua указывается прокси для FTP и HTTP соединений. В принципе достаточно только HTTP.

_SH, 2010-05-13 в 11:28:41

Забыл добавить. Описанная выше доработка обеспечивает именно скачивание обновлений через прокси. Для того, чтоб искать ключи через прокси нужно доработать файл lib/keys.pm
Суть та же. В начале файла объявляем переменную $proxy

our $proxy = "http://192.168.11.3:1080/";

Далее по тексту ищем строки my $ua = LWP::UserAgent->new (...); Их вроде 3 и после каждой вставляем строку

if ($proxy) { $ua->proxy(["http","ftp"], $proxy);}

sh_gubar, 2010-06-09 в 16:42:53

Can't locate object method "uri_canonical" via package "HTTP::Headers" at (eval 31) line 1.

alexco, 2011-09-30 в 16:31:09

Есть альтернативный вариант создания зеркала http://www.lissyara.su/?id=2212

Devo, 2013-05-25 в 12:57:34

Рабочее зеркало обновлений NOD32 http://zzizz.ru:2221/
май 2013

VC, 2015-08-07 в 1:36:05

последние две версии не требуют лицензии просто правят в реестре
http://ftpn.ru/nod32-change-update-server/

VC, 2015-08-07 в 1:38:32

хм... ссылка сломалась
http://ftpn.ru/nod32-change-update-server/



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0515 секунд
Из них PHP: 24%; SQL: 76%; Число SQL-запросов: 78 шт.
Исходный размер: 46395; Сжатая: 11681