Reload von openhab alle 1 - 2 Tage

Hier bitte alles rein was Off-topic ist.

Moderatoren: Cyrelian, seppy

oh73
Beiträge: 285
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Reload von openhab alle 1 - 2 Tage

Beitrag von oh73 »

ja, da hast du mal wieder Recht!

aber da war ich noch am versuchen, hab das jetzt geändert ,

Code: Alles auswählen

Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/halt, /sbin/reboot

Cmnd_Alias OTHER_COMMANDS = /etc/openhab/scripts/, /bin/bash, /bin/echo

openhab ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS, OTHER_COMMANDS
sieht doch jetzt besser aus?
OH 4.0.3 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: Reload von openhab alle 1 - 2 Tage

Beitrag von udo1toni »

Na ja, ein bisschen besser... aber wenn ich nur sudo /bin/bash schreiben muss, um eine Root Konsole zu erhalten, ist das nicht wirklich besser ;)

Du brauchst keine Root Konsole, niemals.
Während Konfigurationsarbeiten kann es angenehm sein, auf eine solche zu wechseln, um sich das sudo zu ersparen.
Für executeCommandLine ist es ein absolutes No-go.

/etc/openhab/scripts/ ist ein Verzeichnis, kein Befehl.
Abgesehen davon besteht da auch ein weit verbreitetes fundamentales Missverständnis.
Der Ordner /etc/openhab/scripts/ ist ausschließlich für DSL Rule Scripte gedacht. Alle Dateien in diesem Ordner sollten die Endung .script haben und jeweils einen Codeblock in DSL enthalten, den man dann aus einer Rule heraus per callscript(<Dateiname ohne Endung und ohne Pfadangabe>) aufrufen kann. Z.B. callscript(meinscript) ruft dann /ect/openhab/scripts/meinscript.script auf.
executeCommandLine() hingegen ruft immer den absoluten Pfad auf, falls kein Pfad angegeben ist, wird der Suchpfad verwendet und der erste Treffer ausgeführt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

oh73
Beiträge: 285
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Reload von openhab alle 1 - 2 Tage

Beitrag von oh73 »

ist nicht immer einfach mit mir ;)

hab jetzt noch mal

Code: Alles auswählen

/bin/bash, /bin/echo, /bin/grep,
weg gelassen, brauch ich nicht! das ganze war sowieso irgend wo geklaut!

aber der Pfad muss drin bleiben, nur so funktioniert es!

meine sh Sripts noch mal wo anders hin speichern, müsste ich versuchen.
aber erst mal bin ich froh das es überhaupt funktioniert!

bin mit dem ganzen Linux, Ubuntu doch nicht so fitt.
mit viel googln und fragen mogel ich mich immer so durch!
OH 4.0.3 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: Reload von openhab alle 1 - 2 Tage

Beitrag von udo1toni »

Nein, der Pfad ist komplett unnötig, da stimmt dann grundsätzlich was nicht. Wie rufst Du die Scripte auf? Korrekt wäre z.B.

Code: Alles auswählen

executeCommandLine("sudo /sbin/poweroff")
da gibt es noch nicht mal den Verweis auf /etc/openhab/scripts/

Wenn Du hingegen ein Script dort speicherst, welches erweiterte Rechte benötigt, ist /etc/openhab/scripts/ ja Teil des Namens des Scripts, der auch angegeben werden muss:

Code: Alles auswählen

executeCommandLine("sudo /etc/openhab/scripts/myscripot.sh")
Nun muss halt /etc/openhab/scripts/myscripot.sh als command hinterlegt werden. Aber wie gesagt, nicht nur ist der Ordner falsch, es ist auch eine üble Idee, einfach alles, was dort liegt ohne Passwort unter Rootrechten ausführbar zu machen.

Hast Du ein Script, in dem bestimmte Befehle mit erweiterten Rechten laufen müssen, so kannst Du innerhalb des Scripts das sudo voranstellen, z.B.:
/usr/share/bin/poweroff.sh:

