|
|
www.lissyara.su
—> документация
—> EXIM
—> 4.70
—> часть 9
9. Поиски в файлах и базах данных
Exim может быть сконфигурирован для поиска данных в файлах или базах данных, когда он обрабатывает сообщение. Могут использоваться два различных синтаксиса:
1. Строка, которая будет раскрыта, может содержать явный запрос поиска. По этой причине, часть строки будет заменена данными, найденными поиском. Поиски этого типа - условия в элементах раскрытия. Различные результаты могут быть заданы для случаев успешного и неудачного поисков. Смотрите раздел 11, где в деталях описано раскрытие строк.
2. Списки доменов, хостов, и адресов e-mail могут содержать запрос поиска, как способ избежать слишком длинного линейного списка. В этом случае, данные возвращённые запросом, обычно (но не всегда) отбрасываются (короче, не нужны они - прим. lissyara); реально засчитывается - успешен ли поиск, или нет. Эта разновидность списков описана в разделе 10.
Раскрытие строк, списков, и поисков взаимодействуют друг с другом, в каждом случае, нет порядка, в котором описан любой из них и нет ссылок к другим. Каждая из этих трёх частей даст намного больше, если вы прочтёте вначале две другие. Если вы читаете это первым, то знайте, что поймёте больше, после прочтения глав 10 и 11.
9.1 Примеры различных синтаксисов поиска
Очень легко перепутать два разных способа поиска, тем более, что списки, которые могут содержать вторую разновидность, всегда раскрываются, прежде чем быть обработанными как списки. Поэтому, они также могут содержать поиски первого вида. Будте точны в различии между следующими двумя примерами:
domains = ${lookup{$sender_host_address}lsearch{/some/file}}
domains = lsearch;/some/file
| Первый использует раскрытие строки, результат которого должен быть списком доменов. Строки, для успешного или безуспешного поиска не заданы; значение по-умолчанию, в этом случае, найденные данные и пустая строка, соответственно. Раскрытие помещается прежде чем строка обрабатывается как список, и файл, по которому ведётся поиск, может содержать строки как эти:
192.168.3.4: domain1:domain2:...
192.168.1.9: domain3:domain4:...
| Когда поиск успешен, результат раскрытия - список доменов (и, возможно, другие типы элементов, разрешённые в списке доменов).
Во втором примере, ищется один элемент в списке доменов. Это вынуждает exim к использованию поиска, для того чтобы узнать, может ли обрабатываемый домен быть найден в файле. Файл может содержать строки как эти:
Любые данные, сопровождаемые ключами, не уместны при проверке что домен совпадает с элементом списка.
Их можно спутать, при использовании обоих видов поиска сразу. Рассмотрите файл, содержащий, например, такие строки:
192.168.5.6: lsearch;/another/file
| Если значение “$sender_host_address ” - 192.168.5.6, раскрытие первой установки “domains ” генерит вторую установку, которая вызывает второй поиск.
Оставшаяся часть этой главы описывает различные доступные типы поиска. Любой из них может использоваться в любой части конфигурации, где разрешены поиски.
9.2 Типы поиска
Реализованы два различных типа поиска:
“Одноключевой ” ( “single-key ”) тип поиска, требует задания файла, в котором будет происходить поиск, и одного ключа для поиска. Ключ должен быть непустой строкой, чтобы поиск был успешен. Тип поиска определяет, как найден файл.
Поиск в “стиле запроса ” ( “query-style ”) - принимает обобщённый запрос базы данных. Exim не предполагает никакого специфического ключевого значения для поисков в стиле запроса. Вы можете использовать любые переменные exim`a для необходимого вам запроса к БД.
Код для каждого типа поиска находится в отдельном файле исходных текстов, и включается в бинарник exim`a лишь если при компиляции установлена соответствующая опция. Дефолтовые настройки в “src/EDITME ” таковы:
LOOKUP_DBM=yes
LOOKUP_LSEARCH=yes
| и означают, что лишь линейный поиск и поиск в DBM включены по дефолту. Для некоторых типов поисков (например, БД SQL), вам необходимо инсталлировать библиотеки и файлы заголовков, до сборки exim`a.
9.3 Одноключевые типы поиска
Реализованы следующие одноключевые типы поиска:
“cdb ”: По данному файлу производится поиск как по файлу Статической БД (Constant DataBase), используя ключевую строку без завершающего двоичного нуля. Формат “cdb ” спроектирован для индексных файлов, которые часто читаются, и никогда не обновляются, исключая полное пересоздание. Также он является наиболее подходящим для больших файлов, содержащих альясы, или другие индексированные данные, на которые ссылается MTA. Информация о “cdb ” может быть найдена в нескольких местах:
http://www.pobox.com/~djb/cdb.html
ftp://ftp.corpit.ru/pub/tinycdb/
http://packages.debian.org/stable/utils/freecdb.html
Дистрибутив “cdb ” не нужен для сборки exim`a с поддержкой “cdb ”, поскольку код для чтения “cdb ”-файлов непосредственно включён в exim. Однако, с exim`ом не предоставляется никаких средств для сборки или тестирования “cdb ”-файлов, таким образом вам необходимо получить дистрибутив “cdb ” для этого.
“dbm ”: Вызовы к библиотечным функциям “dbm ” используются для извлечения данных из файлов DBM, путём поиска записей с данным ключом. Завершающий бинарный ноль включён в ключ, который передаётся библиотеке DBM. Смотрите раздел 4.4, для обсуждения библиотек DBM.
Для всех версий Berkeley DB, exim использует стиль DB_HASH базы данных, когда собирает DBM-файлы используя утилиту “exim_dbmbuild ”. Однако, когда используется Berkeley DB версий 3 и 4, он открывает для чтения, существующие базы данных, с опцией DB_UNKNOWN. Это позволяет ему обработать любой из типов БД поддерживаемых библиотекой, и может быть полезным для доступа к DBM-файлам созданным другими приложениями. (Для более ранних версий DB, всегда используется DB_HASH.)
“dbmnz ”: Это тоже самое, что и “dbm ”, за исключением, что, завершающий бинарный ноль не включен в ключ передаваемый библиотеке DBM. Вам может понадобиться использовать это, если вы хотите искать данные в файлах, которые созданы или расшарены с каким-либо иным приложением, которое не использует завершающий ноль. Например, вы должны использовать “dbmnz ” а не “dbm ”, если вам необходимо аутентифицировать входящие SMTP-подключения, используя пароли из файла “/etc/userdbshadow.dat ” Сourier`a. Утилита exim`a для создания файлов DBM ( “exim_dbmbuild ”) по дефолту включает нули, но у неё есть опция для их исключения (смотрите раздел 50.9).
“dsearch ”: Данный файл должен быть директорией; вызовом функции “lstat() ” ищется файл, имя которого равно ключу. Ключ не должен содержать символов прямого слэша. Если “lstat() ” успешен, то результат поиска - имя объекта, ккоторый может быть файлом, директорией, символической ссылкой, или чем угодно что может содержать директория. Пример, как этот поиск может использоваться для поддержки виртуальных доменов, дан в разделе 47.7.
“iplsearch ”: Данный файл - текстовый файл, содержащий ключи и данные. Ключ завершается двоеточием, или пробелом, или концом строки. Ключи, в файле, должны быть IP-адресами, или IP-адресами с CIDR масками. Ключи включающие в себя адреса IPv6, должны быть заключены в кавычки, для предотвращения интерпретации первого внутреннего двоеточия как завершение ключа. Например:
1.2.3.4: data for 1.2.3.4
192.168.0.0/16: data for 192.168.0.0/16
"abcd::cdab": data for abcd::cdab
"abcd:abcd::/32" data for abcd:abcd::/32
| Ключ для “iplsearch ” поиска должен быть IP-адресом (без маски). Поиск по файлу линейный, с использованием масок CIDR, где они заданы, до нахождения соответствия ключу. Используется первый совпадающий ключ; дальнейших попыток найти “лучшее ” совпадение, не предпринимается. Кроме совпадения ключей, обработка “iplsearch ” - такая же как у “lsearch ”.
Предупреждение 1: В отличие от большинства других одноключевых поисков, файл данных для “iplsearch ” не может быть превращён в DBM или cdb-файл, поскольку эти типы поиска поддерживают только буквальные ключи.
Предупреждение 2: В списке хостов,вы всегда должны использовать “net-iplsearch ”, таким образом, чтобы неявный ключ был IP-адресом, а не именем (смотрите раздел 10.12).
“lsearch ”: Данный файл - текстовый файл, по которому линейно ищется строка, начинающаяся с искомого ключа, законченную двоеточием, или пробелом, или концом строки. Поиск регистронезависимый; таким образом, символы верхнего и нижнего регистра обрабатываются как одинаковые. Используется первое найденное совпадение.
Разрешено пустое место между ключом и двоеточием. Остаток строки, после удаления начального и конечного пустого пространства является данными. Они могут быть продолжены на последующие строки путём начала их с любого количества пустого пространства, но только один символ пробела включается в данные при таком соединении. Если данные начинаются с двоеточия, ключ должен быть завершён двоеточием, например:
Пустые строки, и строки начинающиеся с “# ” игнорируются, даже если они встречаются в середине строки. Это - традиционный текстовый формат файла альясов. Обратите внимание, что ключи в файле “lsearch ” - литеральные строки. Тут нету подстановки ( “wildcarding ”) какого бы то ни было вида.
В большинстве “lsearch ” файлов, ключи не могут содержать двоеточия, или символы “# ”, или пустые пробелы. Однако, если вам необходима эта возможность, она доступна. Если ключ начинается с символа двойной кавычки, она завершается только соответствующей кавычкой (или концом строки), и, к её содержимому, применяются обычные правила экранирования (смотрите раздел 6.16). Опционально, двоеточие разрешено после ключа в кавычках (также как и для ключей без кавычек). Специальная обработка кавычек для части данных строки “lsearch ” отсуствует.
“nis ”: Данный файл - имя карты NIS, и поиск NIS производится с данным ключом, без завершающего двоичного нуля. Есть вариант, называемый “nis0 ”, который включает двоичный нуль в ключ. По сведениям, это необходимо для файла альясов в стиле SUN. Exim не понимает NIS-альясы; должны использоваться полные имена карт.
“wildlsearch ” или “nwildlsearch ”: Поиск по файлу линейный, как “lsearch ”, но вместо того, чтобы интепретировать как литеральную строку, каждый ключ в файле может быть подстановочным. Различие между этими двумя типами поиска в том, что для “wildlsearch каждый ключ в файле раскрывается до начала использования, тогда как для “nwildlsearch нет раскрытия на месте.
Как и “lsearch ”, тестирование производится без учёта регистра. Однако, ключи в файле, являющиеся регулярными выражениями, могут быть регистрозависмыми, если перед шаблоном используется ключ “(-i) ”. Признаются следующие формы подстановочных знаков:
1. Строка может начинаться со звёздочки, для обозначения “кончается на ”. Например:
*.a.b.c data for anything.a.b.c
*fish data for anythingfish
|
2. Строка может начинаться с крышки ( “^ ”), для обозначения регулярного выражения. Например, для “wildlsearch ”:
^\N\d+\.a\.b\N data for <digits>.a.
| Примечание - использование “\N ” отключает раскрытие содержимого регулярного выражения. Если вы используете “nwildlsearch ” там, где ключи не раскрываются, это эквиалентно:
^\d+\.a\.b data for <digits>.a.b
| Регистронезависимый флаг устанавливает начало компиляции регулярного выражения, но это может быть отключено использованием “(-i) ” в соответствующем месте. Например, чтобы весь шаблон был регистрозависим:
^(?-i)\d+\.a\.b data for <digits>.a.b
| Если регулярное выражение содержит пустое место, или символы двоеточия, вы должны поместить его в кавычки (смотрите “lsearch ”, выше), или представить эти символы другим образом. Например, “\s ” может быть использовано для обозначения пробела и “\x3A ” - для двоеточия. Это может оказаться легче, чем использовать кавычки, поскольку при использовании кавычек, вы должны экранировать все обратные слэши внутри кавычек.
Примечание: Невозможно зафиксировать подстроки в совпадении регулярного выражения, для дальнейшего использования, поскольку результаты всех поисков кэшируются. Если поиск повторяется, результат берётся из кэша, и нет фактического сопоставления с образцом. Значения всех цифровых переменных сбрасываются после совпадения “(n)wildlsearch ”.
3. Хотя я не вижу много применений, общая функция соответствия, используемая для реализации “(n)wildlsearch ”, означает, что строка может начинаться с имени поиска, завершаемого двоеточием, и сопровождаться данными поиска. Например:
cdb;/some/file data for keys that match the file
| Данные, полученные из вложенного поиска, отвергаются.
Ключи, которые не соответствуют ни одному из этих паттернов, интепретируются буквально. Правила продолжения для данных - точно ткие же как для “lsearch ”, и ключи могут сопровождаться опциональными двоеточиями.
Предупреждение: В отличие от большинства других одноключевых поисков, файл данных для “(n)wildlsearch ” не может быть превращён в DBM или cdb-файл, поскольку эти типы поиска поддреживают только буквальной соответствие.
9.4 Типы поиска в стиле запроса
Поддерживаемые типы поиска в стиле запроса перечислены ниже. Дальнейшие детали, о многих из них, даны в дальнейших разделах.
“dnsdb ”: Этот производит поиск одной или более записей, чьи доменные имена даны в предоставленном запросе. Результирующие данные - содержимое записей. Смотрите раздел 9.10.
“ibase ”: Этот производит поиск по БД InterBase.
“ldap ”: Этот производит поиск по LDAP, используя запрос в форме URL, и возвращает атрибуты единственного элемента. Есть вариант, вызывающий “ldapm ”, который разрешает возврат значений от нескольких элементов. Третиф вариант, называемый “ldapdn ”, возвращает Distinguished Name (отличительное имя) одного элемента, вместо любых значений атрибутов. Смотрите раздел 9.13.
“mysql ”: Формат запроса - SQL-выражение, передаваемое БД MySQL. Смотрите раздел 9.20.
“nisplus ”: Этот производит поиск в NIS+, используя запрос, который может задать имя поля для возврата. Смотрите раздел 9.19.
“oracle ”: Формат запроса - SQL-выражение, передаваемое БД Oracle. Смотрите раздел 9.20.
“passwd ”: Поиск в стеле запросов, с запросами, которые содержат лишь имя пользователя. Поиск вызывает “getpwnam() ”, для запроса данных системного пароля, и при успехе, строка результата - то же самое, что вы бы получили из поиска “lsearch ” в традиционном файле паролей “/etc/passwd file ”, со значением “* ” в качестве заначения пароля. Например:
*:42:42:King Rat:/home/kr:/bin/bash
|
“pgsql ”: Формат запроса - SQL-выражение, передаваемое БД PostgreSQL. Смотрите раздел 9.20.
“sqlite ”: Формат запроса - имя файла, сопровождаемое SQL-выражением, передаваемым БД SQLite. Смотрите раздел 9.25.
“testdb ”: Это тип поиска, используемый для тестирования exim. Он врятли будет полезен в обчной ситуации.
“whoson ”: “Whoson ” (http://whoson.sourceforge.net) - Internet-протокол, позволяющий программам интернет-серверов проверять то, что конкретный (динамически выделенный) IP адрес в данное время назначен известному (доверенному) пользователю, и опционально, для получения идентификационных данных этого пользователя. В exim, он может быть использован для реализации проверки условия ACL “POP перед SMTP ”, например:
require condition = \
${lookup whoson {$sender_host_address}{yes}{no}}
| Запрос состоит из единственного IP-адреса. Возвращённое значение - имя аутентифицированного пользователя, который сохранён в переменной “$value ”. Однако, в этом примере, данные “$value ” не используются; результат поиска - одна из фиксированных строк - “yes ” or “no ”.
9.5 Временные ошибки в поисках
Функции поиска мошут вернуть коды временных ошибок, если поиск не может быть завершён. Например, БД SQL или LDAP могут быть недоступны. Поэтому не желательно использовать поиск, которыё мог бы сделать такое для критичных опций, например, списка локальных доменов.
Когда поиск не может быть завершён в роутере или транспорте, доставка сообщения (к релевантному адресу) задерживается, как и для других временных ошибок. При других обстоятельствах, exim может предположить, что поиск был неудачен, или может вообще всё бросить.
9.6 Дефолтовые значения в одноключевых поисках
В этом контексте, “дефолтовые значения ” - это значения заданные администратором, которое должно использоваться, если поиск неудачен.
Замечание: Эта секция относится только к одноключевым поискам. Для поисков в стиле запроса, должны использоваться средства языка запроса. Попытка определить значение по-умолчанию для поиска в стиле запроса провоцирует ошибку.
Если “* ” добавляется к одноключевому типу поиска (например “lsearch* ”) и начальный поиск неудачен, ключ “* ” ищется в файле, для нахождения значения по-умолчанию. Также, смотрите раздел о частичном соответствии, ниже.
Альтернативно, если “* ” добавляется к одноключевому типу поиска (например “dbm*@ ”), тогда, если начальный поиск неудачен и ключ содержит символ “@ ”? второй поиск производится заменив все на “* ”, до последней “@ ”. Это позволяет предоставить значения по умолчанию на домен, в файлах альясов, включающих домены в ключи. Если воторой поиск неудачен (или его нет, потому что в ключе нет “@ ”), ищется “* ”. Например, роутер “redirect ” мог бы содержать:
data = ${lookup{$local_part@$domain}lsearch*@{/etc/mix-aliases}}
| Предположим, обрабатываемый адрес - “jane@eyre.example ”. Exim ищет эти ключи в таком порядке:
jane@eyre.example
*@eyre.example
*
| Данные берутся из любого ключа найденного первым. Примечание: В файле “lsearch ”, это не означает первый из этих ключей в файле. Полное сканирование производится для каждого ключа, и лишь если он не найден, exim пробует следующий ключ.
9.7 Частичное совпадение в одноключевых поисках
Нормальная операция одноключевого поиска - поиск в файле, точного соответствия заданному ключу. Однако, во множестве ситуаций в которых ищутся домены, было бы полезным частичное соответствие. В этом случае, информация в файле, которая начинается с “*. ”, совпадает с любым доменом заканчивающимся компоненами, следующими за точкой. Например, если ключ в DBM-файле такой
тогда, когда частичное соответсвие включено, это совпадает (в том числе) “2001.dates.fict.example ” и “1984.dates.fict.example ”. Также совпадает с “dates.fict.example ”, если эта строка не появляется как отдельный ключ в файле.
Примечание: Частичное соответствие не доступно для поисков в стиле запроса. Также оно недоступно для поиска любых элементов в списках адресов (смотрите раздел 10.19).
Частичное соответствие реализовано путём отдельных поисков с использованием ключей сконструированных путём модификации оригинального ключа. Это означает, что он может использоваться с любым типом одноключевого поиска, при условии, что частично совпадающие ключи, начинающиеся со специального преффикса (по умолчанию - “*. ”), включены в файл данных. Ключи в файле, которые не начинаются с преффикса, совпадают только с немодифицированными ключами, когда используется частичное соответствие.
Частичное соответствие вызывают путём добавления строки “partial- ” к началу имени одноключевого типа поиска, например, “partial-dbm ”. Когда это происходит, вначале ищется немодифицированный объект ключа; если поиск неудачен, “*. ” добавляется вначале ключа, и снова производится поиск. Если он неудачен, будущие поиски пробуют удалять разделённые точками компоненты, он начала ключа, один за одним, и добавляя “*. ” к началу того, что осталось.
Требуемое минимальное число не-* компонентов - два. Это может быть скорректировано включением числа до дефиса, в типе поиска. Например, “partial3-lsearch ” задаёт минимум три не-* компонента в измененённых ключах. Отстутствие числа эквивалентно “partial2- ”. Если ключ “2250.dates.fict.example ”, тогда следующие ключи ищутся, когда минимальное число не-* компонентов - два:
2250.dates.fict.example
*.2250.dates.fict.example
*.dates.fict.example
*.fict.example
| Как только один ключ, в последовательности, успешно найден, поиск завершён.
Использование “*. ”, как дефолтового преффикса, может быть изменено. Мотивацией для этой возможности является разрешение exim`y работать с форматами файлов используемыми другими MTA. Иной префикс может быть предоставлен в круглых скобках, вместо дефиса, после “partial ”. Например:
domains = partial(.)lsearch;/some/file
| В этом примере, если домен - “a.b.c ”, последовательность поисков - “a.b.c ”, “.a.b.c ” и “.b.c ” (при неизменённом дефолтовом минимуме в 2 компонента). Префикс может состоять из любых символов пунктуации, кроме закрывающей круглой скобки. Он может быть пустым, например:
domains = partial1()cdb;/some/file
| Для этого примера, если домен “a.b.c ”, последовательность поиска будет “a.b.c ”, “b.c ” и “c ”.
Если задан “partial0 ”, что случается в конце (когда поиск, с лишь одним неподстановочным компонентом, неудачен и оригинальный ключ укорачиватся вправо на нулевую строку) зависимостей от префикса:
Если префикс имеет нулевую длинну, весь поиск неудачен.
Если длинна префикса равна 1, поиск производится лишь для префикса. Например, заключительный поиск для “partial0(.) ” является единственным для “. ”.
Иначе, если префикс заканчиватся точкой, точка удаляется, и ищется оставшаяся часть. Поэтому, с дефолтовым префиксом, финальный поиск для “* ” самостоятелен.
Иначе, ищется полный префикс.
Если тип поиска заканчивается на “* ” или “*@ ” (смотрите выше, раздел 9.6), поиск окончательного дефолтового значения, подразумевающего эти последовательности, происходит после неудачи всех поисков. Однако, тут можно использовать поиск типа “partial0(.)lsearch* ”.
Использование “* ”, в частично соответствующем поиске, отличается от её использовния как подстановочного символа в списках доменов и тому подобном. Частичное соответствие работает только в виде компонентов разделённых точкой; ключ, например “*fict.example ” бесполезен в БД, поскольку звёздочка в частично совпадающем ключе всегда сопровождается точкой.
9.8 Кэширование поиска
Exim кэширует все результаты поисков, для избежания бесполезных повторений поисков. Однако, поскольку (кроме даемона) exim работает как коллекция независимых, короткоживущих процессов, это кэширование применяется только в пределах одного процесса exim`a. Средства для межпроцессного кэширования отсутсвуют.
Для одноключевого поиска, exim оставляет релевантные файлы открытыми в случае, если есть другой поиск, нуждающийся в них. В некоторых типах конфигураций, это может привести к большому числу открытых файлов, сохраняемых открытыми, оставляемых открытыми для сообщений со многими получателями. Для избежания попадений под системные ограничения на число открытых файлов, exim закрывает последний использованный файл, когда необходимо открыть больше файлов чем позволяют его внутренние ограничения, которое можно изменить через опцию “lookup_open_max ”.
Файлы одноключевого поиска закрываются и сбрасывается кэш поиска в стратегических точках доставки - например, после завершения всех роутингов.
9.9 Экранирование данных поиска
Когда данные из входящего сообщения включаются в поиск типа запросов, возможно появление специальных символов в данных, нарушающих синтаксис запроса. Например, запрос NIS+ содержащий
будет прерван, если локальная часть будет содержать правую квадратную скобку. Для данных NIS+, данные должны быть помещены в двойные кавычки, как в примере:
но это оставляет проблемы с кавычками в данных. Правила для NIS+ состоит в том, что двойные кавычки должны быть удвоены. Другие типы поиска имеют иные правила, и для решения этих требований существет оператор раскрытия такой формы:
${quote_<lookup-type>:<string>}
| Например, самый безопасный способ написания NIS+ запроса:
[name="${quote_nisplus:$local_part}"]
| Смотрите раздел 11 для полного обзора раскрытия строк. Оператор кавычек может использоваться для всех типов поисков, но он не имеет эффекта в одноключевых поисках, т.к. кавычки в них никогда не бывают необходимы.
9.10 Дополнительные сведения о dnsdb
Тип поиска “dnsdb ” использует DNS как базу данных. Простой запрос содержит тип записи и имя домен, разделённые знаком равно ( “= ”). Например, строка раскрытия может содержать:
${lookup dnsdb{mx=a.b.example}{$value}fail}
| Если поиск успешен, результат помещается в “$value ”, которая, в этом случае, используется как результат. Если поиск не успешен, ключевое слово “fail ” вызывает принудительную ошибку раскрытия ( “forced expansion failure ”) - смотрите раздел 11.4 для понимания, что это означает.
Поддерживаемые типы DNS-записей - A, CNAME, MX, NS, PTR, SRV, and TXT, и когда exim скомпилен с поддержкой IPv6 - AAAA (и A6, если это тоже сконфигурено). Если тип не задан, предполагается TXT. Когда тип PTR, данные могут быть нормально записанным IP-адресом; инверсия и добавление “in-addr.arpa ” или “ip6.arpa ” происходят автоматически. Например:
${lookup dnsdb{ptr=192.168.4.5}{$value}fail}
| Если данные для PTR-записи не являются синтаксически допустимым IP-адресом, он не изменяется и ничего не добавляется.
Для поиска MX, для каждой записи возвращаются оба привелигированных значения, и имя хоста, разделённые пробелом. Для поиска SRV, приоритет, вес, порт и имя хоста возвращаются для каждой записи, разделённые пробелами.
Для любых типов записей, если найдено много записей (или, для поиска A6, если одна запись ведёт ко многим адресам), данные возвращаются как объединение, с символом новой строки, как дефолтовым разделителем. Порядок, разумеется, определяется DNS-резольвером. Вы можете задать иной разделитель символов, между несколькими записями, путём помещения в начале запроса правой угловой скобки, сопровождаемой (без пробелов) новым раделителем. Например:
${lookup dnsdb{>: a=host1.example}}
| Разрешается задать пробел, как символ разделителя. дальнейшее пустое пространство игнорируется.
9.11 Псевдо- “dnsdb ” типы записей
По-умолчанию, и предпочтительное значение, и имя хоста, возвращаются для каждой MX-записи, разделённые пробелами. Если вам нужны только имена хостов, вы можете использовать псевдо-тип MXH:
${lookup dnsdb{mxh=a.b.example}}
| В этом случае, предпочтительное значение опущено, и возвращаются только имена хостов.
Другой псевдотип - ZNS (расшифровывается “zone NS ”). Он выполянет поиск NS-записи для данного домена, но если она не наёдена, он удаляет первый компонент имени домена, и пробует снова. Этот процесс продолжанется пока не найдена NS-запись, или не останется компонентов имени (или произойдёт ошибка DNS). Другими словами, он может вернуть сервер имён домена верхнего уровня, но никогда не вернёт корневой сервер имён. Если нет NS-записей домена верхнего уровня, поиск неудачен. Рассмотрите эти примеры:
${lookup dnsdb{zns=xxx.quercite.com}}
${lookup dnsdb{zns=xxx.edu}}
| Предполагается, что в каждом случае тут нет NS-записей для полного доменного имени, в первом случае сервером имён возвращается значение для “quercite.com ”, и во втором случае сервером имён возвращается значение для “edu ”.
Вы должны быть внимательны при использовании этого типа поиска, поскольку, если домен верхнего уровня не существует, поиск всегда вернёт какое-то имя домена. Это могло бы использоваться для того, чтобы видеть, находится ли сервер имён данного домена в чёрном списке. Вероятно, вы можете предполагать, что сервреа имён для доменов верхнего уровня, таких как “su ” или “co.uk ” не собиираются находиться в таких списках.
Третий псевдо-тип - CSA (Client SMTP Authorization). Он ищет SRV-записи для правил CSA, которые описаны в разделе 40.46. Хотя “dnsdb ” непосредственно поддерживает поиски SRV, этого недостаточно, из-за дополнительного режима поиска родительских доменов CSA. Результат успешного поиска, например:
${lookup dnsdb {csa=$sender_helo_name}}
| имеет два разделённых пробелами поля: код авторизации и имя целевого хоста. Авторизационный код может быть “Y ” для yes, “N ” для no, “X ” для явно требуемой, но отсутствующей авторизации, или “? ” для неизвестного.
9.12 Множественные поиски “dnsdb ”
В предыдущих разделах описаны поиски для одиночного домена. Однако, вы можете задать список доменов или адресов в отдельном “dnsdb ” поиске. Список задаётся в нормальном виде exim`a, с двоеточием в качестве дефолтового разделителя, но с возможностью изменить его. Например:
${lookup dnsdb{one.domain.com:two.domain.com}}
${lookup dnsdb{a=one.host.com:two.host.com}}
${lookup dnsdb{ptr = <; 1.2.3.4 ; 4.5.6.8}}
| Для сохранения обратной совместимости, есть один специальный случай: если тип поиска PTR и не указано изменение разделителя, exim смотрит, не является ли остаток строки одним IPv6 адресом. В этом случае, он не обрабатывает её как список.
Данные каждого поиска объединены, с символом новой строки в качестве дефолтового разделителя, таким образом обрабатываются множественные DNS-записи для одного элемента. Может быть задан иной разделитель, как указано выше.
Поиск “dnsdb ” неудачен, лишь если неудачны все все DNS-поиски. Если для любого из них происходит временная ошибка DNS, то поведением управляет опциональное ключевой слово, с последующей запятой, могущей появиться перед типом записи. Возможные ключевые слова - “defer_strict ”, “defer_never ”, и “defer_lax ”. С “strict ” поведением, любая временная ошибка DNS вызывает задержку всего поиска. С “never ” поведением, временные ошибки DNS игнорируются, и поведение такое, будто поиск в DNS не привёл ни к чему. С “lax ” поведением, предпринимаются все запросы, но временые ошибки DNS вызывают задержку лишь в случае, если если остальные поиски были безуспешны. Дафолт - “lax ”, таким образом, следующие поиски эквивалентны:
${lookup dnsdb{defer_lax,a=one.host.com:two.host.com}}
${lookup dnsdb{a=one.host.com:two.host.com}}
| Следовательно, в дефолтовом случае, поиск успешен до тех пор, пока хоть один поиск в DNS привёл к каким-то данным.
9.13 Дополнительные сведения о LDAP
Оригинальная реализация LDAP была сделана в University of Michigan; она стала “Open LDAP ”, и сейчас существует два различных релиза. Другая реализация происходит из Netscape, Solaris 7 и последующие релизы содержат встроенную поддержку LDAP. К сожалению, хотя все они совместимы на уровне функционирования запросов, обработка их ошибок различна. По этой причине необходимо установить переменную, во время компиляции exim`a с LDAP, для указания, какая библиотека LDAP используется. Одна из следующих строк должна быть в вашем “Local/Makefile ”:
LDAP_LIB_TYPE=UMICHIGAN
LDAP_LIB_TYPE=OPENLDAP1
LDAP_LIB_TYPE=OPENLDAP2
LDAP_LIB_TYPE=NETSCAPE
LDAP_LIB_TYPE=SOLARIS
| Если “LDAP_LIB_TYPE ” не задана, exim предполагает “OPENLDAP1 ”, имеющий такой же интерфейс, как и версия University of Michigan.
Есть три типа поиска LDAP в exim. Они ведут себя по-разному, когда обрабатывают результаты запроса:
“ldap ” - требует, чтобы результат содержал только один элемент; если их больше - он выдаёт ошибку.
“ldapdn ” - также требует, чтобы результат содержал только один элемент, но запросом должно быть возвращено Distinguished Name, а не любые аттрибуты со значением.
“ldapm ” - разрешает результату содержать более одного элемента; все их аттрибуты возвращаются запросом.
Для “ldap ” и “ldapm ”, если запрос находит лишь входы без аттрибутов, exim ведёт себя, как будто вхождения не найдены, и поиск неудачен. Формат данных, возвращаемых успешным поиском описаны в следующей секции. Сначала мы объясняем, как кодируются LDAP-запросы.
9.14 Формат запросов LDAP
Запрос к LDAP имеет форму URL, как определено в RFC2255. Например, в конфигурации роутера “redirect ”, могла бы быть такая установка:
data = ${lookup ldap \
{ldap:///cn=$local_part,o=University%20of%20Cambridge,\
c=UK?mailbox?base?}}
| URL может начинаться с “ldap ” или “ldaps ”, если ваша библиотека LDAP поддерживает безопасные (шифрованные) LDAP-соединения. Второй из них гарантирует, что используются шифрованные подключения TLS.
9.15 Квотирование (использование двойных кавычек и спецсимволов) в LDAP
В запросах LDAP требуются два уровня квотирования, первый - непосредвственно для LDAP, и второй, поскольку запрос LDAP представлен как URL. Кроме того, внутри LDAP-запроса, требуются два различных вида квотирования. Поэтому есть два различных, LDAP-специфичных, оператора квотирования.
Оператор “quote_ldap ” спроектирован для использования на строках, являющихся частью спецификации фильтра. Концептуально, он, вначале, производит следующие преобразования строки:
* => \2A
( => \28
) => \29
\ => \5C
| в соответствии с RFC2254. Результирующая строка квотируется согласно правилам для URL, т.е. все не алфавитно-цифровые символы, кроме:
конвертируются в их шастнадцатеричные значения, с предшествующим им символом процента. Например:
${quote_ldap: a(bc)*, a<yz>; }
| превращается в
%20a%5C28bc%5C29%5C2A%2C%20a%3Cyz%3E%3B%20
| Удалив квотирование URL, это (с начальным и конечным пустым пространством):
Оператор “quote_ldap_dn ” спроектирован для использования на строках, являющихся частью базовых спецификаций DN, в запросех. Концептуально, вначале он конвертирует строку, вставляя обратный слэш перед любым из следующих символов:
Он также вставляет обратный слэш перед любыми пробелами или символом “# ”, и перед конечными пробелами. (Правила находятся в RFC2253.) Тогда результирующая строка квотирована согласно правилам для URL. Например:
${quote_ldap_dn: a(bc)*, a<yz>; }
| будет
%5C%20a(bc)*%5C%2C%20a%5C%3Cyz%5C%3E%5C%3B%5C%20
| Удалив квотирование URL, получится (с конечными пробелами)
Есть некоторые дальнейшие комментарии о квотировании в секции о аутентификации LDAP, ниже.
9.16 Соединения LDAP
Подключение к серверу LDAP может быть через TCP/IP, или, когда используется OpenLDAP, через сокет UNIX. Пример, данный выше, не определяет сервер LDAP. Сервер, который доступен по TCP/IP, может быть задан в запросе, запуская его так:
ldap://<hostname>:<port>/...
| Если порт (и предыдущее двоеточие) опущены, используется стандартный порт LDAP (389). Если в запросе не указан сервер, список дефолтовых серверов берётся из конфигурационной опции “ldap_default_servers ”. Он предоставляет список серверов, разделённых двоеточиями, пробуемых по очереди, пока запрос не будет успешно обработан, или не произойдёт серьёзная ошибка. Успешная обработка или вернёт запрошенные данные, или укажет, что они не существуют. Серьёзные ошибки - синтаксические, или много значений, когда ожидается только одно. Ошибки, приводящие к пробе следующего сервера - сбои подключения, привязки, и таймауты.
Для каждого имени сервера, в списке, можно задать номер порта. Стандартный способ задания хоста и порта - использование двоеточия, как разделителя (RFC1738). Поскольку “ldap_default_servers ” - список значений разделённых двоеточиями, такие двоеточия должны быть удвоены. Например:
ldap_default_servers = ldap1.example.com::145:ldap2.example.com
| Если “ldap_default_servers ” незадана, библиотеке LDAP передаётся URL безбез имени сервера, и используется дефолтовое значение библиотеки (обычно - локальный компьютер).
Если вы используете библиотеку OpenLDAP, вы можете соединится с LDAP-сервером используя сокет UNIX, вместо подключения через TCP/IP. Это задаётся использованием “ldapi ” вместо “ldap ” в LDAP-запросах. Нижеследующее (имеется ввиду - про “ldapi ” - прим. lissyara), применяется только в OpenLDAP. Если exim скомпилен с поддержкой различных LDAP-библиотек, эта возможность недоступна.
Для этого типа соединения, вместо имени хоста, требуется имя-путь сокета, и номер порта неуместен. Имя-путь может быть указано как элемент в “ldap_default_servers ”, или встроено в запрос. В первом случае, вы будете иметь настройки типа таких:
ldap_default_servers = /tmp/ldap.sock : backup.ldap.your.domain
| Когда путь с именем указываются в запросе, вы должны заменить прямые слэши последовательностью “%2F ” для соблюдения синтаксиса LDAP URL. Например:
${lookup ldap {ldapi://%2Ftmp%2Fldap.sock/o=...
| Когда exim производит поиск LDAP, и находит, что “имя хоста ” ( “hostname ”) - реальный путь к сокету, он использует код сокета UNIX, даже если запрос задаёт использование “ldap ” или “ldaps ”. В частности, для соединения с сокетом не используется шифрование. Это поведение означает, что вы можете использовать настройки, например, “ldap_default_servers ”, в примере выше, с традиционными “ldap ” или “ldaps ”, и эо будет работать. Вначале, exim пробует соединиться через через сокет UNIX; если это не удаётся, он пробует подключиться по TCP/IP к резервному хосту.
Если в запросе задаётся явный тип “ldapi ”, при указанном имени хоста, диагностируется ошибка. Однако, если есть другие элементы в “ldap_default_servers ”, пробуются они. Другими словами:
Использование пути к сокету с “ldap ” или “ldaps ” вызывает использование интерфейса сокета UNIX.
Использование “ldapi ” с именем хоста вызывает ошибку.
Использование “ldapi ” без хоста или пути в запросе, и без установки “ldap_default_servers ”, делает то, что библиотека делает по умолчанию.
9.17 Аутентификация LDAP и управляющая информация
Синтаксис LDAP URL не предоставляет пути передачи аутентификационной и иной управляющей информации на сервер. Чтобы сделать это возможным, URL в запросе LDAP может предшествоваться любым числом установок “<name>=<value> ”, разделённых пробелами. Если значение содержит пробелы, они должны быть помещены в двойные кавычки, и, когда используются двойные кавычки, надо использовать обратный слэш, как обычно. Распознаются следующие имена:
имя
|
значение
|
DEREFERENCE
|
установить параметр разименования
|
NETTIME
|
установить таймаут сетевой операции
|
USER
|
установить DN для аутентификации связи LDAP
|
PASS
|
установить пароль для аутентификации связи LDAP
|
REFERRALS
|
установить ссылочный параметр
|
SIZE
|
установить ограничение числа возвращаемых входов
|
TIME
|
установить таймаут запроса
|
|
Значение параметра “DEREFERENCE ” должно быть одним из слов “never ”, “searching ”, “finding ”, или “always ”. Значение параметра “REFERRALS ” может быть “follow ” (по-умолчанию) или “nofollow ”. Последний вариант останавливает LDAP библиотеку от попыток следования ссылкам, отданным LDAP-сервером.
Имя “CONNECT ” - устаревшее имя “NETTIME ”, сохраненноё для обратной совместимости. Этот таймаут (заданный как число секунд) устанавливатся с клиентской стороны, для операций, который могут быть выполнены по сети. Специально, это применяется к сетевым соединениям и вызовам функции “ldap_result() ”. Если значение больше чем ноль, используется LDAP_OPT_NETWORK_TIMEOUT, если задано в заголовках LDAP (OpenLDAP), или, если в заголовках LDAP (Netscape SDK 4.1) задано LDAP_X_OPT_CONNECT_TIMEOUT. Нулевое значение вызывает явную установку “no timeout ” для Netscape SDK; для OpenLDAP никакого действия не происходит.
Параметр TIME (также число секунд) передаётся на сервер для установки серверных ограничений на время потраченное на поиск.
Вот пример запроса LDAP в поиске exim`a, использующем некотрые из этих значений. Это - одна строка, перенесённая, чтобы поместиться на странице:
${lookup ldap
{user="cn=manager,o=University of Cambridge,c=UK" pass=secret
ldap:///o=University%20of%20Cambridge,c=UK?sn?sub?(cn=foo)}
{$value}fail}
| Кодирование пробелов, как “%20 ” - из URL, его нелььзя делать для каких-либо вспомогательных данных. Конфигурационные настройки exim`a, включающие поиски содержащие информацию о пароле, необходимо предварять “hide ”, чтобы предотвратить возможность увидеть эти значения не-административными пользователями, при использовании опции “-bP ”.
Вспомогательные данные могут быть даны в любом порядке. По умолчанию - таймаут отсутсвует (используется системный таймаут), нет пользователя или пароля, нет ограничений на число возвращённых значений, и нет ограничений по времени запроса.
Когда DN квотирован в USER= setting для LDAP аутентификации, exim удаляет любое URL-квотирование, которое может быть до LDAP. Очевидно, некоторые библиотеки делают это для себя, но некоторые нет. Удаление URL-квотирование даёт два преимущества:
Это позволяет использовать тоже самое раскрытие “quote_ldap_dn ” для USER= DNs, что и для DNs внутри фактических запросов.
Это разрешает пробелы внутри USER= DNs.
Например, настройка типа
USER=cn=${quote_ldap_dn:$1}
| должна работать, даже если “$1 ” содержит пробелы.
Раскрытые данные для PASS= value должны быть квотированы с использованием оператора раскрытия “quote ”, а не оператора квотирования LDAP. Единственная причина, по которой это поле нуждается в квотировании, состоит в том, чтобы гарантировать его соответствие синтаксису exim`a, который не разрешает пробелы вне кавычек. Например:
Аутентификационный механизм LDAP может использоваться для прокерки паролей, как часть SMTP-аутентификации. Смотрите условие ракрытия строки “ldapauth ” в разделе 11.
9.18 Формат данных возвращённых LDAP
Типы поиска “ldapdn ” возвращают Distinguished Name (отличительное имя) из единственного элемента, как последовательность значений, например:
cn=manager, o=University of Cambridge, c=UK
| Тип поиска “ldap ” генерит ошибку, если более одного элемента соответствует фильтру поиска, тогда как “ldapm ” разрешает этот случай, и вставляет новую строку в результат, до данных от различных входов. Это возможно для многочисленных значений возвращённых для обоих “ldap ” и “ldapm ”, но в первом случае вы знаете, что независимо от возвращённого значения, исходили из одиночного вхождения в директории.
В общем случае, где вы задаёте один аттрибут в вашем LDAP-запросе, результат не квотируется, и не содержит имя атрибута. Если атрибут имеет множественные значения, они разделются запятыми.
Если вы определяете множественные тарибуты, результат содержит разделённые пробелами, квотированные строки, каждая с предшествующим именем атрибута и символом равно. В пределах кавычек, символ двойной кавычки, обратного слэша и новой строки экранируется обратным слэшем, и запятые используются для разделения многочисленных значений атрибута. В части для экранирования, строка внутри кавычекпринимает такую же форму как вывод, когда запрашивается единственный атрибут. Если никакие атрибуты не заданы, это тоже самое, что и задание всех атрибутов.
Это - некотрые примеры формата вывода. Превая строка каждой пары - запрос LDAP, и вторая - возвращённые данные. Атрибут называемый “attr1 ” имеет два занчения, тогда как “attr2 ” - лишь одно:
ldap:///o=base?attr1?sub?(uid=fred)
value1.1, value1.2
ldap:///o=base?attr2?sub?(uid=fred)
value two
ldap:///o=base?attr1,attr2?sub?(uid=fred)
attr1="value1.1, value1.2" attr2="value two"
ldap:///o=base??sub?(uid=fred)
objectClass="top" attr1="value1.1, value1.2" attr2="value two"
| Оператор “extract ” в раскытиях строки может быть использован для выбора индивидуальных полей из данных, состоящих из пар “key=value ”. Вы модете использовать опцию exim`a “-be ”, для хапуска теста раскрытия и таким образом проверить результаты поиска в LDAP.
9.19 Дополнительные сведения о NIS+
Запросы NIS+ состоят из “индексного имени ” ( “indexed name ”) NIS+, сопровождаемого опциональным двоеточием и именем поля. Если это дано, разультат успешного запроса - содержимое именованного поля; иначе - результат состоит из объединённых пар “field-name=field-value ”, разделённых пробелами. пустые значения и значения содержащие пробелы помещаются в двойные кавычки. Например, запрос
[name=mg1456],passwd.org_dir
| мог бы вернуть строку
name=mg1456 passwd="" uid=999 gid=999 gcos="Martin Guerre"
home=/home/mg1456 shell=/bin/bash shadow=""
| (разбито на две строки чтобы пометиться на странице), тогда как
[name=mg1456],passwd.org_dir:gcos
| вернул бы лишь
без кавычек. Поиск NIS+ неудачен если NIS+ возвращает больше одного элемента таблицы для данного индексного ключа. Эффект оператора раскрытия “quote_nisplus ” удваивает любые символы кавычек внутри текста.
9.20 Поиски SQL
Exim может поддерживать поиски в InterBase, MySQL, Oracle, PostgreSQL, и SQLite базах данных. Запросы для этих БД содержат SQL-выражения, таким образом, пример мог бы быть таким
${lookup mysql{select mailbox from users where id='userx'}\
{$value}fail}
| Если результат запроса содержит более одного поля, данные возвращаются для каждого поля, предшествуеиые его именем, таким образом, результат
${lookup pgsql{select home,name from users where id='userx'}\
{$value}}
| мог бы быть
home=/home/userx name="Mister X"
| Пустые значения, и значения содержащие пробелы помещаются в двойные кавычки, внутренние кавычки экранируются обратным слэшем. Если результат запроса содержит лишь одно поле, значение возвращется дословно, без имени поля, например:
Если результат запроса приводит более чем к одной строке, они все объединяются, с новой строкой между данными для каждой строки.
9.21 Дополнительные сведения о MySQL, PostgreSQL, Oracle, и InterBase
Если используются какие-либо поиски в MySQL, PostgreSQL, Oracle, или InterBase, то должна быть установлена опция “mysql_servers ”, “pgsql_servers ”, “oracle_servers ” или “ibase_servers ” (соответственно) в виде списка информации о сервере, разделённого двоеточиями. (Только для MySQL и PostgreSQL, глобальная опция не должна быть установлена, если если все запросы содержат собственную информацию о сервере - смотрите секцию 9.22) Каждый элемент в списке - разделённый слэшами список четырёх пунктов: имя хоста, имя БД, имя пользователя и пароль. В случае Oracle, поле имени хоста используется для “имени сервиса ” ( “service name ”), поле имени базы данных не используется, и должно быть пустым. Например:
hide oracle_servers = oracle.plc.example//userx/abcdwxyz
| Поскольку данные пароля секретны, вы всегда должны предшествовать настройку словом “hide ”, для предотвращения просмотра установки неадминистративными пользователями при использовании опции “-bP ”. Вот пример, где перечислены два сервера MySQL:
hide mysql_servers = localhost/users/root/secret:\
otherhost/users/root/othersecret
| Для MySQL и PostgreSQL, хост может быть задан как “<name>:<port> ”, но т.к. это список значений разделённых двоеточиями, то оно должно быть удвоено. Для каждого запроса, эти параметры групп проверяются, в порядке успешности соединенией и запросов. Разультат запроса может такой, что данные не найдены, но сам запрос успешен. Другими словами, список серверов предоставляет средсво резервирования, а не список иных мест для поиска.
Операторы раскрытия “quote_mysql ”, “quote_pgsql ” и “quote_oracle ” конвертируют новую строку, таб, возврат каретки и обратный слэш в “\n ”, “\t ”, “\r ” и “\b ” соответственно, и символы одиночной кавычки, двойной кавычки и обратного слэша экранируются обратным слэшем. Оператор раскрытия “quote_pgsql ”, кроме того, экранирует символы процента и подчёркивания. Это нельзя делать для MySQL, поскольку эти символы экранирования не распознаются в контексте, где они они не экранируют специальные символы.
9.22 Задание сервера в запросе
Для поиска в MySQL и PostgreSQL (но, в данный момент не для Oracle и InterBase), возможно задать список серверов в каждом отдельном запросе. Это производиться путём создания такого начала запроса:
servers=server1:server2:server3:...;
| Каждый элемент списка может иметь одну из двух форм:
1. Если он не содержит слэшей, то предполагается что это просто имя хоста. В соответствующей глобальной опции ( “mysql_servers ” или “pgsql_servers ”) ищщется хост с таким же именем, последующие параметры (база данных, пользователь, пароль) берутся оттуда.
2. Если в нём содержиться любой слэш, он принимается как полный набор параметров.
Список серверов используется точно таким же способом как и глобальный список. Как только происходит успешное соединение с сервером и запрос успешно выполняется, происходит обработка поиска.
Эта особенность предназначена для использования в ситуациях master/slave, когда происходят обновления и вам предпочтительней обновить master, нежели чем slave. Если master в спике как запасной сервер для чтения, у вас могут быть глобальные установки типа таких:
mysql_servers = slave1/db/name/pw:\
slave2/db/name/pw:\
master/db/name/pw
| В запросе обновления вы должны написать:
${lookup mysql{servers=master; UPDATE ...} }
| Этот запрос будет послан только на мастер-сервер. Если, в другом случае, мастер не используется для чтения, и не присутствует в глобальной опции, вы всё равно можете провести обновление путём запроса такого вида:
${lookup pgsql{servers=master/db/name/pw; UPDATE ...} }
|
9.23 Специальные возможности MySQL
Для MySQL, пустое имя хоста, или использование “localhost ” в “mysql_servers ” вызывает соединение с сервером на локальном хосте через сокет UNIX. Альтернативный сокет может быть указан в круглых скобках. полный синтаксис каждого элемента в “mysql_servers ” таков:
<hostname>::<port>(<socket name>)/<database>/<user>/<password>
| Любая из трёх частей первого поля может быть опущена. Для нормального использования на локальном хосте можно отсавить пробел, или установить лишь “localhost ”.
Нет необходимости в указании БД, - если она тут отсутсвует, то должна быть дана в запросах.
Если запрос MySQL не возвращает никаких данных (команды insert, update, или delete), результат поиска - число затронутых строк.
Внимание: Это может ввести в заблуждение. Если обновление ничего, фактически, не меняет (например, устанаваливая поле на то же самое значение), результат - ноль, поскольку нет затронутых строк.
9.24 Специальные возможности PostgreSQL
Поиски в PostgreSQL также могут использовать сокет UNIX для соединения с БД. Обычно, это быстрей, и стоит меньше процессорного времени, чем подключение по TCP/IP. Однако он может использоваться лишь в случае, если сервер БД работает на той же самой машине, что и почтовый сервер. Конфигурационная строка для PostgreSQL, через сокет UNIX, выглядит так:
hide pgsql_servers = (/tmp/.s.PGSQL.5432)/db/user/password : ...
| Другими словами, вместо имени хоста даётся путь к сокету. путь заключён в круглые скобки так, чтобы его прямые слэши не были визуально перепутаны с разделителями других параметров сервера.
Если запрос PostgreSQL не возвращает никаких данных (команды insert, update, или delete), результат поиска - число затронутых строк.
9.25 Дополнительные сведения о SQLite
SQLite отличается от других поисков SQL, поскольку требуется имя файла, в дополнение к SQL-запросу. БД SQLite - один файл, и нет демона, как в других БД. Интерфейс exim`a требует чтобы имя файла, как абсолютный путь, было задано в начале запроса. Оно отделяется от запроса пустым пространством. Это означает что путь и имя файла не могут содержать пустые символы. Вот пример раскрытия поиска:
${lookup sqlite {/some/thing/sqlitedb \
select name from aliases where id='userx';}}
| В списке, похожий синтаксис. Например:
domainlist relay_domains = sqlite;/some/thing/sqlitedb \
select * from relays where ip='$sender_host_address';
| Единственный символ, затрагиваемый оператором “quote_sqlite ” - символ одиночной кавычки, которую он удваивает.
Библиотека SQLite обрабатывает множественные одновременные доступы к БД внутренне. Множественные чтения разрешены, но лишь один процесс может производить обновление. Попытки обращения к БД, во время обновления, отклоняются после таймаута ожидания, в течение которого библиотека SQLite ждёт освобождения блокировки. В exim, дефолтовый таймаут установлен в 5 секунд, но это может быть изменено с помощью опции “sqlite_lock_timeout ”.
=============
translated by lissyara
verifying by Gerk
Ссылка на обсуждение: http://forum.lissyara.su/viewforum.php?f=20.
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS
Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat
Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration
Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster
HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS
История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire
Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной
Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
2011-01-21, m4rkell
Syslog server
Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
2011-01-07, lissyara
Canon/gphotofs
Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
2010-12-13, Al
IPSec
Описание принципов работы IPSEC и способов аутентификации.
2010-12-07, manefesto
FreeBSD on flash
Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
2010-12-05, Fomalhaut
root ZFS, GPT
Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
2010-09-05, Cancer
Настройка аудиоплеера на ximp3
Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
2010-08-31, Cancer
Установка и настройка OpenVPN
На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
2010-08-25, manefesto
freebsd lvm
Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
2010-04-30, gonzo111
proftpd file auth"a
Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
2010-04-22, lissyara
tw_cli
Пошаговая инструкция по восстановлению RAID на контроллере 3ware, из которого выпал один диск. Настройка мониторинга состояния рейда и отчётов о его состоянии на email.
2010-04-14, fox
MySQL Master+Master
MySQL (Master Master) and (Master Slave) Как настроить репликацию…
2010-03-09, terminus
DNS zones
Краткий ликбез про управление DNS зонами. Примеры проведения делегирования прямых и обратных DNS зон.
2010-03-09, aspera
Squid+AD (group access)
Настройка прокси сервера SQUID с автроризацией пользователей в AD. Разделение пользователей на группы
2010-03-02, BlackCat
Шлюз: Часть 4
Настройка дополнительных сервисов: синхронизация времени (OpenNTPD), клиент DynDNS.org.
2010-03-01, BlackCat
Шлюз: Часть 3
Настройка DHCP и DNS серверов для работы внутри частной сети, c поддержкой внутренних (частных зон) DNS, а так же интеграция DHCP и DNS сервисов.
2010-03-01, BlackCat
Шлюз: Часть 2
Конфигурация МСЭ pf для проброса портов с изменением порта назначения и без, а так же поддержки активного режима FTP и ограничения максимального размера сегмента
2010-03-01, BlackCat
Шлюз: Часть 1
Быстрая настройка шлюза/маршрутизатора с установлением PPPoE-соединения, поддержкой NAT и DNS-forwarding.
2010-02-23, Morty
darkstat
Простая считалка траффика, со встроенным веб-сервером. Очень маленькая, может делать отчеты трафика по хостам, портам, протоколам, а также строить графики
2010-01-23, gonzo111
squid+sams+sqstat
Пилим squid и sams - примеры конфигов с объяснениями. Установка SqStat.
2009-12-19, schizoid
mpd5 + radius + ng_car + Abills
Настройка pppoe-сервера с биллинговой системой Abills и шейпером ng_car
2009-11-16, lissyara
UFS->ZFS
Удалённая миграция с UFS на ZFS. Загрузка с раздела zfs. Настройка для работы с малым количеством памяти под архитектурой i386.
2009-11-13, gx_ua
fusefs-ntfs
Установка, настройка и использование fusefs-ntfs, драйвер NTFS, предназанченного для монтирования NTFS разделов под FreeBSD
2009-11-12, Morty
LiveCD
Создание собственного LiveCD с необходимыми вам изменениями, автоматизирование данного процесса, а так же вариант скоростной сборки СД.
2009-09-27, lissyara
Samba как PDC
Контроллер домена - аналог M$ NT4 домена под самбой, без использования LDAP и прочей хиромантии. Просто и быстро =)
2009-08-30, terminus
ipfw nat
Подробное руководство по ipfw nat, сложные случаи конфигурации.
2009-08-24, levantuev
HotSpot
Установка Hotspot системы в общественное заведение.
2009-08-18, lissyara
diskless
Создание бездисковых терминалов под управлением FreeBSD - с загрузкой по сети. Используются для старта rdesktop и подключения к виндовому серверу терминалов.
2009-07-29, BAV_Lug
Видеонаблюдение
Настройка бюджетного варианта видеонаблюдения на удаленном объекте
2009-07-22, Cancer
OpenLDAP адресная книга
Настройка и создание адресной книги на базе OpenLDAP + phpLDAPadmin
2009-06-30, SergeySL
AimSniff
Руководство по созданию системы мониторинга ICQ-переписки на базе AimSniff, использующей базу данных MySQL для хранения и Web-интерфейс WAS (Web Aim Sniff) для просмотра перехваченных сообщений
2009-06-25, atrium
Управление правами доступа
Полномочия пользователей и файлов, принадлежащих им, формирует концепцию ОС UNIX.
2009-06-16, DNK
Exim+PgSQL
Установка почтовой системы exim+pgsql на FreeBSD 7.1
2009-05-30, mvalery
HDD(mbr) -> HDD(gpt)
Как разбить диск размером более 2TB на разделы, сделать загрузочным, а затем перенести на него информацию с рабочей системы — донора.
2009-05-22, Cancer
SendXMPP
Отправка сообщений на Джаббер сервер по средствам SendXMPP
2009-05-11, Raven2000
Network UPS Tools
Network UPS Tools представляет собой набор программ, которые обеспечивают общий
интерфейс для мониторинга и администрирование UPS оборудования.
2009-04-29, m0ps
IPSEC over GRE with RIP
Пример IPSEC over GRE и динамическим роутингом (RIP), с ADSL в качестве последней мили на оборудовании Cisco.
2009-04-24, WhiteBear777
qemu network
Появилась необходимость поставить на БСД эмулятор(qemu) и настроить в качестве гостевой ОС Windows XP, предоставив ей выход в локалку и в сеть internet...
2009-04-22, vp
freebsd + huawei 162 gsm modem
В статье описывается простой способ подключения модема huawei 162 к freebsd + первичная настройка smstools
2009-04-12, mvalery
Мониторинг RAID
Мониторинг из командной строки RAID компаний AMCC 3ware, HighPoint, Dell (Perc 5/i и PERC 6/i) и LSI (MegaRAID SAS 8408E и SAS1078)
2009-04-09, texnotronic
RAID1 via LAN
Функциональности DRBD во FreeBSD можно добиться примонтировав блочное устройство по сети при помощи GEOM Gate (ggate) и добавив его в зеркало с локальным диском средствами gmirror.
2009-04-03, Raven2000
Оптимизация хоста для CMS
В последнее время на старый и не очень быстрый ПК (Celeron 800 RAM 256) мною было навешано с десяток сайтов и некоторые были из серии тяжелых CMS. И так нам дано FreeBSD 7.1 и ~10 сайтов/CMS.
2009-04-01, atrium
VSFTPD + AD && MySQL
Настройка самого безопасного сервера FTP - vsftpd.
2009-03-31, Dron
Peoplenet + C-motech (3G)
Описание подключения к сети Peoplenet посредством 3G модема С-motech CCu-650U на FreeBSD
2009-03-25, lissyara
mod_auth_external
mod_auth_external - авторизация пользователей в apache c помощью внешней программы - например, системных пользователей.
2009-03-24, gx_ua
Lightsquid
Частично lightsquid может заменить sams: быстрая и простая инсталляция, быстрый парсер, cgi скрипт для динамической генерации отчета, нет привязки к БД, различные графические отчеты, мультиязычный инт
2009-03-18, LHC
Установка Zabbix-1.6
Установка и первоначальная настройка системы мониторинга Zabbix (версия 1.6)
2009-03-16, Cancer
Принт-Сервер Samba+LPD & AD
Простейшая настройка Принт-Сервера на FreeBSD используя Samba+LPD & AD
2009-03-04, Mad_caterpillar
ipsec_vpnc
Настройка VPN IPSec концентратора на FreeBSD 6.2 для клиента cisco с использованием ipsec-tools и авторизацией в активной директории
2009-02-18, Andy
Free-SA
Программа анализирует log файлы Squid'а и формирует по ним отчет.
2009-02-02, Cancer
Openfire Jabber Server
Установка Jabber сервера на примере Openfire
2009-01-28, Cancer
mpd5 + сжатие и шифрование
Установка VPN сервера mpd5 + сжатие и шифрование
2009-01-26, vp
freebsd + webcamera
Подключение и настройка вебмкамеры для работы с freebsd на примере Logitech QCam STX
2009-01-10, Grishun_U_S
конфиг для офисов
В статье разбирается конфиг для офиса, пользователи которого имеют строгие ограничения по портам. Заворачиваем www трафик на транспарентный прокси, а остальное NAT'им. Эффективно делим канал интернет
2008-12-27, Storoge
sftp+chroot
Возникла необходимость дать возможность нескольким пользователям заливать на сервер контент для своих сайтов через sftp, чтобы при этом не страдала безопасность.
2008-12-13, Morty
PurefFTPd
Администрирование pureftpd-сервера с помощью вэб интерфейса Usermanager
2008-12-11, lissyara
termlog
Небольшая простая утилита, использующаяся для записи в файл всего что происходит на терминалах системы. Полезно, когда есть доступ по ssh у тех, кому не очень доверяете. Паранойя - это не плохо =)
2008-11-26, Cancer
SQUID+SAMS +Rejik-(ADLDAP)
Установка Прокси сервера SQUID с красивой мордой SAMS и редиректором REJIK,для учета кто куда ходил + графики в pdf,РЕЖИК собственно рубит банеры и запрещает пользователям ходить на запрещенные сайты,
2008-11-22, dvg_lab
php5-oci8
Решение проблем segmentation fault (core dumped) при работе с oracle8-client и php5-oci8
2008-11-21, m0ps
NTP
Пример настройки NTP сервера для локальной сети и клиента, для синхронизации времени с локальный NTP сервером. Обновление ntpd из портов.
2008-11-20, Cancer
SQUID+SAMS +Rejik-(NTLM)
Установка Прокси сервера SQUID с аутентификацией по NTL с красивой мордой SAMS и редиректором REJIK,для учета кто куда ходил + графики в pdf, РЕЖИК собственно рубит банеры и запрещает пользователям хо
2008-11-20, UA
Hotspot
Настройка безпроводной точки доступа (WiFi) на freebsd
2008-11-12, Shaman
Enemy Territory
Появилась у меня такое желание поднять сервер Enemy Territory.
Поискал погуглил, ничего толкового не нашел пришлось все самому делать.
И вот решил поделиться опытом. Начинаем......
2008-11-11, lissyara
Samba+ NT ACL
Использование vfs самбы - модули full_audit и recycle. Настройка для использования в качестве файлопомойки с 500+ одновременно работающих юзеров. Раздача прав через нативный виндовый интерфейс.
2008-11-11, Raven2000
Upgrading OpenBSD
Сегодня мы будем обновлять OpenBSD. Систему необходимо поддерживать в актуальном виде и следить, чтобы все работало, как часы и все дырки были залатаны до прихода врага =)
2008-11-10, lexy
SMSTools 3
Как автоматизировать отправку и обработку входящих сообщений при помощи мобильного телефона, датакабеля и компа
2008-11-06, Cancer
Asterisk IP PBX
Установка VoiP сервера Asterisk IP PBX для соединения двух шлюзов и АТС
2008-10-30, atrium
Samba & CUPS & AD & ACL
Настройка Samba в роли доменного файл-сервера, и CUPS в роли принт-сервера для Windows клиентов
2008-10-17, Raven2000
src & ports
Конечно, в OpenBSD система портов никогда не сможет быть полной сравнение с той же системой во FreeBSD. Связано это с тем, что разработчики включают в порты лишь те приложение которые протестированн
2008-10-13, Morty
Mysql - базовое описание
Базовое описание и принципы работы с MySQL
2008-10-10, Cancer
exim&dovecot + fetchmail + SSL
Exim & Dovecot + Postfixadmin & Roundcube + Fetchmail & smtp_relay
С возможностью отправлять письма через смтп релей провайдера.
С использование SSL шифрование: POP3s IMAPs sSMTP
2008-10-09, m0ps
Дополнительные порты для роутера
Увеличение количества Ethernet портов маршрутизатора за счет свободных портов коммутатора пробросив vlan с сабинтерфейса роутера на интерфейс коммутатора.
2008-10-06, princeps
Bacula
Настройка сервера системы резервного копирования Bacula на FreeBSD для бэкапов FreeBSD и Windows машин
2008-10-02, zheromo
Postfix + DBMail
Создание почтовой системы на основе Postfix + DBMail + SASL2 + TLS + DSpam + ClamAV + RoundCubeWebMail
2008-10-02, Cancer
SugarForge CRM
SugarForge CRM предоставляет подавляющее большинство функциональных возможностей CRM систем
2008-09-12, arksu
ng_ipacct + squid
Подсчет трафика с помощью ng_ipacct. Связка ng_ipacct + squid + парсер логов + авторизатор + nginx + mysql и куча служебных скриптов для работы всей системы.
|