#!/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)]


    The following parameters are valid only in box

    [--nice number] 
    [rsync options] 


    The following parameters are valid only in dan

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

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

use MYDan::Node;
use MYDan::Agent::Mrsync;
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, src => hostname() )
    ->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 ) )
    ->dump();

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

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

my $range = MYDan::Node->new( $option->dump( 'range' ) );
my $mrsync = MYDan::Agent::Mrsync->new
(
    ( map { $_ => delete $o{$_} } qw( sp dp ) ),
    map { $_ => [ $range->load( delete $o{$_} || [] )->list ] } qw( src dst )
);

$o{opt} = join ' ', @ARGV if @ARGV;

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