-#!/bin/perl -T
+#!/bin/perl
#============================================================= -*-perl-*-
#
# BackupPC_sendEmail: send status emails to users and admins
#
#========================================================================
#
-# Version 2.1.0_CVS, released 3 Jul 2003.
+# Version 3.0.0, released 28 Jan 2007.
#
# See http://backuppc.sourceforge.net.
#
use Data::Dumper;
use Getopt::Std;
use DirHandle ();
-use vars qw($Lang $TopDir $BinDir %Conf);
+use vars qw($Lang $TopDir $BinDir $LogDir %Conf);
die("BackupPC::Lib->new failed\n") if ( !(my $bpc = BackupPC::Lib->new) );
$TopDir = $bpc->TopDir();
+$LogDir = $bpc->LogDir();
$BinDir = $bpc->BinDir();
%Conf = $bpc->Conf();
$Lang = $bpc->Lang();
$bpc->ChildInit();
use vars qw(%UserEmailInfo);
-do "$TopDir/log/UserEmailInfo.pl";
+do "$LogDir/UserEmailInfo.pl";
my %opts;
-if ( !getopts("t", \%opts) || @ARGV != 0 ) {
- print("usage: $0 [-t]\n");
+if ( !getopts("ctu:", \%opts) || @ARGV != 0 ) {
+ print <<EOF;
+usage: $0 [-t] [-c] [-u userEmail]
+options:
+
+ -t display the emails that would be sent, without sending them
+
+ -c check if BackupPC is alive and send an email if not
+
+ -u send a test email to userEmail
+EOF
exit(1);
}
my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort});
if ( $err ) {
+ if ( $opts{c} && $Conf{EMailAdminUserName} ne "" ) {
+ my $headers = $Conf{EMailHeaders};
+ $headers .= "\n" if ( $headers !~ /\n$/ );
+ my $mesg = <<EOF;
+To: $Conf{EMailAdminUserName}
+Subject: BackupPC: can't connect to server
+$headers
+Error: cannot connect to BackupPC server.
+
+Regards,
+PC Backup Genie
+EOF
+ SendMail($mesg);
+ exit(1);
+ }
print("Can't connect to server ($err)\n");
exit(1);
}
-my $reply = $bpc->ServerMesg("status hosts");
+exit(0) if ( $opts{c} );
+my $reply = $bpc->ServerMesg("status hosts info");
$reply = $1 if ( $reply =~ /(.*)/s );
my(%Status, %Info, %Jobs, @BgQueue, @UserQueue, @CmdQueue);
eval($reply);
+###########################################################################
+# Generate test message if required
+###########################################################################
+if ( $opts{u} ne "" ) {
+ my $headers = $Conf{EMailHeaders};
+ $headers .= "\n" if ( $headers !~ /\n$/ );
+ my $mesg = <<EOF;
+To: $opts{u}
+Subject: BackupPC test email
+$headers
+This is a test message from $0.
+
+Regards,
+PC Backup Genie
+EOF
+ SendMail($mesg);
+ exit(0);
+}
+
###########################################################################
# Generate sysadmin warning messages
###########################################################################
my @badHosts = ();
foreach my $host ( sort(keys(%Status)) ) {
- next if ( $Status{$host}{reason} ne "backup failed"
+ next if ( ($Status{$host}{reason} ne "Reason_backup_failed"
+ && $Status{$host}{reason} ne "Reason_restore_failed")
|| $Status{$host}{error} =~ /^lost network connection to host/ );
push(@badHosts, "$host ($Status{$host}{error})");
}
my @files = $d->read;
$d->close;
foreach my $host ( @files ) {
- next if ( $host eq "." || $host eq ".." || defined($Status{$host}) );
+ next if ( $host =~ /^\./ || defined($Status{$host}) );
push(@oldDirs, "$TopDir/pc/$host");
}
if ( @oldDirs ) {
}
if ( $mesg ne "" && $Conf{EMailAdminUserName} ne "" ) {
+ my $headers = $Conf{EMailHeaders};
+ $headers .= "\n" if ( $headers !~ /\n$/ );
$mesg = <<EOF;
To: $Conf{EMailAdminUserName}
Subject: BackupPC administrative attention needed
-
+$headers
${mesg}Regards,
PC Backup Genie
EOF
- if ( $opts{t} ) {
- print("#" x 75, "\n");
- print $mesg;
- } else {
- SendMail($mesg);
- }
+ SendMail($mesg);
}
###########################################################################
my $user = $Hosts->{$host}{user};
next if ( time - $UserEmailInfo{$user}{lastTime}
< $Conf{EMailNotifyMinDays} * 24*3600 );
+ next if ($Conf{XferMethod} eq "archive" );
my @Backups = $bpc->BackupInfoRead($host);
my $numBackups = @Backups;
if ( $numBackups == 0 ) {
my $numBadOutlook = 0;
for ( my $i = 0 ; $i < @Backups ; $i++ ) {
my $fh;
+ #
+ # ignore partials -> only fulls and incrs should be used
+ # in figuring out when the last good backup was
+ #
+ next if ( $Backups[$i]{type} eq "partial" );
$lastNum = $Backups[$i]{num} if ( $lastNum < $Backups[$i]{num} );
if ( $Backups[$i]{type} eq "full" ) {
$lastFull = $Backups[$i]{startTime}
while ( 1 ) {
my $s = $fh->readLine();
last if ( $s eq "" );
- if ( $s =~ /^Error reading file.*\.pst : ERRDOS - ERRlock/
- || $s =~ /^Error reading file.*\.pst\. Got 0 bytes/ ) {
+ if ( $s =~ /^\s*Error reading file.*\.pst : (ERRDOS - ERRlock|NT_STATUS_FILE_LOCK_CONFLICT)/
+ || $s =~ /^\s*Error reading file.*\.pst\. Got 0 bytes/ ) {
$badOutlook = 1;
last;
}
my $dumpStr = Data::Dumper->Dump(
[\%UserEmailInfo],
[qw(*UserEmailInfo)]);
- if ( open(HOST, ">", "$TopDir/log/UserEmailInfo.pl") ) {
+ if ( open(HOST, ">", "$LogDir/UserEmailInfo.pl") ) {
binmode(HOST);
print(HOST $dumpStr);
close(HOST);
sub sendUserEmail
{
my($user, $host, $mesg, $subj, $vars) = @_;
- $vars->{user} = $user;
- $vars->{host} = $host;
- $vars->{domain} = $Conf{EMailUserDestDomain};
- $vars->{CgiURL} = $Conf{CgiURL};
+ $vars->{user} = $user;
+ $vars->{host} = $host;
+ $vars->{headers} = $Conf{EMailHeaders};
+ $vars->{headers} .= "\n" if ( $vars->{headers} !~ /\n$/ );
+ $vars->{domain} = $Conf{EMailUserDestDomain};
+ $vars->{CgiURL} = $Conf{CgiURL};
$subj =~ s/\$(\w+)/defined($vars->{$1}) ? $vars->{$1} : "\$$1"/eg;
$vars->{subj} = $subj;
$mesg =~ s/\$(\w+)/defined($vars->{$1}) ? $vars->{$1} : "\$$1"/eg;
- if ( $opts{t} ) {
- print("#" x 75, "\n");
- print $mesg;
- } else {
- SendMail($mesg);
- }
+ SendMail($mesg);
$UserEmailInfo{$user}{lastTime} = time;
$UserEmailInfo{$user}{lastSubj} = $subj;
$UserEmailInfo{$user}{lastHost} = $host;
sub SendMail
{
my($mesg) = @_;
- my($from) = $Conf{EMailFromUserName};
+ my $from = $Conf{EMailFromUserName};
+ my $utf8 = 1
+ if ( $Conf{EMailHeaders} =~ /Content-Type:.*charset="utf-?8"/i );
local(*MAIL);
+ if ( $opts{t} ) {
+ binmode(STDOUT, ":utf8") if ( $utf8 );
+ print("#" x 75, "\n");
+ print $mesg;
+ return;
+ }
$from = "-f $from" if ( $from ne "" );
+ print("Sending test email using $Conf{SendmailPath} -t $from\n")
+ if ( $opts{u} ne "" );
if ( !open(MAIL, "|$Conf{SendmailPath} -t $from") ) {
printf("Can't run sendmail ($Conf{SendmailPath}): $!\n");
return;
}
+ binmode(MAIL, ":utf8") if ( $utf8 );
print MAIL $mesg;
close(MAIL);
}