Das Heim-VPN mit einer systemd ExecCondition überspringen
Ein bewusstes Überspringen und ein defekter Vorbereitungsbefehl sind verschiedene Ergebnisse. Definieren Sie die Exit-Codes des Helfers und testen Sie dann den Wechsel zwischen Netzwerken.
Ihr Heimnetz-VPN hat nichts zu tun, wenn der Laptop ohnehin in diesem Netz sitzt. Die verlockende Abkürzung ist ein Vorbereitungsbefehl, der mit einem Wert ungleich null endet; das lässt die Unit scheitern und jedes Dashboard kaputt aussehen. systemd hat eine Direktive für genau diese Art von Entscheidung, und sie trennt ein bewusstes Überspringen von einem echten Fehler. Es richtig zu machen bedeutet vor allem, aufzuschreiben, was welcher Exit-Code bedeutet.
Warum eine fehlschlagende Vorbedingung die falsche Form ist
ExecStartPre behandelt einen Exit ungleich null als Startfehler, was für einen Befehl, der den Dienst vorbereitet, korrekt ist. Wird er als Bedingung verwendet, ist eine Richtlinienentscheidung nicht mehr von einer defekten Abhängigkeit zu unterscheiden. ExecCondition existiert, damit eine Unit den Start ablehnen kann, ohne als fehlgeschlagen zu gelten.
Dieser Unterschied zählt um drei Uhr morgens, wenn niemand eine rote Unit triagieren will, die sich wie vorgesehen verhalten hat. Eine fehlgeschlagene Unit verdeckt außerdem die echten Fehler zwischen den beabsichtigten.
Zuerst den Exit-Code-Vertrag schreiben
Schreiben Sie den Vertrag vor dem Skript. Exit null bedeutet weiter, Exit eins bedeutet die restlichen Startbefehle überspringen, und Exit 255 bedeutet, dass die Bedingung selbst nicht laufen konnte. Codes zwischen zwei und 254 bedeuten normalerweise ebenfalls Überspringen, was man leicht vergisst, wenn ein Helfer einen zufälligen Fehlercode zurückgibt. Der Drop-in unten bindet den Helfer an den echten Unit-Namen.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnPrüfen Sie die effektive Unit auf geerbte SuccessExitStatus- oder stop-post-Einstellungen, bevor Sie die Standardsemantik annehmen. Testen Sie dann jedes der drei Ergebnisse bewusst.
Ein Netzwerkhinweis ist kein Standortbeweis
Eine erreichbare Routeradresse oder eine bekannte MAC kann auf das richtige Netz hindeuten, und keines von beiden beweist es. Ein anderes Netz kann dieselbe Adresse wiederverwenden, ARP-Daten können veraltet sein, und Kennungen lassen sich nachahmen. Behandeln Sie die Prüfung als eine mit der Richtlinie vereinbare Optimierung, nicht als Authentifizierungsergebnis.
Entscheiden Sie vorab, was Unsicherheit bedeutet. Das VPN bei Unsicherheit zu starten ist für einen Client sicher, der einfach keine Verbindung bekäme; es bei Unsicherheit zu überspringen ist es nicht. Machen Sie die Prüfung begrenzt und lesen Sie das aktive Interface, statt das erste in der Liste anzunehmen. Eine hängende Prüfung ist schlimmer als eine, die mit Nein antwortet, weil die Unit darauf wartet.
Halten Sie diese Annahmen neben der Unit-Datei fest, damit die nächste Person weiß, was der Helfer glaubt. Ein Kommentar oben im Skript ist der billigste Ort dafür.
Den Wechsel zwischen Netzwerken behandeln
Die Bedingung läuft beim Start des Dienstes und wird später nicht neu bewertet. Eine übersprungene Unit bleibt übersprungen, nachdem der Laptop in ein Café umzieht, und ein laufender Tunnel bleibt bestehen, nachdem der Laptop nach Hause kommt. Verbinden Sie den Lebenszyklus des Netzwerkwechsels über einen separaten Mechanismus mit der Start- und Stoppentscheidung.
systemctl cat home-vpn.serviceTesten Sie vier Fälle: Start zu Hause, Start unterwegs, eine Prüfung, die nicht laufen kann, und einen Wechsel zwischen Netzwerken, während die Unit aktiv ist. Halten Sie den Grund für das Überspringen im Journal sichtbar, damit eine beabsichtigte Entscheidung nie wie ein Authentifizierungsfehler aussieht. Die Dienstreferenz dokumentiert die Exit-Semantik und die Mindestversion.