|
|
www.lissyara.su
—> документация
—> EXIM
—> 4.70
—> часть 12
12. Встроенный perl
Exim может быть собран с встроенным интерпретатором perl. Когда это сделано, подпрограммы perl можно вызывать как часть процесса раскрытия. Для использования поддержки perl, в системе должен быть установлен Perl, версии не ниже 5.004, или более новой. Для включения встроенного интерпретатора perl в бинарный файл exim'a, включите строку
в ваш “Local/Makefile ”, и затем соберите exim обычным способом.
12.1 Настройка использования perl
Доступ к подпрограммам perl осуществляется через глобальную конфигурационную опцию “perl_startup ”, и оператор раскрытия “${perl ...} ”. Если опция “perl_startup ” отсутствует в конфигурационном файле exim, тогда интерпретатор perl не запускается, и для exim почти нет накладных расходов (т.к. ни одна библиотек perl не использует страницы памяти). Если опция “perl_startup ” присутствует, тогда ассоциированное значение берётся чтобы быть кодом perl, выполняемым во вновь созданном интерпретаторе perl.
Значение “perl_startup ” не раскрывается exim'ом, таким образом, вам не нужно добавлять символ обратного слэша перед символами имеющими специальное значение. Опция, обычно, выглядит так
perl_startup = do '/etc/exim.pl'
| где “/etc/exim.pl ” - код perl, определяющий любые подрограммы, которые вы хотите использовать с exim. Exim может быть сконфигурирован как для немедленного запуска интерпретатора perl сразу, так и для запуска интерпретатора Perl при первом обращении к нему. Старт интепретатора в начале, гарантирует, что действие будет сделано в то время, когда exim имеет setuid привилегии, но может вызвать ненужные накладные расходя, если perl, фактически, не используется в выполняемой части. Кроме этого, отметтьте, что это не означает, что exim работает от root`a, при вызове perl`a в более поздние моменты времени. По дефолту, интерпретатор запускается только когда он необходим, и это может быть изменено в двух местах:
Установкой опции “perl_at_start ” (булева опция) в конфигурации запрашивается запуск при начале работы exim`a.
Опция командной строки “-ps ”, также вызывает запуск вместе с exim`ом, перезаписывая значение “perl_at_start ”.
Также, есть опция командной строки “-pd ” (для задержки), подавляющая начальный запуск, даже если уставновлена “perl_at_start ”.
12.2 Вызов подпрограмм perl
Когда конфигурационный файл включает опцию “perl_startup ”, вы можете использовать элемен раскрытия строк для вызова подрограмм perl, заданных кодом “perl_startup ”. Оператор используется в любой из следующих форм:
${perl{foo}}
${perl{foo}{argument}}
${perl{foo}{argument1}{argument2} ... }
| вызывающих подпрограмму “foo ” с заданными параметрами. Может быть передано, максимум, восемь параметров. Передача большего числа приводит к ошибке раскрытия, с сообщением об ошибке, такой формы:
Too many arguments passed to Perl subroutine "foo" (max is 8)
| Возвращаемое значение подрограммы perl оценивается в скалярных величинах до возвращения его exim`у, чтобы быть вставленным в раскрытую строку. Если возвращённое значение - “undef ”, раскрытие терпит принудительную неудачу таким же образом, как и явный “fail ” в элементе “if ” или “lookup ”. Если подпрограмма прерывается повинуясь функции perl`a “die ”, раскрытие неудачно, с сообщением об ошибке, которое переданно “die ”.
12.3 Вызов функций exim`a из perl`a
Внутри любого кода perl, вызыванного из exim, доступна функция “Exim::expand_string() ”, для обратного вызова в функцию раскрытия exim. Для примера, код perl
my $lp = Exim::expand_string('$local_part');
| сделает текущую переменную exim`a “$local_part ”, доступной в переменной perl “$ip ”. Отметтьте, что тут одиночные кавычки, а не двойные, для предотвращения интепретации “$local_part ” как переменной perl.
Если раскрытие строки принудительно сделано неуспешным, элементом “fail ”, результат “Exim::expand_string() ” - “undef ”. Если в строке раскрытия есть синтаксическая ошибка, из оригинального раскрытия строки вызывается ошибка perl, с соотвествующим сообщением об ошибке, таким же образом как будто использовалось “die ”.
Внутри кода perl доступны две другие функции exim. “Exim::debug_write() ” записывает строку в стандартный поток ошибок, если включена отладка exim. Если вы хотите добавлять в конец строки символ новой строки, вы его должны подставить. “Exim::log_write() ” пишет строки в основной лог exim`a, добавляя в начале метку времени. В этом случае, вам не нужно добавлять перевод строки.
12.4 Использование стандартного вывода и ошибок perl`ом
Вы не должны записывать в стандартный поток ошибок, или стандартный вывод изнутри вашего кода perl, поскольку не заданы их установки. В версиях exim до 4.50, это возможно для стандартного вывода или стандартного потока ошибок, для ссылки на SMTP-соединение в течение приёма сообщения даемоном.Запись в этот поток вызывает хаос. С exim 4.50, прогресс, стандартные потоки ошибок и вывода соединены с “/dev/null ”, в даемоне. Хаос отсутствует, но вывод потерян.
Утверждение perl “warn ”, по умолчанию, пишется в стандартный поток ошибок. Вызовы “warn ” могут быть встроены в модули perl, которые вы используете, но которые не контролируете. Когда exim запускает интерпретатор perl, он принимает меры для записи вывода утверждений “warn ” в главный лог exim`a. Вы можете изменить это, путём включения соответствующей perl'овой феньки, где-то внутри его кода. например, чтобы полностью отказаться от вывода “warn ”, вам необходимо это:
$SIG{__WARN__} = sub { };
| Всякий раз, когда появляется “warn ”, вызывается безымянная программа. В этом примере, код программы пуст, таким образом, она ничего не делает, но вы можете включить любой код perl, который вам нравится. Текст сообщения “warn ” передаётся как первый параметра подпрограммы.
=============
translated by lissyara
verifying by Gerk
Ссылка на обсуждение: http://forum.lissyara.su/viewforum.php?f=20.
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS
Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat
Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration
Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster
HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
|