В локалке много людей используют антивирус NOD32 версии 2.7 или 3.0. Есть зеркало обновлений (работает не постоянно).
Цель: создать постоянный сервер обновлений.
#!/usr/bin/perl -w my $base_dir = "base"; my $basever_file = "basever"; my $host = "10.10.1.10"; my $port = "2221"; my %nod_files = ( "nod0F74.nup" => "62197", "nod15C0.nup" => "10913246", "nod1725.nup" => "49919", "nod1AF6.nup" => "216577", "nod23D1.nup" => "88762", "nod2536.nup" => "220506", "nod25D0.nup" => "126176", "nod261F.nup" => "32136", "nod33AF.nup" => "11131", "nod343B.nup" => "155161", "nod42C0.nup" => "311522", "nod45B2.nup" => "1625", "nod4A5E.nup" => "32606", "nod4D40.nup" => "57624", "nod514F.nup" => "14857", "nod57F0.nup" => "511546", "nod5E9E.nup" => "431832", "nod681A.nup" => "1808", "nod68FA.nup" => "31580", "nod69A7.nup" => "29447", "nod6B47.nup" => "10720", "nod6B6D.nup" => "10743", "nod6CB3.nup" => "18065", "nod73C6.nup" => "324575", "nod797A.nup" => "3112", "update.ver" => "5000" ); while (my ($key, $value) = each %nod_files) { unless (check_server($host)) { print "WEb server is down!!!!!1\n"; exit 1; } if (check_server($host)) { delete_signature($key); download_signature($key); get_base_version(); } } ######################### # FUNCTIONS # ######################### sub download_signature { my $sig_name = shift; # Detect wget # $ which wget my $wget_path = `which wget` or die "Error! Wget not found! or another error..\n"; chomp $wget_path; system "$wget_path http://$host:$port/$sig_name -P $base_dir"; } sub delete_signature { my $del_sign = shift; unlink ("$base_dir/$del_sign"); } sub check_server { my $srv_ip = shift; my $response = `sudo arping -c 1 $srv_ip`; $response =~ m/\s?\[(\w{2}:*){6}\]/; # print $&, "\n" if defined($&); if ($&) { return 1; } else { return 0; } } sub get_base_version { open (VERSION, "./base/update.ver") or die ("Error. Can't open update.ver\n"); my @line = <VERSION>; my ($line_1, $line_2); for (my $i = 0; $i < scalar(@line); $i++) { if ($line[$i] =~ m/\[ENGINE2\]/) { $line_1 = $i + 1; next; } if ($line[$i] =~ m/\[LOADER0\]/) { $line_2 = $i; last; } } my ($version_id); # for signature version my ($date); # for signature date for (my $j = $line_1; $j < $line_2; $j++) { if ($line[$j] =~ m/versionid/) { $line[$j] =~ m/\d{3,5}\s+/; $version_id = $&; } if ($line[$j] =~ m/date/) { $line[$j] =~ m/(\d{2}\.?){2}\d{4}/; $date = $&; } } # write base version & date write_on_file($basever_file, $version_id, $date); } sub write_on_file { my $filename = shift; my $version_id = \shift; my $date = \shift; open(my $file1, ">$filename"); if ( (-e $filename) and (-r $filename) ) # -e exist; -r enable to read { print $file1 "$$version_id"; print $file1 "$$date\n"; } close($file1); return 1; } ###### exit 0;
По хорошему надо сделать, чтобы размер файлов сигнатур определялся с сервера. (Не скачивая файл) но это я не осилил, поэтому тупо качается все что есть..
После обновления вытаскивается версия и дата последнего обновления из файла update.ver и записывается в файлик basever
(который потом читает php скрипт и выводит в web).
Вот его пример:
3385 25.08.2008
Скрипт запускается несколько раз в сутки через cron. Тестировалось на версии Nod32 3.0.650.0 Business edition. На момент написания обнаружилось что в новой версии (расширеной) поменялся формат сигнатур, так что буду делать 0.2 для нее. =)
Вроде бы ве что хотел рассказать - написал.
Ругайте.

Привет! Ну,
Привет!
Ну, ругать не будем, но пару-тройку комментов дать можем:)
Вынеси часть настроек(или даже все) в конфигурационный файл. Имена файлов прямо просятся туда(и им там и место). Подключение к серверу и все такое - ну, я бы тоже вынес, если честно, но это мое личное мнение.
Лучше стараться использовать стандартные для Perl решения для загрузки - LWP. Там же можно настроить обработку ошибок, например, ввести тайм-ауты.
У тебя вовсю используются различные утилиты ОС, что не есть хорошо. LWP позволит тебе обработать проблемные места, которые ты вынес в check_server. Кстати, его два раза можно было и не вызывать:) Уж если использовать твою нотацию:
Зачем делать два вызова?
Веди журнал, хотя бы элементарный, что было сделано. Каждый вызов скрипта должен что-то писать в лог файл - удалено столько-то файлов, загружено столько-то, ошибки при удалении/загрузке файла такого-то.
Ну, это мое личное мнение:)
Спасибо за советы =)
Конфиг вынесу отдельно, сам хотел это сделать. Насчет использования утилит, то да.. это костыльно как-то получается.. LWP пробовал, так и не понял как сделать чтобы получать размер файла. Нашел модуль HTTP:Size, но его нет в моем репозитарии, а через утилиту cpan оно не может установиться (не проходит какие-то тесты). В общем если с этим разобраться, то ве остальное уже заработает.
--------------
...
Мне идея очень понравилась, здорово!
и код очень классно оформлен!