* The CSS definition has been removed from the config.pl file and
[BackupPC.git] / configure.pl
index 262e7b3..1f787df 100755 (executable)
@@ -15,7 +15,7 @@
 #   Craig Barratt <cbarratt@users.sourceforge.net>
 #
 # COPYRIGHT
 #   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
 #
 #   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
@@ -40,6 +40,7 @@
 #========================================================================
 
 use strict;
 #========================================================================
 
 use strict;
+no  utf8;
 use vars qw(%Conf %OrigConf);
 use lib "./lib";
 
 use vars qw(%Conf %OrigConf);
 use lib "./lib";
 
@@ -99,11 +100,11 @@ my $bpc;
 if ( $ConfigPath ne "" && -r $ConfigPath ) {
     (my $topDir = $ConfigPath) =~ s{/[^/]+/[^/]+$}{};
     die("BackupPC::Lib->new failed\n")
 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;
     %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;
 
     if ( $err eq "" ) {
         print <<EOF;
 
@@ -120,16 +121,21 @@ EOF
 # These are the programs whose paths we need to find
 #
 my %Programs = (
 # 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)) ) {
 );
 
 foreach my $prog ( sort(keys(%Programs)) ) {
@@ -148,7 +154,7 @@ I found the following locations for these programs:
 
 EOF
     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);
     }
     print "\n";
     last if (prompt('--> Are these paths correct?', 'y') =~ /^y/i);
@@ -359,8 +365,12 @@ exit unless prompt("--> Do you want to continue?", "y") =~ /y/i;
 #
 # Create install directories
 #
 #
 # 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"
     next if ( -d "$Conf{InstallDir}/$dir" );
     mkpath("$Conf{InstallDir}/$dir", 0, 0775);
     if ( !-d "$Conf{InstallDir}/$dir"
@@ -401,6 +411,7 @@ printf("Installing binaries in $Conf{InstallDir}/bin\n");
 foreach my $prog ( qw(BackupPC BackupPC_dump BackupPC_link BackupPC_nightly
         BackupPC_sendEmail BackupPC_tarCreate BackupPC_trashClean
         BackupPC_tarExtract BackupPC_compressPool BackupPC_zcat
 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);
 }
         BackupPC_restore BackupPC_serverMesg BackupPC_zipCreate ) ) {
     InstallFile("bin/$prog", "$Conf{InstallDir}/bin/$prog", 0555);
 }
@@ -411,11 +422,44 @@ foreach my $prog ( qw(BackupPC BackupPC_dump BackupPC_link BackupPC_nightly
 unlink("$Conf{InstallDir}/bin/BackupPC_queueAll");
 
 printf("Installing library in $Conf{InstallDir}/lib\n");
 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);
 }
     ) ) {
     InstallFile("lib/$lib", "$Conf{InstallDir}/lib/$lib", 0444);
 }
@@ -426,10 +470,21 @@ if ( $Conf{CgiImageDir} ne "" ) {
        (my $destImg = $img) =~ s{^images/}{};
        InstallFile($img, "$Conf{CgiImageDir}/$destImg", 0444, 1);
     }
        (my $destImg = $img) =~ s{^images/}{};
        InstallFile($img, "$Conf{CgiImageDir}/$destImg", 0444, 1);
     }
+
+    #
+    # Install new CSS file, making a backup copy if necessary
+    #
+    my $cssBackup = "$Conf{CgiImageDir}/BackupPC_stnd.css.pre-__VERSION__";
+    if ( -f "$Conf{CgiImageDir}/BackupPC_stnd.css" && !-f $cssBackup ) {
+       rename("$Conf{CgiImageDir}/BackupPC_stnd.css", $cssBackup);
+    }
+    InstallFile("conf/BackupPC_stnd.css",
+               "$Conf{CgiImageDir}/BackupPC_stnd.css", 0444, 0);
 }
 
 printf("Making init.d scripts\n");
 }
 
 printf("Making init.d scripts\n");
