use strict;
use File::Find;
use Digest::MD5;
use MIME::Base64;
use XML::Twig;
my $twig= XML::Twig->new(); # XML Parser
#lets get all folderz
my %digest;
my $cdir = "./";
my $distrodir = "/socket/.DIST/";
my $current_updates_xml;
find(
{
wanted=>sub{
if ($_ !~ /temp|\.log/) {
my $filename = $_;
if (-f $File::Find::name) {
open(FILE, "<$File::Find::name") or die "Can't open '$File::Find::name': $!";
binmode(FILE);
$digest{$cdir}{$filename} = Digest::MD5->new->addfile(*FILE)->hexdigest;
close FILE;
} elsif (-d $File::Find::name) {
$cdir=$File::Find::name;
$cdir =~ s/^$distrodir//;
$digest{$cdir} = () unless ($cdir."/" eq $distrodir);
}
}
},
chdir=>1
},$distrodir);
#generate XML
$current_updates_xml = qq~ \n~;
foreach my $folder (sort {$a cmp $b} keys %digest) {
$current_updates_xml .= "\n";
foreach my $file (keys %{$digest{$folder}}) {
$current_updates_xml .= "\n"
}
$current_updates_xml .= "";
}
$current_updates_xml .= "\n";
#print $current_updates_xml;
# client side
$twig->parse($current_updates_xml);
my $root = $twig->root;
my %redigest;
foreach my $folder ($root->children('folder')) {
$redigest{$folder->att('name')} = ();
foreach my $file ($folder->children('file')) {
$redigest{$folder->att('name')}{$file->att('name')} = $file->att('crc');
}
}
#TEMPORARY SECTION
my $destfolder = "/socket/REDIST/";
my %tofetch;
#create directory structure
foreach my $folder (sort {$a cmp $b} keys %redigest) {
mkdir $destfolder.$folder unless (-d $destfolder.$folder);
# print "$folder\n";
foreach my $file (keys %{$redigest{$folder}}) {
#compare files
#print "\t $destfolder$folder/$file (CRC: $redigest{$folder}{$file}\n";
if (-f "$destfolder$folder/$file") {
open(FILE, "$destfolder$folder/$file") or die "Can't open $destfolder$folder/$file: $!";
binmode(FILE);
$tofetch{$folder}{$file} = 1 if (Digest::MD5->new->addfile(*FILE)->hexdigest ne $redigest{$folder}{$file});
close FILE;
} else {
$tofetch{$folder}{$file} = 1
}
}
}
#debug
foreach my $folder (keys %tofetch) {
#print join(", ", keys %{$tofetch{$folder}});
#print "\n";
foreach my $file (keys %{$tofetch{$folder}}) {
my $requestxml;
# = qq~ \n~;
$requestxml .= "\n";
my $filexml = server_return($requestxml);
$twig->parse($filexml);
my $root = $twig->root;
if ($root->att('status') == 1) {
my $filebindata = $root->att('binfile');
$filebindata = MIME::Base64::decode($filebindata);
open(OUT, "> $destfolder$folder/$file") or die "can't open $_[1]: $!";
syswrite OUT, $filebindata;
close OUT;
}
}
}
sub server_return {
my $distrodir = "/socket/.DIST/";
my $ixml = shift;
$twig->parse($ixml);
my $root = $twig->root;
my $file = $root->att('file');
my $folder = $root->att('folder');
print $file;
my $encoded;
my $status;
if (-f "$distrodir$folder/$file") {
$encoded = MIME::Base64::encode(slurpfile("$distrodir$folder/$file"));
$status = 1;
} else { $status = 0; }
my $oxml = " \n";
return $oxml;
}
sub slurpfile
{
open(IN, "< $_[0]") or die "can't open $_[0]: $!";
binmode (IN);
seek(IN, 0, 0); sysread (IN, my $slurp, -s IN);
close(IN);
return $slurp;
}