perl-Warnung bei jedem backup-Befehl aus FHEM

Begonnen von juemuc, 09 April 2024, 22:46:05

Vorheriges Thema - Nächstes Thema

juemuc

Hallo,

immer wenn ich in FHEM den backup-Befehl absetze erhalte ich am Ende eine Perl-Warnung. Das Backup selbst ist ok.

2024.04.09 22:33:06.680 2: Backup with command: tar czf /mnt/DS-Save/FHEM/FHEM-20240409_223306.tar.gz "./restoreDir" "./alexa-fhem.cfg.previous" "./conf" "./demolog" "./configDB.pm" "./docs" "./GPL_V2.txt" "./log" "./FHEM" "./lib" "./contrib" "./fhem.cfg.demo" "./MAINTAINER.txt" "./fhem.pl" "./fhem.cfg" "./alexa-fhem.cfg" "./certs" "./www" "./README_DEMO.txt" "./CHANGED"
Backup done
2024.04.09 22:33:37.970 1: PERL WARNING: Use of uninitialized value in hash element at (eval 42745) line 13.
2024.04.09 22:33:37.971 1: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
# Directory, followed by a '/'
my $dir = AttrVal("global", "backupdir", undef);
# List only $max Files, to disable set $max to 0
my $max=1;

my $mybackups;
my %HASH;
# fhem("backup");
opendir DIR, $dir or die $!;
while(my $file = readdir DIR){
  next if($file eq "." || $file eq "..");
  $HASH{(stat($dir.$file))[9]}=$file;
  }
my $count = keys %HASH;

$mybackups="List only $max Files of $count" if($count>$max);
foreach (sort keys %HASH) {
  next if ((($count-- -$max) >0)&&$max);
  $mybackups.= ''.$HASH{$_};
  }
fhem("set SYS_Backup ".$mybackups."<br>".$EVENT);
fhem("set FHEM_Backup off")
}
2024.04.09 22:33:37.971 1: stacktrace:
2024.04.09 22:33:37.971 1:     main::__ANON__                      called by (eval 42745) (13)
2024.04.09 22:33:37.971 1:     (eval)                              called by fhem.pl (1177)
2024.04.09 22:33:37.971 1:     main::AnalyzePerlCommand            called by fhem.pl (1206)
2024.04.09 22:33:37.971 1:     main::AnalyzeCommand                called by fhem.pl (1133)
2024.04.09 22:33:37.972 1:     main::AnalyzeCommandChain           called by ./FHEM/91_notify.pm (122)
2024.04.09 22:33:37.972 1:     main::notify_Exec                   called by fhem.pl (3985)
2024.04.09 22:33:37.972 1:     main::CallFn                        called by fhem.pl (3897)
2024.04.09 22:33:37.972 1:     main::DoTrigger                     called by fhem.pl (3344)
2024.04.09 22:33:37.972 1:     main::CommandTrigger                called by fhem.pl (1282)
2024.04.09 22:33:37.972 1:     main::AnalyzeCommand                called by fhem.pl (1133)
2024.04.09 22:33:37.972 1:     main::AnalyzeCommandChain           called by ./FHEM/98_telnet.pm (263)
2024.04.09 22:33:37.972 1:     main::telnet_Read                   called by fhem.pl (3985)
2024.04.09 22:33:37.972 1:     main::CallFn                        called by fhem.pl (786)
2024.04.09 22:33:37.976 1: PERL WARNING: Use of uninitialized value in hash element at (eval 42745) line 13.


Habe ich etwas falsches definiert?

Ich werte das Ende des Backups mit einem notify aus:

defmod SYS_Backup_done notify global.backup.done.* {\
# Directory, followed by a '/'\
my $dir = AttrVal("global", "backupdir", undef);;\
# List only $max Files, to disable set $max to 0\
my $max=1;;\
\
my $mybackups;;\
my %HASH;;\
# fhem("backup");;\
opendir DIR, $dir or die $!;;\
while(my $file = readdir DIR){\
  next if($file eq "." || $file eq "..");;\
  $HASH{(stat($dir.$file))[9]}=$file;;\
  }\
my $count = keys %HASH;;\
\
$mybackups="List only $max Files of $count" if($count>$max);;\
foreach (sort keys %HASH) {\
  next if ((($count-- -$max) >0)&&$max);;\
  $mybackups.= ''.$HASH{$_};;\
  }\
fhem("set SYS_Backup ".$mybackups."<br>".$EVENT);;\
fhem("set FHEM_Backup off")\
}
attr SYS_Backup_done alias letzte FHEM-Sicherung