Code: Alles auswählen

#!/bin/bash

sudo /sbin/poweroff
Nun kannst Du in openHAB auf das sudo verzichten:

Code: Alles auswählen

executeCommandLine("/usr/share/bin/poweroff.sh")
In der sudoers Datei muss lediglich /sbin/poweroff als erlaubter Befehl eingetragen sein.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

oh73
Beiträge: 285
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Reload von openhab alle 1 - 2 Tage

Beitrag von oh73 »

ich denke meine Scripts rufe ich schon richtig auf,

Code: Alles auswählen

 executeCommandLine(Duration.ofSeconds(60),"sudo","/etc/openhab/scripts/Medien_mounten.sh")
bei openhab 3 darf kein Leerzeichen im Befehl sein!

Code: Alles auswählen

 executeCommandLine("sudo /etc/openhab/scripts/myscripot.sh")
geht nicht!

Beispiel von meinem sh Script um Verzeichnisse meiner externen Festplatte zu mounten

Code: Alles auswählen

 #!/bin/bash

# Verzeichnis mounten, es müssen beide Verzeichnisse Vorhanden sein !
# auf /media/walter/Hd700GB/1.Media/xxxx/xxx/xxx die Originale
# auf /var/www/html/Medien/xxxx/xxxx/xxx 	ein Verzeichnis mit dem Namen, welches gemountet werden soll!

sudo mount --bind /media/usb_hd/hd700/1.Media/Bilder/ /var/www/html/Medien/Bilder

sudo mount --bind /media/usb_hd/hd700/1.Media/Video/ /var/www/html/Medien/Video 

sudo mount --bind /media/usb_hd/hd700/1.Media/Musik/ /var/www/html/Medien/Musik
oder um Bild Dateien zu verschieben,

Code: Alles auswählen

 #!/bin/bash

sudo cp -p /etc/openhab/html/bild4.jpg /etc/openhab/html/bild5.jpg
sudo cp -p /etc/openhab/html/bild3.jpg /etc/openhab/html/bild4.jpg
sudo cp -p /etc/openhab/html/bild2.jpg /etc/openhab/html/bild3.jpg
sudo cp -p /etc/openhab/html/bild1.jpg /etc/openhab/html/bild2.jpg

Für System Befehle hab ich im Habpanel ein Widget mit Auswahl: openhab reboot, Asterisk reload, Server Shutdown, Server Reboot und Verzeichnisse mounten oder umount.
das ganze noch mal mit Sicherheits Abfrage, damit nicht aus Versehen was ausgelöst wird.

Code: Alles auswählen

<!-- Schalter-7 Kachel V4 Class 2x2  -->

<div ng-if="itemValue('sysHS') == 'nixtun' ">
	<button class="a button" style="top:0%;left:0%;right:0;bottom:80%;width:100%; font-size: 20px;" 
		ng-click="sendCmd('sysHS', 'oh_restart')">
			openhab Restart
	</button>
	<button class="a button" style="top:20%;left:0%;right:0;bottom:60%;width:100%; font-size: 20px;" 
		ng-click="sendCmd('sysHS', 'asterisk')">
			 Asterisk Reload
	</button>
	<button class="a button" style="top:40%;left:0%;right:0;bottom:40%;width:100%; font-size: 20px;" 
		ng-click="sendCmd('sysHS', 'z_reboot')">
			 Zotac Reboot
	</button>
	<button class="a button" style="top:60%;left:0%;right:0;bottom:20%;width:100%; font-size: 20px;" 
		ng-click="sendCmd('sysHS', 'z_shutdown')">
			 Zotac Shutdown
	</button>
	<button class="a button" style="top:80%;left:0%;right:0;bottom:0%;width:100%; font-size: 18px;" 
		ng-click="sendCmd('sysHS', 'z_mount')">
			 Verz. mounten / umount
	</button>
	
</div>

