Nod32 Update server на Perl v0.1

В локалке много людей используют антивирус 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. Кстати, его два раза можно было и не вызывать:) Уж если использовать твою нотацию:

	if (check_server($host)) {
		delete_signature($key);
		download_signature($key);
		get_base_version();
	} else {
		print "WEb server is down!!!!!1\n";
		exit 1;
               }

Зачем делать два вызова?

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

Ну, это мое личное мнение:)

Спасибо за советы =)

Конфиг вынесу отдельно, сам хотел это сделать. Насчет использования утилит, то да.. это костыльно как-то получается.. LWP пробовал, так и не понял как сделать чтобы получать размер файла. Нашел модуль HTTP:Size, но его нет в моем репозитарии, а через утилиту cpan оно не может установиться (не проходит какие-то тесты). В общем если с этим разобраться, то ве остальное уже заработает.

--------------

#!/usr/bin/perl
print("подпись!!1\n");

...

Мне идея очень понравилась, здорово!
и код очень классно оформлен!