-foreach my $init ( qw(linux-backuppc solaris-backuppc debian-backuppc) ) {
+foreach my $init ( qw(gentoo-backuppc gentoo-backuppc.conf linux-backuppc
+                     solaris-backuppc debian-backuppc suse-backuppc) ) {
     InstallFile("init.d/src/$init", "init.d/$init", 0444);
 }
 
     InstallFile("init.d/src/$init", "init.d/$init", 0444);
 }
 
@@ -488,6 +543,41 @@ if ( defined($Conf{SmbClientArgs}) ) {
     delete($Conf{SmbClientArgs});
 }
 
     delete($Conf{SmbClientArgs});
 }
 
+#
+# CSS is now stored in a file rather than a big config variable.
+#
+delete($Conf{CSSstylesheet});
+
+#
+# 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}
+#
+if ( defined($Conf{RsyncLogLevel}) ) {
+    $Conf{XferLogLevel} = $Conf{RsyncLogLevel};
+    delete($Conf{RsyncLogLevel});
+}
+
+#
+# In 2.1.0 the default for $Conf{CgiNavBarAdminAllHosts} is now 1
+#
+$Conf{CgiNavBarAdminAllHosts} = 1;
+
 #
 # IncrFill should now be off
 #
 #
 # IncrFill should now be off
 #
@@ -502,7 +592,7 @@ if ( defined($Conf{PingArgs}) ) {
     if ( $^O eq "solaris" || $^O eq "sunos" ) {
        $Conf{PingCmd} = '$pingPath -s $host 56 1';
     } elsif ( ($^O eq "linux" || $^O eq "openbsd" || $^O eq "netbsd")
     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';
        $Conf{PingCmd} = '$pingPath -c 1 -w 3 $host';
     } else {
        $Conf{PingCmd} = '$pingPath -c 1 $host';
@@ -542,7 +632,8 @@ if ( -f $dest && !-f $confCopy ) {
                                            unless chown($uid, $gid, $confCopy);
     die("can't chmod $mode $confCopy\n")   unless chmod($mode, $confCopy);
 }
                                            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)
 my $blockComment;
 foreach my $var ( @$newConf ) {
     if ( length($blockComment)
@@ -592,11 +683,35 @@ will need to do:
   - 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
   - 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
 
 
 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
 ###########################################################################
 ###########################################################################
 # Subroutines
 ###########################################################################
@@ -620,26 +735,20 @@ sub InstallFile
     if ( $binary ) {
        die("can't copy($prog, $dest)\n") unless copy($prog, $dest);
     } else {
     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/ ) {
        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;
            }
            } else {
                print OUT;
            }
@@ -665,11 +774,13 @@ sub ConfigParse
 {
     my($file) = @_;
     open(C, $file) || die("can't open $file");
 {
     my($file) = @_;
     open(C, $file) || die("can't open $file");
+    binmode(C);
     my($out, @conf, $var);
     my $comment = 1;
     my $allVars = {};
     my($out, @conf, $var);
     my $comment = 1;
     my $allVars = {};
+    my $endLine = undef;
     while ( <C> ) {
     while ( <C> ) {
-        if ( /^#/ ) {
+        if ( /^#/ && !defined($endLine) ) {
             if ( $comment ) {
                 $out .= $_;
             } else {
             if ( $comment ) {
                 $out .= $_;
             } else {
@@ -697,7 +808,10 @@ sub ConfigParse
                 $out .= $_;
             }
             $var = $1;
                 $out .= $_;
             }
             $var = $1;
+           $endLine = $1 if ( /^\s*\$Conf\{[^}]*} *= *<<(.*);/ );
+           $endLine = $1 if ( /^\s*\$Conf\{[^}]*} *= *<<'(.*)';/ );
         } else {
         } else {
+           $endLine = undef if ( defined($endLine) && /^\Q$endLine[\n\r]*$/ );
             $out .= $_;
         }
     }
             $out .= $_;
         }
     }