Перейти к содержимому

Правила проверки

hostsctl check читает конфиг и показывает то, что /etc/hosts молча проигнорирует. Те же правила работают внутри apply, add, import и edit, так что до файла не доходит ничего, на что check пожаловался бы.

Уровня два, и разница не косметическая:

Уровень Что означает Последствие
error Строка не могла бы работать — или это вообще не строка. check выходит с 3; apply отказывается писать что-либо.
warn Законно и обычно ошибка. Сообщается, ничего не блокируется. check всё равно выходит с 0.

Ошибка внутри выключенной записи или выключенной группы понижается до предупреждения с пометкой (entry is disabled): строка, которая до /etc/hosts не доедет, не имеет права ронять apply.

Правило Уровень
Wildcard (*.example.com) — в /etc/hosts такого нет, нужен dnsmasq или /etc/resolver/. error
Порт или путь в имени (api.local:8080, example.com/api) — имя занимает всё поле целиком. error
Пустое имя или пустая метка (a..b). error
Длиннее 253 символов или метка длиннее 63. error
Символ вне a–z, 0–9, - и _ в метке. error
Метка начинается или заканчивается дефисом. warn

Завершающая точка (example.com.) намеренно не считается проблемой: запрос без точки такую строку находит, а блоклисты именно в такой форме имена и раздают.

Правило Уровень
ip не является адресом — всё, что отвергает std::net::IpAddr, хоть IPv4, хоть IPv6. error
Запись вообще без адреса. error
Запись без единого имени хоста. error
Один и тот же адрес повторён внутри одной записи. warn
Правило Уровень
Пустое имя группы. error
source.url не http:// и не https://. error
rewrite_ip не является адресом. error
source.url без TLS — список можно подменить по дороге. warn
В группе есть и source, и entries — при рендере записи игнорируются. warn

Два предупреждения приходят не из конфига, а из рендера, поэтому появляются в check, diff и apply, но не в add:

  • одна и та же пара «адрес + имя» дважды — дубликат выбрасывается, один раз, с предупреждением;
  • имя, объявленное в двух разных группах, — обе строки сохраняются, потому что несколько адресов у одного имени это законное желание;
  • имя, которое встречается ещё и вне управляемого блока на другом адресе. Ту строку hostsctl не трогает, а в /etc/hosts выигрывает первое совпадение, так что строка выше блока тихо перебивает строку внутри него. Предупреждение называет файл и номер строки.

Одинаковые предупреждения схлопываются в одну строку со счётчиком (×N): иначе блоклист на сто тысяч записей похоронит под собой всё остальное.

Terminal window
hostsctl check
error blocklist: ads.example: '0.0.0.0.' is not an IP address
warn local: k8s.orb.local: label 'k8s-' starts or ends with a hyphen

До двоеточия — место: имя группы или группа: имена для записи. hostsctl edit запускает check сам после выхода из редактора — самое дешёвое место поймать опечатку.