21. РОУТЕР QUERYPROGRAM.


    Роутер queryprogram маршрутизирует адрес путем вызова внешней команды и после действует в соответствии с ее выводом. Это достаточно тяжеловесный способ маршрутизации и предназначен он главным образом для несильно нагруженных систем или для экспериментов. Однако, если есть возможность использовать опции предусловий (domains, local_parts, и т.д. ), чтобы пропускать этот роутер для большинства адресов, то он может использоваться в специальных целях даже на загруженном узле. Ниже перечислены следующие частные опции роутера:

command
Use: queryprogram
Type: string†
Default: unset


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

command_group
Use: queryprogram
Type: string
Default: unset


   Эта опция определяет групповой идентификатор (gid) для запуска команды. Она должна быть установлена в том случае, если опции
command_user присвоено числовое значение идентификатора пользователя (uid). Если данная опция начинается с цифры, то она интерпретируется как числовое значение группового идентификатора (gid). В противном случае, поиск ее значения выполняется путем вызова функции getgrnam() .

command_user
Use: queryprogram
Type: string
Default: unset


   Данная опция должна быть обязательно установлена. Она определяет идентификатор пользователя (uid), от имени которого должна быть выполнена команда. Если опция начинается с цифры, то она интерпретируется как числовое значение идетификатора пользователя. В противном случае, поиск ее значения выполняется при помощи функции
getpwnam() , а если не определена опция command_group, то также происходит и поиск значения группового идентификатора gid.
   Внимание: Изменение uid и gid возможно лишь когда exim запущен от пользователя root, что происходит, в нормальной конфигурации, во время доставки. Однако, во время проверки адреса, в процессе приёма сообщения, exim, обычно работает не от пользователя root. Если маршрутизатор
queryprogram вызывается не от root, то exim не может изменить uid или gid до выполнения команды. В таких обстоятельствах, команда выполняется с текущими gid и uid.

current_directory
Use: queryprogram
Type: string
Default: /


   Эта опция определяет абсолютный путь, куда происходит переход перед запуском команды.

timeout
Use: queryprogram
Type: time
Default: 1h


   Если команда не завершается в течение периода таймаута, то ее группа процессов уничтожается и сообщение замораживается. Нулевое значение времени указывает на отсутствие таймаута.
   Стандартный вывод команды направляется в конвейер (pipe), чтение из которого производится когда команда завершается. Он должен состоять из одной строки вывода, содержащей до 5 полей, разделенных пробелами. Максимальная длинна строки 1923 символа. Более длинные линии укорачиваются. Первое поле является одним из нижеперечисленных слов (независимо от регистра):

  • Accept: маршрутизация выполнена успешно; остальные поля определяют какие действия выполнять (см. ниже).
  • Decline: роутер отклоняется; передать адрес на следующий роутер, если только не установлена опция no_more
  • Fail: маршрутизация завершилась неудачно; больше не передавать этот адрес роутерам. Весь следующий за этим текст является сообщением об ошибке. Если запуск роутера выполняется как часть проверки адреса во время входящего SMTP сообщения, то сообщение включается в SMTP-ответ.
  • Defer: в данный момент маршрутизация не может быть завершена; попробуйте позже еще раз. Весь следующий за этим текст в строке является сообщением об ошибке, которое записывается в журнал. Сообщение не вклчается в SMTP-ответ.
  • Freeze: то же что и defer", за исключением того, что сообщение замораживается.
  • Pass: передать адрес на следующий роутер (или на роутер, определенный опцией pass_router), перекрывая опцию no_more.
  • Redirect: сообщение перенаправляется. Оставшаяся часть строки представляет собой список новых адресов, маршрутизируемых независимо друг от друга, начиная с первого роутера, либо с роутера, определенного опцией redirect_router.
       Если первым словом является
    accept, то остаток строки состоит из некоторого количества ключевых слов и их значений, например так (строка разделена на две, для того, чтобы уместить по ширине страницы):
    
    ACCEPT TRANSPORT=<transport> HOSTS=<list of hosts>
    LOOKUP=byname|bydns DATA=<text>
    
    
    

       Данные могут быть указаны в произвольном порядке, к тому же все они являются необязательными. Если не определен транспорт, то используется транспорт, описанный общей опцией transport. Список узлов и тип поиска необходимы только в том случае, если транспортом является транспорт smtp, который не может самостоятельно определить список узлов.
       Формат списка узлов такой же как и для роутера manualroute. Он может содержать как IP-адреса и имена узлов, так и имена с последующим суффиксом
    /MX для определения подсписков узлов, полученных путем поиска MX-записей.
       Если тип поиска не определен, то Exim ведет себя следующим образом во время попыток нахождения IP-адреса для каждого узла: Сначала выполняется DNS-запрос. Если в результате возвращается что-либо, отличное от HOST_NOT_FOUND, то используется этот результат. В противном случае, Exim вызывает функцию
    getipnodebyname() или gethostbyname() , и результатом поиска в этом случае является результат этого вызова.
       Если установлено поле DATA, то его значение помещается в переменную
    $address_data . Например, данная возвращенная строка

    
    accept hosts=x1.y.example:x2.y.example data="rule1"
    
    
    

    маршрутизирует адрес на транспорт по умолчанию, список узлов состоит из двух узлов. Если транспорт запускается, то строка rule1 помещается в переменную $address_data .


    begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
    edit, verification and complete translation by lissyara