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



         

Увеличение почты в службу поддержки



Увеличение почты в службу поддержки

Даже если у вас нет официальной службы поддержки, наверняка существует несколько адресов, куда пользователи могут посылать свои вопросы и сообщения о трудностях. У электронной почты, как средства для связи по вопросам поддержки, есть несколько преимуществ:

  • Все можно хранить и отслеживать, в отличие от разговоров в коридорах.
  • Электронная почта асинхронна; системный администратор может читать почту и отвечать на нее в более спокойные вечерние часы.
  • По желанию, это может быть индивидуальная, групповая или широковещательная рассылка. Если 14 человек пишут об одном и том же (скажем, об одних и тех же сообщениях спамеров), есть возможность ответить им всем одновременно, когда проблема будет решена.
  • Почту легко переслать тому, кто разбирается в обсуждаемом деле или ответственен за конкретные службы.
  • Все это веские причины использовать электронную почту для связи по вопросам поддержки. Однако есть у электронной почты и недостатки:
  • Если проблема касается самой почтовой системы или у пользователя что-то не ладится с электронной почтой, то для связи нужно применять что-то другое.
  • Пользователи могут и будут писать в сообщениях все что угодно. Нет никакой гарантии, что в письме будет информация, которая пригодится для решения проблемы или помощи пользователю. Возможно, вы даже не поймете, зачем нужно было такое сообщение. Это приводит к головоломке, о которой стоит поговорить в данном разделе.

Мое любимое письмо в службу поддержки приведу точно в таком виде, в каком оно было получено, за исключением имени автора:

Date: Sat, 28 Sep 1996 12:27:35 -0400 (EOT) From:

Special User <user@example.com> To:

systems@example.com Subject: [Req. 89531] printer help

something is wrong and I

have know idea what (что-то случилось, и я не имею понятия, что именно)

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

From: Another user <user2®examplecom>

Subject: [Req 814563] broken macine

To. systems§exarriple com

Date: Wed, 11 Mar 1998 10:59:42 -0500 (EST)

С малиной krakatoa. example, com

Пользователи посылают подобные письма, лишенные содержания, не со зла. Мне кажется, что корень всех бед в полном несоответствии представлений о компьютерной среде у пользователей и системных администраторов.

Для большинства пользователей видимая структура компьютерной среды ограничена клиентской машиной, на которой они работают, соседним принтером и их хранилищем данных (т. е. домашним каталогом). Для системного администратора структура совсем иная. Он видит ряд серверов, предоставляющих услуги клиентам, у каждого из которых может быть множество периферийных устройств. На каждой машине может быть установлено различное программное обеспечение и все они могут находиться в различном состоянии (системная загрузка, конфигурация и т. д.).

Для пользователя вопрос «С какой машиной проблемы?» кажется странным. Они говорят об одном компьютере, о том, на котором работают сейчас. Неужели это не очевидно? Системному администратору столь же странной кажется просьба «помогите с принтером»; в конце концов, он следит за многими принтерами.

Также обстоит дело и со спецификой проблемы. Системные администраторы всего мира каждый день скрежещут зубами, получая почту, в которой сказано: «Мой компьютер не работает, не могли бы вы помочь мне?». Они знают, что «не работает» может относиться к множеству симптомов, у каждого из которых есть свои причины. Для пользователя, столкнувшегося с тремя зависаниями компьютера за неделю, слова «не работает» выглядят вполне конкретными.

Один из способов разобраться с таким расхождением - четко определить, какие данные посылать в сообщениях. На некоторых сайтах пользователь должен послать сообщение о проблеме, употребляя определенную форму или приложение. Беда такого подхода в том, что пользователи редко испытывают удовольствие от лишних движений мышью и нажатий клавиш, необходимых только для того, чтобы сообщить о проблеме или задать вопрос. Чем больше усилий нужно приложить, тем меньше вероятность, что кто-то воспользуется таким механизмом. Неважно, насколько хорошо продумана форма и какой у нее дизайн, если никто не захочет ею пользоваться. Вопросы в коридорах снова станут нормой. Снова вернулись назад?

