use IO::Socket::INET; use File::Find; use Archive::Rar; use Net::Ftp; use Tie::File; use strict; use warnings; #Anlegen der Variablen und Arrays my ($inidaten,$ftphost,$ftpuser,@answer,$antwort,@del_rar,$fd,$pfad,$Dateipfad,@safe_rar,$zeile,$datei_pfad,@safe_datei,@pd,$dateigroesse_server,$aenderungsdatum_server,$answer,$anzahl_server,$anzahl_client,$pfad_dateiname,$ftppasswort,$socket,$imput,$helper,@pfad,$remotehost,@Serverfiles_loeschen,$remoteport,$sek,$min,$stu,$tag,$mon,$jahr,$wtag,$programmpfad); our (@file,%daten,$ctime_cl,@fehlermeldung); #definieren der Variablen; my $ini = "Config_client.ini"; my $rar =new Archive::Rar(); my $zeit = time(); my $datum = date(); tie my @ini,'Tie::File',$ini; #or die print "InI Datei konnte nicht gefunden werden. Programm wird beendet...;" foreach my $inidaten(@ini) { if ($inidaten=~/Backuppfad\=/i) { $helper=index($inidaten,"backuppfad\=")+12; $pfad=substr($inidaten,$helper); chomp($pfad); print "$pfad"; } elsif ($inidaten=~/remoteport\=/i) { $helper=index($inidaten,"remoteport\=")+11; $remoteport=substr($inidaten,$helper); chomp($remoteport); } elsif ($inidaten=~/remotehost\=/i) { $helper=index($inidaten,"remotehost\=")+11; $remotehost=substr($inidaten,$helper); chomp($remotehost); } elsif ($inidaten=~/ftphost\=/i) { $helper=index($inidaten,"ftphost\=")+8; $ftphost=substr($inidaten,$helper); chomp($ftphost); } elsif ($inidaten=~/ftpuser\=/i) { $helper=index($inidaten,"ftpuser\=")+8; $ftpuser=substr($inidaten,$helper); chomp($ftpuser); } elsif ($inidaten=~/ftppasswort\=/i) { $helper=index($inidaten,"ftppasswort\=")+12; $ftppasswort=substr($inidaten,$helper); chomp($ftppasswort); } elsif ($inidaten=~/programmpfad\=/i) { $helper=index($inidaten,"programmpfad\=")+13; $programmpfad=substr($inidaten,$helper); chomp($programmpfad); } } untie @ini; open (FEHLER, ">Logdatei.log"); print FEHLER "Programm wurde am "."$datum"." um "."$zeit"." gestartet"."\n"|| die print "$!"; #Aufruf der Subroutine. find(\&wanted,$pfad); print "test"; #Aufbauen der FTP-Verbindung my $ftp = Net::FTP->new("$ftphost", Timeout => 360, Port => 21, Debug => 1, Hash => 0 )|| print FEHLER "Am $datum ist ein Fehler aufgetreten\nFTP konnte nicht geöffnet werden $@\n\n"; #Aufbauen der Socket-Verbindung $socket = IO::Socket::INET -> new ( PeerAddr => $remotehost, PeerPort => $remoteport, Proto => "tcp", Type => SOCK_STREAM) || print FEHLER "Am $datum ist ein Fehler aufgetreten\nKeine Verbindung zum Backup-Server $remotehost:$remoteport : $!\n\n"; #Senden des Benutzernamens an den Server print $socket "$ENV{USERNAME}\n"; print FEHLER "Anmeldung mit dem Username "."$ENV{USERNAME}"."\n"|| die print "$!"; #Empfangen der Antwort $answer = <$socket>; chomp $answer; if ($answer =~ "keine Zugriffsberechtigung") { print "$answer\n"; print FEHLER "$answer"."\n"; exit; } else { print "$answer\n"; print FEHLER "$answer"."\n"; } #Sendet den Pfad an den Server; print $socket "$pfad"."\n"; #Empfangen ANzahl der Files auf dem Server; $anzahl_server = <$socket>; chomp $anzahl_server; $anzahl_client = 0; todo: while ($$anzahl_client eq $anzahl_server) { $anzahl_client = $anzahl_client + 1; $pfad_dateiname = <$socket> || die print "aua!!!!"."\n"; chomp $pfad_dateiname; $aenderungsdatum_server = <$socket>;# print $aenderungsdatum_server; chomp $aenderungsdatum_server; $dateigroesse_server = <$socket>; chomp $dateigroesse_server; $daten{dateien}{"$pfad_dateiname"}{'aenderungsdatum_server'}="$aenderungsdatum_server"; $daten{dateien}{"$pfad_dateiname"}{'dateigroesse_server'}="$dateigroesse_server"; } foreach (sort keys %{$daten{dateien}}) { push (@pd,$_); } undef @safe_datei; foreach my $zeile(@pd) { unless ($daten{dateien}{"$zeile"}{'aenderungsdatum_client'}){push (@Serverfiles_loeschen, "$zeile");} else { if ($daten{dateien}{"$zeile"}{'aenderungsdatum_server'} ne $daten{dateien}{"$zeile"}{'aenderungsdatum_client'}) { $datei_pfad=$pfad.$zeile; $datei_pfad=~ tr/\//\\/; push (@safe_datei,"\"$datei_pfad\"") } elsif ($daten{dateien}{"$zeile"}{'dateigroesse_client'} ne $daten{dateien}{"$zeile"}{'dateigroesse_server'}) { $datei_pfad=$pfad.$zeile; $datei_pfad=~ tr/\//\\/; push (@safe_datei,"\"$datei_pfad\"") } elsif ($daten{dateien}{"$zeile"}{'aenderungsdatum_server'} eq $daten{dateien}{"$zeile"}{'aenderungsdatum_client'}) { if ($daten{dateien}{"$zeile"}{'dateigroesse_client'} ne $daten{dateien}{"$zeile"}{'dateigroesse_server'}) { $datei_pfad=$pfad.$zeile; $datei_pfad=~ tr/\//\\/; push (@safe_datei,"\"$datei_pfad\"") } } } } unless (@safe_datei) { print "Update nicht notwendig!"."\n"; print FEHLER "Update ist nicht erfordelerlich. Programm wurde beendet."."\n"; exit; } else { my @teilrar; my $dateienfertig = @safe_datei; while (my $dateiengesamt ne my $dateienfertig) { foreach (@safe_datei) { my $counterdatei++; $dateienfertig++; if ($counterdatei ne 900) { push (@teilrar,$_); } else { $counterdatei=0; my $i++; $rar->Add( -size => 1000, -archive => "pre_rar"."$i", -files => \@teilrar, ); undef @teilrar; } } } } $ftp->login("$ftpuser","$ftppasswort") || die print FEHLER "Am $datum ist ein Fehler aufgetreten\nKonnte nicht auf dem FTP anmelden. $!\n\n"; print FEHLER "Erfolgreiche anmeldung an FTP "."$ftphost"."\n"; find(\&wanted_rar,"$programmpfad"); foreach $zeile(@safe_rar) { $ftp->binary() or die "no Binary ", $ftp->message; $ftp->put("$zeile")|| print FEHLER "Am $datum ist ein Fehler aufgetreten\nKonnte folgende Datei $zeile nicht auf den FTP-Server hochladen. $!\n\n"; } print $socket "@safe_rar"."\n"; while ($answer ne "ok") { $answer = <$socket>; chomp $answer; @answer = split (/ /, $answer); foreach $fd (@answer) { foreach $zeile (@safe_rar) { if ($fd eq $zeile) { $ftp->binary() or die "no Binary ", $ftp->message; $ftp->put($zeile)|| print FEHLER "Am $datum ist ein Fehler aufgetreten\nKonnte folgende Datei $zeile nicht auf den FTP-Server hochladen. $!\n\n"; } } } } print $socket "Upload"."\n"; foreach $zeile (@del_rar) { unlink($zeile); } chomp @Serverfiles_loeschen; foreach my $Serverfile_loeschen (@Serverfiles_loeschen) { print $socket "$Serverfile_loeschen"."\n"|| die print "$!"; } undef @Serverfiles_loeschen; print $socket "alle Files"."\n"; $antwort = <$socket>; close FEHLER; exit; #subroutine zur suche der erforderlichen rar_dateien. sub wanted_rar { if (($_ =~ ".rar")&&($_ =~ "pre_rar\.")) { push (@safe_rar, $_); push (@del_rar, $File::Find::name); } } #subroutine zur suche der erforderlichen Dateien sub wanted { if( -f $File::Find::name) { $helper=length($pfad); $Dateipfad=substr($File::Find::name,$helper); chomp ($Dateipfad); $ctime_cl=scalar localtime ((stat $File::Find::name)[9]); my @split_cttime_cl = split (/ /,$ctime_cl); my @split_time = split (/:/, $split_cttime_cl[3]); $ctime_cl = "$split_cttime_cl[0]"." "."$split_cttime_cl[1]"." "."$split_cttime_cl[2]"." "."$split_time[0]".":"."$split_time[0]"." "."$split_cttime_cl[4]"; my $dateigroesse_client = (-s $File::Find::name); #$daten{dateien}{"$Dateipfad"}{'dateiname'}="$_"; $daten{dateien}{"$Dateipfad"}{'aenderungsdatum_client'}="$ctime_cl"; $daten{dateien}{"$Dateipfad"}{'dateigroesse_client'}="$dateigroesse_client"; } } #Subroutine für das Datum sub date { my ($mday,$mon,$year)=(localtime(time))[3,4,5]; my $datum = sprintf("%02d_%02d_%04d",$mday,$mon+1,$year+1900); return $datum } #Subroutine für die Zeit sub time { my ($sec,$min,$hour)=(localtime(time))[0..2]; my $zeit = sprintf("%02d\:%02d\:02d",$hour,$min,$sec); return $zeit; }