#!/usr/bin/perl
#   rsync.pl
# syncronizes $dest with newest subdir of $src (to save last backup).
# creates actuel name for subdir in destination.
# uses hard links to last saved subdir in destination to save space.
# uses format of date like c't backup "2008-12-16_12~35" for 
#   generating name of actuel backup-dir.
# 
# usage: perl rsync.pl
# 
# source, destination, logfile are hardlinked.
#
# 081216, 081219, 090114,

use strict;
use warnings;

# vars to customize
my $src="/media/sekr"; # should end with slash
my $dest="/media/hda6/sik/sekr";
my $options="-av --progress " ;    # options for rsync
#my $options="-avn --progress " ;   # dry run
my $rsync="rsync";     # sync-prg
my $log="/home/gerd/log/rsync.log"; # logging

my ( @directories, $linkdir, $newdir, $command );
$src = push_slash($src);     # $src must end with slash
$src .= search_newest_dir($src) ; # searches for newest subdir
$src = push_slash($src);     # $src must end with slash
$dest = push_slash($dest);   # $dest must end with slash
$newdir = &create_dirname() ;
$log = "${log}.$newdir" ;
$newdir = $dest . $newdir ;


# $linkdir: last created DIR in $dest, maybe undefined for the first time
$linkdir = $dest . search_newest_dir($dest) ; 
if( -e $linkdir ) { 
	$options .= " --link-dest=$linkdir";
}
if( ! (mkdir $newdir) ) { die "could not create $newdir, $!"; }
$command="$rsync $options $src $newdir";
system("echo >> $log");
system("echo -- begin >> $log");
system("date >> $log");
system("echo command: $command >> $log"); # make bkup
system("$command >> $log");
system("echo -- end >> $log");
system("echo >> $log");
system("less $log");  # read log-file

sub create_dirname {
	my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime();
	my $newdir =  sprintf("%d-%02d-%02d_%02d~%02d",$year+1900,$mon+1,$mday,$hour,$min);
	return $newdir ;
}

sub search_newest_dir {
	my ($dest) = (@_ );
	my ( @directories );
	
	opendir(IN,"$dest") or die "could not open $dest, $!\n";
	while ( my $dat = readdir(IN) ) {
		push(@directories,$dat) if( -d "$dest/$dat" && $dat =~ /^\d{4}-\d{2}-\d{2}_\d{2}~\d{2}$/ );
	}
	closedir(IN);
	@directories = reverse sort @directories;
	if ( $#directories == -1 ) { return ""; }
	else { return ($directories[0]);	}
}

sub push_slash {
	my ($str) = (@_) ;
	if( $str =~ m#.*[^/]$# ) { return($str .= "/");  }
}

