All pastes #138641 Raw Edit

Something

public text v1 · immutable
#138641 ·published 2006-08-19 11:20 UTC
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();
&notifyDone();