Exim lsearch поиск в нескольких файлах одновременно

Вопрос или проблема

Мне нужно, чтобы Exim проходил через несколько файлов в поиске lsearch, останавливаясь, когда найдется первое соответствие.

Чтобы быть более конкретным, у меня есть /etc/exim/plain1 и /etc/exim/plain2, которые содержат данные для аутентификации.

Мое текущее решение работает только с одним файлом:

PLAIN:
  driver = plaintext
  client_send = ${lookup{$sender_address}lsearch{/etc/exim/plain1}}

Как я могу расширить это, чтобы также проверять /etc/exim/plain2?

Вы можете использовать условие OR:

client_send = ${or {lookup{$sender_address}lsearch{/etc/exim/plain1}} \
                   {lookup{$sender_address}lsearch{/etc/exim/plain2}} }

Exim оценивает условия слева направо до тех пор, пока текущее условие не станет true, и возвращает его результат. Если ни одно из подусловий не истинно, тогда все условие становится false, и возвращается пустой результат.

Обратитесь к разделу 11.8 спецификации exim.

Было бы неплохо, если бы lsearch мог принимать список файлов и искать в них последовательно, но, к сожалению, он этого не делает.

Как обходное решение, вы можете вкладывать один lookup в другой следующим образом:

  client_send = ${lookup{$sender_address}lsearch{/etc/exim/plain1}{$value}{\
                  ${lookup{$sender_address}lsearch{/etc/exim/plain2}}\
                }}

Идея заключается в вызове другого поиска в секции fail предыдущего поиска.

Это можно расширить до 3 поисков, обернув далее:

  client_send = ${lookup{$sender_address}lsearch{/etc/exim/plain1}{$value}{\
                  ${lookup{$sender_address}lsearch{/etc/exim/plain2}{$value}{\
                    ${lookup{$sender_address}lsearch{/etc/exim/plain3}}\
                  }}\
                }}

Но, похоже, это не работает за пределами 3 уровней.

Ответ или решение

Вопрос, насколько профессионально организовать поиск lsearch в Exim по нескольким файлам, действительно актуален для ИТ-специалистов, которые работают с почтовыми серверами. Рассмотрим его более подробно.

Задача и контекст

Вы хотите настроить Exim так, чтобы он производил поиск в нескольких файлах для аутентификации пользователя, останавливаясь на первом найденном совпадении. В вашем случае есть два файла: /etc/exim/plain1 и /etc/exim/plain2. В текущей конфигурации используется только один файл для lsearch:

PLAIN:
  driver = plaintext
  client_send = ${lookup{$sender_address}lsearch{/etc/exim/plain1}}

Вариант решения через OR-условие

Одно из простых решений — использование OR-условия. Это позволит Exim выполнять последовательный поиск, начиная с первого файла, и если совпадение не найдено, переходить ко второму:

client_send = ${or {lookup{$sender_address}lsearch{/etc/exim/plain1}} \
                   {lookup{$sender_address}lsearch{/etc/exim/plain2}} }

Этот подход помогает Exim обрабатывать условия слева направо и завершать поиск при первом успешном совпадении.

Альтернативное решение через вложенные lookups

Если вы хотите более гибкий подход, можно воспользоваться вложенными вызовами lookup. Это достигается за счет задания альтернативной (fail-) секции в каждом вызове:

client_send = ${lookup{$sender_address}lsearch{/etc/exim/plain1}{$value}{\
                ${lookup{$sender_address}lsearch{/etc/exim/plain2}}\
              }}

Данный метод позволяет производить последовательные проверки, обращаясь к следующему файлу только в случае, если предыдущая попытка не удалась.

Расширение до нескольких уровней

Можно увеличивать количество уровней, добавляя больше файлов, пример для трех файлов:

client_send = ${lookup{$sender_address}lsearch{/etc/exim/plain1}{$value}{\
                ${lookup{$sender_address}lsearch{/etc/exim/plain2}{$value}{\
                  ${lookup{$sender_address}lsearch{/etc/exim/plain3}}\
                }}\
              }}

Однако, стоит помнить, что такие вложенные конструкции могут ухудшить читабельность конфигурационного файла и могут быть ограничены по количеству уровней.

Заключение

Для поиска в нескольких файлах Exim можно использовать как метод с OR-условием, так и более сложный метод вложенных lookups. Оба способа имеют свои преимущества и недостатки, и выбор между ними должен основываться на ваших конкретных требованиях и предпочтениях. Важно обращать внимание на структуру и читаемость конфигурационного файла, особенно в условиях расширения системы.

Оцените материал
Добавить комментарий

Капча загружается...