#!/usr/local/bin/perl -s # pudgebackup # requires MacOSX::File and psync # I use in cron like so: # 0 5 * * * perl /Users/pudge/bin/pudgebackup >/tmp/pudgebackup_log 2>/tmp/pudgebackup_log_err use warnings; use strict; use File::Path; our($n, $v, $q); # put all AFP network volumes to mount here my @volumes = ( # ['server.local', 'MyVolume', 'user', 'pass'] ); # source directories go here ... my @sources = ( '/Users/pudge', '/usr/local' ); # ... and corresponding targets go here my @targets = ( map { "/Volumes/MyVolume/MyBackups/$_" } qw(pudge local), ); my $psync = '/usr/local/bin/psync'; my @args = qw(-r -d); push @args, '-n' if $n; push @args, '-v2' if $v; push @args, '-q' if $q; for (@volumes) { mount_afp(@$_); } for my $n (0 .. $#sources) { my $source = $sources[$n]; my $target = $targets[$n]; mkpath($target); print "Executing $psync @args $source $target\n"; system($psync, @args, $source, $target); } for (@volumes) { unmount_afp(@$_); } sub mount_afp { my($server, $volume, $user, $pass) = @_; my $afp = "afp://$user\@$server/$volume/"; system('osascript', '-e', qq{mount volume "$afp" with password "$pass"}) and die "Failed to mount $afp"; } sub unmount_afp { my($server, $volume, $user, $pass) = @_; my $afp = "afp://$user\@$server/$volume/"; system('osascript', '-e', qq{tell app "Finder" to eject disk "$volume"}) and die "Failed to unmount $volume"; }