Rückmeldung von Script wenn beendet

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rückmeldung von Script wenn beendet

Beitrag von udo1toni »

Guten Morgen!

Ich habe jetzt erst das Script etwas näher angeschaut :)

Aber der Reihe nach...
Florian.Reinartz hat geschrieben: 6. Jul 2022 00:10 Was bedeutet /bin/bash beim Aufruf bzw. #!/bin/bash innerhalb des Scripts.
bash ist die verwendete Shell (die Eingabeaufforderung, bzw. das Programm, welches sich darum kümmert, das aufgerufene Programm auszuführen)
Es gibt verschiedene Shells, jede hat bestimmte Funktionen, die sie von anderen Shells abheben. bash und sh sind dabei vermutlich die bekanntesten. Man kann explizit angeben, welche Shell zum Ausführen verwendet werden soll (/bin/ ist das Verzeichnis, in dem bash liegt).
Außerdem wird gewöhnlich in der ersten Zeile eines Scripts angegeben, welches Programm verwendet werden soll, um das Script auszuführen. Dieser Eintrag wird mit #! eingeleitet. #!/usr/bin/python wäre z.B. auch ein typischer Eintrag, der zu Beginn eines Python Scripts steht.
Die Dateiendung .sh oder auch .py dient lediglich der Kennzeichnung innerhalb des Dateisystems, hat aber keine Auswirkungen darauf, wie die Datei verarbeitet wird (im Gegensatz zu Windows, welches sich über die Dateiendung auch verwirren lässt...)

Wenn #!/bin/bash im Script steht, sollte es nicht nötig sein, /bin/bash beim Aufruf des Scripts mit anzugeben.
Florian.Reinartz hat geschrieben: 6. Jul 2022 00:10 Warum startet es nicht aus openhab?
Es kann viele verschiedene Gründe dafür geben. Die Frage ist aber: Bist Du sicher, dass das Script nicht gestartet wird? Oder ist es nicht vielmehr so, dass lediglich die enthaltenen Befehle nicht ausgeführt werden? Prüfen könntest Du das, indem Du zu Beginn des aufgerufenen Scripts eine Ausgabe in eine Datei schreiben lässt (diese Datei sollte in einem Ordner liegen, der für alle schreibbar ist, die Datei sollte außerdem evtl. schon existieren und ebenfalls für alle beschreibbar sein, mindestens 666 oder rw-rw-rw- als Rechte...
Wem gehört die Datei /etc/openhab/scripts/Backup.sh? Wie sind die Dateirechte des Scripts gesetzt? das Script stellt eine Verbindung zu einem entfernten Laufwerk her, mittels mount. mount ist ein Befehl, der nur von root ausgeführt werden darf (also außer zur reinen Anzeige der aktuellen natürlich...). Spätestens wenn dieser Befehl aufgerufen wird, wird das Script also fehlende Rechte monieren. Ein Ausweg kann sein, sudo mit anzugeben, allerdings wird sudo ein Passwort verlangen, wenn man dies nicht umkonfiguriert. Es ist aber keine gute Idee, einfach ein NOPASSWD für den User openhab zu setzen, vielmehr sollten alle Befehle, welche der User openhab mit erweiterten rechten ausführen können soll explizit aufgelistet werden. Dies geschieht über die Datei /etc/sudoers. ACHTUNG!!! Diese Datei sollte keinesfalls direkt bearbeitet werden, sondern mit dem Befehl visudo (der nur mit erweiterten Rechten ausgeführt werden kann). visudo prüft vor dem Speichern die Datei auf Fehler, so dass sichergestellt ist, dass sudo auch nach der Konfiguration noch korrekt funktioniert. Ansonsten kann man sich nachhaltig aus dem System aussperren, falls man keinen direkten Zugriff auf den User root hat.
Florian.Reinartz hat geschrieben: 6. Jul 2022 00:10 lösche ich den Inhalt des Skriptes "backup.sh" und schreibe den Inhalt eines anderesn Skriptes rein [...] wird es ausgeführt.
Das deutet darauf hin, dass hier Rechte fehlen, siehe voriger Punkt.
Florian.Reinartz hat geschrieben: 6. Jul 2022 00:10 Wenn openHAB ein Skript ausführt, wer ist denn dann der ausführende user?
Das ist der User, unter dem openHAB ausgeführt wird, gewöhnlich ist das der User openhab. Dieser User kann sich nicht am System anmelden, er hat kein Passwort und keine default Shell. Dies dient der Sicherheit. Natürlich gibt es Möglichkeiten, sich dennoch als User openhab am System anzumelden :)
Florian.Reinartz hat geschrieben: 6. Jul 2022 00:10 Beim Anlegen der backup.sh soll man nach dem erstellen der Datei die Datei "ausführbar" machen:

