Правила проверки
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 и apply
Заголовок раздела «Что видят только check и apply»Два предупреждения приходят не из конфига, а из рендера, поэтому появляются в check,
diff и apply, но не в add:
- одна и та же пара «адрес + имя» дважды — дубликат выбрасывается, один раз, с предупреждением;
- имя, объявленное в двух разных группах, — обе строки сохраняются, потому что несколько адресов у одного имени это законное желание;
- имя, которое встречается ещё и вне управляемого блока на другом адресе. Ту строку
hostsctl не трогает, а в
/etc/hostsвыигрывает первое совпадение, так что строка выше блока тихо перебивает строку внутри него. Предупреждение называет файл и номер строки.
Одинаковые предупреждения схлопываются в одну строку со счётчиком (×N): иначе блоклист на
сто тысяч записей похоронит под собой всё остальное.
Как читать вывод
Заголовок раздела «Как читать вывод»hostsctl checkerror blocklist: ads.example: '0.0.0.0.' is not an IP addresswarn local: k8s.orb.local: label 'k8s-' starts or ends with a hyphenДо двоеточия — место: имя группы или группа: имена для записи. hostsctl edit запускает
check сам после выхода из редактора — самое дешёвое место поймать опечатку.