#!/usr/bin/perl # # Created by Brandon Gillespie # Additional work by Vang (Dale Mayberry) # # if (fork()) { exit(); } # ## This creates a FIFO list of backups based off your configuration, ## it can do regular, weekly and monthly backups, with the intervals ## and depth of the FIFO list defined by you. # Setup: # Create a directory called "dbbin" off of your would directory. Put this # script in the directory and make it executable. Add the file # "timestamps" to the "logs" directory. Put four "0" (zeros) in the file, # one per line. # # check the following variables and make sure they are appropriate to # your system. $base = "~/cold"; $logs = "${base}/logs"; $bdir = "${base}/backups"; # change these if you dont want to daily/weekly/monthly backups $do_monthly = 1; $do_weekly = 1; $do_daily = 1; # shift the FIFO list every hour, backups before the hour is up will # simply update the most recent backup, they will not shift the list $regular_interval = 3600; $daily_interval = 86400; $weekly_interval = 604800; $monthly_interval = 2629728; # how many increments do you want to keep in the various backups? $regular_FIFO = 23; $daily_FIFO = 6; $weekly_FIFO = 4; $monthly_FIFO = 12; ## ## you shouldn't have to change anything beyond here ## ## figure out the last time we did stuff open(TMP, "$logs/timestamps") || exit; $last = <TMP>; $last = int($last); $daily = <TMP>; $daily = int($daily); $week = <TMP>; $week = int($week); $month = <TMP>; $month = int($month); close(TMP); ## setup some basic vars ($l_sec,$l_min,$l_hour,$l_mday,$l_mon,$l_year,$l_wday,$l_yday) = localtime(); ($time) = time(); @days = ("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); @months = ("Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"); $day = "$l_mday$months[$l_mon]$l_year"; ## zip up the current backup rename("binary.bak", "binary-${day}"); system("tar", "-cf", "binary-${day}.tar", "binary-${day}"); system("gzip", "-9f", "binary-${day}.tar"); system("rm", "-rf", "binary-${day}"); ## regular FIFO shuffle, give it 100 seconds leeway if (($last + $regular_interval) <= ($time + 100)) { &backup($regular_FIFO, ""); $last = $time; } ## daily FIFO shuffle, give it 100 seconds leeway if ($do_daily && (($daily + $daily_interval) <= ($time + 700))) { &backup($daily_FIFO, "DAILY"); $daily = $time; } ## weekly FIFO shuffle, give it 100 seconds leeway per day (700 total) if ($do_weekly && (($week + $weekly_interval) <= ($time + 700))) { &backup($weekly_FIFO, "WEEKLY"); $week = $time; } ## monthly FIFO shuffle, give it 700 seconds leeway if ($do_monthly && (($month + $monthly_interval) <= ($time + 700))) { &backup($monthly_FIFO, "MONTHLY"); $month = $time; } ## write out the new timestamp if (open(TMP, ">$logs/timestamps")) { print TMP <<END; $last $daily $week $month END close(TMP); } sub backup { ($top, $suffix) = @_; for $x (0 .. ($top - 1)) { $b = $top - $x; $a = $b - 1; rename("${bdir}/binary-${a}${suffix}.tar.gz", "${bdir}/binary-${b}${suffix}.tar.gz"); } system("/bin/cp", "binary-${day}.tar.gz", "${bdir}/binary-1${suffix}.tar.gz"); }