MYDan
view release on metacpan or search on metacpan
lib/MYDan/Agent/Grsync/V3.pm view on Meta::CPAN
code => 'mrsync',
argv => &$argv( 'mrsync', undef, %o, %$sync, %path, pcb => undef ),
map{ $_ => $o{$_} }qw( user sudo env )
);
my %result = MYDan::Agent::Client->new(
$p
)->run( %{$this->{agent}}, %o, query => \%query );
my $result = $result{$p} || '';
if( $result =~ s/--- 0\n// && $result =~ s/###mrsync_failed:([\w\._-]*):mrsync_failed###$//)
{
map{ $failed{$_} = 1 }split /,/, $1;
}
else
{
map{ $failed{$_} = 1 }@{$sync->{dst}};
}
print $result, "\n";
}
else
{
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
my $mrsync = MYDan::Agent::Mrsync->new( %$sync, %path );
map{ $failed{$_} = 1 } $mrsync->run( %o, 2 => 1 )->failed();
}
}
}
my ( $load, $loadok );
if( $task{load} )
{
my $path = "$MYDan::PATH/tmp";
unless( -d $path ){ mkdir $path;chmod 0777, $path; }
$path .= '/grsync.data.';
for my $f ( grep{ -f } glob "$path*" )
{
my $t = ( stat $f )[9];
unlink $f if $t && $t < time - 86400;
}
$load = $path. Digest::MD5->new->add( time.$$ )->hexdigest;
for ( 0 .. $o{retry} )
{
my $i = int( rand time ) % @{$task{load}};
my $host = $task{load}[$i];
print "$host => localhost: LOAD\n";
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
eval{
MYDan::Agent::Load->new(
node => $host,
sp => $path{sp}, dp => $load,
)->run( %{$this->{agent}}, %o, verbose => $o{pcb} ? 1 : 0,
( defined $o{cc} ) ? ()
: ( 'chown' => undef, 'chmod' => undef )
);
};
my $stat = $@ ? "FAIL $@" : 'OK';
print "$host <= localhost: $stat\n";
if( $stat eq 'OK' )
{
$loadok = 1;
last;
}
}
}
if( $task{dump} && ( $loadok || ! $task{load}) )
{
for ( 0 .. $o{retry} )
{
my %dump;
my $id = -1;
for my $todo ( @{$task{todo}} )
{
$id ++;
next if $todo->{ok};
my @dst = @{$todo->{dst}};
my $i = int( rand time ) % @dst;
my $dst = $dst[$i];
$dump{$dst} = $id;
}
last unless keys %dump;
my @argv;
map{ push( @argv, "--$_", $o{$_} ) if defined $o{$_} }qw( chown chmod );
push( @argv, "--cc" ) if $o{cc};
my %query = (
code => 'dump',
argv => &$argv( 'dump',$load || $path{sp} , '--path', $path{dp}, @argv ),
map{ $_ => $o{$_} }qw( user sudo )
);
map{ print "localhost => $_: DUMP\n" }keys %dump;
my %MYDan_rlog = ( MYDan_rlog => $o{env}{MYDan_rlog} ) if $o{env} && $o{env}{MYDan_rlog};
my %result = MYDan::Agent::Client->new(
keys %dump
)->run( %{$this->{agent}}, %o, %MYDan_rlog, query => \%query, verbose => $o{pcb} ? 1 : 0 );
map{
my $stat = $result{$_} && $result{$_} eq "ok\n--- 0\n"
? 'OK' : sprintf "Fail: %s", $result{$_} || 'error';
print "$_ <= localhost: $stat\n";
$task{todo}[$dump{$_}]{ok} = $_ if $stat eq 'OK'
}keys %dump;
}
}
unlink $load if $load && -f $load;
if( $task{todo} )
{
for my $todo ( @{$task{todo}} )
{
if( $todo->{ok} )
{
my @dst = grep{ $_ ne $todo->{ok} }@{$todo->{dst}};
next unless @dst;
my ( $n ) = @dst;
my %sync = ( src => [ $todo->{ok} ], dst => \@dst, map{ $_ => $path{dp} }qw( sp dp ) );
if( my $p = $this->{proxy}{$n} )
{
my %query = (
code => 'mrsync',
argv => &$argv( 'mrsync', undef, %o, %sync, pcb => undef ),
map{ $_ => $o{$_} }qw( user sudo env )
);
my %result = MYDan::Agent::Client->new( $p )->run( %{$this->{agent}}, %o, query => \%query, pcb => undef );
my $result = $result{$p} || '';
if( $result =~ s/--- 0\n// && $result =~ s/###mrsync_failed:([\w\._-]*):mrsync_failed###$//)
{
map{ $failed{$_} = 1 }split /,/, $1;
}
else
{
map{ $failed{$_} = 1 }@dst;
}
print $result, "\n";
}
( run in 0.672 second using v1.01-cache-2.11-cpan-71847e10f99 )