Что ж, если применить Perl, может быть и нет. Perl наверняка поможет увеличить количество нормальной почты и поучаствовать в процессе поддержки. Один из первых шагов системного администратора выяснить местоположение: «Где случилась проблема? С каким принтером? С каким компьютером?». И так далее.

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

Программа suss применяет очень простой алгоритм для разгадывания имени узла (обычно, поиск в хэше для каждого слова из сообщения). Сначала изучается тема сообщения, затем его тело и, наконец, выполняется поиск по заголовкам Received:. Вот упрощенная версия, считывающая файл /etc/hosts, чтобы определить имена узлов:

use Mail::Internet; $localdomain = ".example.com";

ft считываем файл /etc/hosts

open(HOSTS,"/etc/hosts") or die "He могу открыть файл узлов\п";

while(defined($_ = <HOSTS>)){

next if /"ft/; ft пропускаем комментарии

next if /"$/; ft пропускаем пустые строки

next if /monitor/i; ft пример вводящего в заблуждение узла

ft выделяем первое имя узла и переводим его в нижний регистр

Smachine = lc((split)[1]);

$machine =~ s/\Q$localdomain\E$//oi;

t удаляем имя домена

$macriines{$machine}++ unless $macnines{$machine}; }

ft анализируем сообщение

$message = new Mail: :Internet VSTDIN;

$message->head->unfold();

ft проверяем тему сообщения

my Ssubject = $message->head->get('Subject');

Ssubject =' s/[.,;?]//g;

for (split(/\s+/,Ssubject)) {

if (exists $machines{lc $_}) {

print "subject: $_\n";

$found++; } } exit if $found;

ft проверяем тело сообщения

chomp(my @body = @{$message->body()}):

my Sbody = join(" ",@body);

$body =" s/t"\w\s]/ /g: и удаляем знак

