Neues Modul: 98_serviced.pm - systemd und initd Dienste steuern

Begonnen von DeeSPe, 22 November 2017, 01:03:15

Vorheriges Thema - Nächstes Thema

DeeSPe

Das Modul wird mit dem FHEM Updateprozesses ausgeliefert!

Mit serviced können lokale und entfernte Dienste verwaltet werden.
Die üblichen Kommandos sind verfügbar: start/restart/stop/status.
Der Status kann auch in definierbarem Interval aktualisiert werden.

Define

define <name> serviced <Dienst Name> [<user@ip-adresse>]

Beispiel serviced für lokale Dienste:

define hb serviced homebridge

Beispiel serviced für entfernte Dienste:

define hyp serviced hyperion pi@192.168.1.4

Für entfernte Dienste muss dem Benutzer unter dem FHEM läuft dass passwortlose Anmelden per SSH erlaubt werden. Eine Anleitung wie das zu machen geht ist unter diesem Link abrufbar.

Zur Benutzung von systemctl (systemd) oder service (initd) müssen dem Benutzer unter dem FHEM läuft die entsprechenden Rechte in der sudoers Datei erteilt werden (/etc/sudoers) (visudo).
Die sudo Rechte können auch gezielter als hier gezeigt spezifiziert werden, dazu bitte mit sudoers vertraut machen.
Nähere Infos auch in Beitrag #49.

Für systemd (bitte mit eigenen Pfaden abgleichen):
fhem ALL=(ALL) NOPASSWD:/bin/systemctl

Für initd (bitte mit eigenen Pfaden abgleichen):
fhem ALL=(ALL) NOPASSWD:/usr/sbin/service



Set

start
angehaltenen Dienst starten

stop
laufenden Dienst anhalten

restart
Dienst neu starten

status
Status des Dienstes abrufen



Get

status
Status des Dienstes abrufen
identisch zu 'set status'



Attribute

disable
Anhalten der automatischen Abfrage und komplett deaktivieren
Voreinstellung: 0

serviceAutostart
Verzögerung in Sekunden um den Dienst nach Start von FHEM (neu) zu starten
Voreinstellung:

serviceAutostop
Timeout in Sekunden um den Dienst bei Beenden von FHEM ebenso zu beenden
Voreinstellung:

serviceGetStatusOnInit
beim Start von FHEM automatisch den Status des Dienstes abrufen
Voreinstellung: 1

serviceInitd
benutze initd (system) statt systemd (systemctl)
Voreinstellung: 0

serviceLogin
SSH Anmeldedaten für entfernten Dienst
passwortloser SSH Zugang ist Grundvoraussetzung
Voreinstellung:

serviceRegexFailed
Regex für failed Status
Voreinstellung: dead|failed|exited

serviceRegexStarted
Regex für running Status
Voreinstellung: running|active

serviceRegexStarting
Regex für starting Status
Voreinstellung: activating|starting

serviceRegexStopped
Regex für stopped Status
Voreinstellung: inactive|stopped

serviceStatusInterval
Interval um den Status automatisch zu aktualisieren
Voreinstellung:

serviceStatusLine
Zeilennummer der Status Rückgabe welche die Status Information enthält
Voreinstellung: 3

serviceSudo
sudo benutzen - bei Benutzer root wird automatisch kein sudo verwendet
Voreinstellung: 1



Readings

error
letzter aufgetretener Fehler

state
aktueller Zustand

status
letzte Statuszeile von 'get/set status'




Die commandref ist genau so in EN/DE enthalten.

Tester und Kommentare sind willkommen.
Viel Spaß damit.

Gruß
Dan

UPDATE: 24.11.
- error mit none überschreiben wenn keine Fehler mehr vorliegen
- Attribute homebridgeMapping und genericDeviceType werden nur noch gesetzt wenn das Attribut homebridgeMapping vorhanden ist
- weitere Verbesserungen

UPDATE2: 24.11.
- fix Attribute RegEx Prüfung
- dead|failed|exited als Default für serviceRegexFailed

