package Net::FTP::Backup;
our $Time = time;
$Time > 1e5 or die 'your system clock must not be set';
our $Location;
use AppConfig qw(:argcount);
use Data::Dumper;
use Getopt::Long;
use File::Find;
use File::stat;
use Net::FTP::Common;
use strict;
our $last_done;
my ($since_last_run, $blind, $seconds_mtime);
# when file exists server-side,
# - check date?
# -
GetOptions('since-last-run' => \$since_last_run, 'blind' => \$blind, 'seconds-mtime' => \$seconds_mtime) or die;
my $sum = $since_last_run + $blind + $seconds_mtime;
my @option_name = qw(since-last-run blind seconds-mtime);
$sum == 1 or die "exactly one of @option_name must be specified";
my $lockfile = '/tmp/net-ftp-common-rsync-files.lck';
sub cleanup {
warn "closing dup handle";
close(Net::FTP::Common::DUP);
unlink $lockfile;
1;
}
-e $lockfile and
cleanup and die "$lockfile must be removed before running script";
my $config = AppConfig->new( {CASE => 1} ) ;
my $location = 'location';
my $install_dir = 'install_dir';
$config->define($location, { ARGCOUNT => ARGCOUNT_LIST });
$config->define($install_dir, { ARGCOUNT => ARGCOUNT_ONE });
$config->file($ENV{NET_FTP_BACKUP});
my $location = $config->get($location);
$install_dir = $config->get($install_dir);
my $done_file = "$install_dir/files-wanted.done";
warn Dumper($location, $install_dir);
if ($since_last_run) {
my $tmp = stat($done_file);
$last_done = $tmp->mtime;
warn "last_done: $last_done";
}
if ($seconds_mtime) {
warn "calculating last_done from system time";
$last_done = time - $seconds_mtime;
}
open RUNLOG, ">$done_file" or
die "could not open $done_file: $!";
foreach (@$location) {
warn "testing $_";
$Location = $_;
find(\&wanted, $_);
}
sub unwanted {
my $file = shift;
return 1 if $file =~ /.DS_Store/;
return 1 if $file =~ /.FBC/;
return 1 if $file =~ /\.mp3$/;
my $tmp = stat($file);
my $mtime = $tmp->mtime;
if ($since_last_run) {
my $diff = $mtime - $last_done;
if ($diff > 0) {
warn "$file\tlast_done - mtime: $diff";
return 0
} else {
return 1
}
}
return 0
}
sub wanted {
last unless -f;
if ($Location eq '/Users/metaperl') {
# do not enter subdirs for home dir
last unless $File::Find::dir eq $Location;
}
last if /[\r\n]/s;
my $lf = $_;
last if unwanted($File::Find::name);
print RUNLOG "$File::Find::name\n";
}
close(RUNLOG);