App-MtAws
view release on metacpan or search on metacpan
lib/App/MtAws.pm view on Meta::CPAN
my ($src, $vault, $journal);
my $maxchildren = 4;
my $config = {};
my $config_filename;
my $res = App::MtAws::ConfigDefinition::get_config()->parse_options(@ARGV);
my ($action, $options) = ($res->{command}, $res->{options});
if ($res->{warnings}) {
while (@{$res->{warnings}}) {
my ($warning, $warning_text) = (shift @{$res->{warnings}}, shift @{$res->{warning_texts}});
print STDERR "WARNING: $warning_text\n";
}
}
if ($res->{error_texts}) {
for (@{$res->{error_texts}}) {
print STDERR "ERROR: ".$_."\n";
}
die exception cmd_error => 'Error in command line/config'
}
if ($action ne 'help' && $action ne 'version') {
$PerlIO::encoding::fallback = Encode::FB_QUIET;
binmode STDERR, ":encoding($options->{'terminal-encoding'})";
binmode STDOUT, ":encoding($options->{'terminal-encoding'})";
}
my %journal_opts = ( journal_encoding => $options->{'journal-encoding'} );
if ($action eq 'sync') {
die "Not a directory $options->{dir}" unless -d binaryfilename $options->{dir};
my $j = App::MtAws::Journal->new(%journal_opts, journal_file => $options->{journal}, root_dir => $options->{dir},
filter => $options->{filters}{parsed}, leaf_optimization => $options->{'leaf-optimization'}, follow => $options->{'follow'});
require App::MtAws::Command::Sync;
check_module_versions;
App::MtAws::Command::Sync::run($options, $j);
} elsif ($action eq 'upload-file') {
defined(my $relfilename = $options->{relfilename})||confess;
my $partsize = delete $options->{partsize};
my $j = App::MtAws::Journal->new(%journal_opts, journal_file => $options->{journal});
with_forks 1, $options, sub {
$j->read_journal(should_exist => 0);
## no Test::Tabs
die <<"END"
File with same name already exists in Journal.
In the current version of mtglacier you are disallowed to store multiple versions of same file.
Multiversion will be implemented in the future versions.
END
if (defined $j->{journal_h}->{$relfilename});
## use Test::Tabs
if ($options->{'data-type'} ne 'filename') {
binmode STDIN;
check_stdin_not_empty(); # after we fork, but before we touch Journal for write and create Amazon Glacier upload id
}
$j->open_for_write();
my $ft = ($options->{'data-type'} eq 'filename') ?
App::MtAws::QueueJob::Upload->new(
filename => $options->{filename}, relfilename => $relfilename,
partsize => ONE_MB*$partsize, delete_after_upload => 0) :
App::MtAws::QueueJob::Upload->new(
stdin => 1, relfilename => $relfilename,
partsize => ONE_MB*$partsize, delete_after_upload => 0);
my ($R) = fork_engine->{parent_worker}->process_task($ft, $j);
die unless $R;
$j->close_for_write();
}
} elsif ($action eq 'purge-vault') {
my $j = App::MtAws::Journal->new(%journal_opts, journal_file => $options->{journal}, filter => $options->{filters}{parsed});
with_forks !$options->{'dry-run'}, $options, sub {
$j->read_journal(should_exist => 1);
my $archives = $j->{archive_h};
if (scalar keys %$archives) {
if ($options->{'dry-run'}) {
for (keys %$archives) {
print "Will DELETE archive $_ (filename $archives->{$_}{relfilename})\n"
}
} else {
$j->open_for_write();
my @filelist = map { {archive_id => $_, relfilename =>$archives->{$_}->{relfilename} } } keys %{$archives};
my $ft = App::MtAws::QueueJob::Iterator->new(iterator => sub {
if (my $rec = shift @filelist) {
return App::MtAws::QueueJob::Delete->new(
relfilename => $rec->{relfilename}, archive_id => $rec->{archive_id},
);
} else {
return;
}
});
my ($R) = fork_engine->{parent_worker}->process_task($ft, $j);
die unless $R;
$j->close_for_write();
}
} else {
print "Nothing to delete\n";
}
}
} elsif ($action eq 'restore') {
my $j = App::MtAws::Journal->new(%journal_opts, journal_file => $options->{journal}, root_dir => $options->{dir}, filter => $options->{filters}{parsed}, use_active_retrievals => 1);
confess unless $options->{'max-number-of-files'};
require App::MtAws::Command::Retrieve;
check_module_versions;
App::MtAws::Command::Retrieve::run($options, $j);
} elsif ($action eq 'restore-completed') {
my $j = App::MtAws::Journal->new(%journal_opts, journal_file => $options->{journal}, root_dir => $options->{dir}, filter => $options->{filters}{parsed});
lib/App/MtAws.pm view on Meta::CPAN
Common options:
--config - config file
--journal - journal file (append only)
--dir - source local directory
--vault - Glacier vault name
--concurrency - number of parallel workers to run
--max-number-of-files - max number of files to sync/restore
--protocol - Use http or https to connect to Glacier
--partsize - Glacier multipart upload part size
--filter --include --exclude - File filtering
--dry-run - Don't do anything
--token - to be used with STS/IAM
--timeout - socket timeout
Commands:
sync
--new --replace-modified --delete-removed - Sync modes
--leaf-optimization - Don't use directory hardlinks count when traverse.
--follow - Follow symbolic links
--detect treehash|mtime|mtime-or-treehash|mtime-and-treehash|always-positive|size-only
purge-vault
restore
restore-completed
--segment-size - Size for multi-segment download, in megabytes
check-local-hash
retrieve-inventory
--request-inventory-format - json or csv
download-inventory
--new-journal - Write inventory as new journal
create-vault VAULT-NAME
delete-vault VAULT-NAME
upload-file
--filename - File to upload
--set-rel-filename - Relative filename to use in Journal (if dir not specified)
--stdin - Upload from STDIN
--check-max-file-size - Specify to ensure there will be less than 10 000 parts
list-vaults
--format for-humans|mtmsg
version - prints debug information about software installed
Config format (text file):
key=YOURKEY
secret=YOURSECRET
# region: eu-west-1, us-east-1 etc
region=us-east-1
# protocol=http (default) or https
protocol=http
END
## use Test::Tabs
} elsif ($action eq 'version') {
check_all_dynamic_modules();
print "mt-aws-glacier version: $VERSION $VERSION_MATURITY\n";
print "Perl Version: $]\n";
print_system_modules_version();
} else {
die "Wrong usage";
}
}
sub check_stdin_not_empty
{
die "Empty input from STDIN - cannot upload empty archive"
if eof(STDIN); # we block until first byte arrive, then we put it back in to buffer
}
1;
( run in 2.510 seconds using v1.01-cache-2.11-cpan-0d23b851a93 )