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 )