X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=bin%2FBackupPC;h=d200f5a167330d5c80ca2d02d3332d1d663db88e;hp=8e718de2ef817c083b6ec0e841ccf25996675c16;hb=fda25dc88a63ccac1c80efa2e4994bf0725ca9b7;hpb=b81d2da5e16975674f011e4833337ac0fa24e0ea diff --git a/bin/BackupPC b/bin/BackupPC index 8e718de..d200f5a 100755 --- a/bin/BackupPC +++ b/bin/BackupPC @@ -29,7 +29,7 @@ # Craig Barratt # # COPYRIGHT -# Copyright (C) 2001-2003 Craig Barratt +# Copyright (C) 2001-2007 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 @@ -47,7 +47,7 @@ # #======================================================================== # -# Version 3.0.0beta2, released 11 Nov 2006. +# Version 3.1.0, released 25 Nov 2007. # # See http://backuppc.sourceforge.net. # @@ -59,6 +59,7 @@ use vars qw(%Status %Info $Hosts); use lib "/usr/local/BackupPC/lib"; use BackupPC::Lib; use BackupPC::FileZIO; +use Encode qw/decode_utf8/; use File::Path; use Data::Dumper; @@ -113,9 +114,13 @@ if ( $Conf{BackupPCUserVerify} # Read old status # if ( -f "$LogDir/status.pl" && !(my $ret = do "$LogDir/status.pl") ) { - die "couldn't parse $LogDir/status.pl: $@" if $@; - die "couldn't do $LogDir/status.pl: $!" unless defined $ret; - die "couldn't run $LogDir/status.pl"; + if ( $@ ) { + print STDERR "couldn't parse $LogDir/status.pl: $@"; + } elsif ( !defined($ret) ) { + print STDERR "couldn't do $LogDir/status.pl: $!"; + } else { + print STDERR "couldn't run $LogDir/status.pl"; + } } # @@ -243,14 +248,16 @@ sub Main_Initialize umask($Conf{UmaskMode}); # - # Check for another running process, check that PASSWD is set and - # verify executables are configured correctly. + # Check for another running process, verify executables are configured + # correctly and make sure $TopDir is on a file system that supports + # hardlinks. # if ( $Info{pid} ne "" && kill(0, $Info{pid}) ) { print(STDERR $bpc->timeStamp, "Another BackupPC is running (pid $Info{pid}); quitting...\n"); exit(1); } + foreach my $progName ( qw(SmbClientPath NmbLookupPath PingPath DfPath SendmailPath SshPath) ) { next if ( $Conf{$progName} eq "" || -x $Conf{$progName} ); @@ -260,6 +267,17 @@ sub Main_Initialize exit(1); } + if ( !$bpc->HardlinkTest("$TopDir/pc", "$TopDir/cpool") ) { + print(STDERR $bpc->timeStamp, "Can't create a test hardlink between a file" + . " in $TopDir/pc and $TopDir/cpool. Either these are different" + . " file systems, or this file system doesn't support hardlinks," + . " or these directories don't exist, or there is a permissions" + . " problem, or the file system is out of inodes or full. Use" + . " df, df -i, and ls -ld to check each of these possibilities." + . " Quitting...\n"); + exit(1); + } + if ( $opts{d} ) { # # daemonize by forking; more robust method per: @@ -517,6 +535,7 @@ sub Main_TryToRun_CmdQueue } if ( !$pid ) { setpgrp 0,0; + $ENV{BPC_REQUSER} = $req->{user}; exec(@$cmd); print(LOG $bpc->timeStamp, "can't exec @$cmd for $host\n"); exit(0); @@ -1262,7 +1281,7 @@ sub Main_Check_Client_Messages last; } $Clients{$client}{mesgCnt}++; - $cmd = $2; + $cmd = decode_utf8($2); if ( $cmd =~ /^stop (\S+)\s+(\S+)\s+(\S*)/ ) { $host = $1; my $user = $2; @@ -1571,10 +1590,8 @@ sub StatusWrite [ \%Info, \%Status], [qw(*Info *Status)]); $dump->Indent(1); - if ( open(STATUS, ">", "$LogDir/status.pl") ) { - print(STATUS $dump->Dump); - close(STATUS); - } + my $text = $dump->Dump; + $bpc->{storage}->TextFileWrite("$LogDir/status.pl", $text); } #