UPDATE 26.11.: v1.2.1
- neues Attribut serviceAutostart um Dienste beim Start von FHEM automatisch mit dem hier eingestellten Wert in Sekunden verzögert zu starten
- neues Attribut serviceAutostop um Dienste beim Beenden von FHEM automatisch zu beenden mit dem hier eingestellten Timeout
- AbortFn für BlockingCall hinzugefügt

UPDATE 27.11.: v1.2.3
- serviceAutostop funktioniert nun wie erwartet
- neues Attribut serviceGetStatusOnInit um den Status des Dienstes beim Start von FHEM automatisch zu aktualisieren (default: 1)
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

KlaGho

Funktioniert bei mir gut.
Ich hatte vorher Deine manuelle Version über UserReadings (auch die funktionierte sehr gut)

Gruß gho

binford6000


igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Steffen@Home

Morgen Dan,

steh ich auf dem Schlauch oder warum finde ich weder in der Commandref noch in fhem wiki was zu "serviced" ?  ???

Gruß Steffen
Pi 1 - FHEM, HM-MOD-RPI-PCB, HM-RT-CC-DN, HM-WDS10-TH-O, HM-Sec-SCo, HM-LC-Sw1PBU-FM, Relais Platine für ext. Ansteuerung, LD382 Wifi LED Controller, DHT
Pi 2 - Kamera, DHT
Pi 3 - FHEM2, Grafana, DHT, Magnet-Sensoren, Relais-Platine

Amenophis86

Weil es noch nicht eingecheckt ist und daher hier als Download zur Verfügung steht.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

DeeSPe

Zitat von: igami am 23 November 2017, 06:20:47
Da hat sich jemand an meinen Wunsch erinnert :) https://forum.fhem.de/index.php/topic,40127.0.html

Den Wunsch kannte ich nicht und zur Zeit des Wunsches kannte ich auch FHEM noch nicht. ;)

Zitat von: Steffen@Home am 23 November 2017, 07:15:55
steh ich auf dem Schlauch oder warum finde ich weder in der Commandref noch in fhem wiki was zu "serviced" ?  ???

Wie Amenophis86 schon geschrieben hat ist das eine Vorab-Version.
Ich möchte damit primär sehen ob überhaupt Interesse an diesem Modul besteht.
Evtl. funktioniert auch irgendwas (noch) nicht richtig bei anderen Betriebssystemen, auch das soll hierbei zu Tage kommen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Amenophis86

Ich habe übrigens auch Interesse dran, muss nur schaue wann ich zum Testen komme. Also bitte nicht zu früh die Flinte ins Korn werfen :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Esjay

Zitat von: igami am 23 November 2017, 06:20:47
Da hat sich jemand an meinen Wunsch erinnert :) https://forum.fhem.de/index.php/topic,40127.0.html?PHPSESSID=i448rubf72kfv6fhovik4n52h5

Zitat von: Esjay am 02 Dezember 2016, 22:12:43
Hi DeeSPe,

wäre es möglich,einen set Befehl einzubauen, welcher der Hardware (z.B seperater Raspberry) auf der Hyperion läuft nen shutdown Befehl verpasst? Ich weiß,dass dafür der Austausch der Keys ect. nötig ist, und ich denke auch drüber nach, ob es Sinn macht das in diesem Modul aufzunehmen, aber da ich gerne alles unter einem Dach habe, dachte ich, dass ich mal nachfrage.

Habt ihr eure Hyperion Hardware immer am Netz? Ich würde es gern bei Bedarf über eine Funksteckdose zuschalten. Nur wird auf dauer die SD Karte darunter leiden.

Ansonsten wahnsinn, welchen Umfang das Modul mittlerweile hat.

Grüße
Zitat von: DeeSPe am 23 November 2017, 10:43:36
Den Wunsch kannte ich nicht und zur Zeit des Wunsches kannte ich auch FHEM noch nicht. ;)
..................

Ich nehme es gerne auf meine Kappe  ;D ;)