Die Warnung kommt wahrscheinlich aus dieser Zeile:
$HASH{(stat($dir.$file))[9]}=$file;;
Hat jemand eine Idee, was zu ändern ist?

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

rudolfkoenig

Ich wuerde den Code-Stueck mit etlichen Log-Zeilen versehen, um den Wert der Variablen kennenzulernen.
Zum Testen kann man das notify mit "trigger global backup done" (ohne ") ausfuehren.

Laengere Codestuecke wuerde ich in 99_myUtils.pm als Funktion (sub) speichern, und sie aus dem notify aufrufen.
Vermeidet das rumhantieren mit ;; und \.

juemuc

Hallo zusammen,

ich komme hier leider nicht weiter. Das Problem liegt eindeutig an der Zeile
$HASH{(stat($dir.$file))[9]}=$file;
Die Variablen $dir und $file sind aus meiner Sicht immer gefüllt. Da ich leider keine großen perl-Kenntnisse habe, bitte ich um Hilfe. Ich habe die Abfrage in einem "at"-Device definiert, sodass man es mit exec-now einfach ausführen kann. Sieht jemand den "Fehler". Selbst wenn ich $file vorher mit $file = " " initialisiere, bleibt die Warnung.   

defmod at_Test at 2024-04-15T00:00:10 {\
# Directory, followed by a '/'\
my $dir = AttrVal("global", "backupdir", undef);;\
# List only $max Files, to disable set $max to 0\
my $max=1;;\
my $Test=" ";;\
\
my $mybackups=" ";;\
my %HASH;;\
# fhem("backup");;\
opendir (DIR, $dir) or die $!;;\
my $file = " ";;\
while(my $file = readdir DIR){\
  next if($file eq "." || $file eq "..");;\
  $HASH{(stat($dir.$file))[9]}=$file;;\
  }\
my $count = keys %HASH;;;;\
\
$mybackups="List only $max Files of $count" if($count>$max);;\
foreach (sort keys %HASH) {\
  next if ((($count-- -$max) >0)&&$max);;\
  $mybackups.= ''.$HASH{$_};;\
  }\
\
fhem("set TEST $dir".$mybackups)\
}
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

betateilchen

Denn sie wissen nicht, was sie tun...

Alleine schon, dass Du zweimal "my $file" angibst, ist völlig unsinnig.

Beschreibe doch mal die Aufgabe. Was willst Du mit Deinem nicht funktionierenden notify denn genau erreichen?

Was steht im globalen Attribut backupdir?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

juemuc

Hallo betateilchen,

sorry, das doppelte "my $file" ist beim kopieren passiert. Ist so nicht beim test gewesen. ich wollte für die Bereitstellung hier wieder den "Originalzustand" herstellen und habe vergessen das obere "my $file" zu löschen.

Die Augabenstellung besteht darin, den Namen des "aktuellsten" Sicherungsfiles aus dem "Backup-Verzeichnis" zu ermitteln und in das dummy "SYS_Backup" zu schreiben. Das funktioniert auch. Lediglich die perl-Warnung stört mich.

Viele Grüße
Jürgen   
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

betateilchen

Viele Problemstellen in Deinem code...

my $dir = AttrVal("global", "backupdir", undef);;\
Man sollte nicht undef als default-Wert in einer Variablenzuweisung verwenden, wenn man danach nicht prüft, ob ein Wert in $dir steht oder nicht. Du arbeitest sonst ggf. mit einer nicht vorhandenen Variablen weiter, was perl Meldungen verursachen kann.

stat($dir.$file)
Das mit dem Punkt an dieser Stelle ist unschön.

Besser wäre so:

stat("$dir$file")
was aber in beiden Fällen voraussetzt, dass in $dir am Ende zwingend ein / stehen muss.

Noch besser wäre:

stat("$dir/$file")
Bei mir sieht es im Moment so aus:

defmod nTest notify nTest {\
my $dir = AttrVal("global", "backupdir", './FHEM');;\
Debug "dir: $dir";;\
\
my $max = 1;;\
my %HASH = ();;\
opendir (DIR, $dir) or die $!;;\
while(readdir DIR){\
my $file = $_;;\
next if($file eq "." || $file eq ".." || !defined($file));;\
$HASH{(stat("$dir/$file"))[9]}=$file;;\
}\
my $count = keys %HASH;;\
Debug "count: $count";;\
}

und liefert das korrekte Ergebnis (siehe Logfile) ohne perl Warning.



Nochwas:

Zitat von: juemuc am 14 April 2024, 17:28:25Ich habe die Abfrage in einem "at"-Device definiert, sodass man es mit exec-now einfach ausführen kann.

Das geht viel einfacher mit einem notify.

define nTest notify nTest {irgendein perl code}
dann kannst Du einfach mit "trigger nTest" experimentieren.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: juemuc am 14 April 2024, 20:03:58Die Augabenstellung besteht darin, den Namen des "aktuellsten" Sicherungsfiles aus dem "Backup-Verzeichnis" zu ermitteln

die aktuellste Datei in meinem Log-Verzeichnis finde ich so:

use File::DirList; # apt install libfile-dirlist-perl
my @list = File::DirList::list('./log', 'M');
return $list[0][0][0];
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

juemuc

Hallo betateilchen,

vielen Dank. Ich habe die Ermittlung der Backup-Datei mangels Wissen irgendwo hier im Forum "abgeschrieben". Ist nicht immer gut, hat mir aber geholfen.

Ich werde Deine Hinweise jetzt einmal in Ruhe auf meinem Testsytem ausprobieren.

Nochmals vielen Dank für die Unterstützung.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

juemuc

Zitat von: betateilchen am 14 April 2024, 20:41:21Bei mir sieht es im Moment so aus:

defmod nTest notify nTest {\
my $dir = AttrVal("global", "backupdir", './FHEM');;\
Debug "dir: $dir";;\
\
my $max = 1;;\
my %HASH = ();;\
opendir (DIR, $dir) or die $!;;\
while(readdir DIR){\
my $file = $_;;\
next if($file eq "." || $file eq ".." || !defined($file));;\
$HASH{(stat("$dir/$file"))[9]}=$file;;\
}\
my $count = keys %HASH;;\
Debug "count: $count";;\
}

und liefert das korrekte Ergebnis (siehe Logfile) ohne perl Warning.


Hallo betateilchen,
da ich auch verstehen möchte, was passiert, habe ich nun dein Coding per copy und paste übernommen und folgende Logeinträge erhalten:
2024-04-14_21:40:33 Logfile clear
2024.04.14 21:40:44.203 1: DEBUG>dir: /mnt/DS-Save/FHEM/
2024.04.14 21:40:44.210 1: PERL WARNING: Use of uninitialized value in hash element at (eval 345938) line 11.
2024.04.14 21:40:44.251 1: DEBUG>count: 1

Was mache ich anders als Du :o

Ich nutze Debian 12 (bookworm) als OS und ein aktuelles FHEM.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

betateilchen

Zitat von: juemuc am 14 April 2024, 21:44:03Ich nutze Debian 12 (bookworm) als OS und ein aktuelles FHEM.

Ich auch.

Zitat von: juemuc am 14 April 2024, 21:44:03Was mache ich anders als Du :o

Du verwendest am Ende des Pfades (im Attribut backupdir) einen / , was ich nicht tue.

ZitatDEBUG>dir: /mnt/DS-Save/FHEM/

Das hatte ich doch vorhin schon ausführlich erklärt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

juemuc

Das ändert aber leider nichts. Ich hatte es vorher schon "ohne" getestet.

2024.04.14 21:56:58.565 1: DEBUG>dir: /mnt/DS-Save/FHEM
2024.04.14 21:56:58.571 1: PERL WARNING: Use of uninitialized value in hash element at (eval 376729) line 11.
2024.04.14 21:56:58.609 1: DEBUG>count: 1

defmod SYS_Backup_Test notify global.backup.done.* \
{\
my $dir = AttrVal("global", "backupdir", './FHEM');;\
Debug "dir: $dir";;\
\
my $max = 1;;\
my %HASH = ();;\
opendir (DIR, $dir) or die $!;;\
while(readdir DIR){\
my $file = $_;;\
next if($file eq "." || $file eq ".." || !defined($file));;\
$HASH{(stat("$dir/$file"))[9]}=$file;;\
}\
my $count = keys %HASH;;\
Debug "count: $count";;\
}

Viele Grüße
Jürgen

3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).