backup auf Synology NAS mit NFS scheitert an Leserechten von FHEM aus ...

Begonnen von grappa24, 12 Juni 2024, 10:57:28

Vorheriges Thema - Nächstes Thema

grappa24

Ich hab mir auf meiner Synology eine NFS Freigabe eingerichtet (/mnt/syno/fhembackup); vom RasPi auch erreichbar,  und im Zugriff (auch mit meinem FTP Client).

Nur von FHEM komm ich nicht auf das gemountete Verzeichnis,

- weder mit "attr global archivedir /mnt/syno/fhembackup"

- noch mit dem Script von Martin Koch
  https://hausautomatisierung-koch.de/2017/02/19/naechtliche-sicherung-fhem-nas/
   SYS_Backup:* {
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
  sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
 next if($file eq "." || $file eq "..");
 push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
 my $longfile = "./backup/".$file;
 my $destination = "/mnt/syno/fhembackup/";
 `sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
 next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
 my $mybackupfile = "/mnt/syno/fhembackup/".$file;
 push(@mybackups,$file);
 $lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
 $lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
 my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
 $year += 1900;
 $mon += 1;
 $lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
 $lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
 $mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
 $lastbackupdatedatum = "kein Backup gefunden";
 $lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}

Scheitert am Befehlopendir DIR, "/mnt/syno/fhembackup" or die $!;mit dem FehlerSYS_BackupRun return value: Permission denied at (eval 13039) line 23Schreibrechte auf syno hab ich vergeben (777).

Die backups landen alle in /opt/fhem/backup
FHEM 6.3, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

grappa24

bin einen Schritt weiter, aufgrund der Fehlermeldung sudo: no tty present and no askpass program specifiedhab ich in sudoers den Eintrag fhem    ALL=(ALL) NOPASSWD: ALL ergänzt.

Jetzt landen alle neuen backups auf dem NAS und auch die, die vorher in /opt/fhem/backup lagen finden sich auf dem NAS.

Allerdings liefert das o.a. Script SYS_Backup noch weitere Fehler, ich häng mal den ganzen LOG an:

2024.06.12 17:46:54 2: Backup with command: tar czf ./backup/FHEM-20240612_174654.tar.gz "./demolog" "./docs" "./fhem.cfg" "./CHANGED" "./unused" "./cache" "./MAINTAINER.txt" "./certs" "./README_DEMO.txt" "./restoreDir" "./fhem.pl" "./log" "./contrib" "./configDB.pm" "./conf" "./regSave.cfg" "./FHEM" "./alexa-fhem.cfg" "./www" "./lib" "./FHEM-20240610_140603.tar.gz" "./alexa-fhem.cfg.previous" "./GPL_V2.txt" "./fhem.cfg.demo"
2024.06.12 17:46:54 3: backup : Started the backup in the background, watch the log for details
Backup done
2024.06.12 17:47:43 1: ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
  sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
 next if($file eq "." || $file eq "..");
 push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
 my $longfile = "./backup/".$file;
 my $destination = "/mnt/syno/fhembackup/";
 `sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
 next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
 my $mybackupfile = "/mnt/syno/fhembackup/".$file;
 push(@mybackups,$file);
 $lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
 $lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
 my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
 $year += 1900;
 $mon += 1;
 $lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
 $lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
 $mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
 $lastbackupdatedatum = "kein Backup gefunden";
 $lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}: Permission denied at (eval 4549) line 23.

2024.06.12 17:47:43 3: SYS_BackupRun return value: Permission denied at (eval 4549) line 23.

Insb. wird das dummy mit Datum und Größe des letzten Backup nicht gefüllt (siehe Anhang).

Ich versuch auch parallel den Autor des Script zu erreichen, wär aber toll, wenn ihr mir hier helfen könntet - so kurz vor dem Ziel  ;D

Danke,
Dieter





FHEM 6.3, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Wernieman

fhem    ALL=(ALL) NOPASSWD: ALLIch weiß, das es sich immer toll anhört und (leider) von mehreren Propagiert wird, aber damit hast Du praktisch sämtliche Sicherheitsbemühungen von Linux und FHEM ausgehebelt. Wenn dann bitte auf (wenige) Programme einschränken. Zum Erstmaligen Testen mag es O.K. sein (aber nicht empfehlenswert, weil der Mensch ist fault und dann bleibt es so), aber dann bitte sofort einschränken auf das mindest notwendigste!
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

grappa24

o.k. verstehe, was wäre denn hier das nötigste, damit das Script läuft und der Fehler "sudo: no tty present and no askpass program specified" nicht auftritt?
Gruß,
Dieter
FHEM 6.3, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

grappa24

Das move (mv) funktioniert noch, aber opendir DIR auf das gemountete NAS Directory ergibt "permission denied" ...

foreach my $file (sort @mybackups) {
 my $longfile = "./backup/".$file;
 my $destination = "/mnt/syno/fhembackup/";
 `sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
FHEM 6.3, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Wernieman

?? Deine Ausgabe macht kein Sinn ... kannst Du uns bitte mal das komplette Script geben?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

grappa24

hier nochmal das komplette Script:
SYS_Backup:* {
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
  sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
 next if($file eq "." || $file eq "..");
 push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
 my $longfile = "./backup/".$file;
 my $destination = "/mnt/syno/fhembackup/";
 `sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
 next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
 my $mybackupfile = "/mnt/syno/fhembackup/".$file;
 push(@mybackups,$file);
 $lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
 $lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
 my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
 $year += 1900;
 $mon += 1;
 $lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
 $lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
 $mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
 $lastbackupdatedatum = "kein Backup gefunden";
 $lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}