Bin auch gerade  wieder an dem Thema dran. Hab es bisher nur nicht geschafft, den Passwortlosen Zugriff auf meinem Zyxel 325 einzurichten. Bis dahin werd ich das Ganze mal an meinem Hyperion Server ausprobieren.

Grüße

DeeSPe

Ich habe noch vergessen zu erwähnen dass das Abfragen der Dienste natürlich nicht blockierend ist.
Immer Fehlerfalle wird auch die Fehlermeldung im Reading error ausgegeben.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Cobra

Hallo zusammen,

ich versuch mich auch gerade dran, scheitere aber irgendwie an den Rechten. Muss auch gestehen dass ich nicht der Linux-Profi bin.

Ich habe sowohl Homebridge als auch Alexa auf nem eigenen Raspberry laufen auf dem kein FHEM installiert ist.
Demnach dachte ich es reicht aus die Anleitung für den SSH Login mit dem Nutzer PI zu machen.

Nun kommt aber als Fehlermeldung immer

Permission denied please try again. Permission denied please try again. Permission denied (publickeypassword).

Hier mal das List von Alexa-Service:

Internals:
   CFGFN
   DEF        alexa pi@192.168.178.9
   NAME       Alexa_Service
   NOTIFYDEV  global
   NR         1046
   NTFY_ORDER 50-Alexa_Service
   SERVICENAME alexa
   STATE      error
   TYPE       serviced
   READINGS:
     2017-11-23 16:05:11   error           Permission denied please try again.  Permission denied please try again.  Permission denied (publickeypassword).
     2017-11-23 16:05:11   state           error
   helper:
Attributes:
   alias      Service alexa
   cmdIcon    restart:rc_REPEAT stop:rc_STOP status:rc_INFO start:rc_PLAY
   devStateIcon Initialized|status:light_question error|failed:light_exclamation running:audio_play:stop stopped:audio_stop:start stopping:audio_stop .*starting:audio_repeat
   genericDeviceType switch
   homebridgeMapping On=state,valueOff=/stopped|failed/,cmdOff=stop,cmdOn=start
StatusJammed=state,values=/error|failed/:JAMMED;/.*/:NOT_JAMMED
   icon       hue_room_garage
   room       Services
   serviceLogin pi@192.168.178.9
   webCmd     start:restart:stop:status


Hier die Statusmeldung vom Alexa-Service direkt auf dem PI:

pi@raspberrypiwz:~ $ sudo service alexa status
● alexa.service - Node.js Alexa Server
   Loaded: loaded (/etc/systemd/system/alexa.service; enabled)
   Active: active (running) since Thu 2017-11-23 16:01:55 CET; 5min ago
Main PID: 711 (alexa)
   CGroup: /system.slice/alexa.service
           └─711 alexa

