FHEM Forum

FHEM => Sonstiges => Thema gestartet von: juemuc am 09 April 2024, 22:46:05

Titel: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: juemuc am 09 April 2024, 22:46:05
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
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: rudolfkoenig am 10 April 2024, 14:37:10
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 \.
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: juemuc am 14 April 2024, 17:28:25
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)\
}
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: betateilchen am 14 April 2024, 19:32:39
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?
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: juemuc am 14 April 2024, 20:03:58
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   
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: betateilchen am 14 April 2024, 20:41:21
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.

Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: betateilchen am 14 April 2024, 20:52:45
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];
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: juemuc am 14 April 2024, 20:58:40
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
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: juemuc am 14 April 2024, 21:44:03
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
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: betateilchen am 14 April 2024, 21:53:14
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.
Titel: Aw: perl-Warnung bei jedem backup-Befehl aus FHEM
Beitrag von: juemuc am 14 April 2024, 22:01:49
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