# HG changeset patch # User Heiko Schlittermann # Date 1256767202 -3600 # Node ID ab747c27a38b47abadc982a8aa8d805749df537d # Parent dfda1573e706248a7ccc3aaa529ccabe535f2708 auto select log level diff -r dfda1573e706 -r ab747c27a38b ftbackup --- a/ftbackup Tue Oct 27 22:32:42 2009 +0100 +++ b/ftbackup Wed Oct 28 23:00:02 2009 +0100 @@ -8,6 +8,7 @@ use Perl6::Slurp; use Getopt::Long; use Sys::Hostname; +use Time::Local; use Pod::Usage; use POSIX qw(strftime);; use English qw(-no_match_vars); @@ -23,7 +24,7 @@ my $NODE = hostname; my $NOW = time(); -my $opt_level = 0; +my $opt_level = undef; my $opt_today = strftime("%F", localtime $NOW); my @opt_debug = (); my $opt_verbose = 0; @@ -34,6 +35,7 @@ sub get_configs(@); sub get_candidates(); sub verbose(@); +sub iso2epoch($); our @AT_EXIT; END { $_->() foreach @AT_EXIT }; @@ -90,10 +92,25 @@ verbose "Now in @{[$ftp->pwd]}.\n"; + # examine the situation and decide about the level + # FIXME: currently we simply run a full dump every FULL_CYCLE + # days, the intermediate dumps are level 1 + my @last; + foreach (reverse sort $ftp->ls) { + /^(?.*)\.(?\d+)$/; + $last[$+{level}] = $+{date}; + last if $+{level} == 0; + } + + if (not defined $opt_level) { + $opt_level = + ($NOW - iso2epoch $last[0])/86400 > $cf{FULL_CYCLE} ? 0 : 1; + } + my $file = strftime("%F_%R", localtime $NOW) . ".$opt_level"; my $label = "$NODE:" . basename($dev->{rdev}); - verbose "Working on $dev->{dev} as $dev->{rdev} on $dev->{mountpoint}, stored as $file\n"; + verbose "\tdumping $dev->{dev} as $dev->{rdev} on $dev->{mountpoint} to $file\n"; next if $opt_dry; ## complain if there is already a full backup in this @@ -187,6 +204,8 @@ # $dev does not have to contain the real device my $rdev = $dev; if ($dev ~~ /^(LABEL|UUID)=/) { + # NOTE: dump is able to handle LABEL=... too, but I think + # it's more easy for recovery to know the real device chomp($rdev = `blkid -c /dev/null -o device -t '$dev'`); } $rdev = readlink $rdev while -l $rdev; @@ -277,6 +296,15 @@ sub get_home { return $data{ref shift}{home} }; } +sub iso2epoch($) { + $_[0] =~ /(?\d+)\D(?\d+)\D(?\d+) + (?:\D(?\d\d)\D(?\d\d)(?:\D(?\d\d))?)?/x; + my %iso = ((sec => 0, min => 0, hour => 0), %+); + $iso{mon}--; + $iso{year} += 1900 if $iso{year} < 100; + return timelocal(@iso{qw/sec min hour mday mon year/}); +} + __END__ =head1 NAME @@ -308,7 +336,8 @@ =item B<-l>|B<--level> I The backup level. Level other than "0" needs a previous -level 0 (full) backup. (default: 0) +level 0 (full) backup. If not specified, it is choosen automagically. +(default: undef) =item B<-L>|B<--label> I