Code: Alles auswählen

sudo chmod 755 /etc/openhab/scripts/Backup.sh
Das war mir schon ein paar Zeilen vorher aufgefallen... Was nun? Backup.sh oder backup.sh? Unter Linux sind das zwei verschiedene Dateien!
Die Dateirechte als Zahlen: erste Stelle steht für den Besitzer, zweite Stelle für die Gruppe, dritte Stelle für alle anderen. Die Datei gehört immer einem bestimmten User und einer bestimmten Gruppe. Ist man dieser User, so gilt die erste Ziffer. Gehört man der Gruppe an, gilt die zweite Ziffer. Trifft weder das eine noch das andere zu, so gilt die dritte Ziffer. Die Ziffer ist binär zu betrachten, also z.B. 7->111 oder 2->010 usw. Dabei steht das MSB für Lesen, das LSB für Ausführen und das mittlere Bit für Schreiben. 755 bedeutet also, jeder darf die Datei lesen und ausführen, aber nur der Besitzer darf die Datei auch beschreiben, also ändern. 755 ist also für Scripte immer ausreichend.
Florian.Reinartz hat geschrieben: 6. Jul 2022 00:10 4.
beinhaltet backups.sh den mount Befehl mit sudo [...]
Genau das ist der Punkt. Rückmeldung 1 -> Fehler, weil openhab weder Mitglied der Gruppe sudo ist noch anderweitig erweiterte rechte erhalten hat. 32 -> Fehler, vermutlich, weil versucht wurde, einen Befehl auszuführen, der nur mit root Rechten ausgeführt werden darf. 32 ist aber kein reservierter Exit Code, da müsste man also stöbern, um unter allen verwendeten Programmen dasjenige zu fingen, welches die 32 exponiert. Aber mount ist ein heißer Kandidat...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

