23. Среда для работы локальных транспортов
Локальные транспорты обрабатывают доставки в файлы и трубы (pipe). (О транспорте
“
autoreply
” можно думать как о доставке в трубу.) Exim всегда выполняет транспорты в субпроцессах, под заданным gid и uid. Типичная доставка в локальные почтовые ящики выполняется под gid и uid локального пользователя.
“
Также, exim устанавливает специфическую текущую директорию, когда работает транспорт; для некоторых транспортов, также уместна установка домашней директории. Единственный транспорт, устанавливающий переменные окружения -
pipe
”; для получения дополнительных деталей, смотрите раздел 29.4.
“
Значение, используемое для uid, gid, и директорий может приходить из нескольких различных мест. Во многих случаях, роутер, обрабатывающий адрес, ассоциирует настройки этого адреса как результат его опций
check_local_user
”,
“
group
” или
“
user
”. Однако, значения также можно задать в собственной конфигурации транспорта, и они перезадают любые прихожящие из роутера.
23.1 Одновременные доставки
Если одновременно приходят два различных сообщения, для одного и того же пользователя, то, вероятно, два процеса доставки выполнятся одновременно. Когда для записи в файл используется транспорт
“
appendfile
”, exim применяет правила блокировки, чтобы помешать одновременным процессам записывать в один файл одновременно.
“
Однако, когда вы используете транспорт
pipe
”, вам решать, как упорядочивать необходимую блокировку. Вот, глупый пример:
|
Он, должен записывать сообщение в конце файла. Однако, если придут два сообщения одновременно, в файле будет свалка. Вы можете использовать утилиту
“
exim_lock
” (смотрите раздел 49.15), для блокировки файла с использованием того же алгоритма, который использует exim.
23.2 Uid`ы и gid`ы
У всех транспортов есть опции
“
group
” и
“
user
”. Если установлена
“
group
”, она перезадаёт любую группу, заданную маршрутизатором в адресе, даже если для транспорта не задана опция
“
user
”. Это позволяет, например, производить локальную доставку почты под uid получателя (установленного роутером), но в специальной группе (установленной транспортом). Например:
|
Если для транспорта установлена опция
“
user
”, её значение переопределяет, то, что установленно маршрутизатором в адресе. Если
“
user
” задано не в виде числа, и незадана
“
group
”, gid ассоциируется с используемым пользователем. Если
“
user
” в виде числа,
“
group
” должна быть задана.
“
Когда uid берётся из конфигурации транспорта, для связанных с этим uid групп вызывается функция
initgroups()
”, если для транспорта установлена опция
“
initgroups
”. Когда uid не задан транспортом, но ассоциирован роутером с адресом, опция для вызова
“
initgroups()
” берётся из конфигурации роутера.
“
Транспорт
pipe
” содержит специальную опцию -
“
pipe_as_creator
”. Если она задана, и не задана
“
user
”, используется uid процесса, вызвавшего exim для передачи сообщения, и если не задана
“
group
”, также используется оригинальный gid.
Это - предпочтительный детализованный порядок получения gid; используется первый из установленных:
Установка
“
group
” транспорта;
Установка
“
group
” роутера;
Gid ассоциированный с пользовательской настройкой роутера, или как результат
“
check_local_user
”, или явной нечисловой установки
“
user
”;
Группа, ассоциированная с нечисловой установкой
“
user
” транспорта;
В транспорте
“
pipe
”, gid создателя, если
“
deliver_as_creator
” установлена, и uid - uid создателя;
Gid exim`a, если по дефолту используется uid exim`a.
Если, например, пользователь определён в роутере в цифровой форме, и в нём нет установок группы, нет доступного gid. В этой ситуации, происходит ошибка. Это отличается от uid, для которого всегда есть дефолтовое значение. Используется первая из установленных настроек:
Установка
“
user
” транспорта;
В транспорте
“
pipe
”, uid создателя, если установлена
“
deliver_as_creator
”;
Установка
“
user
” роутера;
Установка роутера -
“
check_local_user
”;
Uid exim`a.
Разумеется, всё равно будет ошибка, если выбранный uid в списке
“
never_users
”.
23.3 Текущая и домашняя директории
Роутеры могут устанавливать текущую и домашнюю директории для локальных транспортов путём опций
“
transport_current_directory
” и
“
transport_home_directory
”. Однако, если для транспорта установлены опции
“
current_directory
” и
“
home_directory
”, они переопределяют значения роутера. В деталях, домашняя директория для локального транспорта берётся из первого установленного значения:
Опции
“
home_directory
”, в транспорте;
Опции
“
transport_home_directory
” в роутере;
Данных пароля, если в роутере установлена
“
check_local_user
”;
Опции
“
router_home_directory
”, в роутере.
Текущая директория берётся из первого установленного значения:
Опции транспорта
“
current_directory
”;
Опции
“
transport_current_directory
”, роутера.
Если ни роутер, ни транспорт не устанавливают текущую директорию, exim использует значение домашней директории, если оно установлено. Иначе, до работы локального транспорта, он устанавливает текущую директорию в
“/
”.
23.4 Переменные раскрытия произведённые из адреса
Обычно, локальная доставка обрабатывает один адрес, и в этом случае, переменные типа
“
$domain
” и
“
$local_part
” установлены в течение локальных доставок. Однако, в некоторых обсоятельствах, может быть обработано более одного адреса за раз (например, при записи пакетного SMTP для дальнейшей передачи другими средствами). В этом случае, переменные, ассоциированные с локальной частью, никогда не устанавливаются,
“
$domain
” устанавливается лишь если адреса имеют одинаковый домен,
“
$original_domain
” не устанавливается никогда.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200