Wie gesagt, ohne "fhem    ALL=(ALL) NOPASSWD: ALL" kommt die Meldung "sudo: no tty present and no askpass program specified"

Mit "fhem    ALL=(ALL) NOPASSWD: ALL"
- wird das Backup ausgeführt
- zuerst auf /opt/fhem/backup gespeichert
- und dann auf das gemountete NAS umkopiert: "/mnt/syno/fhembackup"
- allerdings erzeugt Zeile 23 des Scripts (opendir DIR, "/mnt/syno/fhembackup" or die $!;) dann den Fehler "permission denied"

by the way: Ganz am Anfang sieht man im Log noch den Fehler
"ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{

hier das ganze FHEM-Log:
2024.06.12 17:46:54 2: Backup with command: tar czf ./backup/FHEM-20240612_174654.tar.gz "./demolog" "./docs" "./fhem.cfg" "./CHANGED" "./unused" "./cache" "./MAINTAINER.txt" "./certs" "./README_DEMO.txt" "./restoreDir" "./fhem.pl" "./log" "./contrib" "./configDB.pm" "./conf" "./regSave.cfg" "./FHEM" "./alexa-fhem.cfg" "./www" "./lib" "./FHEM-20240610_140603.tar.gz" "./alexa-fhem.cfg.previous" "./GPL_V2.txt" "./fhem.cfg.demo"
2024.06.12 17:46:54 3: backup : Started the backup in the background, watch the log for details
Backup done
2024.06.12 17:47:43 1: ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
fhem("backup");
sleep(5);
while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {
  sleep(10);
}
opendir DIR, "./backup" or die $!;
my @mybackups = ();
my $lastbackupdatedatum = "";
my $lastbackupdatesize = "";
my %lastbackupsize;
my %lastbackuptime;
while(my $file = readdir DIR){
 next if($file eq "." || $file eq "..");
 push(@mybackups,$file);
}
closedir DIR;
foreach my $file (sort @mybackups) {
 my $longfile = "./backup/".$file;
 my $destination = "/mnt/syno/fhembackup/";
 `sudo mv $longfile $destination`;
}
opendir DIR, "/mnt/syno/fhembackup" or die $!;
@mybackups =();
while(my $file = readdir DIR){
 next if($file eq "." || $file eq ".." || $file eq "\@eaDir");
 my $mybackupfile = "/mnt/syno/fhembackup/".$file;
 push(@mybackups,$file);
 $lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];
 $lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];
}
closedir DIR;
@mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);
if($#mybackups > 0) {
 my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});
 $year += 1900;
 $mon += 1;
 $lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);
 $lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";
 $mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";
} else {
 $lastbackupdatedatum = "kein Backup gefunden";
 $lastbackupdatesize = "kein Backup gefunden";
}
@mybackups = join("</br>", @mybackups );
fhem("set SYS_Backup @mybackups");
fhem("set SYS_last_Backup_date $lastbackupdatedatum");
fhem("set SYS_last_Backup_size $lastbackupdatesize");
}: Permission denied at (eval 4549) line 23.

2024.06.12 17:47:43 3: SYS_BackupRun return value: Permission denied at (eval 4549) line 23.
FHEM 6.3, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Wernieman

Ist es wirklich auf Deiner NAS gelandet? Denn ohne den "OpenDir" Befehl kann er nicht mounten
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

grappa24

Zitat von: Wernieman am 15 Juni 2024, 17:11:21Ist es wirklich auf Deiner NAS gelandet? Denn ohne den "OpenDir" Befehl kann er nicht mounten

ja, mit der Einstellung "fhem    ALL=(ALL) NOPASSWD: ALL"

- wird das Backup ausgeführt
- zuerst auf /opt/fhem/backup gespeichert
- und dann auf das gemountete NAS umkopiert: "/mnt/syno/fhembackup"
- allerdings erzeugt Zeile 23 des Scripts (opendir DIR, "/mnt/syno/fhembackup" or die $!;) dann den Fehler "permission denied"

ohne die "Generalvollmacht" wird nur das backup auf /opt/fhem/backup erzeugt und nichts auf das NAS kopiert:

2024.06.16 09:42:49 3: backup : Started the backup in the background, watch the log for details
Backup done

Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat.  Normalerweise läuft es auf drei Regeln hinaus:

    #1) Respektieren Sie die Privatsphäre anderer.
    #2) Denken Sie nach, bevor Sie tippen.
    #3) Mit großer Macht kommt große Verantwortung.

sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben
FHEM 6.3, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Otto123

Moin,

ich finde da gibt es zwei Ansätze:
Für sudo nur die Rechte erteilen die benötigt werden. Ich hatte mir das hier mal notiert.
ZitatInhalt der sudoers Datei
Die durch Komma getrennten Werte in der Datei haben folgende Bedeutung und benötigen immer den vollen Pfad!

/usr/sbin -> für alles im Verzeichnis
/usr/sbin/service * -> für alle Parameter
/usr/sbin/service apache2 * -> für alle weiteren Parameter
/usr/sbin/service apache2 reload -> genau nur hierfür

Der Aufruf in FHEM muss dann genau dem Schema entsprechen:
"sudo /usr/sbin/service apache2 reload"
Was ich für besser halte: den mount so machen, dass der user fhem die richtigen Rechte hat. Für nfs habe ich das nicht parat, aber für cifs habe ich das schon gemacht. Link
Das Prinzip sollte bei nfs ähnlich funktionieren: Den mount so vorbereiten, dass jeder user mounten darf und dann den mount erst im Script ausführen, abschließend umount.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz