#!/usr/bin/env perl

=head1 SYNOPSIS

 $0 [--src src-range(default `hostname`)] --dst dst-range --sp src-path [--dp dst-path] \
    [--timeout seconds(default 300)]
    [--max number(default 128)]
    [--retry number(default 2)]
    [--gave number(default 3)]

    [--user username(default `id -un`)] 
    [--sudo user1 ] 
    [--chown root]
    [--chmod 777]
    [--cc]

     -1      Forces grsync to try protocol version 1
     -2      Forces grsync to try protocol version 2
     -3      Forces grsync to try protocol version 3

=cut
use strict;
use warnings;
use Sys::Hostname;

use MYDan::Node;
use MYDan::Agent::Grsync::V12;
use MYDan::Agent::Grsync::V3;
use MYDan::Util::OptConf;

$| ++;

@MYDan::Util::OptConf::CONF = qw( pass_through no_ignore_case );

my $option = MYDan::Util::OptConf->load();
my %o = $option->set( retry => 2, timeout => 300, gave => 3 )
    ->get( qw( src=s dst=s sp=s dp=s timeout=i max=i retry=i nice=i user=s sudo=s gave=i chown=s chmod=s cc 1 2 3 ) )
    ->dump();

$o{delete $o{ProtocolVersion}} = 1 unless $o{ProtocolVersion} && $o{ProtocolVersion} =~ /^\d$/ && grep{ $o{$_} }1..3;

$option->assert( qw( dst sp ) );

$o{user} = `id -un` and chop $o{user} unless $o{user};

my $range = MYDan::Node->new( $option->dump( 'range' ) );

my %sync = (
    ( map { $_ => [ $range->load( delete $o{$_} || [] )->list ] } qw( src dst ) ),
    agent => +{ $option->dump( 'agent' ) }
);

my $grsync = $o{3} 
  ? MYDan::Agent::Grsync::V3->new ( %sync ) 
  : MYDan::Agent::Grsync::V12->new ( %sync );

exit 0 unless my @failed = $grsync->run( %o )->failed();
die $range->load( \@failed )->dump . ": failed.\n\n";
