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