fix
[BackupPC.git] / configure.pl
index 433a016..28c4b86 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/perl
+#!/usr/bin/env perl
 #============================================================= -*-perl-*-
 #
 # configure.pl: Configuration and installation program for BackupPC
@@ -19,7 +19,7 @@
 #   Craig Barratt <cbarratt@users.sourceforge.net>
 #
 # COPYRIGHT
-#   Copyright (C) 2001-2006  Craig Barratt
+#   Copyright (C) 2001-2010  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
@@ -37,7 +37,7 @@
 #
 #========================================================================
 #
-# Version 3.0.0alpha, released 8 Jul 2006.
+# Version 3.1.0beta0, released 3 Sep 2007.
 #
 # See http://backuppc.sourceforge.net.
 #
@@ -47,6 +47,15 @@ use strict;
 no  utf8;
 use vars qw(%Conf %OrigConf);
 use lib "./lib";
+use Encode;
+
+my $EncodeVersion = eval($Encode::VERSION);
+if ( $EncodeVersion < 1.99 ) {
+    print("Error: you need to upgrade perl's Encode package.\n"
+        . "I found $EncodeVersion and BackupPC needs >= 1.99\n"
+        . "Please go to www.cpan.org or use the cpan command.\n");
+    exit(1);
+}
 
 my @Packages = qw(File::Path File::Spec File::Copy DirHandle Digest::MD5
                   Data::Dumper Getopt::Std Getopt::Long Pod::Usage
@@ -58,7 +67,8 @@ foreach my $pkg ( @Packages ) {
     if ( $pkg =~ /BackupPC/ ) {
         die <<EOF;
 
-BackupPC cannot find the package $pkg, which is included in the
+Error loading $pkg: $@
+BackupPC cannot load the package $pkg, which is included in the
 BackupPC distribution.  This probably means you did not cd to the
 unpacked BackupPC distribution before running configure.pl, eg:
 
@@ -87,6 +97,7 @@ if ( !GetOptions(
             "cgi-dir=s",
             "compress-level=i",
             "config-path=s",
+            "config-override=s%",
             "config-dir=s",
             "data-dir=s",
             "dest-dir=s",
@@ -220,10 +231,15 @@ EOF
 # Create defaults for FHS setup
 #
 if ( $opts{fhs} ) {
-    $Conf{TopDir}       ||= "/data/BackupPC";
-    $Conf{ConfDir}      ||= $opts{"config-dir"} || "/etc/BackupPC";
-    $Conf{InstallDir}   ||= "/usr/local/BackupPC";
-    $Conf{LogDir}       ||= $opts{"log-dir"} || "/var/log/BackupPC";
+    $Conf{TopDir}       ||= $opts{"data-dir"}    || "/data/BackupPC";
+    $Conf{ConfDir}      ||= $opts{"config-dir"}  || "/etc/BackupPC";
+    $Conf{InstallDir}   ||= $opts{"install-dir"} || "/usr/local/BackupPC";
+    $Conf{LogDir}       ||= $opts{"log-dir"}     || "/var/log/BackupPC";
+} else {
+    $Conf{TopDir}       ||= $opts{"data-dir"}    || "/data/BackupPC";
+    $Conf{ConfDir}      ||= $opts{"config-dir"}  || "$Conf{TopDir}/conf";
+    $Conf{InstallDir}   ||= $opts{"install-dir"} || "/usr/local/BackupPC";
+    $Conf{LogDir}       ||= $opts{"log-dir"}     || "$Conf{TopDir}/log";
 }
 
 #
@@ -250,7 +266,7 @@ my %Programs = (
 foreach my $prog ( sort(keys(%Programs)) ) {
     my $path;
     foreach my $subProg ( split(/\//, $prog) ) {
-        $path = FindProgram("$ENV{PATH}:/bin:/usr/bin:/sbin:/usr/sbin",
+        $path = FindProgram("$ENV{PATH}:/usr/bin:/bin:/sbin:/usr/sbin",
                             $subProg) if ( !length($path) );
     }
     $Conf{$Programs{$prog}} = $path if ( !length($Conf{$Programs{$prog}}) );
@@ -273,13 +289,13 @@ EOF
     }
 }
 
-my $Perl56 = system($Conf{PerlPath}
-                        . q{ -e 'exit($^V && $^V ge v5.6.0 ? 1 : 0);'});
+my $Perl58 = system($Conf{PerlPath}
+                        . q{ -e 'exit($^V && $^V ge v5.8.0 ? 1 : 0);'});
 
-if ( !$Perl56 ) {
+if ( !$Perl58 ) {
     print <<EOF;
 
-BackupPC needs perl version 5.6.0 or later.  $Conf{PerlPath} appears
+BackupPC needs perl version 5.8.0 or later.  $Conf{PerlPath} appears
 to be an older version.  Please upgrade to a newer version of perl
 and re-run this configure script.
 
@@ -325,6 +341,8 @@ check the name and verify that this user is in the passwd file.
 
 EOF
         exit(1) if ( $opts{batch} );
+    } else {
+        last;
     }
 }
 
@@ -348,10 +366,10 @@ while ( 1 ) {
 
 print <<EOF;
 
-Please specify a data directory for BackupPC.  This is where the
-all the PC backup data is stored.  This file system needs to be
-big enough to accommodate all the PCs you expect to backup (eg:
-at least several GB per machine).
+Please specify a data directory for BackupPC.  This is where all the
+PC backup data is stored.  This file system needs to be big enough to
+accommodate all the PCs you expect to backup (eg: at least several GB
+per machine).
 
 EOF
 
@@ -389,10 +407,8 @@ BackupPC can compress pool files, but it needs the Compress::Zlib
 package installed (see www.cpan.org). Compression will provide around a
 40% reduction in pool size, at the expense of cpu time.  You can leave
 compression off and run BackupPC without compression, in which case you
-should leave the compression level at 0 (which means off).  You could
-install Compress::Zlib and turn compression on later, but read the
-documentation first about how to do this.  Or the better choice is
-to quit, install Compress::Zlib, and re-run configure.pl.
+should leave the compression level at 0 (which means off).  Or the better
+choice is to quit, install Compress::Zlib, and re-run configure.pl.
 
 EOF
     } elsif ( $Conf{CompressLevel} ) {
@@ -400,14 +416,12 @@ EOF
         print <<EOF;
 
 BackupPC now supports pool file compression.  Since you are upgrading
-BackupPC you probably have existing uncompressed backups.  You have
-several choices if you want to turn on compression.  You can run
-the script BackupPC_compressPool to convert everything to compressed
-form.  Or you can simply turn on compression, so that new backups
-will be compressed.  This will increase the pool storage requirement,
-since both uncompressed and compressed copies of files will be stored.
-But eventually the old uncompressed backups will expire, recovering
-the pool storage.  Please see the documentation for more details.
+BackupPC you probably have existing uncompressed backups.  You could
+turn on compression, so that new backups will be compressed.  This
+will increase the pool storage requirement, since both uncompressed
+and compressed copies of files will be stored. But eventually the old
+uncompressed backups will expire, recovering the pool storage.  Please
+see the documentation for more details.
 
 If you are not sure what to do, leave the Compression Level at 0,
 which disables compression.  You can always read the documentation
@@ -422,8 +436,6 @@ BackupPC now supports pool file compression, but it needs the
 Compress::Zlib module (see www.cpan.org).  For now, leave
 the compression level set at 0 to disable compression.  If you
 want you can install Compress::Zlib and turn compression on.
-Please see the documentation for more details about converting
-old backups to compressed form.
 
 EOF
     }
@@ -460,12 +472,12 @@ if ( $Conf{CgiDir} ne "" ) {
 
     print <<EOF;
 
-BackupPC's CGI script needs to display various GIF images that
-should be stored where Apache can serve them.  They should be
-placed somewher under Apache's DocumentRoot.  BackupPC also
-needs to know the URL to access these images.  Example:
+BackupPC's CGI script needs to display various PNG/GIF images that
+should be stored where Apache can serve them.  They should be placed
+somewhere under Apache's DocumentRoot.  BackupPC also needs to know
+the URL to access these images.  Example:
 
-    Apache image directory:  /usr/local/apache/htdocs/BackupPC
+    Apache image directory:  /var/www/htdocs/BackupPC
     URL for image directory: /BackupPC
 
 The URL for the image directory should start with a slash.
@@ -516,6 +528,7 @@ foreach my $dir ( qw(bin doc
                     lib/BackupPC/Storage
                     lib/BackupPC/Xfer
                     lib/BackupPC/Zip
+                     lib/Net/FTP
                 ) ) {
     next if ( -d "$DestDir$Conf{InstallDir}/$dir" );
     mkpath("$DestDir$Conf{InstallDir}/$dir", 0, 0755);
@@ -531,7 +544,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, 0755);
     if ( !-d "$DestDir$dir" || !my_chown($Uid, $Gid, "$DestDir$dir") ) {
         die("Failed to create or chown $DestDir$dir");
@@ -591,15 +604,22 @@ if ( $Conf{CgiImageDir} ne "" ) {
     }
     InstallFile("conf/BackupPC_stnd.css",
                "$DestDir$Conf{CgiImageDir}/BackupPC_stnd.css", 0444, 0);
+    InstallFile("conf/BackupPC_stnd_orig.css",
+               "$DestDir$Conf{CgiImageDir}/BackupPC_stnd_orig.css", 0444, 0);
+    InstallFile("conf/sorttable.js",
+                "$DestDir$Conf{CgiImageDir}/sorttable.js", 0444, 0);
 }
 
 printf("Making init.d scripts\n");
 foreach my $init ( qw(gentoo-backuppc gentoo-backuppc.conf linux-backuppc
-                     solaris-backuppc debian-backuppc suse-backuppc
-                     slackware-backuppc ) ) {
+                     solaris-backuppc debian-backuppc freebsd-backuppc
+                      freebsd-backuppc2 suse-backuppc slackware-backuppc ) ) {
     InstallFile("init.d/src/$init", "init.d/$init", 0444);
 }
 
+printf("Making Apache configuration file for suid-perl\n");
+InstallFile("httpd/src/BackupPC.conf", "httpd/BackupPC.conf", 0644);
+
 printf("Installing docs in $DestDir$Conf{InstallDir}/doc\n");
 foreach my $doc ( qw(BackupPC.pod BackupPC.html) ) {
     InstallFile("doc/$doc", "$DestDir$Conf{InstallDir}/doc/$doc", 0444);
@@ -697,6 +717,13 @@ $Conf{CgiNavBarAdminAllHosts} = 1;
 #
 $Conf{IncrFill} = 0;
 
+#
+# Empty $Conf{ParPath} if it isn't a valid executable
+# (pre-3.0.0 configure.pl incorrectly set it to a
+# hardcoded value).
+#
+$Conf{ParPath} = '' if ( $Conf{ParPath} ne '' && !-x $Conf{ParPath} );
+
 #
 # Figure out sensible arguments for the ping command
 #
@@ -769,6 +796,23 @@ if ( defined($Conf{CgiUserConfigEdit}) ) {
             =~ s/(\s*\$Conf\{.*?\}\s*=\s*).*/$1$value/s;
 }
 
+#
+# Apply any command-line configuration parameter settings
+#
+foreach my $param ( keys(%{$opts{"config-override"}}) ) {
+    my $val = eval { $opts{"config-override"}{$param} };
+    if ( @$ ) {
+        printf("Can't eval --config-override setting %s=%s\n",
+                        $param, $opts{"config-override"}{$param});
+        exit(1);
+    }
+    if ( !defined($newVars->{$param}) ) {
+        printf("Unkown config parameter %s in --config-override\n", $param);
+        exit(1);
+    }
+    $newConf->[$newVars->{$param}]{text} = $opts{"config-override"}{$param};
+}
+
 #
 # Now backup and write the config file
 #
@@ -836,6 +880,8 @@ will need to do:
 
   - Verify that the CGI script BackupPC_Admin runs correctly.  You might
     need to change the permissions or group ownership of BackupPC_Admin.
+    If this is an upgrade and you are using mod_perl, you will need
+    to restart Apache.  Otherwise it will have stale code.
 
   - BackupPC should be ready to start.  Don't forget to run it
     as user $Conf{BackupPCUser}!  The installation also contains an
@@ -862,9 +908,9 @@ EOF
 }
 
 eval "use File::RsyncP;";
-if ( !$@ && $File::RsyncP::VERSION < 0.64 ) {
+if ( !$@ && $File::RsyncP::VERSION < 0.68 ) {
     print("\nWarning: you need to upgrade File::RsyncP;"
-        . " I found $File::RsyncP::VERSION and BackupPC needs 0.64\n");
+        . " I found $File::RsyncP::VERSION and BackupPC needs 0.68\n");
 }
 
 exit(0);
@@ -905,6 +951,8 @@ sub InstallFile
                                     if ( $prog =~ /Lib.pm/ );
            s/__BACKUPPCUSER__/$Conf{BackupPCUser}/g;
            s/__CGIDIR__/$Conf{CgiDir}/g;
+            s/__IMAGEDIR__/$Conf{CgiImageDir}/g;
+            s/__IMAGEDIRURL__/$Conf{CgiImageDirURL}/g;
            if ( $first && /^#.*bin\/perl/ ) {
                #
                # Fill in correct path to perl (no taint for >= 2.0.1).
@@ -1166,7 +1214,7 @@ final locations.
 
 Use locations specified by the Filesystem Hierarchy Standard
 for installing BackupPC.  This is enabled by default for new
-installatios.  To use the pre-3.0 installation locations,
+installations.  To use the pre-3.0 installation locations,
 specify --no-fhs.
 
 =item B<--help|?>
@@ -1187,7 +1235,7 @@ specified for a batch new install.
 
 Example:
 
-    --html-dir /usr/local/apache/htdocs/BackupPC
+    --html-dir /var/www/htdocs/BackupPC
 
 =item B<--html-dir-url URL>
 
@@ -1261,7 +1309,7 @@ Craig Barratt <cbarratt@users.sourceforge.net>
 
 =head1 COPYRIGHT
 
-Copyright (C) 2001-2006  Craig Barratt.
+Copyright (C) 2001-2010  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