<div ng-if="itemValue('sysHS') == 'oh_restart' ">
	<button class="a button" style="top:0%;left:0%;right:0;bottom:80%; font-size: 18px;
		background: linear-gradient(to bottom, white, red ) ; " 
		ng-click="sendCmd('System_Services', 'oh_restart')">
			 Openhab Restart ? 
	</button>
	<button class="a button" style="top:20%;left:0%;right:0;bottom:60%; font-size: 18px;
		background: linear-gradient(to bottom, white, lime ) ; " 
		ng-click="sendCmd('sysHS', 'nixtun')">
			 abbrechen 
	</button>
</div>

<div ng-if="itemValue('sysHS') == 'asterisk' ">
	<button class="a button" style="top:0%;left:0%;right:0;bottom:80%; font-size: 18px;
		background: linear-gradient(to bottom, white, red ) ;" 
		ng-click="sendCmd('System_Services', 'asterisk_reload')">
			 Asterisk reload ?
	</button>
	<button class="a button" style="top:20%;left:0%;right:0;bottom:60%; font-size: 18px;
		background: linear-gradient(to bottom, white, lime ) ; " 
		ng-click="sendCmd('sysHS', 'nixtun')">
			 abbrechen 
	</button>
</div>

<div ng-if="itemValue('sysHS') == 'z_reboot' ">
	<button class="a button" style="top:0%;left:0%;right:0;bottom:80%; font-size: 18px;
		background: linear-gradient(to bottom, white, red ) ;" 
		ng-click="sendCmd('System_Services', 'z_reboot')">
			 Zotac Reboot ?
	</button>
	<button class="a button" style="top:20%;left:0%;right:0;bottom:60%; font-size: 18px;
		background: linear-gradient(to bottom, white, lime ) ; " 
		ng-click="sendCmd('sysHS', 'nixtun')">
			 abbrechen 
	</button>
</div>

<div ng-if="itemValue('sysHS') == 'z_shutdown' ">
	<button class="a button" style="top:0%;left:0%;right:0;bottom:80%; font-size: 18px;
		background: linear-gradient(to bottom, white, red ) ;" 
		ng-click="sendCmd('System_Services', 'z_shutdown')">
			 Zotac Shutdown ?
	</button>
	<button class="a button" style="top:20%;left:0%;right:0;bottom:60%; font-size: 18px; 
		background: linear-gradient(to bottom, white, lime ) ; " 
		ng-click="sendCmd('sysHS', 'nixtun')">
			 abbrechen 
	</button>
</div>

<div ng-if="itemValue('sysHS') == 'z_mount' ">
	<button class="a button" style="top:0%;left:0%;right:0;bottom:80%; font-size: 18px;
		background: linear-gradient(to bottom, white, gray ) ;" 
		ng-click="sendCmd('System_Services', 'z_medien_mount')">
			 Medien mounten ?
	</button>
	<button class="a button" style="top:20%;left:0%;right:0;bottom:60%; font-size: 18px;
		background: linear-gradient(to bottom, white, red ) ;" 
		ng-click="sendCmd('System_Services', 'z_medien_umount')">
			 Medien  umount ! 
	</button>
	<button class="a button" style="top:40%;left:0%;right:0;bottom:40%; font-size: 18px;
		background: linear-gradient(to bottom, white, gray ) ;" 
		ng-click="sendCmd('System_Services', 'z_download_mount')">
			 Download mounten ?
	</button>

	<button class="a button" style="top:60%;left:0%;right:0;bottom:20%; font-size: 18px;
		background: linear-gradient(to bottom, white, red ) ;" 
		ng-click="sendCmd('System_Services', 'z_download_umount')">
			 Download umount !
	</button>
	<button class="a button" style="top:80%;left:0%;right:0;bottom:0%; font-size: 18px;
		background: linear-gradient(to bottom, white, lime ) ; " 
		ng-click="sendCmd('sysHS', 'nixtun')">
			 abbrechen 
	</button>
</div>
und dazu die Rule

Code: Alles auswählen