Moin Zusammen,
@udo1toni
ich muss mich mal wieder für Deine echt hozizonterweiternden, umfangreichen Ausführungen bedanken.
Vor allem die Erläuterungen zum Shell und ausführenden Programmenm (#!/bin/bash).

Die Datei hieß zuerst Backup.sh und später dann backup.sh.
Ich habe den Namenswechsel bewusst durchgezogen weil ich erstens mit den verschiedenen Schreibweisen aufräumen wollte (klein- GROSS-Schreibungs-Durcheinander).
Dummerweise habe ich den Namenswechseln mitten im Schreiben des letzten Thread vollzogen :roll:

Sudo habe ich vor einiger Zeit tätsächlich mit NOPASSWD modifiziert. Alledings nicht nur für openhab oder openhabian sonder für users und wenn ich es richtig verstanden habe heißt das für wirklich jeden...

Da der mount-Befehl über die fstab funktioniert habe werde ich jetzt den Weg verfolgen das Script nicht mehr mounten sondern nur noch backupen lassen.
Ergänzug in fstab:

Code: Alles auswählen

192.168.0.1:/volume1/RaspberryPi/openHAB     /home/openhabian/openHAB_Backup     nfs      rw,auto,users     0      0
Hätte es schöner gefunden wenn die Verbindung nur während der Zeit des Backups besteht.
Gab es nicht eine Möglichkeit in der fstab ein mount anzulegen den später jeder users aufrufen und beenden kann?
Vielleicht könnte die Verbindung so nur zum Zweck des Backups aufgebaut werden.

Es scheint aber auch Probleme mit den anderen Befehlen zu geben!
Meinscript wird unmittelbar wieder beendet (Switch geht wieder auf OFF)
Da der Backup-Befehlt lange dauert muss openHAB bereits diesen Teil nicht ausführen können:

Code: Alles auswählen

#!/bin/bash

#Variablen
BACKUP_PFAD="/home/openhabian/openHAB_Backup"
BACKUP_ANZAHL="7"
BACKUP_NAME="Sicherung"

#Backup erstellen
dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img bs=1MB

#Alte Sicherung löschen
pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd
und selbst dieser Befehl wird nicht ausgeführt (mit und ohne sudo nicht):

Code: Alles auswählen

#!/bin/bash
dd if=/dev/mmcblk0 of=/home/openhabian/openHAB_Backup/Sicherung-20220707.img bs=1MB
Nun habe ich mal ganz simple sachen versucht:

Code: Alles auswählen

net rpc shutdown -I 192.168.0.3 -U Florian%7kvbgpr7 -f -C openHAB -t 300
-> funktioniert aus openHAB (wie schon erwähnt)

Code: Alles auswählen

touch /home/openhabian/openHAB_Backup/test.txt
-> funktioniert nicht aus openHAB aber aus PuTTY als opanhabian

Code: Alles auswählen

touch /temp/test.txt
-> funktioniert aus openHAB nicht (diverse Pfade versucht)
Ich bekomme langsam das Gefühl, dass bei openHAB 3 nich mehr berechtigt ist auf die "Platte" zu schreiben.
Alle funktionierenden Skripte schreiben nichts auf die SD-Karte. Sie führen alle nur Remote-Befehle aus oder übergeben die Rückmeldung als String an ein Item.

Danke und Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rückmeldung von Script wenn beendet

Beitrag von udo1toni »

Florian.Reinartz hat geschrieben: 7. Jul 2022 02:42 Dummerweise habe ich den Namenswechseln mitten im Schreiben des letzten Thread vollzogen
Macht nix, ich habe schon mit sowas gerechnet, wollte es aber nicht unerwähnt lassen...
Florian.Reinartz hat geschrieben: 7. Jul 2022 02:42 Alledings nicht nur für openhab oder openhabian sonder für users und wenn ich es richtig verstanden habe heißt das für wirklich jeden...
:o JA. Dann kannst Du auch gleich alles mit dem User root ausführen lassen (NEIN!).
Verflucht sei Microsoft! Die haben es nachhaltig geschafft, den Leuten beizubringen, dass Bequemlichkeit über Sicherheit geht.
Mach das bitte, bitte rückgängig, auch wenn Dein System nur im eigenen LAN erreichbar ist.
Florian.Reinartz hat geschrieben: 7. Jul 2022 02:42 Da der Backup-Befehlt lange dauert muss openHAB bereits diesen Teil nicht ausführen können:
Jepp. dd versucht nach BACKUP_PFAD zu schreiben, welches auf /home/openhabian/... gesetzt ist. Der user openhab hat keine Schreib/Leserechte in diesem Ordner. Es ist beim Entwickeln eines Scripts ok, die verwendeten Verzeichnisse erst mal so abzulegen, wenn es aber produktiv geht, sollte es eher in einen eigenen Verzeichniszweig ausgelagert werden.

Korrekt macht man Backups mit einem Backup User, das heißt, man erstellt ein eigenes Benutzerkonto. Der User bekommt den Namen und die Gruppe backup (kann auch gut sein, dass es den User schon gibt). Für das Backup erzeugt man ein Verzeichnis unter /var/backup/ und erteilt Schreibrechte für Besitzer und Gruppe. Ob man möchte, dass auch andere User Leserechte gewährt bekommen, ist ein Stück weit Geschmackssache, aber da Backups potenziell auch private Daten enthalten können, ist es eher unüblich.
Das Verzeichnis darf natürlich keinesfalls Bestandteil der Backupquelle sein. Sollte das der Fall sein, so hilft ein symlink in einen anderen Teil des Dateisystems weiter, noch besser ist natürlich ein Mountpoint an dieser Stelle. Das könnte auch direkt die nfs Freigabe sein... warum speicherst Du das Image überhaupt lokal?
Damit der User openhab das Backup dennoch ausführen kann, fügst Du ihn der Gruppe backup hinzu. Auf diese Weise erhält er Schreibrechte in allen notwendigen Verzeichnissen.

user mount: ja, der Parameter user ist dafür zuständig. Du hast allerdings users geschrieben ;)
Eigentlich sollte der Eintrag statt auto das Wort noauto enthalten, sonst wird das Verzeichnis umgehend beim Booten eingebunden, was Du ja eigentlich gar nicht willst.

