MYDan

 view release on metacpan or  search on metacpan

lib/MYDan/Agent/GrsyncM.pm  view on Meta::CPAN

            $self{task} = [ +{ 
                sp => $self{opt}{sp}, dp => ( $self{opt}{dp} =~ /\/$/ ) 
                    ? $self{opt}{dp}.basename $self{opt}{sp}: $self{opt}{dp} 
            } ];
        }
    }

    bless \%self, ref $class || $class;
}

sub run
{
    my $this = shift;

    my ( $opt, $sync, %failed ) = @$this{qw( opt sync )};

    if( $this->{error} )
    {
        return wantarray ? @{$sync->{dst}} : $sync->{dst};
    }

    for my $task ( @{$this->{task}} )
    {
        print '-' x 60, "\n";

        my $timeout = $opt->{timeout} - $this->{usetime};
        print "sp:$task->{sp} => dp:$task->{dp}\n";
        my @dst = grep{ ! $failed{$_} }@{$sync->{dst}};
        last unless @dst;
        if( $timeout < 0 )
        {
            map{ $failed{$_} ++ }@dst;
            last;         
        }

        my %sync = ( %$sync, dst => \@dst );

        my $grsync = $opt->{4} ? MYDan::Agent::Grsync::V4->new ( %sync ):
                     $opt->{3} ? MYDan::Agent::Grsync::V3->new ( %sync ):
                                MYDan::Agent::Grsync::V12->new ( %sync );
        
        my $time = time;
        my @failed = $grsync->run( %$opt, %$task, timeout => $timeout )->failed();
        $this->{usetime} += time - $time;
        if( @failed )
        {
            print "failed:\n";
            map{ $failed{$_}++; print "$_\n" }@failed;
        }
    }

    print '=' x 60, "\n";

    if( $this->{spIsDir} )
    {
        delete $ENV{MYDanExtractFile};
        delete $ENV{MYDanExtractFileAim};

    	my %query = ( 
    		code => 'unzipdir', argv => +{ uuid => $this->{uuid}, 
                path => [ $this->{opt}{dp} ], map{ $_ => $opt->{$_} }qw( delete chown chmod ) }, 
    		map{ $_ => $opt->{$_} }qw( user sudo ) );
    	my %result = MYDan::Agent::Client->new( @{$sync->{dst}} )
    	    ->run( %$opt, %{$sync->{agent}}, query => \%query );
    
        print "untar.\n";
        for my $node ( keys %result )
        {
            if( $result{$node} =~ s/--- 0\n$// )
            {
                 print "$node: $result{$node}\n" if $result{$node};
            }
            else
            {
                print "$node: $result{$node}\n";
                $failed{$node} = 1;
            }
        }
        
    
        print '=' x 60, "\n";
        print "clean dir.\n";
    
    	%query = ( 
    		code => 'cleandir', argv => +{ uuid => $this->{uuid}, 
                path => [ $this->{opt}{sp}, $this->{opt}{dp} ], expire => 86400 }, 
    		map{ $_ => $this->{opt}{$_} }qw( user sudo ) );
    	%result = MYDan::Agent::Client->new( @{$sync->{src}}, @{$sync->{dst}} )
    	    ->run( %$opt, %{$sync->{agent}}, query => \%query );
    
        for my $node ( keys %result )
        {
            unless( $result{$node} =~ s/--- 0\n$// )
            {
                print "[warn]$node: $result{$node}\n";
            }
        }
    }

    my @failed = keys %failed;

    return wantarray ? @failed : \@failed;
}

1;



( run in 0.860 second using v1.01-cache-2.11-cpan-71847e10f99 )