# Craig Barratt <cbarratt@users.sourceforge.net>
#
# COPYRIGHT
-# Copyright (C) 2001-2003 Craig Barratt
+# Copyright (C) 2001-2004 Craig Barratt
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
#========================================================================
use strict;
+no utf8;
use vars qw(%Conf %OrigConf);
use lib "./lib";
if ( $ConfigPath ne "" && -r $ConfigPath ) {
(my $topDir = $ConfigPath) =~ s{/[^/]+/[^/]+$}{};
die("BackupPC::Lib->new failed\n")
- if ( !($bpc = BackupPC::Lib->new($topDir, ".")) );
+ if ( !($bpc = BackupPC::Lib->new($topDir, ".", 1)) );
%Conf = $bpc->Conf();
%OrigConf = %Conf;
$Conf{TopDir} = $topDir;
- my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}, 1);
+ my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}, 1);
if ( $err eq "" ) {
print <<EOF;
# These are the programs whose paths we need to find
#
my %Programs = (
- perl => "PerlPath",
- 'gtar/tar' => "TarClientPath",
- smbclient => "SmbClientPath",
- nmblookup => "NmbLookupPath",
- rsync => "RsyncClientPath",
- ping => "PingPath",
- df => "DfPath",
- 'ssh/ssh2' => "SshPath",
- sendmail => "SendmailPath",
- hostname => "HostnamePath",
+ perl => "PerlPath",
+ 'gtar/tar' => "TarClientPath",
+ smbclient => "SmbClientPath",
+ nmblookup => "NmbLookupPath",
+ rsync => "RsyncClientPath",
+ ping => "PingPath",
+ df => "DfPath",
+ 'ssh/ssh2' => "SshPath",
+ sendmail => "SendmailPath",
+ hostname => "HostnamePath",
+ split => "SplitPath",
+ 'parchive/par' => "ParPath",
+ cat => "CatPath",
+ gzip => "GzipPath",
+ bzip2 => "Bzip2Path",
);
foreach my $prog ( sort(keys(%Programs)) ) {
EOF
foreach my $prog ( sort(keys(%Programs)) ) {
- printf(" %-11s => %s\n", $prog, $Conf{$Programs{$prog}});
+ printf(" %-12s => %s\n", $prog, $Conf{$Programs{$prog}});
}
print "\n";
last if (prompt('--> Are these paths correct?', 'y') =~ /^y/i);
#
# Create install directories
#
-foreach my $dir ( qw(bin lib/BackupPC/Xfer lib/BackupPC/Zip
- lib/BackupPC/Lang doc) ) {
+foreach my $dir ( qw(bin doc
+ lib/BackupPC/CGI
+ lib/BackupPC/Lang
+ lib/BackupPC/Xfer
+ lib/BackupPC/Zip
+ ) ) {
next if ( -d "$Conf{InstallDir}/$dir" );
mkpath("$Conf{InstallDir}/$dir", 0, 0775);
if ( !-d "$Conf{InstallDir}/$dir"
foreach my $prog ( qw(BackupPC BackupPC_dump BackupPC_link BackupPC_nightly
BackupPC_sendEmail BackupPC_tarCreate BackupPC_trashClean
BackupPC_tarExtract BackupPC_compressPool BackupPC_zcat
+ BackupPC_archive BackupPC_archiveHost
BackupPC_restore BackupPC_serverMesg BackupPC_zipCreate ) ) {
InstallFile("bin/$prog", "$Conf{InstallDir}/bin/$prog", 0555);
}
unlink("$Conf{InstallDir}/bin/BackupPC_queueAll");
printf("Installing library in $Conf{InstallDir}/lib\n");
-foreach my $lib ( qw(BackupPC/Lib.pm BackupPC/FileZIO.pm BackupPC/Attrib.pm
- BackupPC/PoolWrite.pm BackupPC/View.pm BackupPC/Xfer/Tar.pm
- BackupPC/Xfer/Smb.pm BackupPC/Xfer/Rsync.pm
- BackupPC/Xfer/RsyncFileIO.pm BackupPC/Zip/FileMember.pm
- BackupPC/Lang/en.pm BackupPC/Lang/fr.pm BackupPC/Lang/es.pm
+foreach my $lib ( qw(
+ BackupPC/Lib.pm
+ BackupPC/FileZIO.pm
+ BackupPC/Attrib.pm
+ BackupPC/PoolWrite.pm
+ BackupPC/View.pm
+ BackupPC/Xfer/Archive.pm
+ BackupPC/Xfer/Tar.pm
+ BackupPC/Xfer/Smb.pm
+ BackupPC/Xfer/Rsync.pm
+ BackupPC/Xfer/RsyncDigest.pm
+ BackupPC/Xfer/RsyncFileIO.pm
+ BackupPC/Zip/FileMember.pm
+ BackupPC/Lang/en.pm
+ BackupPC/Lang/fr.pm
+ BackupPC/Lang/es.pm
BackupPC/Lang/de.pm
+ BackupPC/Lang/it.pm
+ BackupPC/CGI/AdminOptions.pm
+ BackupPC/CGI/Archive.pm
+ BackupPC/CGI/ArchiveInfo.pm
+ BackupPC/CGI/Browse.pm
+ BackupPC/CGI/DirHistory.pm
+ BackupPC/CGI/EmailSummary.pm
+ BackupPC/CGI/GeneralInfo.pm
+ BackupPC/CGI/HostInfo.pm
+ BackupPC/CGI/Lib.pm
+ BackupPC/CGI/LOGlist.pm
+ BackupPC/CGI/Queue.pm
+ BackupPC/CGI/ReloadServer.pm
+ BackupPC/CGI/RestoreFile.pm
+ BackupPC/CGI/RestoreInfo.pm
+ BackupPC/CGI/Restore.pm
+ BackupPC/CGI/StartServer.pm
+ BackupPC/CGI/StartStopBackup.pm
+ BackupPC/CGI/StopServer.pm
+ BackupPC/CGI/Summary.pm
+ BackupPC/CGI/View.pm
) ) {
InstallFile("lib/$lib", "$Conf{InstallDir}/lib/$lib", 0444);
}
delete($Conf{SmbClientArgs});
}
+#
+# The blackout timing settings are now stored in a list of hashes, rather
+# than three scalar parameters.
+#
+if ( defined($Conf{BlackoutHourBegin}) ) {
+ $Conf{BlackoutPeriods} = [
+ {
+ hourBegin => $Conf{BlackoutHourBegin},
+ hourEnd => $Conf{BlackoutHourEnd},
+ weekDays => $Conf{BlackoutWeekDays},
+ }
+ ];
+ delete($Conf{BlackoutHourBegin});
+ delete($Conf{BlackoutHourEnd});
+ delete($Conf{BlackoutWeekDays});
+}
+
+#
+# $Conf{RsyncLogLevel} has been replaced by $Conf{XferLogLevel}
+#
+$Conf{XferLogLevel} = $Conf{RsyncLogLevel};
+
#
# IncrFill should now be off
#
if ( $^O eq "solaris" || $^O eq "sunos" ) {
$Conf{PingCmd} = '$pingPath -s $host 56 1';
} elsif ( ($^O eq "linux" || $^O eq "openbsd" || $^O eq "netbsd")
- && !system("$Conf{PingClientPath} -c 1 -w 3 localhost") ) {
+ && !system("$Conf{PingPath} -c 1 -w 3 localhost") ) {
$Conf{PingCmd} = '$pingPath -c 1 -w 3 $host';
} else {
$Conf{PingCmd} = '$pingPath -c 1 $host';
unless chown($uid, $gid, $confCopy);
die("can't chmod $mode $confCopy\n") unless chmod($mode, $confCopy);
}
-open(OUT, ">$dest") || die("can't open $dest for writing\n");
+open(OUT, ">", $dest) || die("can't open $dest for writing\n");
+binmode(OUT);
my $blockComment;
foreach my $var ( @$newConf ) {
if ( length($blockComment)
- BackupPC should be ready to start. Don't forget to run it
as user $Conf{BackupPCUser}! The installation also contains an
init.d/backuppc script that can be copied to /etc/init.d
- so that BackupPC can auto-start on boot. See init.d/README.
+ so that BackupPC can auto-start on boot. This will also enable
+ administrative users to start the server from the CGI interface.
+ See init.d/README.
Enjoy!
EOF
+if ( `$Conf{PerlPath} -V` =~ /uselargefiles=undef/ ) {
+ print <<EOF;
+
+Warning: your perl, $Conf{PerlPath}, does not support large files.
+This means BackupPC won't be able to backup files larger than 2GB.
+To solve this problem you should build/install a new version of perl
+with large file support enabled. Use
+
+ $Conf{PerlPath} -V | egrep uselargefiles
+
+to check if perl has large file support (undef means no support).
+EOF
+}
+
+eval "use File::RsyncP;";
+if ( !$@ && $File::RsyncP::VERSION < 0.50 ) {
+ print("\nWarning: you need to upgrade File::RsyncP;"
+ . " I found $File::RsyncP::VERSION and BackupPC needs 0.50\n");
+}
+
+exit(0);
+
###########################################################################
# Subroutines
###########################################################################
if ( $binary ) {
die("can't copy($prog, $dest)\n") unless copy($prog, $dest);
} else {
- open(PROG, $prog) || die("can't open $prog for reading\n");
- open(OUT, ">$dest") || die("can't open $dest for writing\n");
+ open(PROG, $prog) || die("can't open $prog for reading\n");
+ open(OUT, ">", $dest) || die("can't open $dest for writing\n");
+ binmode(PROG);
+ binmode(OUT);
while ( <PROG> ) {
s/__INSTALLDIR__/$Conf{InstallDir}/g;
s/__TOPDIR__/$Conf{TopDir}/g;
s/__BACKUPPCUSER__/$Conf{BackupPCUser}/g;
s/__CGIDIR__/$Conf{CgiDir}/g;
if ( $first && /^#.*bin\/perl/ ) {
- if ( $Perl56 ) {
- #
- # perl56 and later is taint ok
- #
- print OUT "#!$Conf{PerlPath} -T\n";
- } else {
- #
- # prior to perl56, File::Find fails taint checks,
- # so we run without -T. It's still safe.
- #
- print OUT "#!$Conf{PerlPath}\n";
- }
+ #
+ # Fill in correct path to perl (no taint for >= 2.0.1).
+ #
+ print OUT "#!$Conf{PerlPath}\n";
} else {
print OUT;
}
{
my($file) = @_;
open(C, $file) || die("can't open $file");
+ binmode(C);
my($out, @conf, $var);
my $comment = 1;
my $allVars = {};
+ my $endLine = undef;
while ( <C> ) {
- if ( /^#/ ) {
+ if ( /^#/ && !defined($endLine) ) {
if ( $comment ) {
$out .= $_;
} else {
$out .= $_;
}
$var = $1;
+ $endLine = $1 if ( /^\s*\$Conf\{[^}]*} *= *<<(.*);/ );
+ $endLine = $1 if ( /^\s*\$Conf\{[^}]*} *= *<<'(.*)';/ );
} else {
+ $endLine = undef if ( defined($endLine) && /^\Q$endLine[\n\r]*$/ );
$out .= $_;
}
}