Thread Skript für automatische Backups
(27 answers)
Opened by mollilinux at 2010-02-23 14:06 2010-02-24T16:20:55 mollilinux Hier fehlen immer noch use strict und use warnings. Code (perl): (dl
)
use POSIX; # Unix Timestamp Ich sehe im Code nichts, was aus POSIX benötigt wurde. Für die Timestamps nutzt du nur time() und localtime(), und die sind built-in. Die Zeile kann weg. Code (perl): (dl
)
use Net::SCP qw(scp); # Datentransfer via SCP Ein use Net::SCP; würde reichen, da du scp nur als Methode benutzt, aber nicht als Funktion. Aus der Doku von Net::SCP wird das aber nicht richtig klar, wie ich gesehen habe. Code (perl): (dl
)
use Time::Local; # Zeitabfrage Das nutzt du auch nicht, kann weg. Code (perl): (dl
)
my $begintime = localtime($timing); Was soll diese Zeile machen? Die Variable $timing ist nicht deklariert, geschweige denn, dass sie einen Wert hat. Trotzdem kommt etwas heraus, und zwar das Gleiche wie bei localtime(0) (nur mit einer Warnung, wenn diese eingeschaltet wären), also der String "Thu Jan 1 01:00:00 1970". Das weist du der Variabne $begintime zu, die du dann aber nie benutzt. Code (perl): (dl
)
my $nextnumber = $filenumber; Diese Variable benutzt du nie. Es ist etwas irreführend, die Variable $localtime zu nennen, denn time() liefert nur einen UNIX-Zeitstempel, während localtime() und gmtime() daraus eine Zeitangabe nach lokaler Zeit resp. UTC machen. Hier fehlt die Fehlerabfrage, wenn nicht in die Datei geschrieben werden kann: ... or die "kann nicht in begintime.txt schreiben: $!" Code (perl): (dl
)
print BT "UnixTime: ", scalar $localtime, "\n"; $localtime ist bereits ein Skalar, das scalar ist überflüssig. Code (perl): (dl
)
print BT "Lokale Zeit: ", scalar localtime($localtime), "\n\n"; Das hier ist die einzige Stelle, an der das scalar notwendig ist, weil localtime() sonst eine Liste von Datums-/Uhrzeitwerten zurückliefert. Code (perl): (dl
)
while (true) { # daemon-Schleife Es gibt kein true in Perl. use strict hätte dich darauf hingewiesen, dass hier ein "Bareword" steht. Perl interpretiert dieses Bareword freundlicherweise als String, der in diesem Fall weder leer noch "0" ist, weshalb die Schleife zufälligerweise doch funktioniert. Schreib einfach while (1). Code (perl): (dl
)
while ( not $auth ) { # Verbindungsschleife Hier hast du immer noch ein "busy wait", das heißt dein Rechner wird diese Schleife so lange mit voller CPU-Last ausführen, bis $auth wahr ist oder die fünf Sekunden um sind, sodass erstmal kopiert wird, wonach der Rechner wieder in Volllast geht. Code (perl): (dl
)
1 2 if ( ( ($timeNow - ($startTime+$duration)) % 5 ) == 0 ) { print "Verbindung wird hergestellt zu ", scalar $host, " als ", scalar $user, "...\n"; Beide scalar sind überflüssig... Die restlichen Fälle nenne ich jetzt nicht mehr, es sollte klar sein. Code (perl): (dl
)
1 2 3 $scp = Net::SCP->new($host); $scp->login($user); $auth = $scp->login($user); # Wenn Verbindung erfolgreich, dann weiter. Das macht nicht, was du denkst. In Net::SCP hat die Methode login() nur den Zweck, den Benutzernamen zu setzen. Und gibt ihn auch wieder zurück. Eine Verbindung wird dabei gar nicht aufgebaut, das macht erst scp(). Die Methode zweimal aufzurufen hilft auch nicht. $auth ist auf jeden Fall wahr, wenn $user wahr ist. Code (perl): (dl
)
1 2 3 if (-e $newfile) { # Wenn $newfile bereits existiert dann $filenumber um 1 addieren. $filenumber++ +1; Du erhöhst $filenumber um eins mit dem Post-Inkrement, addierst dann nochmal 1, aber wirfst das Ergebnis weg. Gibt auch eine Warnung. Code (perl): (dl
)
1 2 3 4 5 6 rename($newfile, $newfile.$filenumber) or warn "Datei konnte nicht umbenannt werden. \n"; } print "Neuer Dateiname: ", scalar $newfile.$filenumber, "\n"; Das Umbenennen kommt mir etwas komisch vor. Die Variable $newfile entsteht aus Dateinamen plus '0' angehängt (das machst du ganz am Anfang), und dann wird zusätzlich noch $filenumber angehängt. $newfile wird nie geändert, aber immer wieder darauf geprüft. Code (perl): (dl
)
$scp->quit; # Verbindung trennen Kannst du dir auch sparen, ist eine Dummy-Funktion in Net::SCP. Ach ja, eins noch: Ich hoffe wirklich sehr für dich und den User, der am Zielrechner arbeitet, dass er/sie weiß, dass du sein/ihr Surfverhalten aufzeichnest! Ansonsten begehst du nämlich eine Straftat (ziemlich eindeutig §202a StGB, evtl. iVm dem berüchtigten §202c StGB, plus wahrscheinlich noch ein paar Verstöße gegen das BDSG). |