Skip to content

Instantly share code, notes, and snippets.

@bseib
Created April 20, 2015 14:54
Show Gist options
  • Save bseib/be02153a05a8239f4126 to your computer and use it in GitHub Desktop.
Save bseib/be02153a05a8239f4126 to your computer and use it in GitHub Desktop.
Script to backup filesystems everyday with a unix 'dump' command.
#!/usr/local/bin/perl -w
#
# $Id: system_backup,v 1.13 2006/09/15 02:48:23 bseib Exp $
##
# 'system_backup'
#
# Description: Run the unix 'dump' command on various filesystems, using a different
# dump level depending on the day of the month. Day 1 always gets a full
# level zero dump. A "towers of hanoi"-ish pattern is used for dump levels.
#
# Author: Broc Seib
#
# Date: Thu Apr 1 21:21:12 EST 1999
##
##
# This is a one month schedule
##
my @SCHED = qw (
0 7 6 9 8
2 7 6 9 8
4 7 6 9 8
1 7 6 9 8
3 7 6 9 8
5 7 6 9 8 9
);
##
# These are the filesystems to backup. Add/remove filesystems as needed.
##
my @FS = qw (
/ /var /usr /home /opt /xyz
);
my $BACKUP_TO = {
'/' => '/backup',
'/var' => '/backup',
'/usr' => '/backup',
'/home' => '/backup',
'/opt' => '/backup',
'/xyz' => '/backup',
'_default_' => '/backup',
};
my $t = time;
my $opt_l = undef;
if ( @ARGV ) {
if ( $ARGV[0] eq '-l' and @ARGV >= 2 ) {
shift @ARGV; ## ditch -l
$opt_l = shift @ARGV;
if ( $opt_l =~ m/\d/ ) {
## must only be a single digit
print "forcing a level $opt_l backup.\n";
} else {
$opt_l = undef;
}
}
if ( @ARGV ) {
@FS = @ARGV;
}
}
#for (0..1000) { ## for testing
my($d,$m,$y) = (localtime($t))[3,4,5]; ## months are zero-based
$y += 1900;
my $date = sprintf("%04d%02d%02d",$y,$m+1,$d);
my $is_leap = ($y%4)?0:($y%100)?1:($y%400)?0:1;
my @DPM = qw ( 31 28 31 30 31 30 31 31 30 31 30 31 );
$DPM[1] += $is_leap;
$d -= 1; ## make day of month zero-based
my $i = $d; ## compute index into schedule.
my $level;
if ( defined($opt_l) ) {
$level = $opt_l;
print "did override of level\n";
} else {
$level = $SCHED[$i];
}
$level =~ s/\D//g; ## guarantee numbers only
print "$date index=$i, dumplevel=$level\n";
my $filesystem;
for $filesystem (@FS) {
my $fsname = $filesystem;
$fsname = 'root' if ($fsname eq '/');
$fsname =~ s#^/##;
my $backto;
if ( exists ($BACKUP_TO->{$filesystem}) ) {
$backto = $BACKUP_TO->{$filesystem};
} else {
$backto = $BACKUP_TO->{'_default_'};
}
my $file = "$backto/$fsname.$level";
my $cmd = "/bin/rm -rf $file";
print "$cmd\n";
system($cmd);
$cmd = "/sbin/dump -${level}ua -L -f $file $filesystem";
print "$cmd\n";
system($cmd);
# $cmd = "/usr/bin/gzip -f $file";
# print "$cmd\n";
# system($cmd);
}
#$t+=86400; ## for testing
#} ## for testing
##
# EOF
##
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment