Домашният VPN няма какво да прави, когато лаптопът вече е в тази мрежа. Изкушаващото бързо решение е подготвителна команда, която излиза с ненулев код; това проваля unit-а и кара всеки панел да изглежда счупен. systemd има директива точно за такова решение и тя отделя умишленото пропускане от истинска повреда. Да се направи правилно, означава преди всичко да се запише какво значи всеки код за изход.

Защо провалено предварително условие е грешна форма

ExecStartPre приема ненулевия изход като провал при стартиране, което е правилно за команда, която подготвя услугата. Използването ѝ като условие прави политическото решение неразличимо от счупена зависимост. ExecCondition съществува, за да може unit-ът да откаже стартиране, без да бъде маркиран като провален.

Това разграничение е важно в три часа през нощта, когато никой не иска да анализира червен unit, който се е държал според замисъла. Проваленият unit също скрива истинските повреди сред умишлените.

Първо напишете договора за кодовете за изход

Напишете договора преди скрипта. Изход нула означава продължаване, изход едно означава пропускане на останалите команди за стартиране, а изход 255 означава, че самото условие не е могло да се изпълни. Кодовете между две и 254 обикновено също означават пропускане, което лесно се забравя, когато помощникът върне случаен код за грешка. Drop-in файлът по-долу прикача помощника към истинското име на unit-а.

[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpn

Проверете ефективния unit за наследени настройки SuccessExitStatus или stop-post, преди да приемете семантиката по подразбиране. След това тествайте умишлено всеки от трите изхода.

Мрежовата подсказка не е доказателство за местоположение

Достъпен адрес на рутер или известен MAC може да подскаже правилната мрежа и нито едно от двете не го доказва. Друга мрежа може да използва същия адрес, ARP данните може да са остарели, а идентификаторите могат да бъдат имитирани. Третирайте проверката като оптимизация, съобразена с политиката, а не като резултат от удостоверяване.

Решете предварително какво означава несигурността. Стартирането на VPN при несигурност е безопасно за клиент, който просто няма да се свърже; пропускането при несигурност не е. Направете проверката ограничена и четете активния интерфейс, вместо да приемате първия в списъка. Проверка, която виси, е по-лоша от такава, която отговаря с „не“, защото unit-ът я чака.

Запишете тези допускания до файла на unit-а, за да знае следващият човек какво вярва помощникът. Коментар в началото на скрипта е най-евтиното място да ги пазите.

Справяне с преминаването между мрежи

Условието се изпълнява при стартиране на услугата и не се преоценява по-късно. Пропуснат unit остава пропуснат, след като лаптопът се премести в кафене, а работещ тунел остава вдигнат, след като лаптопът се прибере вкъщи. Свържете жизнения цикъл на смяната на мрежата с решението за стартиране и спиране чрез отделен механизъм.

systemctl cat home-vpn.service

Тествайте четири случая: стартиране вкъщи, стартиране навън, проверка, която не може да се изпълни, и преминаване между мрежи, докато unit-ът е активен. Дръжте причината за пропускането видима в журнала, за да не изглежда умишлено решение като провал при удостоверяване. Справочникът на услугата документира семантиката на изхода и минималната версия.

Подобни статии