Lookup

Lookup – это обобщенный интерфейс поиска объектов и получения связанных с ними значений. Значения разделяются запятыми. Перед значением может стоять префикс, обозначающий тип Lookup, который отделяется двоеточием:

[prefix1:]value1, [prefix2:]value2, ...

Если префикс не указан, то значение используется непосредственно.

Использование специальных символов

В составе Lookup-запросов возможно применение следующих специальных символов:

$s - будет заменен перед отправлением на запрашиваемый элемент. Например, если запрашивается адрес, то будет подставлен весь адрес (без угловых скобок), а если домен – то весь домен.

$d - если запрашиваемым элементом является адрес, то из него будет выделено доменное имя и передано в качестве запроса. В противном случае подставляется весь запрос.

$u - если запрашивается адрес, то будет выделено имя пользователя и передано в качестве запроса. Если параметр запрашивает домен, то передается пустая строка.

$$ - заменяется на одинарный $.

Внимание!

Пожалуйста, обратите внимание, что имеются случаи, когда значения некоторых специальных символов не могут быть определены при выполнении Lookup для подстановки значений в параметр. В первую очередь это касается параметров, используемых для проверки SMTP-ограничений компонентом Receiver (SMTP/LMTP) на этапе INTRO SMTP-сессии (подключение клиента). На этом этапе:

Для всех проверок, связанных с принадлежностью IP-адреса клиента к списку сетей (см. параметр ProtectedNetworks в секции [Maild]):

o$s – IP-адрес подключившегося клиента.

o$d, $u – пустые, т.к. соответствующее значение не определено.

Для всех проверок, связанных с принадлежностью к домена клиента списку доменов (см. параметр ProtectedDomains в секции [Maild]):

o$s – доменное имя хоста, с которого подключился клиент (если удалось разрешить FQDN), иначе – его IP-адрес.

o$d = $s.

o$u – пустой, т.к. соответствующее значение не определено.

На последующих стадиях SMTP-сессии (MAIL FROM, RCPT TO) значения спецсимволов определены:

o$s – адрес user@domain целиком.

o$d – домен (часть domain адреса).

o$u – имя пользователя (часть user адреса).

Используемые типы префиксов

Cуществуют следующие варианты префикса, задающие источник данных для поиска:

value - за ним указывается непосредственно искомое значение. Этот префикс не обязателен и подразумевается по умолчанию, если не указано иного префикса. Этот префикс может быть указан явно, если, к примеру, в искомом значении встречается символ ":".

file - значение является путем к файлу. Каждое значение в файле должно находиться в новой строке. При поиске это один из самых быстрых вариантов, так как позволяет использовать сортировку и бинарный поиск.

Внимание!

Пожалуйста, обратите внимание, что только первые 2 типа префиксов могут быть использованы для параметров, имеющих специальный ограниченный тип LookupLite, а остальные типы, указанные ниже, там использовать запрещено

regex - значение является регулярным выражением (совместимым с синтаксисом регулярных выражений Perl) – при проверке ищется подстрока, а не полное совпадение;

rfile - значение является путем к файлу. Файл содержит набор регулярных выражений (совместимых с синтаксисом регулярных выражений Perl), каждое из которых должно находиться в новой строке. При проверке ищется подстрока, а не полное совпадение;

Внимание!

Пожалуйста, обратите внимание, что содержимое файлов, которые используются в качестве источников данных для Lookup типа file и rfile, никак не проверяется, поэтому перед использованием их в качестве источников данных, убедитесь в следующем:

Файлы являются текстовыми (содержат только текстовые строки);

В файлах отсутствуют пустые строки, а также строки-"мусор" (типа комментариев или разделителей), которые не могут использоваться в качестве значений для Lookup;

Регулярные выражения (для rfile) составлены корректно в соответствии с синтаксисом регулярных выражений Perl;

Файл не содержит лишних (избыточных) данных;

Следите за размером файла, поскольку при чтении файлов большого размера может произвойти ошибка выделения памяти, что приведет к аварийному завершению работы Dr.Web MailD.

ldap - значение представляет собой путь к поиску на LDAP-сервере;

Формат значения следующий:

[param1=val1|param2=val2|...|] ldap_url

где ldap_url – это интернет-адрес LDAP-запроса.

Пары param=value указываются в том случае, если в данном Lookup-запросе требуется переопределить параметры LDAP, заданные в секции [LDAP] конфигурационного файла Dr.Web MailD. Можно указывать только те параметры из этой секции, для которых явно написано, что это возможно (см. описание параметров секции). Для параметров, значение которых не переопределено в данном запросе, будут использованы значения, заданные в [LDAP].

URL LDAP-запроса выглядит следующим образом:

ldap://hostport/dn[?attrs[?scope[?filter[?exts]]]]

где:

ohostport - имя хоста (возможно, вместе с номером порта, указанным через двоеточие);

odn - имя базы данных, в которой осуществляется поиск;

oattrs - список атрибутов запроса, разделенных запятой;

oscope - может принимать три значения: base, one, sub;

ofilter - название поискового фильтра;

oexts - набор расширений LDAP и/или API.

Пример:

ldap://ldap.example.net/dc=example,dc=net?cn,sn?sub?(cn=*)

odbc, postgres, oracle, mysql, firebird, sqlite - значение представляет собой SQL-запрос к соответствующей базе данных:

