App-BackupPlan
view release on metacpan or search on metacpan
lib/App/BackupPlan.pm view on Meta::CPAN
our $TAR = 'system'; #use system tar
our $HAS_EXCLUDE_TAG = 0; #has tar option --exclude-tag
sub new {
my $class = shift;
my $self = {
config => shift,
log => shift
};
bless $self,$class;
return $self;
}
sub run_policy {
my ($policy,$now, $logger) = @_;
$policy->print;
$logger->debug($policy->info) if defined $logger;
my $ts = &fromTS2ISO($now);
my %files = &getFiles($policy->getTargetDir,$policy->getPrefix);
#get last
my $lastts = &getLastTs(keys %files);
my $threshold = &fromTS2ISO(&subSpan($now,$policy->getFrequency));
if (!defined($lastts) || $lastts < $threshold ) { #needs a new tar file
if (defined $lastts) {
$logger->info("Need a new tar file, last tar was on $lastts") if defined $logger;
}
else {
$logger->info("Need a tar file") if defined $logger;
}
my $tarout;
if (lc $TAR eq 'perl') {$tarout= $policy->perlTar($ts);}
else {$tarout = $policy->tar($ts,$HAS_EXCLUDE_TAG);}
if ($tarout =~ /Error/i) {
$logger->error($tarout) if defined $logger;
} else {
$logger->debug($tarout) if defined $logger;
}
#now delete old
%files = &getFiles($policy->getTargetDir,$policy->getPrefix);
my $maxFiles = $policy->getMaxFiles;
my $cnt = scalar(keys %files);
while ($cnt > $maxFiles && $cnt >0) {
my $oldts = &getFirstTs(keys %files);
if (defined $oldts) {
$logger->info("Deleting old tar file, with time stamp $oldts") if defined $logger;
unlink $files{$oldts};
}
%files = &getFiles($policy->getTargetDir,$policy->getPrefix);
$cnt--;
} #end while
} #end if
}
sub run {
my ($self,$now) = @_;
$now = time unless defined $now;
#validate the config file
die "App::BackupPlan configuration file is required, but was not given!" unless defined $self->{config};
#logging config
if (defined $self->{log}) {
Log::Log4perl::init($self->{log});
} else {
Log::Log4perl->easy_init( { level => $INFO,
file => ">>easy.log" } );
}
my $logger = Log::Log4perl::get_logger();
#get the environment
&getEnvironment;
#--now read config file
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ($self->{config}) or die "Could not parse $self->{config}";
#get policies
my ($obj,%policies) = &getPolicies($doc);
foreach my $k (keys %policies) {
#policy info
print "**$k policy**\n";
$logger->info("**$k policy**");
my $policy = $policies{$k};
&run_policy($policy,$now,$logger);
} #end foreach
} #end sub
sub getEnvironment {
my $env = $Config{osname};
if ($Config{osname} =~ /linux/i) {
my $output = `man tar | grep /\-\-exclude\-tag/ | wc -l`;
$HAS_EXCLUDE_TAG = 1 unless ($output eq '0');
} else {$TAR = 'perl';}
}
sub getPolicies {
my $xml = $_[0];
my $defaultPolicy = new App::BackupPlan::Policy;
#get default policy first
#first default policy
my $nodes = $xml->getElementsByTagName("default");
if ($nodes->getLength > 0) {
my $node = $nodes->item(0);
foreach my $child ($node->getChildNodes) {
if ($child->getNodeType == ELEMENT_NODE){
my $name = $child->getNodeName;
my $value = $child->getFirstChild->getNodeValue;
$defaultPolicy->set($name,$value);
}
}
}
#then all policies
my %raw_policies;
$nodes = $xml->getElementsByTagName("task");
for (my $i=0;$i<$nodes->getLength; $i++) {
( run in 0.510 second using v1.01-cache-2.11-cpan-39bf76dae61 )