Язык программирования Perl - Михаил Шохирев
Шрифт:
Интервал:
Закладка:
Естественно, что в Perl имеется множество средств работы с электронной почтой. По электронной почте можно организовать автоматическое уведомление системных администраторов или пользователей о наступлении определенного события. С помощью сообщений электронной почты организуется регулярная автоматическая рассылка информации, например, счетов клиентам. При работе с почтой можно воспользоваться стандартными модулями - Net::SMTP для отправки сообщений и Net::POP3 для их получения. Приведем пример простой программы, отправляющей сообщение электронной почты:
use Net::SMTP; # используем класс для отправки e-mail my $mail_server = 'shokhirev.com'; # почтовый сервер my $to_user = '[email protected]'; # получатель my $from_user = '[email protected]'; # отправитель $smtp = Net::SMTP->new(Host=>$mail_server);# соединяюсь $smtp->mail($from_user); # пишу $smtp->to($to_user); # получателю $smtp->data(); # письмо $smtp->datasend("To: $to_usern"); # $smtp->datasend("Subject: Lectures on Perl 5n"); $smtp->datasend("n"); $smtp->datasend("Сообщаем о публикации на intuit.run"); $smtp->datasend("курса лекций по Perl 5n"); $smtp->dataend(); # заканчиваю $smtp->quit; # отсоединяюсь
Если нужно в программе проверить почтовый ящик на сервере, то с помощью класса Net::POP3 не составит труда написать короткую программу, принимающую электронную почту. Например, такую:
use Net::POP3; # используем класс для получения e-mail my $mail_server = 'shadrinsk.net'; # почтовый сервер my $user = 'mshock'; # почтовый ящик my $password = 'secret'; # пароль $pop = Net::POP3->new($mail_server); # подключаюсь if ($pop->login($user, $password) > 0) {# регистрируюсь my $numbers = $pop->list; # получаю номера писем foreach my $numbers (keys %$numbers) {# по номеру my $message = $pop->get($numbers); # получаю письмо print @$message; # печатаю его $pop->delete($numbers); # удаляю с сервера } } $pop->quit; # отсоединяюсь
На серверах CPAN есть множество программ для работы с электронной почтой, включая серверы. На Perl написана свободно распространяемая почтовая система с web-интерфейсом Open WebMail (openwebmail.org). На нем же написана и одна из самых известных и эффективных серверных систем фильтрации спама - SpamAssassin.
Системы мгновенного обмена сообщениями (instant messaging), иногда также называемые Интернет-пейджерами, получили огромное распространение: миллионы людей ежедневно общаются с помощью ICQ, Jabber, AOL Instant Messenger или Yahoo!Messenger. В архивах на сайте CPAN можно найти Perl-модули для работы со всеми этими системами. Хотя этот обмен сообщениями ориентирован на взаимодействие людей, его можно использовать для программного извещения пользователя о каком-либо событии. Для примера напишем программу, отправляющую сообщение с использованием открытого протокола мгновенного обмена сообщениями XMPP/Jabber (дополнительный модуль Net::Jabber нужно установить из архива CPAN). В примере после соединения с Jabber-сервером отправляется сообщение пользователю, а после получения от него ответа работа завершается:
use Net::Jabber; # подключаем класс работы с Jabber use utf8; # в Jabber используется UTF-8 my $server = 'jabber.shadrinsk-city.ru'; # сервер my $port = 5222; # порт my $username = 'perl'; # отправитель my $password = 'password'; # его пароль my $resource = 'jud'; # ресурс my $to_user = '[email protected]'; # получатель my $client = new Net::Jabber::Client(); # создаем клиента $client->SetCallBacks( # указываем обработчики событий: onconnect => &on_connect, # при подключении onauth => &on_auth, # при регистрации message => &on_message, # при получении сообщения ); $client->Execute( # соединяемся с сервером hostname=>$server, port=>$port, username=>$username, password=>$password, resource=>$resource, register=>1, connectsleep=>0, connectattempts=>1, ); # завершение программы произойдет в on_message sub on_connect { # выполнится при подключении к серверу print "Подключен к $server:$portn"; } sub on_auth { # выполнится при регистрации на сервере print "Зарегистрирован как $usernamen"; $client->MessageSend( # ОТПРАВЛЯЕМ СООБЩЕНИЕ to=> $to_user. '/' .$resource, subject=>'сообщение от Perl', body=>'Привет, Jabber!' ); } sub on_message { # выполнится при получении сообщения my $sid = shift; # извлекаем номер и текст my $message = shift; # ответа и выводим его: print "Тема:", $message->GetSubject(), "n"; print "Сообщение:", $message->GetBody(), "n"; $client->Disconnect(); # отключаемся от сервера exit(0); # и завершаем работу }
В этом примере демонстрируется прием программирования, распространенный при работе в многозадачной среде: главная программа организует бесконечный цикл обработки событий, для реагирования на которые вызываются обработчики событий. Конечно, помимо обмена сообщениями Jabber предоставляет целый набор средств для полноценного общения, а Perl дает возможность работать с ними.
Есть примеры использования Perl для разработки шлюзов между IP-сетями и беспроводными сетями. На Perl написан свободно распространяемый пейджинговый шлюз Sendpage (www.sendpage.org). Класс Net::SNPP занимается отправкой сообщений на пейджер по протоколу SNPP (Simple Network Paging Protocol), а модуль Net::SMS служит для работы со службой SMS-сообщений для клиентов GSM-телефонии. Теперь мало кого удивляет, что вскоре после появления очередной новой технологии передачи данных на CPAN выкладываются Perl-модули для работы с ней.
Крупную компьютерную сеть можно сравнить с живым организмом: сетевое оборудование и компьютеры - это ее органы, а линии связи - нервные волокна. Сеть ежеминутно меняет свое состояние, ее составные части могут "болеть" и "отмирать", сеть может "задыхаться" от чрезмерного объема передаваемых данных (сетевого трафика). Для мониторинга состояния сети, ее обслуживания и диагностики неисправностей применяются различные служебные программы. Некоторые из них написаны на языке Perl. В других случаях Perl применяется для "склеивания" разных программ в единую систему управления сетью. Если вспомнить, что Perl был создан системным администратором, то станет понятным, почему имеется так много модулей, так или иначе связанных с управлением сетями. В качестве простейшего примера можно привести стандартный класс Net::Ping, с помощью которого можно проверить работоспособность хоста по его IP-адресу. В ОС MS Windows это делается такой командой:
perl -MNet::Ping -e"print Net::Ping->new()->ping('10.0.0.1')"
В ней запускается компилятор perl, который подключает модуль (-M) Net::Ping и выполняет выражение (-e), заключенное в двойные кавычки. А в выражении выводится результат обращения к методу ping класса Net::Ping с IP-адресом в качестве аргумента. В результате выполнения будет выведен адрес хоста и две 1, если хост активен, или два 0, если он не ответил.
Многие программные средства управления компьютерными сетями основаны на протоколе SNMP (Simple Network Management Protocol), использующего для обмена данными протокол UDP. Такие программные средства построены по принципу периодического опроса так называемых агентов, которые отвечают на запросы управляющей программы и передают ей информацию, накопленную во время работы подключенного к сети устройства - компьютера, принтера, маршрутизатора и так далее. Категории собираемой информации (управляемые устройства и их характеристики) имеют унифицированные имена и числовые идентификаторы объектов (Object IDentifier, OID), которые присваиваются производителями устройств в соответствии со стандартами описания "базы данных управляющей информации" MIB (Management Information Base). При определенных условиях по протоколу SNMP можно не только считывать по сети информацию с устройств, но и управлять этими устройствами, изменяя их характеристики. С помощью протокола SNMP можно также организовать управление программными комплексами, например, операционными системами и СУБД. На Perl написаны модули для работы c SNMP-агентами. Для иллюстрации сказанного приведем простой пример, в котором опрашивается агент, работающий на персональном компьютере, и у него запрашиваются две характеристики - описание системы и время ее работы:
use Net::SNMP; # используем класс для работы с SNMP my ($session, $error) = Net::SNMP->session( # сеанс работы -hostname => '192.168.82.83', # с хостом, -community => 'public', # группой -port => 161 # и портом ); defined($session) or die ("Ошибка сеанса SNMP: $error"); # запрашиваем информацию о компьютере по # коду (OID) и идентификатору объекта MIB: info('1.3.6.1.2.1.1.1.0', 'sysDescr'); # описание системы info('1.3.6.1.2.1.1.3.0', 'sysUpTime'); # время работы $session->close(); # завершаем сеанс sub info { # подпрограмма запроса информации my ($OID, $caption) = @_; # параметры: код и имя объекта my $response = $session->get_request($OID); unless (defined($response)) { # если все нормально print 'Ошибка запроса: ', $session->error(); } else { # выводим ответ: printf "$caption/$OID:nt%sn", $response->{$OID}; } }
В результате выполнения этой программы в ОС MS Windows будет выведена следующая информация:
sysDescr/1.3.6.1.2.1.1.1.0: Hardware: x86 Family 6 Model 8 Stepping 6 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free) sysUpTime/1.3.6.1.2.1.1.3.0: 1 hour, 05:14.11
Для отслеживания состояния сети имеется много готовых программных продуктов различной сложности. Сбором и накоплением информации о работе сети и ее визуализацией занимаются основанные на SNMP системы: Big Sister (bigsister.sourceforge.net), Cricket (cricket.sourceforge.net) и MRTG (www.mrtg.org), которые распространяются свободно и написаны на языке Perl.