@rem = '-*- Perl -*-'; @rem = ' @echo off perl -S %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 goto endofperl '; # INCREMENTAL BACKUP SCRIPT. # # Author: Toli Lerios use strict; use English; use File::Remove; use Net::SMTP; use Sys::Hostname; # Error checking. if (@ARGV!=0) { warn "\n"; warn "Usage: ",__FILE__,"\n"; die "\n"; } # Configuration. my($password)="Mykalani1"; my($rsync)="C:/Progra~1/cwRsync/bin/rsync.exe --exclude /public/Temp/"; my($src)="backups\@10.10.1.4::data/"; my($dst_root)="E:/backups/KServer"; my($max_copies)=30; my($smtp_host)="mondeo.websitewelcome.com"; my($email_self)="backups\@kalani.com"; my(@email_admins)= ("", "", ""); # Set to () to stop email notifications. my($host)=hostname(); # Ensure existence of subdirectories. my($files_dir)=$dst_root."/files"; mkdir($files_dir,0777) if (!(-e $files_dir)); my($log_dir)=$dst_root."/logs"; mkdir($log_dir,0777) if (!(-e $log_dir)); # Remove old backups (and associated logs). my(@old_backups)=sort(glob($files_dir."/*")); while (scalar(@old_backups)>=$max_copies) { my($old_backup)=shift(@old_backups); warn "Removing ".$old_backup."\n"; File::Remove::remove(\1,$old_backup); my($date)=($old_backup=~m@/([^/]+)$@); unlink($log_dir."/".$date.".txt"); } # Copy changed files. my($link_opt)=""; if (scalar(@old_backups)>0) { $link_opt="--link-dest=".pop(@old_backups)." "; } my($dum,$dum,$dum,$mday,$mon,$year)=localtime(); my($date)=sprintf("%04d_%02d_%02d",$year+1900,$mon+1,$mday); $ENV{"RSYNC_PASSWORD"}=$password; my($dst)=$files_dir."/".$date; $dst=~s@(\w):@/cygdrive/\1@; my($out)=$log_dir."/".$date."_".$host."_out.txt"; my($err)=$log_dir."/".$date."_".$host."_err.txt"; my($cmd)=$rsync." -v -a --delete ".$link_opt.$src." ".$dst. " 1>".$out." 2>".$err; warn "Running ".$cmd."\n"; system($cmd); if ((-s $err)==0) { unlink($err); } else { warn "Errors occured.\n"; if ($#email_admins>0) { warn "Sending error report.\n"; my($smtp)=Net::SMTP->new($smtp_host); $smtp->auth($email_self,$password); $smtp->mail($email_self); my($email_admin); foreach $email_admin (@email_admins) { $smtp->to($email_admin); } $smtp->data(); $smtp->datasend("From: Backup script <".$email_self.">\n"); $smtp->datasend("To: ".join(',',@email_admins)."\n"); $smtp->datasend("Subject: Nonempty KServer backup error log on ". $host."\n\n"); $smtp->datasend("Nonempty KServer backup error log on ". $host."\n\n"); open(ERR,"<".$err); while () { $smtp->datasend($_); } close(ERR); $smtp->dataend(); $smtp->quit(); } } die "Done.\n"; __END__ :endofperl