Automatische Sicherung der Config in einem GIT

Begonnen von th0nix, 14 Februar 2021, 10:10:45

Vorheriges Thema - Nächstes Thema

th0nix

Hi zusammen,

vielleicht möchte noch jemand anders die Konfiguration wie fhem.cfg und fhem.save beim speichern direkt in ein GIT (gitlab / github etc) einchecken um sie dort zu Sichern und eine Versionierung zu haben.

Howto:

1) Installieren von git tools auf dem Gerät wo das FHEM läuft.
Beispiel für ubuntu:
$ apt install git

2) unter dem Benutzer welcher der FHEM Prozess gestartet (im Beispiel der User: fhem) ist die globale Einstellung machen.

su fhem
$ git config --global user.name FHEM
$ git config --global user.email fhem@fhem.fhem


3) FHEM "trigger" anlegen. Hierbei die Attribute anpassen.


defmod conifgBackup2GIT DOIF ([global:"SAVE"]) \
{ \
my $now = TimeNow();; \
system("git add $attr{global}{configfile}");;\
system("git add $attr{global}{statefile}");;\
system("git commit -m 'triggert by FHEM config save ($now)'");;\
system("sh -c 'git push http://".AttrVal('$SELF','git_username','').":".AttrVal('$SELF','git_password','')."@".AttrVal('$SELF','git_host','')."/".AttrVal('$SELF','git_git','')." ".AttrVal('$SELF','git_repo','')."'" );;\
}
attr conifgBackup2GIT userattr git_username git_password git_host git_git git_repo
attr conifgBackup2GIT git_git fhem/fhem.git
attr conifgBackup2GIT git_host 192.168.1.11
attr conifgBackup2GIT git_password GITPasswort
attr conifgBackup2GIT git_repo master
attr conifgBackup2GIT git_username GitUser
attr conifgBackup2GIT wait 3


Wichtig ist der Wait Timer, da ansonsten die Datei noch nicht geschrieben ist und die "alte" Version gesichert wird.

pldemon

#1
Danke, super Anleitung!

Für alle, die keine Passwörter in Git/FHEM speichern wollen, hier eine Abwandlung mit SSH-Keys:

1.) SSH-Keys auf FHEM-System erstellen
# sudo -u fhem ssh-keygen -t rsa

2.) SSH-Key auf dem GitServer ablegen (je nach Server verschiedene Vorgehensweise)
# sudo -u fhem cat /opt/fhem/.ssh/id_rsa

3.) Repository auf dem Remote-Git-Server erstellen.

4.) Git-Instanz unter FHEM erstellen
# cd /opt/fhem
# git init
# git config --global user.name FHEM
# git config --global user.email fhem@fhem.fhem
# git remote add origin http://IP_UND_PORT/fhem/fhem.git
# chown -R fhem /opt/fhem


5.) Git-Verbidnung testen - ist alles korrekt eingerichtet, sollte alles ohne Passwortabfrage funktionieren
# cd /opt/fhem
# sudo -u fhem git pull


6a.) FHEM definition erstellen
defmod System.SaveConfig DOIF ([global:"SAVE"]) \
{ \
my $now = TimeNow();; \
system("git add $attr{global}{configfile}");;\
system("git add $attr{global}{statefile}");;\
system("git commit -m 'Triggered by FHEM config save ($now)'");;\
system("git push");;\
}

attr System.SaveConfig wait 3


6b) Alternative, wenn das Kommando FHEM nicht blocken und im Hintergrund laufen soll

define System.SaveConfig DOIF ([global:"SAVE"]) \
{ \
my $now = TimeNow();; \
my $command = "git add $attr{global}{configfile};; " \
. "git add $attr{global}{statefile};; " \
. "git commit -m 'Triggered by FHEM config save ($now)';; " \
. "git push";; \
system("/bin/sh -c \"$command\" &");;\
}
attr System.SaveConfig wait 3


Gruß,
Mirko

thunder1902

