Підключення невеликого контролера до VPN у NetworkManager
Активація повертає дескриптор, а не готовий сеанс. Тримайте профіль, запит і активне з'єднання окремо та перебудовуйте стан після перезапуску.
Невеликій програмі, яка підключає наявний VPN, потрібен контролер, а не нова реалізація VPN. Підтримуваний рушій має займатися узгодженням і трафіком тунелю; ваша програма має виражати запит користувача й чесно пояснювати результат. У Linux інтерфейс NetworkManager D-Bus дає цьому контролеру конкретну модель, якої можна дотримуватися.
Чотири перевірки не дають контролеру переплутати збережений профіль, запит на активацію та робочий сеанс.
Перевірка перша: яка сутність обирається
Тримайте UUID профілю як постійну сутність і розв'язуйте його через менеджер, коли потрібен шлях до об'єкта. Показуване ім'я можуть ділити два профілі, а шлях шини під час виконання не є розумним користувацьким налаштуванням для зберігання. Запишіть вибір у власну конфігурацію, а не в коментар про те, який запис був другим у списку.
Перевірте, що повертає менеджер, перш ніж називати це збігом. UUID, якого більше немає, дає помилку пошуку, а це інший шлях коду, ніж профіль, який існує й відмовляється активуватися.
Перевірка друга: що повертає виклик активації
Документований виклик активації приймає шлях до об'єкта наявного з'єднання, шлях до пристрою та конкретний об'єкт. Він повертає шлях активного з'єднання, і ця відповідь є дескриптором, а не результатом готовності. Не встановлюйте прапорець готовності програми з поверненого значення; натомість підпишіться на стан і причину активного з'єднання.
Для VPN конкретний об'єкт вибирає активне базове з'єднання. Передача кореневого шляху залишає вибір пристрою NetworkManager, який бере той, що зараз типовий. Це рішення про контекст маршрутизації, а не поле пароля, і воно змінює, на якому пристрої лежить тунель.
Не беріть загальний приклад додавання й активації та не чекайте, що він створить профіль VPN. Документований помічник виключає з'єднання VPN, тому підготовка або імпорт профілю — окремий, переглянутий крок. Це важливо, бо підготовка потребує авторизації та перегляду, яких кнопка підключення не дає. Ставтеся до імпорту як до адміністративної дії з власним рядком журналу та власним затверджувачем.
Перевірка третя: як подається стан
Активне з'єднання проходить через активацію, активне, деактивацію та деактивовано, а поле причини каже чому. Стискання всього цього в логічне значення з назвою loggedIn втрачає відомості, потрібні користувачу й ті, які запитає підтримка. Показуйте принаймні, чи з'єднання очікує, встановлене чи зникло, і зберігайте рядок причини для випадку збою.
Пов'язуйте асинхронні відповіді із запитом, який їх породив. Пізнє завершення старішої спроби не повинно перезаписувати новішу дію користувача, а повторне натискання Connect слід або ігнорувати, або трактувати як скасування й повтор із видимою політикою.
Перевірка четверта: що відбувається після перезапуску
Коли менеджер перезапускається або ваш контролер знову підключається до шини, перебудуйте спостережуваний стан від власника. Не продовжуйте показувати кешований сеанс активним лише тому, що старий шлях до об'єкта ще в пам'яті. Сигнали зміни стану існують саме для того, щоб контролер міг ресинхронізуватися замість здогадок.
Виберіть, що означає закрити контролер. Залишити наявне з'єднання, що належить машині, увімкненим може бути правильно, і розібрати навмисно нетривалий сеанс теж може бути правильно. Залишити наявне з'єднання, що належить машині, увімкненим може бути правильно; розібрати навмисно нетривалий сеанс теж може бути правильно. Запишіть цей договір володіння в інтерфейс, а не припускайте, що вихід процесу виконує мережеву дію. Користувачі не мають угадувати, чи обірветься їхній тунель після закриття вікна. Помістіть відповідь у текст інтерфейсу, а не лише в коментар коду.
Тримайте повноваження й таємниці в їхніх власників
Дозволи повертаються як так, auth або ні, і інтерфейс має відображати різницю між дозволено, дозволено після автентифікації та відмовлено. Запуск контролера від root не реалізує політику дозволів; він прибирає питання.
Облікові дані належать підтримуваному агентові таємниць або клієнтській інтеграції для налаштованого методу автентифікації. Пароль у вихідному коді, в аргументі або в журналі є знахідкою, а локальна адміністративна авторизація не та сама подія, що автентифікація на шлюзі.
Нарешті, повідомляйте стан з'єднання окремо від завдання, яке хоче виконати користувач. Тунель може бути активним, поки приватне ім'я або програма залишаються недоступними, і цьому другому збою потрібне власне повідомлення та власний статус. Контролер, який точно каже, який рівень відмовив, корисніший за той, що каже, що VPN не працює.