Пропуск домашнього VPN за допомогою systemd ExecCondition
Навмисний пропуск і зламана команда підготовки — різні результати. Визначте коди виходу помічника, потім перевірте перемикання між мережами.
Домашньому 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 активний. Тримайте причину пропуску видимою в журналі, щоб навмисне рішення ніколи не виглядало як збій автентифікації. Довідник служби описує семантику виходу та мінімальну версію.