K - Определение Файла Ключей
Специальные преобразования могут быть определены использованием строки: Kmapname mapclass arguments
Где mapname - имя, под которым это преобразование используется в правилах перезаписи; mapclass - имя типа преобразования (эти имена вкомпилированы в sendmail); arguments интерпретируются в зависимости от класса; обычно, используется один аргумент, указывающий на файл, содержащий преобразование.
На преобразования ссылаются, используя синтаксис: $( ключ преобразования $@ аргументы $: умолчание $)
где и аргументы и умолчание могут быть опущены. $@ аргументы могут встречаться много раз. Указанный ключ и аргументы передаются в соответствующую преобразующую функцию. Если она возвращает значение, то оно замещает ввод. Если она не возвращает значение и имеется определенное умолчание, the умолчание заменяет ввод. Иначе ввод не изменяется.
Аргументы передаются в преобразование для произвольного использования. Большинство классов преобразований могут интерполировать эти аргументы в их значения используя для указания соответствующего аргумента синтаксис "%n" (где n - цифра).
Аргумент "%0" обозначает ключ базы данных. Например, правило R$- ! $+ $: $(uucp $1 $@ $2 $: %1 @ %0 . UUCP $)
Просматривает имя UUCP в (определенном пользователем) преобразовании UUCP; если не найдено, превращает его в форму ".UUCP". База данных должна содержать записи типа: decvax %1@%0.DEC.COM research %1@%0.ATT.COM
Отметьте, что операторы умолчания никогда не делают этого преобразования.
Встроенное преобразование с именем и классом "host" - это просмотр канонизации имени хоста. Таким образом, синтаксис: $(host hostname$)
эквивалентен: $[hostname$]
Существует множество определенных классов.
dbm | Просмотр базы данных, используя библиотеку ndbm(3). Sendmail должен быть скомпилирован с определенной NDBM. |
btree | Просмотр базы данных с использованием интерфейса btree к библиотеке Berkeley db(3). Sendmail должен быть скомпилирован с определенной NEWDB. |
hash | Просмотр базы данных с использованием хэш-интерфейса к библиотеке Berkeley db(3). Sendmail должен быть скомпилирован с определенной NEWDB. |
nis | Просмотры NIS. Sendmail должен быть скомпилирован с определенной опцией NIS. |
nisplus | Просмотры NIS+. Sendmail должен быть скомпилирован с определенной опцией NISPLUS. Аргумент - имя таблицы, используемой для просмотров, а флаги -k и -v могут быть использованы для установки столбцов ключа и значения соответственно. |
hesiod | Просмотры Hesiod. Sendmail должен быть скомпилирован с определенной опцией HESIOD. |
ldapx | Просмотры каталогов LDAP X500. Sendmail должен быть скомпилирован с определенной опцией LDAPMAP. Преобразование поддерживает большинство стандартных аргументов и большинство аргументов командной строки программы ldapsearch. |
netinfo | Просмотры NeXT NetInfo. Sendmail должен быть скомпилирован с определенной опцией NETINFO. |
text | Просмотры текстовых файлов. Формат текстового файла определяется флагами -k (число ключевых полей), -v (число поля значений), и -z (разделитель полей). |
stab | Просмотры внутренней таблицы символов. Используется внутри для псевдонимизирования. |
implicit | По-настоящему должно бы называться "alias" - используется для просмотра файлов псевдонимов по умолчанию, и используется по умолчанию, если не определен класс для файлов псевдонимов. |
user | Просматривает пользователей, используя getpwnam(3). Для указания имени возвращаемого поля может быть использован флаг -v (хотя обычно используется только для проверки существования пользователя). |
host | Канонифицирует доменные имена хостов. Получив имя хоста, вызывает сервер имен для поиска канонического имени для этого хоста. |
bestmx | Возвращает лучшую запись MX для заданного в качестве ключа имени хоста. Всегда предпочитается текущая машина- то есть, текущая машина является одним из хостов, перечисленных в качестве записи MX с самым низким значением предпочтения, следовательно, имеется гарантия его возврата. Это может использоваться для определения, является ли эта машина целью записи MX, и почта может быть принята на этом основании. Если задан флаг -z, то возвращаются все имена MX, разделенные заданным разделителем. |
sequence | Аргументы в строке "K" - список преобразований; результирующее преобразование просматривает аргументы-преобразования, пока не найдет совпадение для указанного ключа. Например, если определение ключа: Kmap1 ... Kmap2 ... Kseqmap sequence map1 map2тогда просмотр "seqmap" сначала производится в map1. Если найдено, то происходит немедленный возврат. Иначе, тот же ключ используется для map2. |
switch | Прямо как преобразование "sequence", за исключением того, что порядок преобразований определяется сервисным переключателем. Аргумент - имя сервиса для просмотра; значения из сервисного переключателя добавляются к имени преобразования для создания новых имен преобразований. Например, рассмотрим определение ключа: Kali switch aliasesвместе с вхождением сервисного переключателя: aliases nis files
Это вызовет запрос по преобразованию "ali" для поиска преобразований с именами "ali.nis" и "ali.files" в этом порядке. |
dequote | Обрезает у имени двойные кавычки ("). Не обрезает обратные слеши, и не будет обрезать кавычки, если результирующая строка будет содержать не возможный для просмотра синтаксис (то есть, основные ошибки типа незакрытых угловых скобок; более сложные ошибки типа неизвестных хостов не проверяются). Предназначается для приема почты из систем типа DECnet, квотирующих странный синтаксис типа "49ers::ubell"Обычное использование - что-то типа: Kdequote dequote ... R$- $: $(dequote $1 $) R$- $+ $: $>3 $1 $2Для предотвращения неожиданных результатов необходима осторожность; например, "|someprogram < input > output"потеряет свои кавычки, но результат, скорее всего, будет отличаться от ожидаемого. К счастью, такие случаи достаточно редки. |
Regex | Определение преобразования в строке K содержит регулярное выражение. Любой ключевой ввод сравнивается с этим выражением, используя программы регулярных выражений стандарта POSIX regcomp(), regerr(), и regexec(). Если вам нужно узнать больше информации о сравнении регулярных выражений, смотрите документацию на эти программы. Если не определен флаг -m не производится никакой перезаписи ключа. Без него, если ключ отвергнут или использован -s, то он замещается подходящими подстроками,разделенными $| или строкой, определенной флагом -d. Флаги, имеющиеся в преобразовании:
Флаг -sflag выбыирает подстроки в результате просмотра. Например, -s1,3,4 |
program | Аргументы в строке K являются путями к программам и любые начальные параметры будут пропущены. При вызове преобразования, к начальным параметрам добавляется ключ, а программа запускается с от пользователя и группы по умолчанию. Первая строка стандартного вывода возвращается как значение просмотра. Это все имеет множество потенциальных проблем безопасности, и жутко тормозит, поэтому использоваться должно только тогда, когда действительно необходимо. |
Большинство из них принимают в качестве аргументов одни и те же опциональные флаги и имя файла (или имя преобразования для NIS; имя файла является корнем пути к базе данных, так что ".db" или какое-либо другое расширение будет добавлено для получения настоящего имени базы данных). Известные флаги:
-o | Указывает, что это преобразование опционально - то есть, если оно не может быть открыто, не выдается ни какой ошибки, а sendmail будет считать, что преобразование было, но было пустым. |
-N, -O | Если ни -N, ни -O не указаны, sendmail использует адаптивный алгоритм для определения смотреть или нет нулевые байты в конце ключей. Сначала пробуются оба; если находится ключ с нулевым байтом, он никогда снова не будет опробован без нулевого байта и наоборот. Если указан -N, то никогда не пробуется без нулевого байта, а если указан -O, то никогда не пробуется с нулевым байтом. Указание одного из них может увеличить скоромть совпадений, но никогда не является необходимым. Если указаны оба -N и -O, sendmail никогда не будет пробовать никакие совпадения - то есть, все будет считаться неудачным. |
-ax | Добавить строку x к успешным совпадениям. Например, преобразование по умолчанию host добавляет точку при успешном совпадении. |
-Tx | Добавить строку x при временной неудаче. |
-f | Не преобразовывать из верхнего в нижний регистр до просмотра ключа. |
-m | Только прверка совпадения (без замены значения). Если вы беспокоитесь о существовании ключа, а не о значении (например, при поиске преобразования NIS "hosts.byname"), этот флаг удержит преобразование от замены значения. Однако, аргумент -a все еще добавляется при совпадении, и умолчание все еще берется при несовпадении. |
-kkeycol | Имя ключевого столбца (для NIS+) или номер (для текстовых просмотров). Для преобразований LDAP это фильтрует строку, проходящую на printf с %s, где вставляется строка для "преобразования". |
-vvalcol | Имя столбца значения (для NIS+) или номер (для текстовых просмотров). Для преобразований LDAP это имя возвращаемого атрибута. |
-zdelim | Разделитель столбцов (для текстовых просмотров). Может быть одним знаком или одной из специальных строк "\n" или "\t" для указания новой строки или табуляции соответственно. Если полностью опущен, разделителем столбцов считается любая последовательность пробелов. |
-t | Обычно, когда преобразование пытается просмотреть имя хоста и сервер ошибочен (то есть, sendmail не может найти ни одного сервера имен; это не то же самое, что вхождение не было найдено в преобразовании), обработанное сообщение ставится в очередь для дальнейшей обработки. Флаг -t отключает такое поведение, позволяя считать, что если происходит временная ошибка (сервер отключен), то это была постоянная ошибка (вхождение не найдено). В частности, это полезно для просмотров DNS, когда чей-то еще неправильно сконфигурированный сервер имен может вызвать проблемы на вашей машине. Однако здесь необходима осторожность, чтобы не откинуть почту, которая могла бы быть разрешена корректно, если бы вы попытались снова. Общая стратегия - перенаправлять такую почту на другой, возможно, имеющий лучшее соединение, почтовый сервер. |
-sspacesub | Только для преобразования dequote, символ, используемый для замены символов пробела после успешного деквотирования. |
-q | Не удалять кавычки перед просмотром. |
-A | При перестройке файла псевдонимов, флаг -A заставляет соединяться дублированные вхождения в текстовой версии. Например, два вхождения: list: user1, user2 list: user3 при присутствии флага -A будет считаться за одно вхождение list: user1, user2, user3 |
Преобразование dbm добавляет строки ".pag" и ".dir" к заданному имени файла; преобразования hash и btree добавляют ".db". Например, описание преобразования Kuucp dbm -o -N /usr/lib/uucpmap
Описывает опциональное преобразование класса "dbm" по имени "uucp"; оно всегда имеет нулевые байты в конце каждой строки, и данные находящиеся в /usr/lib/uucpmap.{dir,pag}.
Для постороения преобразований, ориентированных на три базы данных, может быть использована программа makemap(8). Она принимает следующие флаги:
-f | Не переделывать верхний регистр в нижний при преобразовании. |
-N | Включать нулевые байты в ключах. |
-o | Добавить к существующему (старому) файлу. |
-r | Позволить замещение существующих ключей; обычно, при ошибке, заново вставляет существующий ключ. |
-v | Печатать происходящее. |
Новые классы могут быть добавлены в подпрограмму setupmaps в файле conf.c.