Wenn man das Ganze vom Aspekt der Sicherheit betrachtet, wäre es übrigens wesentlich besser, das Laufwerk gar nicht zu mounten und stattdessen das Remote System zu triggern, damit dieses sich das Backup selbst zieht.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

Moin Zusammen,
dan versuche ich mal Schritt für Schritt Ordnung rein zu bekommen.

1. Gruppe backup anlegen (Rückmeldung wenn schon vorhanden)
sudo groupadd backup -> bereits vorhanden
2. Benutzer backup anlegen (Rückmeldung wenn schon vorhanden)
sudo useradd backup -> bereits vorhanden
3. Gruppenzugehörigkeiten von openhab prüfen
sudo id openhab -> nicht in Gruppe backup
4. openhab zur Gruppe backup hinzufügen
sudo usermod -aG backup openhab
5. Verteichnis anlegen in /var
sudo mkdir /var/nas_backup
6. mount NAS-Server manuell
sudo mount -t nfs -o soft 192.168.0.1:/volume1/RaspberryPi/openHAB /var/nas_backup
7. Eigentumsverhältnisse anzeigen
ls -lah /var/nas_backup -> root:root oder 1026:users
8. Rechte für Gruppe backup hinzufügen (oder ersetzen???)
sudo chgrp -R backup /var/nas_backup
ANTWORT:

Code: Alles auswählen

insgesamt 715G
drwxrwxrwx  1 1026 backup  398  7. Jul 02:15  .
drwxr-xr-x 13 root root   4,0K  7. Jul 11:31  ..
-rwxrwxrwx  1 1026 backup  874 17. Okt 2020  'Letzte Synchronisierung.lnk'
-rwxrwxrwx  1 root backup 120G  1. Mai 04:51  Sicherung-20220501.img
-rwxrwxrwx  1 root backup 120G 11. Mai 04:50  Sicherung-20220511.img
-rwxrwxrwx  1 root backup 120G 21. Mai 04:50  Sicherung-20220521.img
-rwxrwxrwx  1 root backup 120G  1. Jun 04:50  Sicherung-20220601.img
-rwxrwxrwx  1 root backup 120G 11. Jun 04:50  Sicherung-20220611.img
-rwxrwxrwx  1 root backup 120G 21. Jun 04:50  Sicherung-20220621.img
drwxrwxrwx  1 1026 backup  156 29. Mär 2020  '_Sync 01'
drwxrwxrwx  1 1026 backup  156  5. Apr 2020  '_Sync 02'
drwxrwxrwx  1 1026 backup  170 15. Mai 17:53 '_Sync 03'
drwxrwxrwx  1 1026 backup  170 26. Jun 19:33 '_Sync 04'
drwxrwxrwx  1 1026 backup  176  3. Jul 10:06 '_Sync 05'
Jetzt kann ich den Inhalt von nas_backup aber nur noch mit sudo anzeigen.
Touch schreibt auch nur eine Datei in nas_backup wenn ich sudo voranstelle.
Mit cd komme ich garnicht mehr in den Pfad /var/nas_backup.
Das Backup mit openHAB auszulösen funktioniert natürlich immer noch nicht :cry:
Und wenn ich nur eine Zeile in das Backup-Skript schreibe "touch /var/nas_backup/text.txt" mit oder ohne "#!/bin/bash" und mit oder ohne "sudo"ist egal
Jetztweiß ich warum ich so lange gezögert habe mit dem Umstieg aus OH3 ... Ist doch die eine oder andere Hürde zu nehmen...
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