Ich habe Methode 1 (über Ben/PW) ausprobiert. Leider ohne Erfolg. Mit DOIF Variablen definieren funktioniert irgendwie nicht. Schon mit der ersten Zeile (my $now = TimeNow();; \" gibt es einen Fehler.
Wie bindet man das defmod ein? Ich habe es in ein define ersetzt und in die fhem.cfg geschrieben.
War das so richtig?

pldemon

Hallo,

wie lautet die Fehlermeldung? Du kannst die Kommandos entweder per Telnet oder in GUI von FHEM absetzen. Bei Telnet musst du natürlich den Dienst einschalten. Wie es geht, wird hier beschrieben: https://wiki.fhem.de/wiki/Telnet

Gruß,
Mirko

Dries

Hallo Zusammen,

auch wenn dieses Thema nicht aktuell diskutiert wird: mir hat der Thread sehr geholfen. Vielen Dank
@th0nix: für die Idee und iniiale Umsetzung
@pldemon (Mirko): für die Ergänzung um ssh

Da ich mich aktuell auch in anderen Projekten in GIT / GTHUB bzw GITEA  einarbeiten muss und tatsächlich ein wenig verliebt bin,
lag der Gedanke auch die FHEM Config darüber zu verwalten und gleichzeitig auch zu sichern nahe. Hier im Forum bin ich schnell bei Euch fündig geworden.

Ein Anmerkung zur Anleitung von Mirko
Zitat
2.) SSH-Key auf dem GitServer ablegen (je nach Server verschiedene Vorgehensweise)
Code:
# sudo -u fhem cat /opt/fhem/.ssh/id_rsa
Bei meinen "Standard" Installationen liegt in "id_rsa" der private Key.
Sollte es dort nicht besser # sudo -u fhem cat /opt/fhem/.ssh/id_rsa.pub
heißen um eindeutig zu sein?

Ich nutze die non-blocking Variante. Sie funktioniert, aber aber zeigt sich danach mit einem Fehlercode "-1" (Ende vorletzte Zeile) im FHEM-Log. Wisst Ihr ob dies die normale Rückgabe eines git-Push mit Changes ist oder eine ernst zunehmende Warnung?


2022.03.13 19:35:42 2: System.SaveConfig: {  my $now = TimeNow();  my $command = "git add $attr{global}{configfile}; "  . "git add $attr{global}{statefile}; "  . "git add README.md; "  . "git commit -m 'Triggered by FHEM config save ($now)'; "  . "git push";  system("/bin/sh -c \"$command\" &"); }: -1
[master ######] Triggered by FHEM config save (2022-03-13 19:35:42)


PS und ein persönliche Empfehlung: Ich habe zusätzlich eine README.md in /opt/fhem/ erstellt und ins Repo aufgenommen. Das ist Standard-Doku Vorgehen bei mir, da ich sonst nach kurzer Zeit nicht mehr weiß, was da eigentlich vor sich geht. Zudem eine Möglichkeit die FHEM Instanz inkl Backup/Recovery (aber ohne Passworte!!!) vergleichsweise einfach und  an einem logischen Ort zu dokumentieren.

Viele Grüße,

Andreas
   


der-Lolo

#5
Sehr schön, das ganze gefällt mir!
Es läuft auch mittlerweile nach einigen Hürden mit der key authorization auf der Synology NAS.

Kann man nun auch von FHEM aus einige Stati vom Git-Server abfragen? Wäre toll eine Liste zu haben welche commits gepusht wurden, wäre auch toll die commit message selbst schreiben zu können.

sowas wie

save "Änderungen am DOIF xxx & globales update"

in die FHEM cmd-line eintippen wäre klasse.

die -1 Rückgabe des System wird auch offenbar noch als error eingestuft, oder ist doch noch was falsch bei mir? Die Sicherung funktioniert...

error
{ my $now = TimeNow(); my $command = "git add $attr{global}{configfile}; " . "git add $attr{global}{statefile}; " . "git commit -m 'Triggered by FHEM config save ($now)'; " . "git push"; system("/bin/sh -c \"$command\" &"); }: -1



2022.06.05 20:51:48 2: System.SaveConfig: {  my $now = TimeNow();  my $command = "git add $attr{global}{configfile}; "  . "git add $attr{global}{statefile}; "  . "git commit -m 'Triggered by FHEM config save ($now)'; "  . "git push";  system("/bin/sh -c \"$command\" &"); }: -1
[master 8174902] Triggered by FHEM config save (2022-06-05 20:51:48)
2 files changed, 8 insertions(+), 9 deletions(-)
To ssh://192.168.1.5/volume1/**/fhem.git
   d7a2c9b..8174902  master -> master



Gisbert

Hallo th0nix,
Hallo pldemon (Mirko),

sehr interessanter Ansatz, den ich gerne aufgreifen möchte.
Ich habe ein Konto bei Github, bisher um dort ausschließlich zu lesen. Kann ich als einfacher (nicht zahlender) User dort etwas speichern? Ich möchte nicht, dass alle meine Definitionen öffentlich verfügbar sind. Kann man bei Github es so einstellen, dass dort gespeicherte Daten privat gehalten werden?

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

dominik

Ich habe die Tage ein fhempy Modul für das Backup in ein privates Github Repository erstellt.

Ist vielleicht für ein paar hier interessant:
https://forum.fhem.de/index.php/topic,128873.0.html
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

der-Lolo

Ja vielleicht - das hier funktioniert schon sehr gut, aber fhempy wollte ich mir eh genauer anschauen um "exoten" zu integrieren...