Exim 21 Роутер queryprogram

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

Роутер queryprogram

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


Имя Использование Тип Дефолтовое значение
command queryprogram string† незадана

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


Имя Использование Тип Дефолтовое значение
command_group queryprogram string незадана

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


Имя Использование Тип Дефолтовое значение
command_user queryprogram string незадана

Данная опция должна быть обязательно установлена. Она определяет идентификатор пользователя (uid), от имени которого должна быть выполнена команда. Если опция начинается с цифры, то она интерпретируется как числовое значение идентификатора пользователя. В противном случае, поиск ее значения выполняется при помощи функции “getpwnam()”, а если не определена опция “command_group”, то также происходит и поиск значения группового идентификатора gid.

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


Имя Использование Тип Дефолтовое значение
current_directory queryprogram string /

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


Имя Использование Тип Дефолтовое значение
timeout queryprogram time 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”.


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