Вопрос или проблема
Мне нужно, чтобы 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. Оба способа имеют свои преимущества и недостатки, и выбор между ними должен основываться на ваших конкретных требованиях и предпочтениях. Важно обращать внимание на структуру и читаемость конфигурационного файла, особенно в условиях расширения системы.