#!/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
     -4      Forces grsync to try protocol version 4

     --sp /path/file --dp /path/foo/newfile
     --sp /path/file --dp /path/foo/
     --sp /path/     --dp /path/foo/
     --sp /path/foo* --dp /path/foo/
     --sp '/path/file1;/path/file2' --dp /path/foo/


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

use MYDan::Node;
use MYDan::Agent::GrsyncM;
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 4 ) )
    ->dump();

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

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

$o{dp} ||= $o{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' ) }
);

if( $o{dp} eq $o{sp} )
{
    my %src = map{ $_ => 1 }@{$sync{src}};
    die "'$o{sp}' are the same file on same host.\n" unless grep{ ! $src{$_} }@{$sync{dst}};
}

my @failed = MYDan::Agent::GrsyncM->new( opt => \%o, sync => \%sync )->run();

exit 0 unless  @failed;
die $range->load( \@failed )->dump . ": failed.\n\n";
