Nastra, ich versuche dir mal zu erklären, welches Problem ich mit der Geschichte habe. Kurz zusammengefasst läuft es hinaus auf: es ist dein System.
Diese Zeile:
Code: Alles auswählen
ExecStopPost=/bin/sh -c "/usr/bin/sudo -E -u pi /usr/local/bin/benachrichtigung.sh %n 1200"
wird von deiner homebridge Unit aufgerufen, wann immer sie sich beendet. Die homebridge Unit läuft als root (deine Vorgabe, scheint so zu gehören). Das "sudo -E -u pi" wechselt dann sicherheitshalber die Benutzerrechte runter zum Benutzer "pi". Wo kommt der Benutzer pi her und was darf er? Keine Ahnung, wieder deine Vorgabe. Nun wird sudo hier als root ausgeführt, und da root bekanntlich alles darf, wird der Benutzerwechsel zu "pi" klappen, unabhängig von deiner sudo-Konfiguration. Das -E sorgt dafür, dass wir die "geheimen Botschaften" mitnehmen, in denen Systemd versteckt, warum deine homebridge sich beendet hat. Aus welchen Gründen kann so eine homebridge sich eigentlich beenden? Keine Ahnung, es ist dein Dienst.
Mit den Rechten von "pi" wird dann benachrichtigung.sh %n 1200 aufgerufen. Im %n versteckt sich der Dateiname der Systemd-Unit, die sich gerade beendet hat. Diesen Dateinamen missbrauche ich später, um den Zeitstempel darin zu speichern, im home-Verzeichnis von "pi". Bisher habe ich von dir nur "vernünftige" Dateinamen gesehen, aber was mag passieren, wenn du komische Sonderzeichen oder Leerzeichen einbaust? Keine Ahnung, das ist wieder dein Hoheitsgebiet.
Und nun zum Script benachrichtigung.sh. Wie gesagt läuft es unter den Benutzerrechten von "pi" - und geht mal dezent davon aus, dass "pi" ein Home-Verzeichnis hat. Da es komische Dateinamen auf deiner Platte speichert, die es nicht vollständig unter Kontrolle hat, fand ich es sicherer, die Benutzerrechte auf "pi" zu beschränken - so kann es im Problemfall weniger Schaden anrichten. Außerdem versucht es aus den "geheimen Botschaften" von Systemd schlau zu werden. Genauer gesagt aus den Variablen $SERVICE_RESULT $EXIT_CODE und $EXIT_STATUS.
So geheim sind die auch gar nicht, die sind hier dokumentiert:
https://www.freedesktop.org/software/sy ... .exec.html
ziemlich weit unten unter "Environment variables in spawned processes".
Wenn du genau hinguckst, ist die Sache etwas tricky. $SERVICE_RESULT kann zig verschiedene Werte annehmen:
"success", "protocol", "timeout", "exit-code", "signal", "core-dump", "watchdog", "start-limit-hit", "resources"
Beachte, dass "FAILURE" hier gar nicht auftaucht. Um es noch komplizierter zu machen, kann die Bedeutung von $EXIT_STATUS schwanken mit dem Inhalt von $SERVICE_RESULT. Wie wertet man das nun in deinem Interesse aus? Keine Ahnung. Das Script macht es sich momentan einfach: alles andere als "success" wird als Fehler behandelt und du wirst benachrichtigt. Ist das nun in deinem Interesse? Weiß ich nicht. Mit welchem $SERVICE_RESULT können sich deine Dienste überhaupt beenden? Keine Ahnung.
Ganz am Ende des Scriptes wird es dann spannend:
Code: Alles auswählen
/usr/local/bin/ntfy -b telegram send "Dienst $dienst ausgefallen mit $SERVICE_RESULT $EXIT_STATUS"
Das funktioniert so nicht, da wir durch das -E die Umgebungsvariablen von root übernommen haben. ntfy kommt dadurch durcheinander und versucht auf Dateien von root zuzgreifen, obwohl es unter den Berechtigungen von "pi" läuft. Die korrekte Methode wäre jetzt herauszufinden, welche Umgebungsvariable das ist und diese auf den richtigen Wert zu setzen. Stattdessen kommst du mit einem Hack: du schreibst "sudo -u pi" davor. Das ist so einfach wie elegant - "pi" ruft hier sudo im eigenen Namen auf und da das -E hier fehlt, setzt sudo die Umgebungsvariablen auf die richtigen Werte für "pi". Schwupp, schon klappt es mit ntfy. Hier ruft also "pi" per sudo die Benutzerrechte von "pi" auf. Das ist von hinten durch die Brust ins Auge ... aber es funktioniert.
Das Problem an der Geschichte ist, dass es nur funktioniert, wenn sudo geeignet konfiguriert ist. "pi" muss berechtigt sein, per sudo in eigenem Namen ntfy aufzurufen. Klingt bescheuert, aber wenn das "pi" nicht ausdrücklich erlaubt ist, dann verhindert sudo die Ausführung von ntfy. Ist das nun gut so oder schlecht? Weiß ich nicht ... es ist ja dein System.
Wie du siehst ... es gibt eine ganze Menge Punkte, die eigentlich du entscheiden und abwägen musst. Insbesondere, bevor du die Lösung auf eine Horde unbedarfter Apple-User loslässt
Nastra hat geschrieben: 18.03.2018 18:14:08
der exit-code 1 ist nur bei ausstieg mit FAILURE richtig? Ist es ggf. möglich das "FAILURE" mit in der Nachricht einzublenden?
Wie oben erläutert, es gibt kein "FAILURE", darum kann man es auch nicht "einblenden". Du kannst aber einfach FAILURE in die Nachricht reinschreiben, wenn dir das so besser gefällt.
Never change a broken system. It could be worse afterwards.
"No computer system can be absolutely secure." Intel Document Number: 336983-001