#! C:\Perl\bin # # use strict; use File::Copy; use File::Compare; #log file options my $logFile = 'backuper.log'; my $outputLog = checkLogFile($logFile) or die("Error opening log file -- $@"); my @exclusion_list = ('.', '..', 'My Music', 'New Folder'); my %directories = ( 'D:\Documents and Settings\jukeane\My Documents', 'U:\mydocs', 'D:\Documents and Settings\jukeane\Desktop\bin', 'U:\bin'); while ( (my $ldir, my $rdir) = each(%directories) ) { chdir $ldir or fatal_error("Couldn't change to $ldir"); if (! -d $rdir) { fatal_error("Couldn't open the remote directory $rdir"); } my $remoteFileName; my $tmpDirName; my $tmpRemDirName; read_copy($ldir, $rdir); } ###################### # SUBROUTINES # ###################### sub read_copy { my $local_dir = $_[0] or fatal_error("No local directory specified. $!"); my $remote_dir = $_[1] or fatal_error("No remote directory specified. $!"); if (! -d $remote_dir ) { mkdir($remote_dir) or fatal_error("Failed to create $remote_dir. $!"); } opendir(DIRHANDLE, $local_dir) || fatal_error("Cannot opendir $local_dir. $!"); foreach my $name (sort readdir(DIRHANDLE)) { if (! -d $name ) { my $remoteFileName = $remote_dir . '\\' . $name ; my $localFileName = $local_dir . '\\' . $name; if (! -d $remote_dir) { fatal_error("$remoteFileName doesn't seem to exist? $!"); } if (! -d $localFileName) { if ( checkBackup($localFileName, $remoteFileName) ) { copy("$localFileName", "$remoteFileName") or die qq(Cannot copy "$localFileName" to "$remoteFileName": $!) ; logIt("Backed up $localFileName to $remoteFileName"); } } elsif ( -d $localFileName && (! check_exclusion($name)) ) { my $tmpDirName = $local_dir . '\\' . $name; my $tmpRemDirName = $remote_dir . '\\' . $name; read_copy($tmpDirName, $tmpRemDirName); } } else { if (! check_exclusion($name) ) { my $dir1 = $local_dir . '\\' . $name; my $dir2 = $remote_dir . '\\' . $name; read_copy($dir1, $dir2); } } } closedir(DIRHANDLE); } sub checkBackup { my $file1 = $_[0] or fatal_error("Missing first file in checkBackup(). $!"); my $file2 = $_[1] or fatal_error("Missing second file in checkBackup(). $!"); #check to see if we should back these files up if (compare("$file1","$file2") == 0) { return 0; } else { return 1; } } sub check_exclusion { #checks the exclusion list for stuff not to copy my $file = $_[0]; foreach my $item (@exclusion_list) { if ($file eq $item) { return 1; } } return 0; } sub fatal_error { #die and log the error my $error_message = $_[0]; $error_message = "Fatal Error: " . $error_message; logIt($error_message); die ($error_message . "\n"); } ##################### # Logging # ##################### sub logIt { #logs errors. my $message = $_[0]; my @fullTime = localtime(time()); my $time = ($fullTime[5] + 1900) . "/" . (addZero($fullTime[4] + 1)) . "/"; $time .= addZero($fullTime[3]). " " . addZero($fullTime[2]) . ":"; $time .= addZero($fullTime[1]) . ":" . addZero($fullTime[0]); my $logMessage = $time . "> $message \n"; print $outputLog $logMessage; } sub checkLogFile { #checks the output files to make sure they're valid my $file = $_[0]; my $openFile; my $status = (stat($file))[7]; if (! $status) { $status = 0;} if ( $status != 0) { open($openFile, ">>" . $file) or die("Couldn't open log file for appending " . $file); return $openFile; } else { open($openFile, ">" . $file) or die("Couldn't create new log file " . $file); return $openFile; } } sub addZero { #formats output to double digit if (length($_[0]) < 2) { return "0" . $_[0]; } else { return $_[0]; } }