Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> документация —> EXIM —> 4.70 —> часть 12

12. Встроенный perl


    Exim может быть собран с встроенным интерпретатором perl. Когда это сделано, подпрограммы perl можно вызывать как часть процесса раскрытия. Для использования поддержки perl, в системе должен быть установлен Perl, версии не ниже 5.004, или более новой. Для включения встроенного интерпретатора perl в бинарный файл exim'a, включите строку
EXIM_PERL = perl.o

в ваш 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





  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0348 секунд
    Из них PHP: 23%; SQL: 77%; Число SQL-запросов: 56 шт.
    Исходный размер: 21877; Сжатая: 6162