Various changes, including changes in 2.1.1 and 2.1.2 releases.
authorcbarratt <cbarratt>
Sun, 11 Sep 2005 01:37:01 +0000 (01:37 +0000)
committercbarratt <cbarratt>
Sun, 11 Sep 2005 01:37:01 +0000 (01:37 +0000)
27 files changed:
ChangeLog
bin/BackupPC
bin/BackupPC_archive
bin/BackupPC_archiveHost
bin/BackupPC_dump
bin/BackupPC_restore
bin/BackupPC_sendEmail
bin/BackupPC_tarCreate
bin/BackupPC_tarExtract
bin/BackupPC_zipCreate
conf/config.pl
configure.pl
doc-src/BackupPC.pod
init.d/src/gentoo-backuppc
lib/BackupPC/CGI/EditConfig.pm
lib/BackupPC/CGI/Lib.pm
lib/BackupPC/CGI/Restore.pm
lib/BackupPC/Lang/de.pm
lib/BackupPC/Lang/es.pm
lib/BackupPC/Lang/fr.pm
lib/BackupPC/Lang/it.pm
lib/BackupPC/Lang/nl.pm
lib/BackupPC/Lang/pt_br.pm
lib/BackupPC/Lib.pm
lib/BackupPC/View.pm
lib/BackupPC/Xfer/Rsync.pm
lib/BackupPC/Xfer/RsyncFileIO.pm

index 6102576..177734a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 * Add NT_STATUS_FILE_LOCK_CONFLICT to pst read error check in
   BackupPC_sendEmail to fix bug reported by Dale Renton.
 
-* Fixed minor typo in documentation from Richard Ames
+* Fixed simple but serious bug in bin/BackupPC_tarCreate that prevented
+  hardlinks being saved correctly.  Debugged by Michael (mna.news) with
+  several other people.
+
+* Fixed serious bug in bin/BackupPC_dump reported/debugged by Dan
+  Niles that can happen when multiple full backups are deleted after
+  $Conf{FullKeepCnt} is changed.
+
+* Added fixup of $ENV{REMOTE_USER} to lib/BackupPC/CGI/Lib.pm in the
+  case of using mod_authz_ldap; patch submitted by Alain Perrier.
+
+* Added env LC_ALL=C to $Conf{TarClientCmd} and $Conf{TarClientRestoreCmd}
+  to avoid locale problems, suggested by Ludovic Drolez.
+
+* Changed ping output parsing to pick out average rtt time, based
+  on patch from Ron Bickers.
+
+* Changed lib/BackupPC/CGI/Lib.pm so that link to "$TopDir/conf/$host.pl"
+  is displayed if it exists.  Patch from Andreas Vögele.
+
+* Applied daemonize patch to bin/BackupPC from:
+        http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=301057
+
+* It's now a fatal error if $Conf{CompressLevel} is set, but
+  Compress::Zlib is not found.  Before $Conf{CompressLevel} was
+  silently set to 0, which made all the backups uncompressed.
+  That meant the user never knew if they forget to install
+  Compress::Zlib but were expecting compression to be on.
+
+* Finally increased $Conf{ClientTimeout} to 72000 (20 hours).
+
+* Fixed minor documentation typos from Richard Ames, JP Vossen.
+
+* Changed bin/BackupPC_archiveHost to use /bin/csh instead of
+  /bin/sh.  That way any errors in the pipeline are reported
+  via the exit status, instead of just the last.
+
+* Added sleep 1 in restart() function in init.d/src/gentoo-backuppc,
+  suggested by Jon Hood.
+
+* Added $DestDir to the path of the CGI image directory in configure.pl.
+  Patch submitted by Andreas Vögele.
+
+* Added $Conf{EMailHeaders} for additional email headers, requested
+  by Ludovic Gasc.
+
+* Made shareName argument regexp checking more general to allow parens.
+
+* Applied extensive patch to French translation from Frederic Lehobey.
+
+* Minor change to Dutch language $Lang{Pool_Stat} from Wander Winkelhorst.
+
+* Minor change to French language $Lang{EMailOutlookBackupMesg} and
+  $Lang{EMailOutlookBackupSubj} from Ludovic Gasc.
 
 #------------------------------------------------------------------------
 # Version 2.1.0pl1, 15 Aug 2004
index dab51db..4c13633 100755 (executable)
@@ -66,6 +66,7 @@ use Getopt::Std;
 use Socket;
 use Carp;
 use Digest::MD5;
+use POSIX qw(setsid);
 
 ###########################################################################
 # Handle command line options