rule "openhab System Befehle"
	when Item System_Services changed
then
	if (System_Services.state=="oh_restart") {
		executeCommandLine(Duration.ofSeconds(60),"sudo","/etc/openhab/scripts/openhab.sh")  // mit sh Script, geht auch !
		System_Services.postUpdate("warten")												 // schalte Item OH_Service auf nix tun!												
		logInfo("OH3", "Restart")
		//executeCommandLine(Duration.ofSeconds(60), "sudo","systemctl","restart","openhab") // geht auch!
	}
	if (System_Services.state=="asterisk_reload") {
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("warten")
		logInfo("Asterisk", "reload")
		executeCommandLine("sudo","/etc/openhab/scripts/asterisk.sh")
	}
	if (System_Services.state=="z_shutdown") {
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("warten")
		logInfo("Zotac", "shutdown")
		executeCommandLine(Duration.ofSeconds(60), "sudo","/sbin/poweroff")
	}
	if (System_Services.state=="z_reboot") {
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("Pause")
		logInfo("Zotac", "reboot")
		executeCommandLine(Duration.ofSeconds(60), "sudo","/sbin/reboot")
	}
	if (System_Services.state=="z_medien_mount") {
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("warten")
		logInfo("Zotac Service", "z_medien_mount")
		executeCommandLine(Duration.ofSeconds(60),"sudo","/etc/openhab/scripts/Medien_mounten.sh")
	}
	if (System_Services.state=="z_download_mount") {
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("warten")
		logInfo("Zotac Service", "z_download_mount")
		executeCommandLine(Duration.ofSeconds(60),"sudo","mount","--bind","/var/www/hd700/Download/","/var/www/html/Download")
	}
	if (System_Services.state=="z_medien_umount") {
		Thread::sleep(500)
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("warten")
		logInfo("Zotac Service", "Medien umount")
		executeCommandLine(Duration.ofSeconds(60),"sudo","/etc/openhab/scripts/Medien_umount.sh")
	
	}
	if (System_Services.state=="z_download_umount") {
		sysHS.postUpdate("nixtun")
		System_Services.postUpdate("warten")
		logInfo("Zotac Service", "Download umount")
		executeCommandLine(Duration.ofSeconds(60),"sudo","umount","/var/www/html/Download")
	}
end
ist jetz etwas viel Code, aber nur so kann man den Zusammenhang verstehen, denke ich.

wie man sieht sind verschiedene Wege versucht, einmal wenn mehrere Befehle sind über Script,
wenn nur ein Befehl, auch mal direkt ohne Script.
OH 4.0.3 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: Reload von openhab alle 1 - 2 Tage

Beitrag von udo1toni »

Ja, das mit dem Leerzeichen kann ich so bestätigen :) ist halt nicht mein aktives System, ändert aber an der grundsätzlichen Aussage nichts. Wenn Du in einem Script sudo verwendest, musst Du lediglich die dort aufgerufenen Befehle in sudoers eintragen, also z.B. /bin/cp (wobei das schon sehr heikel ist... mit cp kannst Du das gesamte System ins Nirwana schicken, wenn Du es als root ausführst.) Es muss immer der absolute Pfad angegeben werden, also z.B. /sbin/poweroff, nicht nur poweroff (selbst wenn /sbin/ im Suchpfad enthalten wäre).

Wenn Du ein Mount ausführen willst, wäre es besser, die entsprechenden Links in /etc/fstab einzutragen und dort mit der Option user anzulegen, dann brauchst Du zum mounten und unmounten keine root-Rechte.
Letztlich musst Du selbst wissen, wie riskant Du unterwegs sein willst. Nur, grundsätztlich ist es eine ganz schlechte Idee, einen beliebigen User auf dem System zu Gott zu machen, und das noch ohne jegliche Sicherheitsabfragen. Quick and dirty kann man das so machen, aber nicht wundern, wenn Du Dir irgendwann damit ein Eigentor schießt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten