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;
}