Nov 23 16:02:02 raspberrypiwz alexa[711]: [11/23/2017, 4:02:02 PM] [FHEM] { ...,
Nov 23 16:02:02 raspberrypiwz alexa[711]: cmd: 'desired-temp',
Nov 23 16:02:02 raspberrypiwz alexa[711]: delay: true,
Nov 23 16:02:02 raspberrypiwz alexa[711]: minValue: 5,
Nov 23 16:02:02 raspberrypiwz alexa[711]: maxValue: 30,
Nov 23 16:02:02 raspberrypiwz alexa[711]: minStep: 0.5,
Nov 23 16:02:02 raspberrypiwz alexa[711]: device: 'WT.Schlafzimmer_Climate',
Nov 23 16:02:02 raspberrypiwz alexa[711]: informId: 'WT.Schlafzimmer_Climate...,
Nov 23 16:04:00 raspberrypiwz alexa[711]: 2017-11-23 16:04:00 caching: WT.Wo...7
Nov 23 16:04:01 raspberrypiwz alexa[711]: 2017-11-23 16:04:01 caching: WT.Sc...6
Hint: Some lines were ellipsized, use -l to show in full.


In /etc/sudoers (auf dem PI auf dem Alexa und Homebridge läuft) habe ich folgende Einträge gemacht:

fhem ALL=(ALL) NOPASSWD:/etc/init.d
pi ALL=(ALL) NOPASSWD:/etc/init.d
pi ALL=(ALL) NOPASSWD:/etc/systemd/system/
fhem ALL=(ALL) NOPASSWD:/etc/systemd/system/


Hab ich noch irgend etwas übersehen was gemacht werden muss?

Gruß Cobra
RaspberryPI 3 mit Raspbian Jessie, HMLAN/HM-LAN-Gateway
Diverse HM-Komponenten, Netatmo, Hue, Sonos, Nuki, Alexa

mahowi

/etc/init.d und /etc/systemd/system/ sind Verzeichnisse.

Aus dem ersten Post:
Zitat von: DeeSPe am 22 November 2017, 01:03:15
Zur Benutzung von systemctl (systemd) oder service (initd) müssen dem Benutzer unter dem FHEM läuft die entsprechenden Rechte in der sudoers Datei erteilt werden (/etc/sudoers) (visudo).

Für systemd (bitte mit eigenen Pfaden abgleichen):
fhem ALL=(ALL) NOPASSWD:/bin/systemctl

Für initd (bitte mit eigenen Pfaden abgleichen):
fhem ALL=(ALL) NOPASSWD:/usr/sbin/service
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

Cobra

Okay, und ich muss nicht das Verzeichnis sondern auf die Datei mit angeben?

Also:

pi ALL=(ALL) NOPASSWD:/etc/init.d/homebidge
pi ALL=(ALL) NOPASSWD:/etc/systemd/system/alexa.service
fhem ALL=(ALL) NOPASSWD:/etc/init.d/homebridge
fhem ALL=(ALL) NOPASSWD:/etc/systemd/system/alexa.service


Hat leider nicht geklappt. Oder wie finde ich genau raus welchen Pfad ich jetzt angeben muss? Sorry für die laienhafte Frage.

Oder liegt es daran dass auf dem Raspberry kein Nutzer fhem existiert?
RaspberryPI 3 mit Raspbian Jessie, HMLAN/HM-LAN-Gateway
Diverse HM-Komponenten, Netatmo, Hue, Sonos, Nuki, Alexa

DeeSPe

#13
Zitat von: Cobra am 23 November 2017, 16:11:04
Hallo zusammen,

ich versuch mich auch gerade dran, scheitere aber irgendwie an den Rechten. Muss auch gestehen dass ich nicht der Linux-Profi bin.

Ich habe sowohl Homebridge als auch Alexa auf nem eigenen Raspberry laufen auf dem kein FHEM installiert ist.
Demnach dachte ich es reicht aus die Anleitung für den SSH Login mit dem Nutzer PI zu machen.

Nun kommt aber als Fehlermeldung immer

Permission denied please try again. Permission denied please try again. Permission denied (publickeypassword).

Hier mal das List von Alexa-Service:

Internals:
   CFGFN
   DEF        alexa pi@192.168.178.9
   NAME       Alexa_Service
   NOTIFYDEV  global
   NR         1046
   NTFY_ORDER 50-Alexa_Service
   SERVICENAME alexa
   STATE      error
   TYPE       serviced
   READINGS:
     2017-11-23 16:05:11   error           Permission denied please try again.  Permission denied please try again.  Permission denied (publickeypassword).
     2017-11-23 16:05:11   state           error
   helper:
Attributes:
   alias      Service alexa
   cmdIcon    restart:rc_REPEAT stop:rc_STOP status:rc_INFO start:rc_PLAY
   devStateIcon Initialized|status:light_question error|failed:light_exclamation running:audio_play:stop stopped:audio_stop:start stopping:audio_stop .*starting:audio_repeat
   genericDeviceType switch
   homebridgeMapping On=state,valueOff=/stopped|failed/,cmdOff=stop,cmdOn=start
StatusJammed=state,values=/error|failed/:JAMMED;/.*/:NOT_JAMMED
   icon       hue_room_garage
   room       Services
   serviceLogin pi@192.168.178.9
   webCmd     start:restart:stop:status


Hier die Statusmeldung vom Alexa-Service direkt auf dem PI:

pi@raspberrypiwz:~ $ sudo service alexa status
● alexa.service - Node.js Alexa Server
   Loaded: loaded (/etc/systemd/system/alexa.service; enabled)
   Active: active (running) since Thu 2017-11-23 16:01:55 CET; 5min ago
Main PID: 711 (alexa)
   CGroup: /system.slice/alexa.service
           └─711 alexa

Nov 23 16:02:02 raspberrypiwz alexa[711]: [11/23/2017, 4:02:02 PM] [FHEM] { ...,
Nov 23 16:02:02 raspberrypiwz alexa[711]: cmd: 'desired-temp',
Nov 23 16:02:02 raspberrypiwz alexa[711]: delay: true,
Nov 23 16:02:02 raspberrypiwz alexa[711]: minValue: 5,
Nov 23 16:02:02 raspberrypiwz alexa[711]: maxValue: 30,
Nov 23 16:02:02 raspberrypiwz alexa[711]: minStep: 0.5,
Nov 23 16:02:02 raspberrypiwz alexa[711]: device: 'WT.Schlafzimmer_Climate',
Nov 23 16:02:02 raspberrypiwz alexa[711]: informId: 'WT.Schlafzimmer_Climate...,
Nov 23 16:04:00 raspberrypiwz alexa[711]: 2017-11-23 16:04:00 caching: WT.Wo...7
Nov 23 16:04:01 raspberrypiwz alexa[711]: 2017-11-23 16:04:01 caching: WT.Sc...6
Hint: Some lines were ellipsized, use -l to show in full.


In /etc/sudoers (auf dem PI auf dem Alexa und Homebridge läuft) habe ich folgende Einträge gemacht:

fhem ALL=(ALL) NOPASSWD:/etc/init.d
pi ALL=(ALL) NOPASSWD:/etc/init.d
pi ALL=(ALL) NOPASSWD:/etc/systemd/system/
fhem ALL=(ALL) NOPASSWD:/etc/systemd/system/


Hab ich noch irgend etwas übersehen was gemacht werden muss?

Gruß Cobra

Der Benutzer, mit dem Du passwordless SSH eingerichtet hast, hat in seinem Homeverzeichnis einen Ordner .ssh. Also z.B. eingerichtet mit Benutzer pi Pfad /home/pi/.ssh.
Diese dort angelegten Daten braucht für die Benutzung mit FHEM nicht der Benutzer pi, sondern der Benutzer unter dem FHEM läuft (meist fhem).
Mit
sudo cp -R /home/pi/.ssh /opt/fhem
sudo chown -R fhem:dialout /opt/fhem/.ssh


Wird der Ordner .ssh in den Benutzerordner von FHEM kopiert und die Berechtigungen für den Benutzer fhem vergeben.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Cobra

#14
Super, danke für die Info.

Wollte gerade schreiben wie ich es lösen konnte.
Habe nämlich auch die letzte halbe Stunde versucht unter dem Nutzer fhem die Daten für den passwordless SSH zu generieren, dabei ist es dann letztendlich aber daran gescheitert dass ich sie mit der Anleitung die du verlinkt hast nicht auf den anderen Raspberry richtig kopieren konnte (Fehlende Verzeichnisse etc).

Mir hat dann folgende Seite geholfen:
http://www.linuxfun.de/homeautomation/fhem/ssh-befehle-auf-anderen-rechnern-mit-fhem-ausfuehren/

Hab die Daten dann mit
ssh-copy-id -i /opt/fhem/.ssh/id_rsa.pub pi@IP-meines-Raspberrys
verschieben können.

Jetzt läuft es auch bei mir :-)

Danke
RaspberryPI 3 mit Raspbian Jessie, HMLAN/HM-LAN-Gateway
Diverse HM-Komponenten, Netatmo, Hue, Sonos, Nuki, Alexa