1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
#!/usr/bin/perl -w
use strict;
use diagnostics;
# Device that is the DVD drive
my $DVD=("/dev/hdc");
# Size of each slice - DVD max is 4482M
# MC - for testing
# my $SLICE_SIZE=("10M");
# my $SLICE_SIZE=("4400M"); # doesn't work
# BUG - Linux isofs limited to single files of 2^32=4096MB
# my $SLICE_SIZE=("4000M");
# value used by Daromizer is bigger than mine, use it
# my $SLICE_SIZE=("4189500K");
# need more space for parity data
my $SLICE_SIZE=("4000M");
# directory that all paths must be relative to
# NOTE - all backup paths are relative to this
my $ROOT_DIR=("/mnt/backup");
# where all created files will be stored
my $STORAGEDIR=("/mnt/backup/backups/");
# list of dirs to be backed up
# NOTE 1 - these are paths relative for $ROOT_DIR, above
# NOTE 2 - this is used for naming; everything after the last / is used
# for the base name. DO NOT have two things be the same (like /usr/bin and
# /usr/local bin). Otherwise, one will be overwritten
# MC for testing
# my @BACKUPDIRS=("test");
my @BACKUPDIRS=("local","home","pub");
# this the path to the slice as expressed in things that dar will
# substitute the right values for (it's just used in 2 places)
my $SLICE_PATH=("%p/%b.%N.%e");
my $SLICE_NAME=("%b.%N");
my $PARITY_PATH=("%p/%b.%N.par2");
# par2 creates a bunch of "vol" files, we need those too
my $PARITY_FILES=("%p/%b.%N.*.par2");
# list of stuff to be compressed. This must be in the form of
# -Z \"*.mask\"
# with -Z repeated for each one
my $NO_COMPRESS_LIST=("-Z \"*.gz\" -Z \"*.GZ\" -Z \"*.bz2\" -Z \"*.BZ2\" -Z \"*.zst\" -Z \"*.ZST\" -Z \"*.zip\" -Z \"*.ZIP\" -Z \"*.ogg\" -Z \"*.OGG\" -Z \"*.mp3\" -Z \"*.MP3\" -Z \"*.mpg\" -Z \"*.MPG\" -Z \"*.mpeg\" -Z \"*.MPEG\" -Z \"*.wmv\" -Z \"*.WMV\" -Z \"*.avi\" -Z \"*.AVI\" -Z \"*.jpg\" -Z \"*.JPG\" -Z \"*.jpeg\" -Z \"*.JPEG\" -Z \"*.png\" -Z \"*.PNG\" -Z \"*.gif\" -Z \"*.GIF\"");
my $PRE_PARITY_MESSAGE=("echo ; echo Caclulating parity information; echo");
my $PARITY_COMMAND=("par2create -r10 $PARITY_PATH $SLICE_PATH");
my $PRE_BLANK_MESSAGE=("echo ; echo Done archive, erasing DVD; echo");
my $BLANK_COMMAND=("dvd+rw-format -force /dev/hdc");
my $PRE_REC_MESSAGE=("echo ; echo Done erasing, burning to DVD; echo");
# Command to record the DVD, with options
# -dvd-compat = make the most compatible DVD by closing the session
# -Z = create a new session
# -r = generate sane rock ridge extensions
# -J = generate Joliet extensions
# -V = volume ID
# %b = dar will substitute the base name
# %N = dar will substitute the number of the slice
# %p = dar will substitute slice path
# FOR TESTING = -dry-run
my $RECORD_COMMAND=("growisofs -dvd-compat -Z $DVD -r -J -V $SLICE_NAME $SLICE_PATH $PARITY_PATH $PARITY_FILES");
my $EJECT_COMMAND=("eject $DVD");
my $POST_REC_MESSAGE=("echo ; echo Done burning $SLICE_NAME ; echo");
# deletes files once done with them
# note - use AFTER record command
# MC - for testing
# my $DELETE_COMMAND=("echo deleting $SLICE_PATH $PARITY_PATH $PARITY_FILES");
my $DELETE_COMMAND=("rm -f $SLICE_PATH $PARITY_PATH $PARITY_FILES");
# dar with basic options
# -y = compress with bzip2 using default compression of 6
# -s = slice it up
# -R = root dir that all things to be backed up live in
# -D = store empty directories too
# -p = pause and wait for user to change DVD before continuing
# -c (used below) = create an archive called whatever
# FOR TESTING = -e
my $DAR=("dar -y -s $SLICE_SIZE -R $ROOT_DIR -D $NO_COMPRESS_LIST -p -E \"$PRE_PARITY_MESSAGE ; $PARITY_COMMAND ; $PRE_BLANK_MESSAGE ; $BLANK_COMMAND ; $PRE_REC_MESSAGE ; $RECORD_COMMAND ; $EJECT_COMMAND ; $DELETE_COMMAND ; $POST_REC_MESSAGE\"");
&main;
sub main{
my $backup_base;
my $backupdir;
my ($day, $month, $year) = (localtime)[3,4,5];
$year+=1900; # compensate for 1900 based year
$month+=1; # compensate for base 0 months
my $targetbase;
my $pause; # garbage input...
foreach $backupdir (@BACKUPDIRS){
# this gets rid of paths and such from $backupdir, just in case
$backup_base=$backupdir;
$backup_base =~ s/^\///; # remove leading /
$backup_base =~ s/\w+\///g; # remove everything matching "someword/"
$targetbase=$STORAGEDIR.$backup_base."_".$month."_".$day."_".$year;
print("Working on $backup_base\n");
# MC for debugging
# print("Command is: $DAR $backupdir -c $targetbase");
system("$DAR $backup_base -c $targetbase");
print "Work on $backup_base complete. Change the DVD and\n";
print "press any key to continue...";
$pause = <STDIN>; #Like a PAUSE statement in DOS .bat files
}
}
|