[param1=val1|param2=val2|...|] sql_request

sql_request – строка SQL-запроса к базе данных (источнику данных DSN в случае ODBC). Параметры подключения берутся из соответствующей секции конфигурационного файла Dr.Web MailD (соответственно [ODBC], [PostgeSQL], [Oracle], [MySQL], [Firebird], [SQLite]). В качестве SQL-запроса должен использоваться запрос SELECT или любой запрос, возвращающий значение, включая вызов хранимой процедуры (stored procedure).

Пары param=value указываются в том случае, если в данном Lookup-запросе требуется локально переопределить параметры обращения к БД, заданные в соответствующей секции параметров БД конфигурационного файла Dr.Web MailD. Можно указывать только те параметры из этой секции, для которых явно написано, что это возможно (см. описание параметров секции). Для параметров, значение которых не переопределено в данном запросе, будут использованы значения, заданные в секции. В запросе можно указывать специальные символы.

Внимание!

Замечания:

1.Обратите внимание, что если запрос SELECT будет извлекать записи, содержащие более одного поля (вида SELECT field1,field2,... FROM ...), то значениями Lookup будут являться все строки записей с перечнем значений полей в том виде, в каком их возвращает СУБД. В силу того, что разные СУБД могут по-разному формировать вывод записей, содержащих более одного поля, не рекомендуется использовать в Lookup запросы, возвращающие записи, содержащие более одного поля.

2.Lookup типа sqlite предназначены для работы с базами данных SQLite версии 3.x. Пожалуйста, обратите внимание на особенности работы СУБД SQLite.

cdb - значение представляет собой текстовое имя ключа в базе данных CDB.

Базы данных CDB не поддерживают язык запросов SQL. Поэтому драйвер CDB эмулирует единственную команду SQL для унификации работы с Lookup:

select * from @tablename where key='@string'

где @tablename следует заменить на имя одного из файлов, которые были заданы в секции [CDB] конфигурационного файла Dr.Web MailD как источники данных.

В запросе можно указывать специальные символы.

Пример:

cdb:skipdomains=file:/home/skipdomains.list|select * from my_file where key='$s'

Обратите внимание, что параметр SkipDomains, локально переопределенный в данном Lookup, имеет тип LookupLite (т.е. является Lookup, для которого разрешены только префиксы file: и value:).

berkeley - обеспечивает взаимодействие с Berkeley DB. Формат запроса аналогичен cdb. Используются параметры заданные в секции [Berkeley] конфигурационного файла Dr.Web MailD. В запросе можно указывать специальные символы.

Использование локального переопределения параметров

После префикса в Lookup можно (но не обязательно) указывать список локальных значений параметров SkipDomains и OnError для этого Lookup. Локальные значения параметров для Lookup задаются в формате:

NAME1 = VALUE1 | NAME2 = VALUE2 | ... |

где NAME – имя параметра (не зависит от регистра), а VALUE – значение параметра.

Если параметр локально не переопределен, то его значение будет совпадать со значением по умолчанию, или со значением, заданным в секции конфигурационного файла Dr.Web MailD, соответствующей префиксу Lookup (тип источника данных для поиска).

Внимание!

Обратите внимание, что использование параметра SkipDomains не имеет смысла использовать в Lookup, которые выполняются для определения значений параметров на тех этапах SMTP-сессии, когда не может быть определен домен (т.е. пуст спецсимвол $d). Домен не может быть определен на этапе INTRO SMTP-сессии (см. выше).

Особенности обработки Lookup

Обратите внимание, что при обработке Lookup Dr.Web MailD будет ожидать подключения к источнику данных (СУБД или LDAP-серверу) в течение заданного в настройках (или локально переопределенного в префиксе Lookup) тайм-аута, что может привести к замедлению работы Dr.Web MailD при нестабильном сетевом соединении или при неправильно указанных параметрах подключения. В случае если в течении тайм-аута произвести подключение не удастся, будет зафиксирована ошибка, которая будет обрабатываться в соответствии со значением параметра OnError (заданного в настройках источника данных или локально переопределенного в префиксе Lookup).

Если Lookup используется как значение параметра Router в секции [Sender], и при этом задан режим обработки ошибок OnError=exception (в настройках используемого источника данных или переопределен локально), то, в случае если будет невозможно получить нужный маршрут из источника данных, эта ситуация будет обработана как ошибка в компоненте Sender, запись о чем будет зафиксирована в журнале. При этом в синхронном режиме компонент Receiver всегда возвращает отправителю письма код SMTP 451 (Requested action aborted: local error in processing), а обработанное письмо, согласно коду Tempfail (временная ошибка), удаляется из всех очередей. В асинхронном режиме письмо будет помечено как "потерянное" и Sender будет пытаться его отправлять с периодичностью, указанной в параметре StalledProcessingInterval этой же секции.

Внимание!

Неправильно записанная строка Lookup приведет к аварийному завершению работы Dr.Web MailD при запуске (на этапе чтения файла конфигурации), если он не сможет разобрать ее структуру и определить тип.

Для тестирования правильности Lookup рекомендуется иcпользовать утилиту проверки Lookup.

Обратите внимание, что полный вывод в журнал информации о запросах, передаваемых через Lookup в источники данных (к БД) доступен только если уровень подробности ведения журнала не менее подробный, чем DEBUG.