X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=configure.pl;h=28c4b8661f007dc309e8d3870b6a1144c8e001be;hp=0b8e030538cbb374b00ee4010b0945631f50a470;hb=dcde0725fd46cdfe126eb385a1eb356df636bbec;hpb=546f9691f118c9ea2d164f377994b4a018a60d02 diff --git a/configure.pl b/configure.pl index 0b8e030..28c4b86 100755 --- a/configure.pl +++ b/configure.pl @@ -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 # # COPYRIGHT -# Copyright (C) 2001-2004 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 2.1.0beta1, released 9 Apr 2004. +# 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 < 0, -verbose => 2) if $opts{man}; my $DestDir = $opts{"dest-dir"}; +$DestDir = "" if ( $DestDir eq "/" ); if ( !$opts{"uid-ignore"} && $< != 0 ) { print < Full path to existing main config.pl", $ConfigPath, "config-path"); } last if ( $ConfigPath eq "" - || ($ConfigPath =~ /^\// && -r $ConfigPath && -w $ConfigPath) ); + || ($ConfigPath =~ /^\// && -f $ConfigPath && -w $ConfigPath) ); my $problem = "is not an absolute path"; $problem = "is not writable" if ( !-w $ConfigPath ); $problem = "is not readable" if ( !-r $ConfigPath ); @@ -174,7 +195,10 @@ while ( 1 ) { print("Need to specify a valid --config-path for upgrade\n"); exit(1); } + $ConfigFileOK = 0; } +$opts{fhs} = 1 if ( !defined($opts{fhs}) && $ConfigPath eq "" ); +$opts{fhs} = 0 if ( !defined($opts{fhs}) ); my $bpc; if ( $ConfigPath ne "" && -r $ConfigPath ) { @@ -184,9 +208,12 @@ if ( $ConfigPath ne "" && -r $ConfigPath ) { %Conf = $bpc->Conf(); %OrigConf = %Conf; if ( !$opts{fhs} ) { - ($Conf{TopDir} = $ConfigPath) =~ s{/[^/]+/[^/]+$}{}; + ($Conf{TopDir} = $ConfigPath) =~ s{/[^/]+/[^/]+$}{} + if ( $Conf{TopDir} eq '' ); + $bpc->{LogDir} = $Conf{LogDir} = "$Conf{TopDir}/log" + if ( $Conf{LogDir} eq '' ); } - $Conf{ConfDir} = $confDir; + $bpc->{ConfDir} = $Conf{ConfDir} = $confDir; my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}, 1); if ( $err eq "" ) { print < Do you want to continue?", "y") =~ /y/i; # foreach my $dir ( qw(bin doc lib/BackupPC/CGI + lib/BackupPC/Config lib/BackupPC/Lang + 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, 0775); + mkpath("$DestDir$Conf{InstallDir}/$dir", 0, 0755); if ( !-d "$DestDir$Conf{InstallDir}/$dir" || !my_chown($Uid, $Gid, "$DestDir$Conf{InstallDir}/$dir") ) { die("Failed to create or chown $DestDir$Conf{InstallDir}/$dir\n"); @@ -515,8 +544,8 @@ foreach my $dir ( qw(bin doc # Create CGI image directory # foreach my $dir ( ($Conf{CgiImageDir}) ) { - next if ( $dir eq "" || -d $dir ); - mkpath("$DestDir$dir", 0, 0775); + 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"); } else { @@ -535,68 +564,28 @@ foreach my $dir ( ( "$Conf{TopDir}/trash", "$Conf{ConfDir}", "$Conf{LogDir}", - "$Conf{StatusDir}", ) ) { - mkpath("$DestDir/$dir", 0, 0750) if ( !-d "$DestDir/$dir" ); - if ( !-d "$DestDir/$dir" - || !my_chown($Uid, $Gid, "$DestDir/$dir") ) { - die("Failed to create or chown $DestDir/$dir\n"); + mkpath("$DestDir$dir", 0, 0750) if ( !-d "$DestDir$dir" ); + if ( !-d "$DestDir$dir" + || !my_chown($Uid, $Gid, "$DestDir$dir") ) { + die("Failed to create or chown $DestDir$dir\n"); } else { - print("Created $DestDir/$dir\n"); + print("Created $DestDir$dir\n"); } } printf("Installing binaries in $DestDir$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 - BackupPC_archive BackupPC_archiveHost - BackupPC_restore BackupPC_serverMesg BackupPC_zipCreate ) ) { - InstallFile("bin/$prog", "$DestDir$Conf{InstallDir}/bin/$prog", 0555); +foreach my $prog ( qw( + __CONFIGURE_BIN_LIST__ + ) ) { + InstallFile($prog, "$DestDir$Conf{InstallDir}/$prog", 0555); } printf("Installing library in $DestDir$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/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/Lang/nl.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 + __CONFIGURE_LIB_LIST__ ) ) { - InstallFile("lib/$lib", "$DestDir$Conf{InstallDir}/lib/$lib", 0444); + InstallFile($lib, "$DestDir$Conf{InstallDir}/$lib", 0444); } if ( $Conf{CgiImageDir} ne "" ) { @@ -615,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); @@ -639,18 +635,20 @@ InstallFile("conf/hosts", "$DestDir$Conf{ConfDir}/hosts", 0644) # parameters and deleting ones that are no longer needed. # my $dest = "$DestDir$Conf{ConfDir}/config.pl"; -my ($newConf, $newVars) = ConfigParse("conf/config.pl"); +my ($distConf, $distVars) = ConfigParse("conf/config.pl"); my ($oldConf, $oldVars); +my ($newConf, $newVars) = ($distConf, $distVars); if ( -f $dest ) { ($oldConf, $oldVars) = ConfigParse($dest); - $newConf = ConfigMerge($oldConf, $oldVars, $newConf, $newVars); + ($newConf, $newVars) = ConfigMerge($oldConf, $oldVars, $distConf, $distVars); } -$Conf{EMailFromUserName} ||= $Conf{BackupPCUser}; -$Conf{EMailAdminUserName} ||= $Conf{BackupPCUser}; # -# Update various config parameters +# Update various config parameters. The old config is in Conf{} +# and the new config is an array in text form in $newConf->[]. # +$Conf{EMailFromUserName} ||= $Conf{BackupPCUser}; +$Conf{EMailAdminUserName} ||= $Conf{BackupPCUser}; # # Guess $Conf{CgiURL} @@ -719,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 # @@ -753,6 +758,64 @@ if ( defined($Conf{SmbClientTimeout}) ) { delete($Conf{SmbClientTimeout}); } +# +# Replace --devices with -D in RsyncArgs and RsyncRestoreArgs +# +foreach my $param ( qw(RsyncArgs RsyncRestoreArgs) ) { + next if ( !defined($newVars->{$param}) ); + $newConf->[$newVars->{$param}]{text} =~ s/--devices/-D/g; +} + +# +# Merge any new user-editable parameters into CgiUserConfigEdit +# by copying the old settings forward. +# +if ( defined($Conf{CgiUserConfigEdit}) ) { + # + # This is a real hack. The config file merging is done in text + # form without actually instantiating the new conf structure. + # So we need to extract the new hash of settings, update it, + # and merge the text. Ugh... + # + my $new; + my $str = $distConf->[$distVars->{CgiUserConfigEdit}]{text}; + + $str =~ s/^\s*\$Conf\{.*?\}\s*=\s*/\$new = /m; + eval($str); + foreach my $p ( keys(%$new) ) { + $new->{$p} = $Conf{CgiUserConfigEdit}{$p} + if ( defined($Conf{CgiUserConfigEdit}{$p}) ); + } + $Conf{CgiUserConfigEdit} = $new; + my $d = Data::Dumper->new([$new], [*value]); + $d->Indent(1); + $d->Terse(1); + my $value = $d->Dump; + $value =~ s/(.*)\n/$1;\n/s; + $newConf->[$newVars->{CgiUserConfigEdit}]{text} + =~ 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 +# my $confCopy = "$dest.pre-__VERSION__"; if ( -f $dest && !-f $confCopy ) { # @@ -806,9 +869,9 @@ Ok, it looks like we are finished. There are several more things you will need to do: - Browse through the config file, $Conf{ConfDir}/config.pl, - and make sure all the settings are correct. In particular, you - will need to set the smb share password and user name, backup - policies and check the email message headers and bodies. + and make sure all the settings are correct. In particular, + you will need to set \$Conf{CgiAdminUsers} so you have + administration privileges in the CGI interface. - Edit the list of hosts to backup in $Conf{ConfDir}/hosts. @@ -817,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 @@ -843,9 +908,9 @@ EOF } eval "use File::RsyncP;"; -if ( !$@ && $File::RsyncP::VERSION < 0.52 ) { +if ( !$@ && $File::RsyncP::VERSION < 0.68 ) { print("\nWarning: you need to upgrade File::RsyncP;" - . " I found $File::RsyncP::VERSION and BackupPC needs 0.52\n"); + . " I found $File::RsyncP::VERSION and BackupPC needs 0.68\n"); } exit(0); @@ -882,8 +947,12 @@ sub InstallFile s/__LOGDIR__/$Conf{LogDir}/g; s/__CONFDIR__/$Conf{ConfDir}/g; s/__TOPDIR__/$Conf{TopDir}/g; + s/^(\s*my \$useFHS\s*=\s*)\d;/${1}$opts{fhs};/ + 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). @@ -975,7 +1044,7 @@ sub ConfigMerge { my($old, $oldVars, $new, $newVars) = @_; my $posn = 0; - my $res; + my($res, $resVars); # # Find which config parameters are not needed any longer @@ -1007,7 +1076,10 @@ sub ConfigMerge push(@$res, $new); } } - return $res; + for ( my $i = 0 ; $i < @$res ; $i++ ) { + $resVars->{$res->[$i]{var}} = $i; + } + return ($res, $resVars); } sub my_chown @@ -1097,6 +1169,12 @@ Examples Set the configuration compression level to N. Default is 3 if Compress::Zlib is installed. +=item B<--config-dir CONFIG_DIR> + +Configuration directory for new installations. Defaults +to /etc/BackupPC with FHS. Automatically extracted +from --config-path for existing installations. + =item B<--config-path CONFIG_PATH> Path to the existing config.pl configuration file for BackupPC. @@ -1135,8 +1213,9 @@ final locations. =item B<--fhs> Use locations specified by the Filesystem Hierarchy Standard -for installing BackupPC. This is enabled by default. To -use the pre-3.0 installation locations, specify --no-fhs. +for installing BackupPC. This is enabled by default for new +installations. To use the pre-3.0 installation locations, +specify --no-fhs. =item B<--help|?> @@ -1156,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> @@ -1178,6 +1257,10 @@ Example: --install-dir /usr/local/BackupPC +=item B<--log-dir LOG_DIR> + +Log directory. Defaults to /var/log/BackupPC with FHS. + =item B<--man> Prints the manual page and exits. @@ -1226,7 +1309,7 @@ Craig Barratt =head1 COPYRIGHT -Copyright (C) 2001-2004 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