#!/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 () { 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();