| #!/usr/bin/perl |
| |
| use strict; |
| use IniFiles; |
| use Net::SMTP; |
| |
| my $configuration = new Config::IniFiles( -file => "syncopate.conf" ); |
| |
| my $globalRepoDirectory = $configuration->val( "syncopate", "repoDirectory" ); |
| |
| my $repoDirectory = $configuration->val( "syncopate", "repoDirectory" ); |
| |
| my $standardOptions = $configuration->val( "syncopate", "options" ); |
| |
| my $rsyncUser = $configuration->val( "syncopate", "rsyncUser" ); |
| |
| my $reportDirectory = $configuration->val( "syncopate", "reportDirectory" ); |
| |
| my $smtpServer = $configuration->val( "syncopate", "smtpServer" ); |
| |
| my $reportUrl = $configuration->val( "syncopate", "reportUrl" ); |
| |
| if ( defined( $ARGV[0] ) ) |
| { |
| my $sourceConfiguration = new Config::IniFiles( -file => "conf/m1/$ARGV[0]" . ".conf" ); |
| |
| syncSource( $sourceConfiguration ); |
| } |
| else |
| { |
| syncSources(); |
| } |
| |
| # ----------------------------------------------------------------------------- |
| # |
| # |
| # ----------------------------------------------------------------------------- |
| sub syncSources |
| { |
| my @sources = glob( "conf/m1/*.conf" ); |
| |
| for my $source (@sources) |
| { |
| my $sourceConfiguration = new Config::IniFiles( -file => $source ); |
| |
| my $batchDisabled = $sourceConfiguration->val( "info", "batchDisabled" ); |
| |
| if ( not defined( $batchDisabled ) ) |
| { |
| syncSource( $sourceConfiguration ); |
| } |
| } |
| } |
| |
| # ----------------------------------------------------------------------------- |
| # |
| # |
| # ----------------------------------------------------------------------------- |
| sub syncSource() |
| { |
| my $sourceConfiguration = shift; |
| |
| print "Syncing " . $sourceConfiguration->val( "info", "name" ) . "\n"; |
| |
| # Look at the mode we are going to use to sync: svn over https, rsync over ssh, or plain rsync (we should move away from this) |
| |
| my $syncMode = $sourceConfiguration->val( "host", "mode" ); |
| |
| if ( $syncMode == "rsync_ssh" ) |
| { |
| runRsyncOverSsh( $sourceConfiguration ); |
| } |
| else if ( $syncMode == "rsync" ) |
| { |
| runRsync( $sourceConfiguration ); |
| } |
| else if ( $syncMode == "svn" ) |
| { |
| runSvnOverHttps( $sourceConfiguration ); |
| } |
| } |
| |
| # ----------------------------------------------------------------------------- |
| # |
| # ----------------------------------------------------------------------------- |
| |
| |
| |
| sub runRsyncOverSsh() |
| { |
| my $sourceConfiguration = shift; |
| |
| my $address = $sourceConfiguration->val( "host", "address" ); |
| |
| my $directory = $sourceConfiguration->val( "host", "directory" ); |
| |
| my $options = $sourceConfiguration->val( "host", "options" ); |
| |
| my $rsyncUser = $configuration->val( "syncopate", "rsyncUser" ); |
| |
| my $identity = $configuration->val( "syncopate", "identity" ); |
| |
| if ( $sourceConfiguration->val( "host", "rsyncUser" ) ) |
| { |
| $rsyncUser = $sourceConfiguration->val( "host", "rsyncUser" ); |
| } |
| |
| if ( $sourceConfiguration->val( "host", "identity" ) ) |
| { |
| $identity = "-i " . $sourceConfiguration->val( "host", "identity" ); |
| } |
| |
| if ( $sourceConfiguration->val( "host", "repoDirectory" ) ) |
| { |
| $repoDirectory = $sourceConfiguration->val( "host", "repoDirectory" ); |
| } |
| |
| |
| my $cmd = "rsync $standardOptions $options --rsh=\"ssh -oBatchMode=yes $identity -T -l $rsyncUser\" $address:$directory/ $repoDirectory"; |
| |
| # ------------------------------------------------------------------------- |
| # Now we want to run rsync and generate a small xdoc which describes the |
| # syncronization that just occurred. |
| # ------------------------------------------------------------------------- |
| |
| my $id = $sourceConfiguration->val( "info", "id" ); |
| |
| my $name = $sourceConfiguration->val( "info", "name" ); |
| |
| my $reportName = "Synchronization report for " . $name; |
| |
| my @date = date(); |
| |
| my $date = $date[0] . "-" . $date[1] . "-" . $date[2]; |
| |
| my $dir = $date; |
| |
| $dir =~ s/-/\//g; |
| |
| $dir = $id . "/" . $dir; |
| |
| my $rdir = $reportDirectory . "/" . $dir; |
| |
| system( "mkdir -p $rdir > /dev/null 2>&1" ); |
| |
| my $base = $id . "-" . $date[0] . $date[1] . $date[2] . "-" . $date[3] . $date[4] . $date[5]; |
| |
| my $xmlReport = $rdir . "/" . $base . ".xml"; |
| |
| my $rawReport = $rdir . "/" . $base . ".txt"; |
| |
| open( REPORT, "> $xmlReport" ); |
| |
| open( RAW_REPORT, "> $rawReport" ); |
| |
| print REPORT "<document>" . "\n"; |
| |
| print REPORT "<properties>" . "\n"; |
| |
| print REPORT "<author>meeper</author>" . "\n"; |
| |
| print REPORT "<title>$reportName</title>" . "\n"; |
| |
| print REPORT "</properties>" . "\n"; |
| |
| print REPORT "<body>" . "\n"; |
| |
| print REPORT "<section name=\"$reportName\">" . "\n"; |
| |
| print REPORT "<table>" . "\n"; |
| |
| print REPORT "<tr>" . "\n"; |
| |
| print REPORT "<th>Artifact</th>" . "\n"; |
| |
| print REPORT "<th>Size (in bytes)</th>" . "\n"; |
| |
| print REPORT "<th>Date</th>" . "\n"; |
| |
| print REPORT "</tr>" . "\n"; |
| |
| open( SYNC, "$cmd 2>&1 |" ); |
| |
| my $rawReportText; |
| |
| while( <SYNC> ) |
| { |
| # -------------------------------------------------------------------- |
| # We have a line that tells us about an artifact that was synced. |
| # -------------------------------------------------------------------- |
| if ( /^artifact/ ) |
| { |
| my @details = split; |
| |
| print REPORT "<tr>" . "\n"; |
| |
| print REPORT "<td>" . $details[1] . "</td>" . "\n"; |
| |
| print REPORT "<td>" . $details[2] . "</td>" . "\n"; |
| |
| print REPORT "<td>" . $details[3] . " " . $details[4] . "</td>" . "\n"; |
| |
| print REPORT "</tr>" . "\n"; |
| } |
| else |
| { |
| $rawReportText = $rawReportText . $_; |
| |
| print RAW_REPORT; |
| } |
| } |
| |
| print REPORT "</table>" . "\n"; |
| |
| print REPORT "<p><a href=\"$rawReport\">Raw report</a></p>"; |
| |
| print REPORT "</section>" . "\n"; |
| |
| print REPORT "</body>" . "\n"; |
| |
| print REPORT "</document>" . "\n"; |
| |
| close( REPORT ); |
| |
| close( RAW_REPORT ); |
| |
| if ( $rawReportText ) |
| { |
| $rawReportText = $rawReportText . "\n\nYou can view the syncronization reports for today here: \n\n"; |
| |
| $rawReportText = $rawReportText . $reportUrl . "/" . $dir; |
| |
| notify( $sourceConfiguration, $reportName, $rawReportText ); |
| } |
| } |
| |
| sub runRsync() |
| { |
| my $sourceConfiguration = shift; |
| } |
| |
| sub runSvnOverHttps() |
| { |
| my $sourceConfiguration = shift; |
| } |
| |
| sub date |
| { |
| my $second; |
| my $minute; |
| my $hour; |
| my $day; |
| my $month; |
| my $year; |
| |
| ($second, $minute,$hour,$day, $month, $year) = (localtime)[0..5]; |
| |
| $year = $year + 1900; #got 2004 |
| |
| $month = $month + 1; |
| |
| $second = $second + 1; |
| |
| $minute = $minute + 1; |
| |
| $hour = $hour + 1; |
| |
| if ( $second <= 9 ) |
| { |
| $second = "0".$second; |
| } |
| if ( $minute <= 9 ) |
| { |
| $minute = "0".$minute; |
| } |
| if ( $hour <= 9 ) |
| { |
| $hour = "0".$hour; |
| } |
| if ( $day <= 9 ) |
| { |
| $day = "0".$day; |
| } |
| if ( $month <= 9) |
| { |
| $month = "0".$month; |
| } |
| |
| return ($year,$month,$day,$hour,$minute,$second); |
| } |
| |
| sub notify() |
| { |
| my $sourceConfiguration = shift; |
| |
| my $subject = shift; |
| |
| my $text = shift; |
| |
| my $smtp = new Net::SMTP( $smtpServer ); |
| |
| $smtp->mail( "meeper\@maven.org" ); |
| |
| $smtp->to( $sourceConfiguration->val( "info", "contact" ) ); |
| |
| $smtp->data(); |
| |
| $smtp->datasend( "Subject: $subject\n" ); |
| |
| $smtp->datasend( "From: meeper\@maven.org\n" ); |
| |
| $smtp->datasend( "\n" ); |
| |
| $smtp->datasend( $text ); |
| |
| $smtp->dataend(); |
| |
| $smtp->quit(); |
| } |