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-vpn

Prü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.service

Testen 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.

Ähnliche Artikel