<?php define("BIN_MYSQLDUMP", "/usr/local/bin/mysqldump"); define("BIN_TAR", "/usr/local/bin/gtar"); define("BIN_CP", "/bin/cp"); define("MYSQL_ROOT_PASSWORD", "myrootpassword"); define("BACKUP_INCLUDE", "/root/etc/backup.include"); define("BACKUP_EXCLUDE", "/root/etc/backup.exclude"); define("BACKUP_LOCATION", "/var/backup");
function usage(){ echo "Usage: backup.php [--init]\n"; echo "Create backup for today if no parameters are passed.\n"; echo "--init Creates all backups from the beginig of the month until today\n"; exit(); }
function mysql_dump(){ exec(BIN_MYSQLDUMP . " -u root -A -p" . MYSQL_ROOT_PASSWORD . " > /var/sqldumps/mysql_backup.sql"); }
function copy_snar($snar_old, $snar_new){ exec(BIN_CP . " /var/backup/$snar_old /var/backup/$snar_new"); }
function tar_exec($archive_name, $snar_name){ exec(BIN_TAR . " --create \ --gunzip \ --exclude-from=" . BACKUP_EXCLUDE . " \ --files-from=" . BACKUP_INCLUDE . " \ --file=" . BACKUP_LOCATION . "/$archive_name \ --listed-incremental=" . BACKUP_LOCATION . "/$snar_name"); }
function backup($date = false){ if ($date == false) { $date = date('d'); }
// get the day of the week $day = date('N', mktime(0, 0, 1, date('m'), $date));
// get the first friday $first_day_of_the_month = date('j', mktime(0, 0, 0, date('m'), 1)); switch (date('N', mktime(0, 0, 1, date('m'), $first_day_of_the_month))){ case 1: $number_of_days_to_friday = 4; break; case 2: $number_of_days_to_friday = 3; break; case 3: $number_of_days_to_friday = 2; break; case 4: $number_of_days_to_friday = 1; break; case 5: $number_of_days_to_friday = 0; break; case 6: $number_of_days_to_friday = 6; break; case 7: $number_of_days_to_friday = 5; break; } $first_friday = $first_day_of_the_month + $number_of_days_to_friday;
// get the week $first_week = date('W', mktime(0, 0, 0, date('m'), $first_friday)); $todays_week = date('W', mktime(0, 0, 0, date('m'), $date)); $week = $todays_week - $first_week + 1;
// callculate the tar level $level = $week; if ($day == 5){ $level = $level - 1; }elseif ($week == 1){ $level = 5; }
$archive_name = date('Ymd', mktime(0, 0,0 , date('m'), $date)) . '.' . $level . '.tar.gz'; $snar_name = $level . '.snar';
// copy snar files only on monday and friday if ($day == 1) { $snar_old_name = $level - 2 . '.snar'; copy_snar($snar_old_name, $snar_name);
}else if ($day == 5 && $first_friday != $date) {
$snar_old_name = $level - 1 . '.snar'; copy_snar($snar_old_name, $snar_name); }
// create archives only in working days if ($day >= 1 && $day <= 5) { tar_exec($archive_name, $snar_name); } }
// start if (isset($argv[1]) && $argv[1] == '--init') { mysql_dump();
$first_day_of_the_month = date('j', mktime(0, 0, 0, date('m'), 1)); switch (date('N', mktime(0, 0, 1, date('m'), $first_day_of_the_month))){ case 1: $number_of_days_to_friday = 4; break; case 2: $number_of_days_to_friday = 3; break; case 3: $number_of_days_to_friday = 2; break; case 4: $number_of_days_to_friday = 1; break; case 5: $number_of_days_to_friday = 0; break; case 6: $number_of_days_to_friday = 6; break; case 7: $number_of_days_to_friday = 5; break; } $first_friday = $first_day_of_the_month + $number_of_days_to_friday;
for ($i = $first_friday; $i <= date('j'); $i++){ backup($i); } }else if (!isset($argv[1])) { mysql_dump(); backup(); }else { usage(); }
|