rendered paste body#!/usr/bin/perl -w
use strict;
use Archive::Tar;
require HTTP::Request;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Async;
# Time
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;
$year += 1900;
$mon += 1;
if ($mon < 10) { $mon = '0' . $mon; }
if ($mday < 10) { $mday = '0' . $mday; }
# Define vars and arrays
my $errno;
my $errReport;
my $currRun = 1;
my $currentError;
my $tarballName = 'guridi-sql-' . $year . $mon . $mday . '.tar.gz';
my $sourceTarball = '/web/sites/xxx/public/' . $tarballName;
my $localTarball = '/tmp/upload/' . $tarballName;
my $sourceTarballDigest = $sourceTarball . '.md5';
my $localTarballDigest = $localTarball . '.md5';
my $errURL = 'http://some.error.host/report.pl?errno=';
my $sourceServer = 'zzz';
my $bgProc;
my $newDigest;
my $oldDigest;
my $ret;
my $retcode;
my $targetHost;
my @dbServers = ( 'yyy',
'xxx');
# Subroutine for handling errorReporting
sub errorReport {
$errno = shift (@_);
$errURL = $errURL . $errno;
print "$errURL\n";
#$errReport = HTTP::Request->new(GET => $errURL);
kill();
exit $errno;
die($errno);
}
# Subroutine for generating data
sub generateTarball {
return "10";
system "\/usr\/bin\/ssh nicklasw\@xxx \"sh \/crons\/create_gur
idi_data.sh\"";
$retcode = $? >> 8;
return $retcode;
}
# Subroutine for downloading data
sub downloadTarball {
system "\/usr\/bin\/scp nicklasw\@". $sourceServer . ":" . $sourceTarbal
l . " " . $localTarball;
$retcode = $? >> 8;
if ($retcode > 0) {
&errorReport("22");
}
system "\/usr\/bin\/scp nicklasw\@". $sourceServer . ":" . $sourceTarbal
lDigest . " " . $localTarballDigest;
$retcode = $? >> 8;
if ($retcode > 0) {
&errorReport("23");
}
&verifyDigest();
return 0;
}
# Subroutine for verifying digest
sub verifyDigest {
open(FILE, $localTarball) || &errorReport("100");
binmode(FILE);
$newDigest = Digest::MD5->new->addfile(*FILE)->hexdigest;
close(FILE);
open(FILE, $localTarballDigest) || &errorReport("101");
while (<FILE>) {
s/#.*//;
next if /^(\s)*$/;
chomp;
$oldDigest = $_;
}
close(FILE);
if ($oldDigest eq $newDigest) {
$ret = 0;
} else {
&errorReport("24");
$ret = 1;
}
return $ret;
}
# Subroutine for uploading data
sub uploadTarball {
$targetHost = shift (@_);
system "\/usr\/bin\/scp " . $localTarball . " mysql\@". $targetHost . ":
/tmp/upload/. ";
$retcode = $? >> 8;
if ($retcode > 0) {
&errorReport("32");
}
system "\/usr\/bin\/scp " . $localTarballDigest . " mysql\@". $targetHos
t . ":/tmp/upload/. ";
$retcode = $? >> 8;
if ($retcode > 0) {
&errorReport("33");
}
return 0;
}
# Subroutine to cleanup
sub cleanUp {
system "/bin/rm -f " . $localTarball;
$retcode = $? >> 8;
if ($retcode > 0) {
&errorReport("40");
}
system "/bin/rm -f " . $localTarballDigest;
$retcode = $? >> 8;
if ($retcode > 0) {
&errorReport("41");
}
return 0;
}
# Subroutine to notify that we're done
sub notifyDone {
print "We're done\n";
exit 0;
}
#&errorReport("82");
$bgProc = Async->new(sub {generateTarball()}) || &errorReport("10");
$bgProc = Async->new(sub {generateTarball()}) || &errorReport("10");
while ($currRun) {
if ($bgProc->ready) {
if ($currentError = $bgProc->error) {
&errorReport("11");
} else {
if ($bgProc->result > 0) {
&errorReport("12");
}
}
$currRun = 0;
}
sleep 1;
}
$currRun = 1;
$bgProc = Async->new(sub {downloadTarball()}) || &errorReport("20");
while ($currRun) {
if ($bgProc->ready) {
if ($currentError = $bgProc->error) {
&errorReport("21");
}
$currRun = 0;
}
sleep 1;
}
$currRun = 1;
foreach (@dbServers){
$bgProc = Async->new(sub {uploadTarball($_)}) || &errorReport("30");
while ($currRun) {
if ($bgProc->ready) {
if ($currentError = $bgProc->error) {
&errorReport("31");
}
$currRun = 0;
}
sleep 1;
}
$currRun = 1;
}
&cleanUp();
¬ifyDone();