aboutsummaryrefslogtreecommitdiff
path: root/lib/App
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-02-25 15:07:50 +0200
committerSergey Poznyakoff <gray@gnu.org>2018-02-25 15:07:50 +0200
commitf25b98d6b4080b9caad8ca586fc20483aac68a3b (patch)
treedc7ca0516e5a9be14d5c033721c3de349ffa4864 /lib/App
parent28655b98c82bdb86427a282c31469ca291955a98 (diff)
downloadglacier-f25b98d6b4080b9caad8ca586fc20483aac68a3b.tar.gz
glacier-f25b98d6b4080b9caad8ca586fc20483aac68a3b.tar.bz2
Organizational changes
* LICENSE: New file. * glacier: Move main functionality to App::Glacier. * lib/App/Glacier.pm: Move code here. * lib/App/Glacier/Config.pm: Use warnings. * lib/App/Glacier/Config/Locus.pm: Likewise.
Diffstat (limited to 'lib/App')
-rw-r--r--lib/App/Glacier.pm423
-rw-r--r--lib/App/Glacier/Config.pm1
-rw-r--r--lib/App/Glacier/Config/Locus.pm1
3 files changed, 425 insertions, 0 deletions
diff --git a/lib/App/Glacier.pm b/lib/App/Glacier.pm
index c9b7629..7cacd4a 100644
--- a/lib/App/Glacier.pm
+++ b/lib/App/Glacier.pm
@@ -3,3 +3,426 @@ use strict;
use warnings;
use File::Basename;
use Net::Amazon::Glacier;
+use Getopt::Long qw(GetOptionsFromArray :config gnu_getopt no_ignore_case require_order);
+use Pod::Usage;
+use Pod::Man;
+use App::Glacier::Command;
+use File::Basename;
+
+our $VERSION = '1.00';
+
+
+my %comtab = (
+ mkvault => sub {
+ require App::Glacier::Command::CreateVault;
+ return new App::Glacier::Command::CreateVault(@_);
+ },
+ ls => sub {
+ require App::Glacier::Command::ListVault;
+ return new App::Glacier::Command::ListVault(@_);
+ },
+ sync => sub {
+ require App::Glacier::Command::Sync;
+ return new App::Glacier::Command::Sync(@_);
+ },
+ put => sub {
+ require App::Glacier::Command::Put;
+ return new App::Glacier::Command::Put(@_);
+ },
+ rmvault => sub {
+ require App::Glacier::Command::DeleteVault;
+ return new App::Glacier::Command::DeleteVault(@_);
+ },
+ rm => sub {
+ require App::Glacier::Command::DeleteFile;
+ return new App::Glacier::Command::DeleteFile(@_);
+ },
+ purge => sub {
+ require App::Glacier::Command::Purge;
+ return new App::Glacier::Command::Purge(@_);
+ },
+ get => sub {
+ require App::Glacier::Command::Get;
+ return new App::Glacier::Command::Get(@_);
+ },
+ jobs => sub {
+ require App::Glacier::Command::Jobs;
+ return new App::Glacier::Command::Jobs(@_);
+ }
+);
+
+sub getcom {
+ my ($com, %args) = @_;
+
+ while (defined($comtab{$com}) and ref($comtab{$com}) ne 'CODE') {
+ $com = $comtab{$com};
+ }
+ die "internal error: unresolved command alias" unless defined $com;
+ return &{$comtab{$com}}(%args) if defined $comtab{$com};
+
+ my @v = map { /^$com/ ? $_ : () } sort keys %comtab;
+ if ($#v == -1) {
+ usage_error("unrecognized command");
+ } elsif ($#v > 0) {
+ usage_error("ambiguous command: ".join(', ', @v));
+ }
+ return getcom($v[0]);
+}
+
+sub new {
+ my $class = shift;
+
+ my %args;
+
+ GetOptions("hhh|?" => sub {
+ pod2usage(-message => pod_usage_msg(),
+ -exitstatus => EX_OK);
+ },
+ "help" => sub {
+ pod2usage(-exitstatus => EX_OK, -verbose => 2);
+ },
+ "usage" => sub {
+ pod2usage(-exitstatus => EX_OK, -verbose => 0);
+ },
+ "debug|d" => sub { $args{debug}++ },
+ "dry-run|n" => sub { $args{dry_run} = 1 },
+ "config-file|f=s" => sub { $args{config} = $_[1] },
+ "account=s" => sub { $args{account} = $_[1] },
+ "region=s" => sub { $args{region} = $_[1] }
+ ) or exit(EX_USAGE);
+
+ usage_error "no command name" unless @ARGV;
+ usage_error "no command given" if $#ARGV == -1;
+
+ getcom(shift @ARGV, %args);
+}
+__END__
+=head1 NAME
+
+glacier - command line utility for accessing Amazon Glacier storage
+
+=head1 SYNOPSIS
+
+B<glacier>
+[B<-?dn>]
+[B<-f> I<FILE>]
+[B<--account=>I<STRING>]
+[B<--config-file=>I<FILE>]
+[B<--debug>]
+[B<--dry-run>]
+[B<--help>]
+[B<--region=>I<STRING>]
+[B<--usage>]
+I<COMMAND> [I<OPTIONS>] I<ARG>...
+
+=head1 DESCRIPTION
+
+Command line tool for working with the Amazon Glacier storage. The I<COMMAND>
+instructs it what kind of manipulation is required. Its action can be
+modified by I<OPTIONS> supplied after the command name. Options occurring
+before it, affect the behavior of the program as a whole and are common
+for all commands.
+
+The following is a short summary of existing commands. For a detailed
+description about any particular I<command>, please refer to the
+corresponding manual page (B<glacier-I<command>>), or run
+B<glacier I<command> --help>.
+
+=head2 On file versioning
+
+In the discussion below, I<FILE> stands for the name of the file to which
+the command in question applies. In contrast to the UNIX filesystem, where
+each file name is unique within the directory, B<Glacier> vaults can keep
+multiple copies of the same file. To discern between them, the I<version
+number> is used. When a file B<FILE> is first stored in a vault, it is
+assigned version number B<1>. The version numbed of this copy is incremented
+each time a new copy of the same file is added to the vault. The most recently
+stored copy always has the version number of B<1>.
+
+Each command by default operates on the most recent copy of the file, i.e.
+the one with the version number B<1>. To address a particular version of the
+file, append the version number to its name with a semicolon in between. For
+example, to list B<FILE>, version B<3>, do:
+
+ glacier ls vault 'FILE;3'
+
+Notice the use of quotes to prevent C<;> from being interpreted by the shell.
+
+=head1 COMMANDS
+
+=head2 glacier get I<VAULT> I<FILE> [I<LOCALNAME>]
+
+Download I<FILE> from the I<VAULT>. The I<LOCALNAME> argument, if present,
+gives the name of the local file.
+
+=head2 glacier jobs [I<VAULT>...]
+
+List Glacier jobs.
+
+=head2 glacier ls [I<VAULT>] [I<FILES>...]
+
+Without arguments, lists all existing vaults. With one argument, lists files
+in the specified vault. If additional arguments are given, only files with
+matching names will be listed.
+
+=head2 glacier mkvault I<NAME>
+
+Creates a vault with given I<NAME>.
+
+=head2 glacier purge I<VAULT>
+
+Removes all archives from the vault.
+
+=head2 glacier put I<VAULT> I<FILE> [I<REMOTENAME>]
+
+Uploads I<FILE> to I<VAULT>. The I<REMOTENAME>, if supplied, gives the
+new name for the uploaded copy of file. If absent, the base name of I<FILE>
+is used.
+
+=head2 glacier rm I<VAULT> I<FILE>...
+
+Removes files from the vault.
+
+=head2 glacier rmvault I<NAME>
+
+Removes the vault. It must be empty for the command to succeed.
+
+=head2 glacier sync I<VAULT>
+
+Synchronizes the local vault directory with its latest inventory.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-?>
+
+Displays short option summary.
+
+=item B<--account=>I<STRING>
+
+Sets account ID to use. See B<Multiple accounts>, below.
+
+=item B<-f>, B<--config-file=>I<FILE>
+
+Sets the name of the configuration file to use. In the absense of this
+option, the environment variable B<GLACIER_CONF> is consulted. If it
+is not set, the default file F</etc/glacier.conf> is read. See
+the section B<CONFIGURATION> for its description.
+
+=item B<-d>, B<--debug>
+
+Increases debug output verbosity level.
+
+=item B<-n>, B<--dry-run>
+
+Dry run mode: do nothing, print everything.
+
+=item B<--help>
+
+Display the detailed help page.
+
+=item B<--region=>I<STRING>
+
+Sets the avaialbility region.
+
+=item B<--usage>
+
+Displays a succint command line usage summary,
+
+=back
+
+=head1 CONFIGURATION
+
+Default configuration file is F</etc/glacier.conf>. Its location is
+overridden by the value of the command line option B<--config-file> (B<-c>)
+and the environment variable B<GLACIER_CONF>. The option takes precedence
+over the variable.
+
+Configuration file consists of statements in the form
+I<variable> B<=> I<value>), grouped into sections. Whitespace is ignored,
+except that it serves to separate input tokens. However, I<value> is read
+verbatim, including eventual whitespace characters that can appear within it.
+
+The following sections are recognized:
+
+=over 4
+
+=item B<[glacier]>
+
+Configures access to the Glacier service. The following keywords are defined:
+
+=over 8
+
+=item B<credentials => I<FILE>
+
+Sets the name of the credentials file. See below for a detailed discussion.
+
+=item B<access => I<KEYNAME>
+
+Defines Amazon access key or access ID for look up in the credentials file.
+
+=item B<secret => I<SECRET>
+
+Sets the secret key. The use of this statement is discouraged for
+security reason.
+
+=item B<region => I<NAME>
+
+Sets the Amazon region.
+
+=back
+
+The preferred way for storing credentials is in the I<credentials file>. This
+file allows you to store all security sensitive data in a single place and to
+tighten permissions accordingly. In the simplest case, this file contains a
+single line with your access and secret keys separated by a semicolon, e.g.:
+
+ AEBRGYTEBRET:RTFERYABNERTYR4HDDHEYRTWW
+
+Additionally, the default region can be specified after a second semicolon:
+
+ AEBRGYTEBRET:RTFERYABNERTYR4HDDHEYRTWW:us-west-1
+
+The default region is B<eu-west-1>.
+
+=item Multiple accounts
+
+If you have several accounts, you can list their credentials on separate lines.
+In that case, B<glacier> will select the account with the access key supplied
+by the B<access> configuration statement, or the B<--account> command line
+option. If neither of these are supplied, the first account in the file will
+be used.
+
+To further facilitate selection of the credential pair, each line can be tagged
+with the line B<#:I<NAME>> immediately preceding it. In that case, the I<NAME>
+can be used to select it using the B<--account> option or B<access> configuration statement.
+
+Apart from these constructs, the credentials file can contain empty lines and
+comments (lines beginning with B<#> followed by any character, except B<:> ),
+which are ignored.
+
+=item B<[transfer]>
+
+Configures transfer values. The section name can be optionally followed
+by B<upload> or B<download> to indicate that it applies only to transfers
+in that particular direction.
+
+=over 8
+
+=item B<single-part-size => I<SIZE>
+
+Defines the maximum size for single-part transfers. Archives larger than
+I<SIZE> will be transferred using multiple-part procedure. I<SIZE> must
+be a number, optionally followed by one of the following suffixes: B<K>,
+for kilobytes, B<M>, for megabytes, or B<G> for gigabytes. Suffixes are
+case-insensitive. The default is B<100M>.
+
+=item B<jobs => I<NUMBER>
+
+Sets the number of transfers running in parallel, if multi-part transfer is
+selected. The default value is 16.
+
+=item B<retries => I<NUMBER>
+
+Sets the number of retries for failed transfers. Defaults to 10.
+
+=back
+
+=item B<[database job]>
+
+Configures the I<job database>. Job database is a local GDBM file, which
+B<glacier> uses to keep track of the initiated Amazon Glacier jobs.
+
+=over 8
+
+=item B<file => I<NAME>
+
+Defines the database file name. The default is F</var/lib/glacier/job.db>.
+
+=item B<mode => I<OCTAL>
+
+Defines the file permissions. It is used if the database does not exist and
+B<glacier> has to create it. The default value is 644.
+
+=item B<ttl => I<NUMBER>
+
+Interval in seconds after which the completed job will be checked to ensure
+it has not expired. Default is 72000 seconds (20 hours).
+
+=back
+
+=item B<[database inv]>
+
+Configures B<inventory databases>. Inventory databases associate file names
+with the corresponding Glacier archives and keep additional bookkeeping
+information.
+
+=over 8
+
+=item B<directory => I<DIR>
+
+Directory where to place the databases. The default is F</var/lib/glacier/inv>.
+
+=item B<mode => I<OCTAL>
+
+File mode for creating missing databases. The default value is 644.
+
+=item B<ttl => I<NUMBER>
+
+Interval in seconds after which the completed inventory will be checked to
+ensure it has not expired. Default is 72000 seconds (20 hours).
+
+=back
+
+=back
+
+=cut
+
+=head1 FILES
+
+=over 4
+
+=item F</etc/glacier.conf>
+
+Default configuration file.
+
+=item F</var/lib/glacier/job.db>
+
+Default job database name,
+
+=item F</var/lib/glacier/inv/I<VAULT>.db>
+
+Inventory database for the I<VAULT>.
+
+=back
+
+=head1 SEE ALSO
+
+B<glacier-get>(1),
+B<glacier-jobs>(1),
+B<glacier-ls>(1),
+B<glacier-mkvault>(1),
+B<glacier-purge>(1),
+B<glacier-put>(1),
+B<glacier-rm>(1),
+B<glacier-rmvault>(1),
+B<glacier-sync>.
+
+=head1 LICENSE
+
+GPLv3+: GNU GPL version 3 or later, see
+<http://gnu.org/licenses/gpl.html>
+
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+=head1 AUTHOR
+
+Sergey Poznyakoff <gray@gnu.org>
+
+=cut
+
+
+
+
diff --git a/lib/App/Glacier/Config.pm b/lib/App/Glacier/Config.pm
index 0d6879e..6cacf9c 100644
--- a/lib/App/Glacier/Config.pm
+++ b/lib/App/Glacier/Config.pm
@@ -17,6 +17,7 @@
package App::Glacier::Config;
use strict;
+use warnings;
use Carp;
use File::stat;
use Storable qw(retrieve store);
diff --git a/lib/App/Glacier/Config/Locus.pm b/lib/App/Glacier/Config/Locus.pm
index 605a525..0617f06 100644
--- a/lib/App/Glacier/Config/Locus.pm
+++ b/lib/App/Glacier/Config/Locus.pm
@@ -1,6 +1,7 @@
package App::Glacier::Config::Locus;
use strict;
+use warnings;
use Carp;
require Exporter;

Return to:

Send suggestions and report system problems to the System administrator.