# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1438099837 -7200 # Node ID 0d56836fdddcf6756dd797a9385cbe95aefbfc12 # Parent 7bbd7b8e1cbed839cd34fce34fe4344065df6377 Perltidy diff -r 7bbd7b8e1cbe -r 0d56836fdddc pg-backup --- a/pg-backup Tue Jul 28 18:10:08 2015 +0200 +++ b/pg-backup Tue Jul 28 18:10:37 2015 +0200 @@ -8,163 +8,172 @@ use File::Basename; use File::Spec::Functions; - use Data::Dumper; +use Data::Dumper; my $opt_tasks; my $opt_dry; -my $opt_keep = undef; +my $opt_keep = undef; my $opt_basedir = '.'; my $opt_min_age = txt2days('1d'); -my $dir_template = '$version-$cluster-$date'; # do not change! +my $dir_template = '$version-$cluster-$date'; # do not change! -delete @ENV{grep /^LC_/ => keys %ENV}; +delete @ENV{ grep /^LC_/ => keys %ENV }; exit main() if not caller; sub main { - GetOptions( - 'k|keep=i' => \$opt_keep, - 'd|basedir=s' => \$opt_basedir, - 'dry' => \$opt_dry, - 'min-age=s' => sub { $opt_min_age = txt2days($_[1]) }, - 'h|help' => sub { pod2usage(-verbose => 1, -exit => 0) }, - 'm|man' => sub { pod2usage(-verbose => 2, -exit => 0, - -noperldoc => system('perldoc -V >/dev/null 2>&1')) }, - ); + GetOptions( + 'k|keep=i' => \$opt_keep, + 'd|basedir=s' => \$opt_basedir, + 'dry' => \$opt_dry, + 'min-age=s' => sub { $opt_min_age = txt2days($_[1]) }, + 'h|help' => sub { pod2usage(-verbose => 1, -exit => 0) }, + 'm|man' => sub { + pod2usage( + -verbose => 2, + -exit => 0, + -noperldoc => system('perldoc -V >/dev/null 2>&1') + ); + }, + ); - my @clusters = ls_clusters(); + my @clusters = ls_clusters(); - # process the command line and get a list of tasks to do - my @tasks = map { - state $date = date(); - my $version = $_->{version}; - my $cluster = $_->{cluster}; - my $dirname = eval "\"$dir_template\""; - $_->{dirname} = catfile($opt_basedir, $dirname); - $_; - } sort do { - if (@ARGV) { - my $v = $ARGV[0]; - if (@ARGV > 1) { - my %h = map { $_->{cluster} => $_ } grep { $_->{version} eq $v } @clusters; - @h{@ARGV[1..$#ARGV]}; - } - else { - grep { $_->{version} eq $v } @clusters; - } - } - else { - grep { $_->{status} eq 'online' } @clusters; - } - }; + # process the command line and get a list of tasks to do + my @tasks = map { + state $date = date(); + my $version = $_->{version}; + my $cluster = $_->{cluster}; + my $dirname = eval "\"$dir_template\""; + $_->{dirname} = catfile($opt_basedir, $dirname); + $_; + } sort do { + if (@ARGV) { + my $v = $ARGV[0]; + if (@ARGV > 1) { + my %h = + map { $_->{cluster} => $_ } + grep { $_->{version} eq $v } @clusters; + @h{ @ARGV[1 .. $#ARGV] }; + } + else { + grep { $_->{version} eq $v } @clusters; + } + } + else { + grep { $_->{status} eq 'online' } @clusters; + } + }; - # now get the real jobe done - # run for all tasks, regardless of errors + # now get the real jobe done + # run for all tasks, regardless of errors - foreach my $task (@tasks) { + foreach my $task (@tasks) { - rmdir glob("$opt_basedir/*"); - mkdir $task->{dirname} - or die "$0: Can't mkdir $task->{dirname}: $!\n"; + rmdir glob("$opt_basedir/*"); + mkdir $task->{dirname} + or die "$0: Can't mkdir $task->{dirname}: $!\n"; - my @cmd = (pg_basebackup => - '--format' => 't', - '--xlog', - '--cluster' => $task->{name}, - '--pgdata' => $task->{dirname}, - '--gzip', - -t 0 ? '--progress' : ()); - - if ($opt_dry) { - print sprintf "%s %s\n", $task->{name}, "@cmd"; - $task->{exit} = 0; - next; - } + my @cmd = ( + pg_basebackup => '--format' => 't', + '--xlog', + '--cluster' => $task->{name}, + '--pgdata' => $task->{dirname}, + '--gzip', + -t 0 ? '--progress' : () + ); - system @cmd; - warn "$0: `@cmd` failed\n" if $?; - $task->{exit} = $?; - } + if ($opt_dry) { + print sprintf "%s %s\n", $task->{name}, "@cmd"; + $task->{exit} = 0; + next; + } - # check the results - - foreach my $task (@tasks) { - printf "%-10s %-20s %s\n", - $task->{exit} ? "FAIL:$task->{exit}" : 'OK', - $task->{cluster}, - $task->{dirname}; - } + system @cmd; + warn "$0: `@cmd` failed\n" if $?; + $task->{exit} = $?; + } + + # check the results + + foreach my $task (@tasks) { + printf "%-10s %-20s %s\n", + $task->{exit} ? "FAIL:$task->{exit}" : 'OK', + $task->{cluster}, + $task->{dirname}; + } - return 0 if not $opt_keep; + return 0 if not $opt_keep; - # care about the backups to keep, if everything went fine so far - rmdir glob "$opt_basedir/*"; # remove empty directories + # care about the backups to keep, if everything went fine so far + rmdir glob "$opt_basedir/*"; # remove empty directories + + foreach my $task (grep { !$_->{exit} } @tasks) { - foreach my $task (grep { !$_->{exit} } @tasks) { - # sorted list, from oldest to youngest backup - my @old = grep { -M > $opt_min_age } glob catfile $opt_basedir, do { - my $version = $task->{version}; - my $cluster = $task->{cluster}; - my $date = '*'; - eval "\"$dir_template\""; - }; + # sorted list, from oldest to youngest backup + my @old = grep { -M > $opt_min_age } glob catfile $opt_basedir, do { + my $version = $task->{version}; + my $cluster = $task->{cluster}; + my $date = '*'; + eval "\"$dir_template\""; + }; - if ($opt_keep <= @old) { - splice @old, -1 * $opt_keep; - foreach (@old) { - if ($opt_dry) { - print "would unlink $_\n"; - next; - } - unlink glob "$_/*.tar.gz"; - rmdir $_; - } - } - - } - + if ($opt_keep <= @old) { + splice @old, -1 * $opt_keep; + foreach (@old) { + if ($opt_dry) { + print "would unlink $_\n"; + next; + } + unlink glob "$_/*.tar.gz"; + rmdir $_; + } + } + + } + } sub date { - my @now = localtime; - sprintf '%4d-%02d-%02dT%02d-%02d-%02d', - $now[5]+1900, - $now[4]+1, - $now[3], - @now[reverse 0..2]; + my @now = localtime; + sprintf '%4d-%02d-%02dT%02d-%02d-%02d', + $now[5] + 1900, + $now[4] + 1, + $now[3], + @now[reverse 0 .. 2]; } sub ls_clusters { - my @clusters; + my @clusters; - foreach ( map { [(split)[0..3]]} `pg_lsclusters -h` ) { - push @clusters, { - name => "$_->[0]/$_->[1]", - version => $_->[0], - cluster => $_->[1], - port => $_->[2], - status => $_->[3], - }; - } - return @clusters; -}; + foreach (map { [(split)[0 .. 3]] } `pg_lsclusters -h`) { + push @clusters, + { + name => "$_->[0]/$_->[1]", + version => $_->[0], + cluster => $_->[1], + port => $_->[2], + status => $_->[3], + }; + } + return @clusters; +} sub txt2days { - local $_ = shift; - my $seconds; - if (/(\d+)w/) { $seconds += $1 * 604800; } - if (/(\d+)d/) { $seconds += $1 * 86400; } - if (/(\d+)h/) { $seconds += $1 * 3600; } - if (/(\d+)m/) { $seconds += $1 * 60; } - if (/(\d+)s?$/) { $seconds += $1; } - return $seconds/86400; + local $_ = shift; + my $seconds; + if (/(\d+)w/) { $seconds += $1 * 604800; } + if (/(\d+)d/) { $seconds += $1 * 86400; } + if (/(\d+)h/) { $seconds += $1 * 3600; } + if (/(\d+)m/) { $seconds += $1 * 60; } + if (/(\d+)s?$/) { $seconds += $1; } + return $seconds / 86400; } exit main() if not caller; - __END__ =head1 NAME