Perl для системного администрирования

       

Черные ящики



Черные ящики

В мире Perl часто случается так, что когда вы пытаетесь написать что-то широко используемое, кто-то другой публикует свое решение этой задачи раньше. Это дает возможность просто передать свои данные в уже готовый модуль и получить результаты, не задумываясь о том, как выполняется данная задача. Это часто называют «подходом черного ящика».

Один такой пример - это пакет SyslogScan Рольфа Харольда Нельсона (Rolf Harold Nelson). Раньше мы уже отмечали, что анализ почтового журнала sendmail может оказаться непростой задачей из-за информации о состоянии. Часто со строкой связана одна или несколько родственных строк, перемешанных с другими строками в этом же журнале. Пакет SyslogScan предоставляет простой способ обратиться к информации о доставке каждого сообщения, так что нет необходимости вручную просматривать файл и выбирать оттуда все связанные строки. Этот пакет позволяет найти в журнале определенные адреса и предоставляет некоторую статистику по найденным сообщениям.

Пакет SyslogScan объектно-ориентированный, так что первым делом нужно загрузить модуль и создать новый экземпляр объекта:

use SyslogScan::DeliveryIterator;

список почтовых журналов

syslog $maillogs = ["/var/log/mail/maillog"];

$iterator = new SyslogScan::DeliveryIterator(syslogList => $maillogs):

Метод new модуля SyslogScan: :DeliveryIterator возвращает итератор (iterator), т. е. указатель в файле, двигающийся от одной строки о доставке сообщения к другой. Применяя итератор, мы избавляемся от необходимости просматривать файл в поисках всех строк, относящихся к конкретному сообщению. Если вызвать метод next() для этого итератора, он вернет нас обратно к объекту доставки. Этот объект хранит информацию о доставке, прежде распределенную по нескольким строкам в журнале. Например, следующий код:

while ($delivery = $iterator -> next()){ print $delivery->{Sender}." -> ".

join(",",@{$delivery->{ReceiverList}}),"\n"; }

позволяет получить такую информацию:

root@host.ccs.neu.edu -> user1@cse.scu.edu

owner-freebsd-java-digest@freebsd.org ->



user2@ccs.neu.edu rootiahost.ccs.neu.edu ->

user3@ccs.neu.edu

Можно сделать еще лучше. Если передать итератор из SyslogScan методу new модуля SyslogScan: :Summary, new примет весь вывод метода next итератора и вернет итоговый объект. Этот объект содержит итоговую информацию по всем доставкам сообщений, которые только может вернуть итератор.

Но SyslogScan переносит эту функциональность на другой уровень. Если передать последний объект методу new из SyslogScan: : ByGroup, мы получим объект bygroup, в котором вся информация сгруппирована по доменам и приводится статистика по этим группам. Вот как применяется то, о чем мы только что говорили:

use SyslogScan::DeliveryIterator;

use SyslogScan::Summary;

use SyslogScan::ByGroup

use SyslogScan::Usage;

П местоположение maillog

Smaillogs = ["/var/log/mail/maillog"];

# получаем для этого файла итератор

$iterator = new SyslogScan::DeliveryIterator(syslogList => $maillogs);

# передаем итератор в ::Summary, получаем объект summary (сводка)

Ssummary = new SyslogScan::Summary($iterator);

tt передаем сводку в ::ByGroup и получаем обьект stats-by-group

# (статистика по группам)

Sbygroup = new SyslogScan::ByGroup($summary);

ft выводим содержимое этого объекта foreach $group (sort keys %$bygroup){

($bmesg,$bbytes)=@{$bygroup->{$group}->

{groupUsage}->getBroadcastVolume()}; ($smesg,$sbytes)=@{$bygroup->{$group}->

{groupllsage}->getSendVolume()}; ($rmesg,$rbytes)=@{$bygroup->{$group}->

{groupUsage}->getfieceiveVolume()}; ($rmesg,$rbytes)=@{$bygroup->{$group}->

{groupUsage}->getReceiveVolume()}; write; }

format STDOUT.TOP =

Name Bmesg BByytes Smesg SBytes Rmesg Rbytes

format STDOUT =

@««««<«««« @»>» @»»>» @»>» @»»»> @»»> @»»»>

Sgroup,Sbmesg,Sbbytes,$smesg,Ssbytes,$rmesg,$rbytes

Результат представляет собой подробный отчет по количеству широковещательных, отправленных и полученных сообщений и их размера в байтах. Вот отрывок из получаемых результатов:

Name Bmesg BByytes Smesg SByres Rmesg Roytes

globalserve net 1 1245 1 1245 0 0
gloDe.com 0 0 0 0 1 2040

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



Содержание раздела