@@ -260,10 +261,22 @@ sub Main_Initialize
 
     if ( $opts{d} ) {
         #
-        # daemonize by forking
+        # daemonize by forking; more robust method per:
+        #       http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=301057
         #
-        defined(my $pid = fork) or die "Can't fork: $!";
+        my $pid;
+        defined($pid = fork) or die("Can't fork: $!");
+        exit if( $pid );   # parent exits
+
+        POSIX::setsid();
+        defined($pid = fork) or die("Can't fork: $!");
         exit if $pid;   # parent exits
+
+        chdir ("/") or die("Cannot chdir to /: $!\n");
+        close(STDIN);
+        open(STDIN , ">/dev/null") or die("Cannot open /dev/null as stdin\n");
+        # STDOUT and STDERR are handled in LogFileOpen() right below,
+        # otherwise we would have to reopen them too.
     }
 
     #
index 6ab75ea..73425d5 100644 (file)
@@ -139,7 +139,10 @@ if ( $Conf{ClientNameAlias} ne "" ) {
 #
 # Setup file extension for compression and open ArchiveLOG output file
 #
-$Conf{CompressLevel} = 0 if ( !BackupPC::FileZIO->compOk );
+if ( $Conf{CompressLevel} && !BackupPC::FileZIO->compOk ) {
+    $stat{hostError} = "Compress::Zlib not found";
+    exit(ArchiveCleanup($client));
+}
 my $fileExt = $Conf{CompressLevel} > 0 ? ".z" : "";
 my $ArchiveLOG = BackupPC::FileZIO->open("$Dir/ArchiveLOG$fileExt", 1,
                                      $Conf{CompressLevel});
index 4bad6c6..ed481a7 100755 (executable)
@@ -88,6 +88,22 @@ my $mesg = "Writing tar archive for host $host, backup #$bkupNum";
 #
 $share  = $bpc->shellEscape($share);
 $host   = $bpc->shellEscape($host);
+
+#
+# We prefer to use /bin/csh because the exit status of a pipeline
+# is non-zero if any command is non zero.  In contrast, /bin/sh
+# and /bin/bash use the convention that the exit status is just
+# the exit status of the last command of the pipeline.
+#
+my @shell;
+if ( -x "/bin/csh" ) {
+    @shell = ("/bin/csh", "-cf");
+} elsif ( -x "/bin/sh" ) {
+    @shell = ("/bin/sh", "-c");
+} else {
+    print("Error: Can't find executable /bin/csh or /bin/sh\n");
+    exit(1);
+}
 my $cmd = "$tarCreate -t -h $host -n $bkupNum -s $share . ";
 $cmd   .= "| $compPath " if ( $compPath ne "cat" && $compPath ne "" );
 if ( -b $outLoc || -c $outLoc || -f $outLoc ) {
@@ -115,9 +131,9 @@ print("$mesg\n");
 #
 # Run the command
 #
-my $ret = system($cmd);
+my $ret = system(@shell, $cmd);
 if ( $ret ) {
-    print("Executing: $cmd\n");
+    print("Executing: @shell -cf $cmd\n");
     print("Error: $tarCreate, compress or split failed\n");
     exit(1);
 }
@@ -129,7 +145,7 @@ if ( $ret ) {
 if ( -d $outLoc && -x $parPath ) {
     if ( $parfile != 0 ) {
         print("Running $parPath to create parity files\n");
-       my $parCmd = "$parPath c -r$parfile $outLoc/$host.$bkupNum.tar$fileExt.par2 $outLoc/$host.$bkupNum.tar$fileExt.*";
+       my $parCmd = "$parPath c -r$parfile $outLoc/$host.$bkupNum.tar$fileExt.par2 $outLoc/$host.$bkupNum.tar$fileExt*";
         $ret = system($parCmd);
         if ( $ret ) {
            print("Executing: $parCmd\n");
index ccf71d6..8151cbd 100755 (executable)
@@ -434,7 +434,11 @@ $bpc->RmTreeDefer("$TopDir/trash", "$Dir/new") if ( -d "$Dir/new" );
 #
 # Setup file extension for compression and open XferLOG output file
 #
-$Conf{CompressLevel} = 0 if ( !BackupPC::FileZIO->compOk );
+if ( $Conf{CompressLevel} && !BackupPC::FileZIO->compOk ) {
+    print(LOG $bpc->timeStamp, "dump failed: can't find Compress::Zlib\n");
+    print("dump failed: can't find Compress::Zlib\n");
+    exit(1);
+}
 my $fileExt = $Conf{CompressLevel} > 0 ? ".z" : "";
 my $XferLOG = BackupPC::FileZIO->open("$Dir/XferLOG$fileExt", 1,
                                      $Conf{CompressLevel});
@@ -1117,6 +1121,7 @@ sub BackupExpire
        $fullKeepCnt = [$fullKeepCnt] if ( ref($fullKeepCnt) ne "ARRAY" );
        my $fullAgeMax;
        my $fullPeriod = int(0.5 + $Conf{FullPeriod});
+        $fullPeriod = 7 if ( $fullPeriod <= 0 );
        for ( my $i = 0 ; $i < @$fullKeepCnt ; $i++ ) {
            $fullAgeMax += $fullKeepCnt->[$i] * $fullPeriod;
            $fullPeriod *= 2;
@@ -1203,8 +1208,8 @@ sub BackupFullExpire
             #
             # Delete the full backup
             #
-            #printf("Deleting backup $i ($prevFull)\n");
-            push(@delete, $i);
+            #print("Deleting backup $i ($prevFull)\n");
+            unshift(@delete, $i);
         } else {
             $fullCnt++;
             while ( $fullKeepIdx < @$fullKeepCnt
@@ -1345,6 +1350,11 @@ sub BackupRemove
     my($client, $Backups, $idx) = @_;
     my($Dir) = "$TopDir/pc/$client";
 
+    if ( $Backups->[$idx]{num} eq "" ) {
+        print("BackupRemove: ignoring empty backup number for idx $idx\n");
+        return;
+    }
+
     $bpc->RmTreeDefer("$TopDir/trash",
                       "$Dir/$Backups->[$idx]{num}");
     unlink("$Dir/SmbLOG.$Backups->[$idx]{num}")
index 5389e7d..2015df8 100755 (executable)
@@ -186,7 +186,10 @@ if ( (my $errMsg = CorrectHostCheck($hostIP, $host)) ) {
 #
 # Setup file extension for compression and open RestoreLOG output file
 #
-$Conf{CompressLevel} = 0 if ( !BackupPC::FileZIO->compOk );
+if ( $Conf{CompressLevel} && !BackupPC::FileZIO->compOk ) {
+    $stat{hostError} = "Compress:Zlib not found";
+    exit(RestoreCleanup($client));
+}
 my $fileExt = $Conf{CompressLevel} > 0 ? ".z" : "";
 my $RestoreLOG = BackupPC::FileZIO->open("$Dir/RestoreLOG$fileExt", 1,
                                      $Conf{CompressLevel});
index cb5c533..3a1200d 100755 (executable)
@@ -140,10 +140,12 @@ EOF
 }
 
 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
@@ -303,10 +305,12 @@ sub user2name
 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;
index 071de33..ce67747 100755 (executable)
@@ -227,7 +227,7 @@ sub archiveWrite
 #
 sub archiveWriteHardLinks
 {
-    my $fh = @_;
+    my($fh) = @_;
     foreach my $hdr ( @HardLinks ) {
         $hdr->{size} = 0;
        my $name = $hdr->{linkname};
@@ -483,6 +483,7 @@ sub TarWriteFile
            $done = 1;
        } else {
            foreach my $arg ( @ARGV ) {
+               $arg = "/" if ( $arg eq "." );
                $arg =~ s{^\./+}{/};
                $arg =~ s{/+$}{};
                $done = 1 if ( $name eq $arg || $name =~ /^\Q$arg\// );
@@ -504,7 +505,7 @@ sub TarWriteFile
             my $name = $hdr->{linkname};
             $name =~ s{^\./}{/};
            $HardLinkExtraFiles{$name} = $hdr->{name};
-           archiveWrite($fh, $hdr->{linkname}, $hdr->{name});
+           archiveWrite($fh, $name, $hdr->{name});
        }
     } elsif ( $hdr->{type} == BPC_FTYPE_SYMLINK ) {
         #
index 270776f..32044f6 100755 (executable)
@@ -58,7 +58,7 @@ if ( $ARGV[0] !~ /^([\w\.\s-]+)$/ ) {
     exit(1);
 }
 my $client = $1;
-if ( $ARGV[1] !~ /^([\w\s\.\/\$-]+)$/ ) {
+if ( $ARGV[1] !~ /^([\w\s.\/$(){}[\]-]+)$/ ) {
     print("$0: bad share name '$ARGV[1]'\n");
     exit(1);
 }
@@ -313,7 +313,7 @@ sub TarReadFile
         #
         my($nRead);
         #print("Reading $f->{name}, $f->{size} bytes, type $f->{type}\n");
-        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $f);
+        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $file, $f);
         my $poolWrite = BackupPC::PoolWrite->new($bpc,
                                          "$OutDir/$ShareName/$f->{mangleName}",
                                          $f->{size}, $Compress);
@@ -351,7 +351,7 @@ sub TarReadFile
        # a plain file.
         #
         $f->{size} = length($f->{linkname});
-        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $f);
+        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $file, $f);
         my $poolWrite = BackupPC::PoolWrite->new($bpc,
                                          "$OutDir/$ShareName/$f->{mangleName}",
                                          $f->{size}, $Compress);
@@ -369,7 +369,7 @@ sub TarReadFile
         # contents.
         #
         $f->{size} = length($f->{linkname});
-        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $f);
+        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $file, $f);
         my $poolWrite = BackupPC::PoolWrite->new($bpc,
                                          "$OutDir/$ShareName/$f->{mangleName}",
                                          $f->{size}, $Compress);
@@ -393,7 +393,7 @@ sub TarReadFile
         } else {
             $data = "$f->{devmajor},$f->{devminor}";
         }
-        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $f);
+        pathCreate($dir, "$OutDir/$ShareName/$f->{mangleName}", $file, $f);
         my $poolWrite = BackupPC::PoolWrite->new($bpc,
                                          "$OutDir/$ShareName/$f->{mangleName}",
                                          length($data), $Compress);
@@ -487,15 +487,17 @@ sub logFileAction
 #
 sub pathCreate
 {
-    my($dir, $file, $f) = @_;
+    my($dir, $fullPath, $file, $f) = @_;
 
     #
-    # Get parent directory of each of $dir and $file
+    # Get parent directory of each of $dir and $fullPath
     #
-    $dir  =~ s{/[^/]*$}{};
-    $file =~ s{/[^/]*$}{};
-    return if ( -d $file );
-    mkpath($file, 0, 0777);
+    $dir      =~ s{/[^/]*$}{};
+    $fullPath =~ s{/[^/]*$}{};
+    return if ( -d $fullPath );
+    mkpath($fullPath, 0, 0777);
+    $Attrib{$dir} = BackupPC::Attrib->new({ compress => $Compress })
+                                if ( !defined($Attrib{$dir}) );
     $Attrib{$dir}->set($file, {
                             type  => BPC_FTYPE_DIR,
                             mode  => 0755,
index bebea7a..7c859d2 100755 (executable)
@@ -120,7 +120,7 @@ if ( $i >= @Backups ) {
 
 my $PathRemove = $1 if ( $opts{r} =~ /(.+)/ );
 my $PathAdd    = $1 if ( $opts{p} =~ /(.+)/ );
-if ( $opts{s} !~ /^([\w\s\.\/\$-]+)$/ ) {
+if ( $opts{s} !~ /^([\w\s.\/$(){}[\]-]+)$/ ) {
     print(STDERR "$0: bad share name '$opts{s}'\n");
     exit(1);
 }
index d8b6ac9..1284c5d 100644 (file)
@@ -705,7 +705,7 @@ $Conf{BackupZeroFilesIsFatal} = 1;
 #   - 'rsync':   backup and restore via rsync (via rsh or ssh).
 #                Best choice for linux/unix.  Good choice also for WinXX.
 #
-#   - 'rsyncd':  backup and restre via rsync daemon on the client.
+#   - 'rsyncd':  backup and restore via rsync daemon on the client.
 #                Best choice for linux/unix if you have rsyncd running on
 #                the client.  Good choice also for WinXX.
 #
@@ -880,7 +880,7 @@ $Conf{TarShareName} = '/';
 # This setting only matters if $Conf{XferMethod} = 'tar'.
 #
 $Conf{TarClientCmd} = '$sshPath -q -x -n -l root $host'
-                    . ' $tarPath -c -v -f - -C $shareName+'
+                    . ' env LC_ALL=C $tarPath -c -v -f - -C $shareName+'
                     . ' --totals';
 
 #
@@ -937,7 +937,7 @@ $Conf{TarIncrArgs} = '--newer=$incrDate+ $fileList+';
 # restore option will be removed.
 #
 $Conf{TarClientRestoreCmd} = '$sshPath -q -x -l root $host'
-                  . ' $tarPath -x -p --numeric-owner --same-owner'
+                  . ' env LC_ALL=C $tarPath -x -p --numeric-owner --same-owner'
                   . ' -v -f - -C $shareName+';
 
 #
@@ -1344,7 +1344,7 @@ $Conf{CompressLevel} = 0;
 # Despite the name, this parameter sets the timeout for all transport
 # methods (tar, smb etc).
 #
-$Conf{ClientTimeout} = 7200;
+$Conf{ClientTimeout} = 72000;
 
 #
 # Maximum number of log files we keep around in each PC's directory
@@ -1583,6 +1583,14 @@ $Conf{EMailNotifyOldOutlookDays} = 5.0;
 $Conf{EMailOutlookBackupSubj} = undef;
 $Conf{EMailOutlookBackupMesg} = undef;
 
+#
+# Additional email headers
+#
+$Conf{EMailHeaders} = <<EOF;
+MIME-Version: 1.0
+Content-Type: text/plain; charset="iso-8859-1"
+EOF
+
 ###########################################################################
 # CGI user interface configuration settings
 # (can be overridden in the per-PC config.pl)
@@ -1811,4 +1819,5 @@ $Conf{CgiUserConfigEdit} = {
         EMailNotifyOldOutlookDays => 1,
         EMailOutlookBackupSubj    => 1,
         EMailOutlookBackupMesg    => 1,
+        EMailHeaders              => 1,
 };
index bb86691..ec63ebb 100755 (executable)
@@ -467,7 +467,7 @@ foreach my $dir ( qw(bin doc
 # Create CGI image directory
 #
 foreach my $dir ( ($Conf{CgiImageDir}) ) {
-    next if ( $dir eq "" || -d $dir );
+    next if ( $dir eq "" || -d "$DestDir$dir" );
     mkpath("$DestDir$dir", 0, 0775);
     if ( !-d "$DestDir$dir" || !chown($Uid, $Gid, "$DestDir$dir") ) {
         die("Failed to create or chown $DestDir$dir");
index 0de8a1e..3cca13d 100644 (file)
@@ -299,7 +299,7 @@ appreciated, both positive and negative.
 
 Beyond being a satisfied user and telling other people about it, everyone
 is encouraged to add links to L<http://backuppc.sourceforge.net>
-(I'll see then via Google) or otherwise publicize BackupPC.  Unlike
+(I'll see them via Google) or otherwise publicize BackupPC.  Unlike
 the commercial products in this space, I have a zero budget (in both
 time and money) for marketing, PR and advertising, so it's up to
 all of you!  Feel free to vote for BackupPC at
@@ -1983,7 +1983,10 @@ is only run when there are no BackupPC_dump or BackupPC_link processes
 running.  Therefore, when it is time to run BackupPC_nightly, no new
 backups are started and BackupPC waits until all backups have finished.
 Then BackupPC_nightly is run, and until it finishes no new backups are
-started.  If BackupPC_nightly is slow, the settings
+started.  If BackupPC_nightly takes too long to run, the settings
+$Conf{MaxBackupPCNightlyJobs} and $Conf{BackupPCNightlyPeriod} can
+be used to run several BackupPC_nightly processes in parallel, and
+to split its job over several nights.
 
 =back
 
@@ -2728,7 +2731,7 @@ See L<http://backuppc.sourceforge.net>.
 
 =head1 Copyright
 
-Copyright (C) 2001-2004 Craig Barratt
+Copyright (C) 2001-2005 Craig Barratt
 
 =head1 Credits
 
index 3df501e..98d3cf6 100755 (executable)
@@ -34,6 +34,7 @@ stop() {
 restart() {
        ebegin "Restarting BackupPC"
        svc_stop
+        sleep 1
        svc_start
        eend $? "Failed to restart BackupPC"
 }
index 92f9cce..dc831c2 100644 (file)
@@ -322,8 +322,7 @@ sub action
     my $userHost = 1 if ( $Privileged && !$PrivAdmin && defined($host) );
 
     if ( !$Privileged ) {
-        #ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_edit_config_files}}"));
-        ErrorExit("Only_privileged_users_can_edit_config_files");
+        ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_edit_config_files}}"));
     }
 
     if ( defined($In{menu}) || $In{editAction} eq "Save" ) {
index 96a5a78..70a7e49 100644 (file)
@@ -122,6 +122,10 @@ sub NewRequest
     #
     $MyURL  = $ENV{SCRIPT_NAME};
     $User   = $ENV{REMOTE_USER};
+    #
+    # Handle LDAP uid=user when using mod_authz_ldap
+    #
+    $User   = $1 if ( $User =~ /uid=([^,]+)/i );        
 
     #
     # Clean up %ENV for taint checking
@@ -465,7 +469,8 @@ EOF
                    $Lang->{Last_bad_XferLOG_errors_only},
                    " class=\"navbar\"");
        }
-       if ( -f "$TopDir/pc/$host/config.pl" ) {
+        if ( -f "$TopDir/pc/$host/config.pl"
+                    || ($host ne "config" && -f "$TopDir/conf/$host.pl") ) {
            NavLink("?action=editConfig&host=${EscURI($host)}",
                    "Edit Config", " class=\"navbar\"");
        }
index d43d70d..0310c63 100644 (file)
@@ -112,35 +112,30 @@ EOF
         #
        $content .= eval("qq{$Lang->{Restore_Options_for__host2}}");
 
-        #
-        # If there is a single host, make sure direct restore is enabled
-        #
         if ( @hosts == 1 ) {
             #
             # Pick up the host's config file
             #
             $bpc->ConfigRead($hosts[0]);
             %Conf = $bpc->Conf();
+       }
 
-            #
-            # Decide if option 1 (direct restore) is available based
-            # on whether the restore command is set.
-            #
-            my $cmd = $Conf{XferMethod} eq "smb" ? $Conf{SmbClientRestoreCmd}
-                    : $Conf{XferMethod} eq "tar" ? $Conf{TarClientRestoreCmd}
-                    : $Conf{XferMethod} eq "archive" ? undef
-                    : $Conf{RsyncRestoreArgs};
-            if ( defined($cmd) ) {
-                $content .= eval(
-                    "qq{$Lang->{Restore_Options_for__host_Option1}}");
-            } else {
-                my $hostDest = $hosts[0];
-                $content .= eval(
-                    "qq{$Lang->{Restore_Options_for__host_Option1_disabled}}");
-            }
-        } else {
-            $content .= eval("qq{$Lang->{Restore_Options_for__host_Option1}}");
-        }
+       #
+       # Decide if option 1 (direct restore) is available based
+       # on whether the restore command is set.
+       #
+       my $cmd = $Conf{XferMethod} eq "smb" ? $Conf{SmbClientRestoreCmd}
+               : $Conf{XferMethod} eq "tar" ? $Conf{TarClientRestoreCmd}
+               : $Conf{XferMethod} eq "archive" ? undef
+               : $Conf{RsyncRestoreArgs};
+       if ( defined($cmd) ) {
+           $content .= eval(
+               "qq{$Lang->{Restore_Options_for__host_Option1}}");
+       } else {
+           my $hostDest = $hosts[0];
+           $content .= eval(
+               "qq{$Lang->{Restore_Options_for__host_Option1_disabled}}");
+       }
 
        #
        # Verify that Archive::Zip is available before showing the
index 5fc0f9b..e112b73 100644 (file)
@@ -1217,7 +1217,7 @@ $Lang{EMailNoBackupEverMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Hallo $userName,
 
 Ihr Computer ($host) wurde durch den Backup Server noch nie erfolgreich gesichert.
@@ -1247,7 +1247,7 @@ $Lang{EMailNoBackupRecentMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Hallo $userName,
 
 Ihr Computer ($host) wurde seit $days Tagen nicht mehr erfolgreich gesichert.
@@ -1279,7 +1279,7 @@ $Lang{EMailOutlookBackupMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Hallo $userName,
 
 die Outlook Dateien auf Ihrem Computer wurden $howLong Tage nicht gesichert.
index ca7973b..2011795 100644 (file)
@@ -1218,7 +1218,7 @@ $Lang{EMailNoBackupEverMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Estimado $userName,
 
 Su PC ($host) nunca ha completado una copia de seguridad mediante nuestro
@@ -1247,7 +1247,7 @@ $Lang{EMailNoBackupRecentMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Estimado $userName,
 
 No se ha podido completar ninguna copia de seguridad de su PC ($host) durante
@@ -1278,7 +1278,7 @@ $Lang{EMailOutlookBackupMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Estimado $userName,
 
 Los archivos de Outlook de su PC tienen $howLong.
index e4fb494..080261e 100644 (file)
@@ -664,7 +664,7 @@ Les fichiers existants sont ceux qui sont d
 Les nouveaux fichiers sont ceux qui ont été ajoutés au serveur.
 Les fichiers vides et les erreurs de SMB ne sont pas comptabilisés dans les fichiers nouveaux ou réutilisés.
 </p>
-<table class="tableStnd" border cellspacing="1" cellpadding="3" width="80%">
+<table glass="tableStnd" border cellspacing="1" cellpadding="3" width="80%">
 <tr class="tableheader"><td colspan="2" bgcolor="#ffffff"></td>
     <td align="center" colspan="3"> Totaux </td>
     <td align="center" colspan="2"> Fichiers existants </td>
@@ -1215,7 +1215,7 @@ $Lang{EMailNoBackupEverMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 $userName,
 
 Notre logiciel de copies de sécurité n'a jamais réussi à
@@ -1245,7 +1245,7 @@ $Lang{EMailNoBackupRecentMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 $userName,
 
 Aucune sauvegarde de votre ordinateur n'a été effectuée depuis $days
@@ -1270,12 +1270,12 @@ http://backuppc.sourceforge.net
 EOF
 
 # Old Outlook files
-$Lang{EMailOutlookBackupSubj} = "BackupPC: Les fichiers de Outlook sur \$host doivent êtes sauvegardés";
+$Lang{EMailOutlookBackupSubj} = "BackupPC: Les fichiers de Outlook sur \$host doivent être sauvegardés";
 $Lang{EMailOutlookBackupMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 $userName,
 
 Les fichiers Outlook sur votre ordinateur n'ont $howLong. Ces fichiers
index a8f7172..642d70e 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/perl
 #
-# $Id: it.pm,v 1.10 2004/10/10 07:31:25 cbarratt Exp $
+# $Id: it.pm,v 1.11 2005/09/11 01:37:02 cbarratt Exp $
 #
 # Italian i18n file
 #
@@ -1227,7 +1227,7 @@ $Lang{EMailNoBackupEverSubj} = "BackupPC: nessun backup riuscito per \$host";
 $Lang{EMailNoBackupEverMesg} = <<'EOF';
 To: $user$domain
 Subject: $subj
-
+$headers
 Ciao $userName,
 
 Il nostro software di backup non e` ancora riuscito ad effettuare un
@@ -1256,7 +1256,7 @@ $Lang{EMailNoBackupRecentSubj} = "BackupPC: non ci sono backup recenti per \$hos
 $Lang{EMailNoBackupRecentMesg} = <<'EOF';
 To: $user$domain
 Subject: $subj
-
+$headers
 Ciao $userName,
 
 non e` stato effettuato correttamente il backup del tuo PC ($host) per
@@ -1285,7 +1285,7 @@ $Lang{EMailOutlookBackupSubj} = "BackupPC: i file di Outlook su \$host richiedon
 $Lang{EMailOutlookBackupMesg} = <<'EOF';
 To: $user$domain
 Subject: $subj
-
+$headers
 Ciao $userName,
 
 Il backup dei file di Outlook presenti sul tuo PC $howLong.
index 3a58945..279a0d5 100644 (file)
@@ -274,8 +274,9 @@ EOF
 $Lang{Pool_Stat} = <<EOF;
         <li>Gebruikte backupschijfruimte is \${poolSize}GB groot en bevat \$info->{"\${name}FileCnt"} bestanden
             en \$info->{"\${name}DirCnt"} mappen (op \$poolTime),
-        <li>Schijfruimte bevat \$info->{"\${name}FileCntRep"} identieke 
-            bestanden (langste reeks is \$info->{"\${name}FileRepMax"},
+        <li>Schijfruimte bevat \$info->{"\${name}FileCntRep"} bestanden
+            met identieke hashcodes
+            (langste reeks is \$info->{"\${name}FileRepMax"},
         <li>Nachtelijke opruiming verwijderde \$info->{"\${name}FileCntRm"} bestanden
             met een grootte van \${poolRmSize}GB (ongeveer \$poolTime),
 EOF
@@ -1217,7 +1218,7 @@ $Lang{EMailNoBackupEverMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Beste $userName,
 
 Uw pc ($host) is tot op heden nog nooit succesvol gebackupt door
@@ -1248,7 +1249,7 @@ $Lang{EMailNoBackupRecentMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Beste $userName,
 
 Er is reeds gedurende $days dagen geen backup meer gemaakt van uw pc ($host).
@@ -1281,7 +1282,7 @@ $Lang{EMailOutlookBackupMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Beste $userName,
 
 De Outlookbestanden van uw pc zijn $howlong.
index 41dc33d..bcaac03 100644 (file)
@@ -1219,7 +1219,7 @@ $Lang{EMailNoBackupEverMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Caro $userName,
 
 Em seu PC ($host) nenhum backup foi completado por nosso programa de backup.
@@ -1247,7 +1247,7 @@ $Lang{EMailNoBackupRecentMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Caro $userName,
 
 Não foi completado nenhum backup completo de seu PC ($host) durante
@@ -1278,7 +1278,7 @@ $Lang{EMailOutlookBackupMesg} = <<'EOF';
 To: $user$domain
 cc:
 Subject: $subj
-
+$headers
 Caro $userName,
 
 Os arquivos de Outlook de seu PC tem $howLong.
index 0b03282..1e430ca 100644 (file)
@@ -711,10 +711,12 @@ sub CheckHostAlive
                        if ( $bpc->{verbose} );
        return -1;
     }
-    if ( $s =~ /time=([\d\.]+)\s*ms/i ) {
+    if ( $s =~ /rtt\s*min\/avg\/max\/mdev\s*=\s*[\d.]+\/([\d.]+)\/[\d.]+\/[\d.]+\s*(ms|usec)/i ) {
+        $ret = $1;
+        $ret /= 1000 if ( lc($2) eq "usec" );
+    } elsif ( $s =~ /time=([\d.]+)\s*(ms|usec)/i ) {
        $ret = $1;
-    } elsif ( $s =~ /time=([\d\.]+)\s*usec/i ) {
-       $ret =  $1/1000;
+        $ret /= 1000 if ( lc($2) eq "usec" );
     } else {
        print(STDERR "CheckHostAlive: can't extract round-trip time"
                   . " (not fatal)\n") if ( $bpc->{verbose} );
index 66de030..f1a043a 100644 (file)
@@ -192,13 +192,14 @@ sub dirCache
                     }
                 }
             }
-            $m->{files}{$fileUM}{relPath}    = "$dir/$fileUM";
-            $m->{files}{$fileUM}{sharePathM} = "$sharePathM/$file";
-            $m->{files}{$fileUM}{fullPath}   = "$path/$file";
-            $m->{files}{$fileUM}{backupNum}  = $backupNum;
-            $m->{files}{$fileUM}{compress}   = $compress;
-           $m->{files}{$fileUM}{nlink}      = $s[3];
-           $m->{files}{$fileUM}{inode}      = $s[1];
+            ($m->{files}{$fileUM}{relPath}    = "$dir/$fileUM") =~ s{//+}{/}g;
+            ($m->{files}{$fileUM}{sharePathM} = "$sharePathM/$file")
+                                                               =~ s{//+}{/}g;
+            ($m->{files}{$fileUM}{fullPath}   = "$path/$file") =~ s{//+}{/}g;
+            $m->{files}{$fileUM}{backupNum}   = $backupNum;
+            $m->{files}{$fileUM}{compress}    = $compress;
+           $m->{files}{$fileUM}{nlink}       = $s[3];
+           $m->{files}{$fileUM}{inode}       = $s[1];
         }
        #
        # Also include deleted files
@@ -444,13 +445,14 @@ sub dirHistory
                     }
                 }
             }
-            $files->{$fileUM}[$i]{relPath}    = "$dir/$fileUM";
-            $files->{$fileUM}[$i]{sharePathM} = "$sharePathM/$file";
-            $files->{$fileUM}[$i]{fullPath}   = "$path/$file";
-            $files->{$fileUM}[$i]{backupNum}  = $backupNum;
-            $files->{$fileUM}[$i]{compress}   = $compress;
-           $files->{$fileUM}[$i]{nlink}      = $s[3];
-           $files->{$fileUM}[$i]{inode}      = $s[1];
+            ($files->{$fileUM}[$i]{relPath}    = "$dir/$fileUM") =~ s{//+}{/}g;
+            ($files->{$fileUM}[$i]{sharePathM} = "$sharePathM/$file")
+                                                                =~ s{//+}{/}g;
+            ($files->{$fileUM}[$i]{fullPath}   = "$path/$file") =~ s{//+}{/}g;
+            $files->{$fileUM}[$i]{backupNum}   = $backupNum;
+            $files->{$fileUM}[$i]{compress}    = $compress;
+           $files->{$fileUM}[$i]{nlink}       = $s[3];
+           $files->{$fileUM}[$i]{inode}       = $s[1];
         }
 
        #
index a920a67..45f4f3b 100644 (file)
@@ -239,7 +239,9 @@ sub start
        $rsyncClientCmd = $conf->{RsyncClientCmd};
         $argList = ['--server', '--sender', @$rsyncArgs,
                               '.', $t->{shareNameSlash}];
-       $argList = File::RsyncP->excludeStrip($argList);
+       eval {
+           $argList = File::RsyncP->excludeStrip($argList);
+       };
        $fioArgs = {
            client     => $t->{client},
            share      => $t->{shareName},
index cae85c9..c0cf21b 100644 (file)
@@ -1235,7 +1235,7 @@ sub fileListEltSend
             && ($type == BPC_FTYPE_HARDLINK || $type == BPC_FTYPE_FILE)
             && ($type == BPC_FTYPE_HARDLINK
                     || $fio->{protocol_version} < 27
-                    || $a->{mode} & S_HLINK_TARGET ) ) {
+                    || ($a->{mode} & S_HLINK_TARGET) ) ) {
         #
         # Fill in fake inode information so that the remote rsync
         # can correctly create hardlinks.