@body{split( ', lc $bcdy)i = ().

for (keys %body) {

if (exists $machines!ic $_}) {

print "body: $_\n";

$*ound+-i-; } }

exit if $found,

# последняя надежда: проверяем последнюю строку

Received: Sreceived -(reverse $message->head->get('Received'))[0];

Sreceived =" s/\0$localdomain\E//g; for (split(/\s+/,Sreceived)) {

if (exists $machines{lc $_}) { print "received: $_\n";

}

Несколько комментариев к программе:

  • Простота проверки становится проблемой, когда мы сталкиваемся с вполне приемлемыми именами узлов, подобных monitor. Если имена узлов, являющиеся обычными словами, могут появиться в сообщениях, вам придется либо специально их обработать, как было сделано с next if /monitor/i, либо придумать более сложную схему анализа, что предпочтительнее.
  • Мы используем срез хэша (§body{...}), чтобы ускорить поиск по телу сообщения. За один шаг из сообщения выделяются все уникальные слова. Чтобы разобраться с этой конструкцией, можно прочитать ее изнутри. Во-первых, split() возвращает из сообщения список всех «слов» (в нижнем регистре). Эти слова используются как ключи для хэша %body. Поскольку имена ключей в хэше повторяться не могут, он будет содержать только уникальные слова из тела сообщения. Именно подобные возможности делают программирование на Perl приятным.

Теперь применим эту программу. Вот два настоящих сообщения в службу поддержки:

Received: from strontium.example.com

(strontium.example.com [192.168.1.114])

by mailhub.example.com (8.8.4/8.7.3) with ESMTP id RAA27043

for <systems>; Thu, 27 Mar 1997 17:07:44 -0500 (EST)

From: User Person <user@example.com>

Received: (user@localhost)

by strontium.example.com (8.8.4/8.6.4) id RAA10500 for systems;

Thu, 27 Mar 1997 17:07:41 -0500 (EST)

Message-Id: <199703272207.RAA10500@strontium.example.com

Subject: [Req #11509] Monitor

To: systems@example.com

Date: Thu, 27 Mar 1997 17:07:40 -0500 (EST)

Hi,

My monitor is flickering a little bit and it is tiresome

when working with it to much.

Is it possible to fix it or changing the monitor? Thanks. User,

Received: from example.com (user2@example.com [192.168.1.7])

by mailhost.example.com (8.8.4/8.7.3) with SMTP id SAA00732

for <systems@example.com>: Thu. 27 Mar 1997 18:34:54 -0500 (EST)

Date: Thu, 27 Mar 1997 18:34:54 -0500 (EST)

From: Another User <user2@example.com>

To: systems@example.com

Subject: [Req 811510] problems with two computers

Message-Id: <Pine.SUN.3.95.970327183117,23440A-100000ffiexamole.com>

In Jenolen (in room 292), there is a piece of a disk stuck in it.

In intrepid, there is a disk with no cover

(or whatever you call that silver thing) stuck in it.

We tried to turn off intrepid, but it wouldn't work.

Wo (the proctor on duty and I) tried to get the disk piece out, but it didn't. work.

The proctor in charge decided to put signs on them saying 'out of order'

AnotherUser После запуска программы для этих двух сообщений мы получили:

received: strontium и:

body: jenolen body: intrepid

Оба узла были найдены верно и для этого понадобился лишь небольшой отрывок простого кода. Шагнем дальше и предположим, что поступило такое письмо:

Received: from [192.168.1.118]

(buggypeak.example.com [192.168.1.118])

by mailhost.example.com (8.8.6/8.8.6)

with SMTP id JAA16638 for <systems>;

Tue, 4 Aug 1998 09:07:15 -0400 (EOT)

Message-Id: <v02130502b1ecb78576a9@[192.168.1.118]>

Date: Tue, 4 Aug 1998 09:07:16 -0400

To: systems@example.com

From: user@example.com (Nice User)

Subject: [Req «15746] printer

Could someone please persuade my printer to behave and print like

printer should9 Thanks much :)

-Nice User.

Пользователь, должно быть, не знает, что вы «пасете стадо» из 30 принтеров. Но можно применить Perl и чуть-чуть наблюдательности, чтобы сделать умные догадки. Пользователи стараются печатать на принтерах, расположенных ближе всего к тому компьютеру, за которым в данный момент работают. Если бы можно было определить машину, с которой отправлена почта, вероятно, удалось бы вычислить и принтер. Существует много способов получить информацию о связи компьютер-принтер, например, из отдельного файла, из поля в базе данных узлов, о которой упоминалось в главе 5, или даже из службы каталогов LDAP. Вот простой пример, в котором используется простая база данных компьютеров и связанных с ними принтеров:

use Mail: .'Internet; use DB_File;

Slocaldomain = ".example.com";

# printdb - это файл Berkeley DB.

Ключи - имена узлов, значения - принтеры Sprintdb = "printdb";

п анализируем сообщение

Smessage = new Mail::Internet \*STDIN;

$message->head->unfold();

# проверяем тему сообщения

my Ssubject = $<nessage->head->get('Subject');

if (Ssubject =" /print(er|ing)?/i){

ff ищем машину-отправителя (ситаем, что используется формат заголовков Sendmail)

$received = (reverse $rr,essage->head->get( 'Received' ))[0];

($host) =

$received =" /"from \S+ \((?:\S+@)?(\S+)\Q$localdomain\E \[/; }

tie %printdb, "DB_File",Sprintdb or die "Невозможно подключиться к базе данных

Sprintdb:$!\n";

print "Проблема на машине Shost может быть связана с принтером " .

$pnntdb{$host} . "Дп";

untie %printdb;

Если в теме сообщения упоминаются слова «печать», «принтер» или «напечатать», мы выделяем имя узла из заголовка Received:. Для получения этой информации можно применить одно регулярное выражение, т. к. известен формат, используемый для заголовков Received: в нашей сети. Зная имя узла, нетрудно найти связанный с ним принтер в базе данных Berkeley DB. Конечный результат выглядит так:

Проблема на машине buggypea* может быть связана с niroshige. Потратив время на изучение структуры своего окружения, вы найдете разные способы получать больше пользы от почты, доставленной в службу поддержки. Приведенные в этом разделе примеры невелики и созданы для того, чтобы заставить вас задуматься о возможностях. Как еще могут помочь программы, читающие почту (возможно, это почта, отправленная другими программами)? Perl предоставляет много способов проанализировать почту, рассмотреть ее в широком контексте и затем использовать найденную информацию.



Содержание Назад Вперед