Pomijanie domowego VPN-a z systemd ExecCondition
Celowe pominięcie i zepsute polecenie przygotowujące to różne wyniki. Zdefiniuj kody wyjścia pomocnika, a następnie przetestuj przejście między sieciami.
Twoja domowa sieć VPN nie ma nic do zrobienia, gdy laptop już w niej jest. Kuszącym skrótem jest polecenie przygotowujące, które kończy się kodem różnym od zera; to powoduje błąd jednostki i sprawia, że każdy panel wygląda na zepsuty. systemd ma dyrektywę dokładnie dla tego rodzaju decyzji i oddziela celowe pominięcie od prawdziwej awarii. Zrobienie tego dobrze polega głównie na zapisaniu, co oznacza każdy kod wyjścia.
Dlaczego niespełniony warunek wstępny to zły kształt
ExecStartPre traktuje wyjście różne od zera jako błąd uruchamiania, co jest poprawne dla polecenia przygotowującego usługę. Użycie go jako warunku sprawia, że decyzja polityczna staje się nieodróżnialna od zepsutej zależności. ExecCondition istnieje po to, by jednostka mogła odmówić uruchomienia bez oznaczenia jako nieudana.
To rozróżnienie ma znaczenie o trzeciej w nocy, gdy nikt nie chce analizować czerwonej jednostki, która zachowywała się zgodnie z projektem. Nieudana jednostka ukrywa też prawdziwe awarie wśród zamierzonych.
Najpierw napisz kontrakt kodów wyjścia
Napisz kontrakt przed skryptem. Wyjście zerowe oznacza kontynuację, wyjście jeden oznacza pominięcie pozostałych poleceń startowych, a wyjście 255 oznacza, że sam warunek nie mógł się wykonać. Kody między dwa a 254 zwykle też oznaczają pominięcie, o czym łatwo zapomnieć, gdy pomocnik zwraca losowy kod błędu. Poniższy drop-in przypisuje pomocnika do prawdziwej nazwy jednostki.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnZanim założysz domyślną semantykę, sprawdź efektywną jednostkę pod kątem odziedziczonych ustawień SuccessExitStatus lub stop-post. Następnie celowo przetestuj każdy z trzech wyników.
Wskazówka sieciowa nie jest dowodem lokalizacji
Osiągalny adres routera lub znany MAC mogą sugerować właściwą sieć, i żadne z nich tego nie dowodzi. Inna sieć może użyć tego samego adresu, dane ARP mogą być nieaktualne, a identyfikatory można naśladować. Traktuj sondę jako optymalizację spójną z polityką, a nie jako wynik uwierzytelnienia.
Z góry zdecyduj, co oznacza niepewność. Uruchomienie VPN-a w razie wątpliwości jest bezpieczne dla klienta, który po prostu nie mógłby się połączyć; pominięcie go w razie wątpliwości bezpieczne nie jest. Ogranicz sondę i czytaj aktywny interfejs, zamiast zakładać pierwszy na liście. Sonda, która zawiesza się, jest gorsza od tej, która odpowiada nie, bo jednostka na nią czeka.
Zapisz te założenia obok pliku jednostki, aby następna osoba wiedziała, w co wierzy pomocnik. Komentarz na górze skryptu to najtańsze miejsce, by je przechować.
Obsłuż przejście między sieciami
Warunek działa przy starcie usługi i nie jest później ponownie oceniany. Pominięta jednostka pozostaje pominięta po przeniesieniu laptopa do kawiarni, a działający tunel pozostaje włączony po powrocie laptopa do domu. Powiąż cykl życia zmiany sieci z decyzją o starcie i zatrzymaniu za pomocą osobnego mechanizmu.
systemctl cat home-vpn.servicePrzetestuj cztery przypadki: start w domu, start poza domem, sondę, która nie może się wykonać, oraz przejście między sieciami, gdy jednostka jest aktywna. Utrzymuj powód pominięcia widoczny w dzienniku, aby zamierzona decyzja nigdy nie wyglądała jak błąd uwierzytelnienia. Dokumentacja usługi opisuje semantykę wyjścia i minimalną wersję.