Всем добрый день.Помогите разобрать с куском кода, так как с перлом не имел дела вообще...
Немного истории:
- задача программы - просматривать какие программы и пакеты установлены в сети на серверах и ПК, потом скачивание новостей по безопасности из инета -> сравнивает установленные пакеты и какие баги и в чём нашли, если есть совпадения, то извещает админа о них.Так вот интересующая часть программы - это как раз то место, где идёт сравнение установленных программ и багов. Я не могу понять, куда она записывает результат. В мануале вроде написано, что она извещает администратора, но как она это делает - найти этот момент я не смог.
Вопросы:
1) куда результат сравнения сейчас записывается?
2) можно ли изменить код, что б она записывала результат сравнения в файл?Часть кода, отвечающая за сравнение (на сколько я понял):
#
# matches software against feed items
#
sub match {
my( $package, $version, $item ) = @_;
return 0 unless ( $package and $version and $item );
return 0 unless $item =~ /[\s\-\_\.\!\:]\Q$package\E[\s\-\_\.\!\:]/i;
#
# kill buzzwords to minimize false positives
#
my $filter = '\s(?:access|ready|protocol|version|release|root|account
|connect|server|client|microsoft|windows|win32|gpl
|(?:open|free|net|mir|dragonfly|desktop)\-?bsd|free
|suse|debian|gentoo|ubuntu|redhat|slackware|admin
|unix|fedora|hp-ux|solaris|irix|linux|administrator
|xss|ajax|cross.?site.?scripting)\s';
$item =~ s/$filter//xigo unless " $package $version " =~ /$filter/xigo;return 1 if $Conf{'paranoid'};
my $count = 3;
$count++ if $version =~ /.{1,4}\./o;
$version = substr $version, 0, $count;
return 0 unless $item =~ /\Q$version\E/i;return 1;
}
>[оверквотинг удален]
>
>
> return 1 if $Conf{'paranoid'};
> my $count = 3;
> $count++ if $version =~ /.{1,4}\./o;
> $version = substr $version, 0, $count;
> return 0 unless $item =~ /\Q$version\E/i;
>
> return 1;
>}1) похоже что этой процедуре передаётся параметрами пакет, версия и некий итем. и после хитрых действий программа возвращает 0 - не надо обвнолять или 1 - надо обновлять
2) все return замените на
вывод_в_файл x and return x.
>[оверквотинг удален]
>> return 0 unless $item =~ /\Q$version\E/i;
>>
>> return 1;
>>}
>
>1) похоже что этой процедуре передаётся параметрами пакет, версия и некий итем.
>и после хитрых действий программа возвращает 0 - не надо обвнолять
>или 1 - надо обновлять
>2) все return замените на
>вывод_в_файл x and return x.конечно же - помогиТЕ.. опечатался...
извиняюсь, но в перле ПОЛНЫЙ нуль((((
правильно я пониаю, что здесь 0 или 1 передаётся остальной части программы, а не сам пакет и его версия? а можно здесь в файл вывести не 0 или 1, а программу и версию при результате 1?... и что значит вывод_в_файл х , его путь?
>[оверквотинг удален]
>>вывод_в_файл x and return x.
>
>конечно же - помогиТЕ.. опечатался...
>
>извиняюсь, но в перле ПОЛНЫЙ нуль((((
>
>правильно я пониаю, что здесь 0 или 1 передаётся остальной части программы,
>а не сам пакет и его версия? а можно здесь в
>файл вывести не 0 или 1, а программу и версию при
>результате 1?... и что значит вывод_в_файл х , его путь?пакет и версия передаётся извне в программу в качестве параметров: my( $package, $version, $item ) = @_;, а программа возвращает 0 или 1 тоже во внешнюю часть - куча return'ов. но если обновление происходит действительно по return 1, то можно сделать как-то так.
sub match {
my( $package, $version, $item ) = @_;
return 0 unless ( $package and $version and $item );
return 0 unless $item =~ /[\s\-\_\.\!\:]\Q$package\E[\s\-\_\.\!\:]/i;
#
# kill buzzwords to minimize false positives
#
my $filter = '\s(?:access|ready|protocol|version|release|root|account
|connect|server|client|microsoft|windows|win32|gpl
|(?:open|free|net|mir|dragonfly|desktop)\-?bsd|free
|suse|debian|gentoo|ubuntu|redhat|slackware|admin
|unix|fedora|hp-ux|solaris|irix|linux|administrator
|xss|ajax|cross.?site.?scripting)\s';
$item =~ s/$filter//xigo unless " $package $version " =~ /$filter/xigo;
my $fH;
open($fH, ">>/путь/к/файлу");print($fH "пакет $package, версия $version, итем $item") && close($fH) && return 1 if $Conf{'paranoid'};
my $count = 3;
$count++ if $version =~ /.{1,4}\./o;
$version = substr $version, 0, $count;
return 0 unless $item =~ /\Q$version\E/i;print($fH "пакет $package, версия $version, итем $item");
close($fH);
return 1;
}
>[оверквотинг удален]
>
> my $count = 3;
> $count++ if $version =~ /.{1,4}\./o;
> $version = substr $version, 0, $count;
> return 0 unless $item =~ /\Q$version\E/i;
>
> print($fH "пакет $package, версия $version, итем $item");
> close($fH);
> return 1;
>}Кирилл, спасибо большое за помощь!)