Ergänzung nach Reboot:
...jedenfalls funktioniert - durch die Definition in der fstab - schon mal das mounten und umounten mittels openHAB über das Skript backup.sh
Allerdings besteht immernoch ein Problem mit der Schreibberechtigung....
Ich kann nicht mal eine einfache leere txt-Datei anlegen :(
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rückmeldung von Script wenn beendet

Beitrag von udo1toni »

Ja, Du musst bedenken, das Dateisystem des entfernten Rechners, von dem die NFS Freigabe stammt, hat ebenfalls ein Rechtesystem. Natürlich müssen die Berechtigungen dort auch stimmen. Auch das Verzeichnis, in das Du mountest (also /var/nas_backup) hat Rechte, die Du passend setzen musst, und zwar schon vor dem Mounten. Da Du das Verzeichnis mit sudo angelegt hast, gehört es root. Es sollte aber dem User backup gehören

Code: Alles auswählen

sudo chown backup: /var/nas_backup
Der Doppelpunkt bewirkt, dass der Username auch als Gruppe gesetzt wird, also backup:backup.
Weiterhin muss die Gruppe ebenfalls die passenden Rechte haben, sonst hat ja nur der User backup ausreichende Rechte, also

Code: Alles auswählen

sudo chmod 770 /var/nas_backup
Du musst auch openhabian zur Gruppe backup hinzufügen, damit Du als User openhabian Zugriff auf das Verzeichnis erhältst. Das geht übrigens auch ganz einfach mit

Code: Alles auswählen

sudo adduser openhabian backup
quasi das Gegenstück zu

Code: Alles auswählen

sudo useradd -aG backup openhabian
Und immer dran denken, die neuen Gruppenzugehörigkeiten gelten erst mit dem nächsten login, also einmal

Code: Alles auswählen

exec su -l $USER
Ich bin mir gerade etwas unsicher, wie das mit dem eigentlichen Mountpoint und den Besitzverhältnissen ist, evtl. musst Du die direkt auf dem NAS setzen. Eine Alternative wäre, die Backups in ein Unterverzeichnis des Mountpoints zu packen, also z.B. /var/nas_backup/rpibackup/, wobei das Verzeichnis rpibackup auf dem NAS im Verzeichnis /volume1/RaspberryPi/openHAB liegt, aber openHAB wird nach nas_backup gemountet. Da muss man evtl. etwas experimentieren, bis das richtig passt, aber es geht auf jeden Fall!
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 103
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

es tut mir leid... Ich bin zu doo... ...überqualifiziert.

Ich habe jetzt auf dem NAS (Synology DS216+II mit DSM 7.1-42661 Update 2) den Benutzer openhab (war schon lange dort angelegt) zu der neu erstellte Gruppe "backup" hinzugefügt.
Über das WEB-Oberfläche von DSM7.1 habe ich dann die Rechte der Gruppe und auch vom Benutzer zugeteilt.
Trotz Neustart beider Systeme kann openHAB nicht auf das gemountete NAS schreiben.
Kann ich openhab nicht einfach mehr Rechte geben?
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rückmeldung von Script wenn beendet

Beitrag von udo1toni »

Nein, so geht das nicht.

Der "Name" des Users und der Gruppe ist auf der jeweiligen Maschine festgelegt. Die Rechte hängen aber an der ID. Die Übersetzung der ID zum Namen ist individuell auf der Maschine. Wenn Du also Rechte vergibst, musst Du darauf achten, dass die IDs zueinander passen, nicht unbedingt die Namen (auch wenn die Namen das Ganze etwas übersichtlicher machen).
Allgemein kann man die ID ändern, das geht mit usermod und groupmod. Allerdings musst Du anschließend unbedingt alle Dateien, welche die Nutzerzuordnung mit den entsprechenden IDs haben auf die neuen IDs umändern. Geht alles, ist aber auch nicht eben in fünf Minuten erledigt. Am einfachsten geht das immer, wenn man User gerade neu anlegt (da kann man die ID auch mit angeben).

Hier ist das ganz gut beschrieben: https://www.cyberciti.biz/faq/linux-cha ... ned-files/
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten