Exim 12 Встроенный perl
Содержание
Встроенный perl
Exim может быть собран с встроенным интерпретатором perl. Когда это сделано, подпрограммы perl можно вызывать как часть процесса раскрытия. Для использования поддержки perl, вам нужна установленная в системе версия 5.004, или более поздняя. Для включения встроенного интерпретатора perl в бинарный файл exim`a, включите строку
EXIM_PERL = perl.o
в ваш “Local/Makefile”, и затем соберите exim обычным способом.
Настройка использования perl
Доступ к подпрограммам perl осуществляется через глобальную конфигурационную опцию “perl_startup”, и оператор раскрытия “${perl ...}”. Если опция “perl_startup” отсутствует в конфигурационном файле exim, тогда интерпретатор perl не запускается, и для exim почти нет накладных расходов (т.к. ни одна библиотек perl не использует страницы памяти). Если опция “perl_startup” присутствует, тогда ассоциированное значение берётся чтобы быть кодом perl, выполняемым во вновь созданном интерпретаторе perl.
Значение “perl_startup” не раскрывается в смысле exim`a, таким образом, вам не нужно добавлять символ обратного слэша перед символами имеющими специальное значение. Опция, обычно, выглядит так
perl_startup = do '/etc/exim.pl'
где “/etc/exim.pl” - код perl, определяющий любые подпрограммы, которые вы хотите использовать с exim. Exim может быть сконфигурирован или для запуска интерпретатора perl сразу, или ждать первого раза, когда он понадобиться. Старт интерпретатора в начале, гарантирует, что действие будет сделано в то время, когда exim имеет setuid привилегии, но может вызвать ненужные накладные расходы, если perl, фактически, не используется в выполняемой части. Кроме этого, отметьте, что это не означает, что exim работает от root`a, при вызове perl`a в более поздние моменты времени. По дефолту, интерпретатор запускается только когда он необходим, и это может быть изменено в двух местах:
- Установкой опции “perl_at_start” (булева опция) в конфигурации запрашивается запуск при начале работы exim`a.
- Опция командной строки “-ps”, также вызывает запуск вместе с exim`ом, отменяя установку “perl_at_start”.
Также, есть опция командной строки “-pd” (для задержки), подавляющая начальный запуск, даже если установлена “perl_at_start”.
Вызов подпрограмм 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”.
Вызов функций 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, добавляя в начале метку времени. В этом случае, вам не нужно добавлять перевод строки.
Использование стандартного вывода и ошибок 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” передаётся как первый параметра подпрограммы.