Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.
Роутер 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 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" |