App-MBUtiny

 view release on metacpan or  search on metacpan

lib/App/MBUtiny/Storage/SFTP.pm  view on Meta::CPAN

    }
    my $name = $params{name}; # archive name
    my $file = $params{file}; # destination archive file path

    foreach my $storage ($self->sftp_storages) {
        my $url_wop = $storage->{url_wop};
        my $attr = $storage->{attr};
        my $path = $storage->{path};

        # Create object
        my $sftp = new Net::SFTP::Foreign(%$attr);
        if ($sftp->error) {
            $self->error(sprintf("Can't connect to %s: %s", $url_wop, $sftp->error));
            next;
        }

        # Change dir
        if (length($path)) {
            $sftp->setcwd($path) or do {
                $self->error(sprintf("Can't change directory %s on %s: %s", $path, $url_wop, $sftp->error));
                $sftp->disconnect;
                next;
            };
        }

        # Get file size
        my $src_size = 0;
        my $ls = $sftp->ls(wanted => sub {
            my $foreign = shift;
            my $entry = shift;
            S_ISREG($entry->{a}->perm) && $entry->{filename} eq $name;
        });
        if ($sftp->error) {
            $self->error(sprintf("The ls failed: %s", $sftp->error));
            $sftp->disconnect;
            next;
        } elsif ($ls && is_array($ls)) {
            my $file = shift(@$ls);
            $src_size = $file->{a}->size || 0;
        }

        # Get file
        $sftp->get($name, $file) or do {
            $self->error(sprintf("Can't get file %s from %s: %s", $name, $url_wop, $sftp->error));
            $sftp->disconnect;
            next;
        };

        # Check size
        my $dst_size = filesize($file) // 0;
        unless ($src_size == $dst_size) {
            $self->error(sprintf("An error occurred while sending data to %s. Sizes are different: SRC=%d; DST=%d", $url_wop, $src_size, $dst_size));
            $sftp->disconnect;
            next;
        }

        # Disconnect
        $sftp->disconnect;

        # Validate
        unless ($self->validate($file)) { # FAIL validation!
            $self->error(sprintf("SFTP storage %s failed: file %s is not valid!", $url_wop, $file));
            next
        }

        # Done!
        return $self->storage_status(STORAGE_SIGN, 1);
    }

    $self->storage_status(STORAGE_SIGN, 0);
    $self->maybe::next::method(%params);
}
sub del {
    my $self = shift;
    my $name = shift;
    $self->maybe::next::method($name);
    return $self->storage_status(STORAGE_SIGN, -1) if $self->storage_status(STORAGE_SIGN) <= 0; # SKIP and set SKIP
    my $status = 1;

    foreach my $storage ($self->sftp_storages) {
        my $url_wop = $storage->{url_wop};
        my $attr = $storage->{attr};
        my $path = $storage->{path};
        my $ostat = 1;

        # Create object
        my $sftp = new Net::SFTP::Foreign(%$attr);
        if ($sftp->error) {
            $self->error(sprintf("Can't connect to %s: %s", $url_wop, $sftp->error));
            $ostat = 0;
        }

        # Change dir
        if ($ostat && length($path)) {
            $sftp->setcwd($path) or do {
                $self->error(sprintf("Can't change directory %s on %s: %s", $path, $url_wop, $sftp->error));
                $ostat = 0;
            };
        }

        # Delete file
        if ($ostat) {
            my $ls = $sftp->ls(wanted => sub {
                my $foreign = shift;
                my $entry = shift;
                S_ISREG($entry->{a}->perm) && $entry->{filename} eq $name;
            });
            #print explain($ls), "\n";
            if ($sftp->error) {
                $self->error(sprintf("The ls failed: %s", $sftp->error));
                $ostat = 0;
            } elsif ($ls && is_array($ls) && @$ls) {
                $sftp->remove($name) or do {
                    $self->error(sprintf("Can't delete file %s from %s: %s", $name, $url_wop, $sftp->error));
                    $ostat = 0;
                };
            }
        }

        # Disconnect
        $sftp->disconnect;



( run in 0.485 second using v1.01-cache-2.11-cpan-39bf76dae61 )