Перевод выполнен Алексеем Паутовым в рамках
некоммерческого проекта RussianLDP
(http://www.rldp.ru/). Именно на этом сайте
и надлежит искать новые версии, если таковые будут.
21. Роутер QUERYPROGRAM
Роутер queryprogram маршрутизирует адрес путем вызова
внешней команды и после действует в соответствии с ее выводом.
Это достаточно тяжеловесный способ маршрутизации и предназначен он главным
образом для несильно нагруженных систем или для экспериментов.
Однако, если есть возможность использовать опции предусловий
(domains, local_parts и т. д.), чтобы пропускать этот роутер для большинства
адресов, то он может использоваться в специальных целях даже
на загруженном узле. Ниже перечислены следующие частные опции роутера:
опция: |
Использование: queryprogram |
Тип: string† |
Значение по умолчанию: unset |
Данная опция должна быть обязательно установлена.
Она определяет команду, которая должна запускаться.
Команда разделяется на имя команды и ее аргументы, и затем каждый из них
преобразуется отдельно (точно так же, как и для транспорта
pipe, описанного в главе 29).
command_group |
Использование: queryprogram |
Тип: string |
Значение по умолчанию: unset |
Эта опция определяет групповой идентификатор (gid)
для запуска команды. Она должна быть установлена в том случае, если опции
command_user присвоено числовое значение идентификатора пользователя (uid).
Если данная опция начинается с цифры, то она интерпретируется как числовое
значение группового идентификатора (gid). В противном случае поиск ее
значения выполняется путем вызова функции getgrnam().
command_user |
Использование: queryprogram |
Тип: string |
Значение по умолчанию: unset |
Данная опция должна быть обязательно установлена.
Она определяет идентификатор пользователя (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.
|
|