23. Среда для работы локальных транспортов

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

23. Среда для работы локальных транспортов

Локальные транспорты обрабатывают доставки в файлы и в каналы (pipe). О транспорте autoreply можно думать как о доставке в канал. Exim всегда выполняет транспорты в субпроцессах под заданным gid и uid. Типичная доставка в локальные почтовые ящики выполняется под gid и uid локального пользователя.

Также exim устанавливает специфический текущий каталог, когда работает транспорт: для некоторых транспортов также уместна установка домашнего каталога директории. Единственный транспорт, устанавливающий переменные окружения, pipe: для получения дополнительных деталей, смотрите раздел 29.4.

Значение, используемое для каталогов, uid и gid может приходить из нескольких различных мест. Во многих случаях роутер, обрабатывающий адрес, ассоциирует настройки этого адреса как результат его опций check_local_user, group или user. Однако, значения также можно задать в собственной конфигурации транспорта, они перезадают любые приходящие из роутера.

23.1. Одновременные доставки

Если одновременно приходят два различных сообщения для одного и того же пользователя, то, вероятно, два процесса доставки выполнятся одновременно. Когда для записи в файл используется транспорт appendfile, exim применяет правила блокировки, чтобы помешать одновременным процессам записывать в один файл одновременно.

Однако, когда Вы используете транспорт pipe, Вам решать, как упорядочивать необходимую блокировку. Вот глупый пример:

my_transport:
   driver = pipe
   command = /bin/sh -c 'cat >>/some/file'

Он должен записывать сообщение в конце файла. Однако, если придут два сообщения одновременно, в файле будет свалка. Вы можете использовать утилиту exim_lock (смотрите раздел 49.15) для блокировки файла с использованием того же алгоритма, который использует exim.

23.2 Uid и gid

У всех транспортов есть опции group и user. Если установлена group, она перезадаёт любую группу, заданную маршрутизатором в адресе, даже если для транспорта не задана опция user. Это позволяет, например, производить локальную доставку почты под uid получателя (установленного роутером), но в специальной группе (установленной транспортом). Например:

# Routers ...
# User/group are set by check_local_user in this router
local_users:
   driver = accept
   check_local_user
   transport = group_delivery
# Transports ...
# This transport overrides the group
group_delivery:
   driver = appendfile
   file = /var/spool/mail/$local_part
   group = mail

Если для транспорта установлена опция 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, если по умолчанию используется uid exim.

Если, например, пользователь определён в роутере в цифровой форме и в нём нет установок группы, нет доступного gid. В этой ситуации происходит ошибка. Это отличается от uid, для которого всегда есть одна из установленных настроек:

  • Установка user транспорта.
  • В транспорте pipe uid создателя, если установлена deliver_as_creator.
  • Установка user роутера.
  • Установка роутера check_local_user.
  • Uid самого exim.

Разумеется, всё равно будет ошибка, если выбранный 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 не устанавливается никогда.