Четыре типа значений, на которых написан весь конфиг

критично

Syntax definitions
Определены один раз, используются везде

Руководство определяет четыре типа значений в отдельном коротком разделе, а дальше просто ссылается на них из сотен директив. Знать эти четыре — значит понимать грамматику любой строки конфигурации.

Логическое. Четыре написания на два значения: yes, no, true, false. Всё это MTA принимает наравне, поэтому тот, кто читает конфигурацию, обязан считать все четыре равнозначными, а тот, кто её пишет, — выбрать одно написание и держаться его.

Промежуток времени. Строка вроде 1w2d12h или 300s, где w — недели, d — дни, h — часы, m — минуты, s — секунды. Части складываются подряд, без пробелов и знаков. Отдельного поля единицы измерения в руководстве нет нигде: единица всегда внутри значения.

Регулярное выражение. Совместимое с Perl (PCRE), пишется между косыми: /^421 .* too many errors/. Диалект чужой и полный — подробности на странице regex-dialect.

Образец домена. Пять форм, и именно их стоит запомнить: они встречаются в каждом блоке, который что-то сопоставляет с доменом. Разница между двумя из них — ловушка, и о ней ниже.

Главная ловушка — две почти одинаковые формы образца. *.домен ловит только поддомены и не ловит сам домен; [*.]домен ловит и домен, и поддомены. Различие в две скобки, а последствие серьёзное: правило, написанное для *.example.com, молча не применяется к example.com. Ни ошибки при разборе, ни предупреждения — блок просто не совпадает, и вместо него действует что-то более общее.
Что делает Хаб. Пишет конфигурацию сам, поэтому написание выбирает за автора: логические значения — yes/no и true/false вперемешку (наследие шаблонов), промежутки — компактной формой вроде 10m, образцы — пока только * и 0/0.

Разночтение в логических значениях безобидно для MTA, но неудобно человеку, который читает готовый файл: две формы в одном файле выглядят как разница смысла, которой нет.

Регулярные выражения Хаб не пишет вовсе — правила по образцу он собирает списком доменов, а не выражением.

Рекомендуемые значения

Что писать, когда пишете руками:

Тип Форма На что смотреть
логическое yes или no выбрать одно написание на весь файл
промежуток 10m, 4d12h, 300s единица обязательна: голое число это не промежуток
выражение /…/ между косыми диалект PCRE, экранирование как в Perl
образец [*.]домен почти всегда эта форма, а не *.домен

Промежуток без единицы — не промежуток. Строки вроде bounce-after 4 руководство не описывает: у типа единица всегда внутри значения, и голое число здесь не имеет смысла.

Про образцы двух видов сказано и на странице domain-matching — там же пример руководства, где обе формы стоят рядом и видно, чем они отличаются на живом конфиге.

Таблица и совет держаться одного написания — наши. Из руководства здесь состав четырёх типов, все пять форм образца, синтаксис промежутка и то, что выражения совместимы с Perl.
Пример в конфигурации
# четыре типа в четырёх строках
<domain [*.]example.com>
    use-starttls yes                 # логическое: yes | no | true | false    bounce-after 4d12h               # промежуток: w d h m s подряд
    max-msg-rate 500/h
</domain>
<smtp-pattern-list too-many>
    reply /^421 .* too many errors/ mode=backoff   # выражение PCRE
</smtp-pattern-list>
Заголовок первого блока — пятый тип, образец домена: форма со скобками ловит и example.com, и его поддомены. Форма без скобок поймала бы только поддомены.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

Типичные ошибки и проблемы

что делают не так и чем это кончается3 ошибки▶

Пишут промежуток голым числом

§ 3.2

Чем чреватоЕдиница у этого типа всегда внутри значения, отдельного поля для неё нет нигде. Голое число руководством не описано, и полагаться на догадку о том, как его поймёт MTA, нечем.
Как заметитьПроверка конфигурации отвергает строку либо промежуток оказывается не тем, которого ждали.
Как правильноВсегда писать единицу: 300s, 10m, 4d12h. Части складываются подряд, без пробелов.

Смешивают четыре написания логического в одном файле

§ 3.2

Чем чреватоДля MTA все четыре равнозначны, и ошибки не будет. А человек, читающий файл, видит yes в одной строке и true в соседней и ищет разницу, которой нет.
Как заметитьВ одном файле встречаются оба написания, обычно на границе двух шаблонов или двух авторов.
Как правильноВыбрать одно написание и привести файл к нему. Тому, кто пишет разбор чужого конфига, — считать все четыре одним значением.

Читают звёздочку с точкой как «домен и всё под ним»

§ 3.2

Чем чреватоФорма ловит только поддомены. Правило не применяется к самому домену, куда идёт основная почта, и вместо него действует что-то более общее.
Как заметитьНастройка видна в файле, а команда настроек очереди для домена печатает умолчание.
Как правильноПисать [*.]домен. Проверять двумя вызовами настроек очереди — на домен и на его поддомен.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Наследование
Наследования у типов нет: это грамматика значения, а не настройка. Наследуются директивы, которые ими написаны, — по правилам своего блока. Единственное, что важно помнить при слиянии: значение, записанное разными написаниями логического типа, сливается как одно и то же — yes не «сильнее» true.
Как проверить на узле
Разбирается ли написанное — проверяет сам MTA, до применения:
pmta test config
pmta show settings example.com/mta-news-1
Первая команда ловит нарушения грамматики: неизвестную единицу в промежутке, незакрытое выражение, неверную форму образца. Вторая — то, чего первая не поймает: образец разобрался, но совпал не с тем, с чем ждали. Ловушка со звёздочкой видна только второй командой.
В Хабе
Цена ошибки
безопасно: неверное значение ничего не ломает
Сценарии
Жизненный цикл конфигурации · Настроить темп под провайдера
Важность
критично