#
#========================================================================
#
-# Version 1.6.0_CVS, released 10 Dec 2002.
+# Version 2.0.0beta1, released 30 Mar 2003.
#
# See http://backuppc.sourceforge.net.
#
# Handle command line options
###########################################################################
my %opts;
-getopts("d", \%opts);
-if ( @ARGV != 0 ) {
+if ( !getopts("d", \%opts) || @ARGV != 0 ) {
print("usage: $0 [-d]\n");
exit(1);
}
exit(1);
}
foreach my $progName ( qw(SmbClientPath NmbLookupPath PingPath DfPath
- SendmailPath) ) {
- next if ( !defined($Conf{$progName}) || -x $Conf{$progName} );
+ SendmailPath SshPath) ) {
+ next if ( $Conf{$progName} eq "" || -x $Conf{$progName} );
print(STDERR $bpc->timeStamp,
"\$Conf{$progName} = '$Conf{$progName}' is not a"
. " valid executable program\n");
# Write out our initial status and save our PID
#
StatusWrite();
- if ( open(PID, ">$TopDir/log/BackupPC.pid") ) {
+ if ( open(PID, ">", "$TopDir/log/BackupPC.pid") ) {
print(PID $$);
close(PID);
}
host => $bpc->trashJob,
user => "BackupPC",
reqTime => time,
- cmd => "$BinDir/BackupPC_trashClean"
+ cmd => ["$BinDir/BackupPC_trashClean"],
});
$CmdQueueOn{$bpc->trashJob} = 1;
}
host => $bpc->adminJob,
user => "BackupPC",
reqTime => time,
- cmd => "$BinDir/BackupPC_nightly"
+ cmd => ["$BinDir/BackupPC_nightly"],
});
$CmdQueueOn{$bpc->adminJob} = 1;
$RunNightlyWhenIdle = 2;
}
if ( !$pid ) {
setpgrp 0,0;
- exec($cmd);
- print(LOG $bpc->timeStamp, "can't exec $cmd for $host\n");
+ exec(@$cmd);
+ print(LOG $bpc->timeStamp, "can't exec @$cmd for $host\n");
exit(0);
}
$Jobs{$host}{pid} = $pid;
vec($FDread, $Jobs{$host}{fn}, 1) = 1;
$Jobs{$host}{startTime} = time;
$Jobs{$host}{reqTime} = $req->{reqTime};
+ $cmd = join(" ", @$cmd);
$Jobs{$host}{cmd} = $cmd;
$Jobs{$host}{type} = $Status{$host}{type};
$Status{$host}{state} = "Status_link_running";
vec($FDread, $Jobs{$host}{fn}, 1) = 1;
$Jobs{$host}{startTime} = time;
$Jobs{$host}{reqTime} = $req->{reqTime};
- $Jobs{$host}{cmd} = "$progName " . join(" ", @args);
+ $Jobs{$host}{cmd} = join(" ", $progName, @args);
$Jobs{$host}{user} = $user;
$Jobs{$host}{type} = $type;
if ( !$req->{dhcp} ) {
$Jobs{$host}{mesg} = $2;
if ( $Jobs{$host}{dhcp} ) {
if ( $mesg =~ /^DHCP (\S+) (\S+)/ ) {
- my $newHost = $2;
+ my $newHost = $bpc->uriUnesc($2);
if ( defined($Jobs{$newHost}) ) {
print(LOG $bpc->timeStamp,
"Backup on $newHost is already running\n");
} else {
print(LOG $bpc->timeStamp, "dhcp $host: $mesg\n");
}
- } elsif ( $mesg =~ /^started (.*) dump, pid=(-?\d+), tarPid=(-?\d+), share=(.*)/ ) {
+ } elsif ( $mesg =~ /^started (.*) dump, share=(.*)/ ) {
$Jobs{$host}{type} = $1;
- $Jobs{$host}{xferPid} = $2;
- $Jobs{$host}{tarPid} = $3;
- $Jobs{$host}{shareName} = $4;
+ $Jobs{$host}{shareName} = $2;
print(LOG $bpc->timeStamp,
- "Started $1 backup on $host"
- . " (pid=$Jobs{$host}{pid}, xferPid=$2",
- $Jobs{$host}{tarPid} > 0
- ? ", tarPid=$Jobs{$host}{tarPid}" : "",
+ "Started $1 backup on $host (pid=$Jobs{$host}{pid}",
$Jobs{$host}{dhcpHostIP}
? ", dhcp=$Jobs{$host}{dhcpHostIP}" : "",
", share=$Jobs{$host}{shareName})\n");
$Status{$host}{aliveCnt}++;
$Status{$host}{dhcpCheckCnt}--
if ( $Status{$host}{dhcpCheckCnt} > 0 );
- } elsif ( $mesg =~ /^started_restore (\S+) (\S+)/ ) {
- $Jobs{$host}{type} = "restore";
+ } elsif ( $mesg =~ /^xferPids (.*)/ ) {
$Jobs{$host}{xferPid} = $1;
- $Jobs{$host}{tarPid} = $2;
+ } elsif ( $mesg =~ /^started_restore/ ) {
+ $Jobs{$host}{type} = "restore";
print(LOG $bpc->timeStamp,
"Started restore on $host"
- . " (pid=$Jobs{$host}{pid}, xferPid=$2",
- $Jobs{$host}{tarPid} > 0
- ? ", tarPid=$Jobs{$host}{tarPid}" : "",
- ")\n");
+ . " (pid=$Jobs{$host}{pid})\n");
$Status{$host}{state} = "Status_restore_in_progress";
$Status{$host}{reason} = "";
$Status{$host}{type} = "restore";
$Info{"$f[0]FileCntRep"} = $f[7];
$Info{"$f[0]FileRepMax"} = $f[8];
$Info{"$f[0]FileCntRename"} = $f[9];
+ $Info{"$f[0]FileLinkMax"} = $f[10];
$Info{"$f[0]Time"} = time;
printf(LOG "%s%s nightly clean removed %d files of"
. " size %.2fGB\n",
$Info{"$f[0]FileCntRm"},
$Info{"$f[0]KbRm"} / (1000 * 1024));
printf(LOG "%s%s is %.2fGB, %d files (%d repeated, "
- . "%d max chain), %d directories\n",
+ . "%d max chain, %d max links), %d directories\n",
$bpc->timeStamp, ucfirst($f[0]),
$Info{"$f[0]Kb"} / (1000 * 1024),
$Info{"$f[0]FileCnt"}, $Info{"$f[0]FileCntRep"},
- $Info{"$f[0]FileRepMax"}, $Info{"$f[0]DirCnt"});
+ $Info{"$f[0]FileRepMax"},
+ $Info{"$f[0]FileLinkMax"}, $Info{"$f[0]DirCnt"});
} elsif ( $mesg =~ /^BackupPC_nightly lock_off/ ) {
$RunNightlyWhenIdle = 0;
} elsif ( $mesg =~ /^processState\s+(.+)/ ) {
$host = $1;
my $user = $2;
my $backoff = $3;
+ $host = $bpc->uriUnesc($host);
if ( $CmdJob ne $host && defined($Status{$host})
&& defined($Jobs{$host}) ) {
print(LOG $bpc->timeStamp,
"Stopping current backup of $host,"
. " request by $user (backoff=$backoff)\n");
kill(2, $Jobs{$host}{pid});
- vec($FDread, $Jobs{$host}{fn}, 1) = 0;
- close($Jobs{$host}{fh});
- delete($Jobs{$host});
+ #
+ # Don't close the pipe now; wait until the child
+ # really exits later. Otherwise close() will
+ # block until the child has exited.
+ # old code:
+ ##vec($FDread, $Jobs{$host}{fn}, 1) = 0;
+ ##close($Jobs{$host}{fh});
+ ##delete($Jobs{$host});
+
$Status{$host}{state} = "Status_idle";
- $Status{$host}{reason} = "Reason_backup_canceled_by_user"; #FIXME: user should be $user (we need to substitute the variable in the l10n stuff)
+ $Status{$host}{reason} = "Reason_backup_canceled_by_user";
$Status{$host}{activeJob} = 0;
$Status{$host}{startTime} = time;
$reply = "ok: backup of $host cancelled";
QueueAllPCs();
} elsif ( $cmd =~ /^backup (\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ ) {
my $hostIP = $1;
- $host = $2;
- my $user = $3;
+ $host = $2;
+ my $user = $3;
my $doFull = $4;
+ $host = $bpc->uriUnesc($host);
+ $hostIP = $bpc->uriUnesc($hostIP);
if ( !defined($Status{$host}) ) {
print(LOG $bpc->timeStamp,
"User $user requested backup of unknown host"
$host = $2;
my $user = $3;
my $reqFileName = $4;
+ $host = $bpc->uriUnesc($host);
+ $hostIP = $bpc->uriUnesc($hostIP);
if ( !defined($Status{$host}) ) {
print(LOG $bpc->timeStamp,
"User $user requested restore to unknown host"
} elsif ( $type =~ /^hosts/ ) {
push(@values, \%Status);
push(@names, qw(*Status));
- } elsif ( $type =~ /^host\((.*)\)/
- && defined($Status{$1}) ) {
- push(@values, {
- %{$Status{$1}},
- BgQueueOn => $BgQueueOn{$1},
- UserQueueOn => $UserQueueOn{$1},
- CmdQueueOn => $CmdQueueOn{$1},
- });
- push(@names, qw(*StatusHost));
+ } elsif ( $type =~ /^host\((.*)\)/ ) {
+ my $h = $bpc->uriUnesc($1);
+ if ( defined($Status{$h}) ) {
+ push(@values, {
+ %{$Status{$h}},
+ BgQueueOn => $BgQueueOn{$h},
+ UserQueueOn => $UserQueueOn{$h},
+ CmdQueueOn => $CmdQueueOn{$h},
+ });
+ push(@names, qw(*StatusHost));
+ } else {
+ print(LOG $bpc->timeStamp,
+ "Unknown host $h for status request\n");
+ }
} else {
print(LOG $bpc->timeStamp,
"Unknown status request $type\n");
$reply = $dump->Dump;
} elsif ( $cmd =~ /^link\s+(.+)/ ) {
my($host) = $1;
+ $host = $bpc->uriUnesc($host);
QueueLink($host);
} elsif ( $cmd =~ /^log\s+(.*)/ ) {
print(LOG $bpc->timeStamp, "$1\n");
[ \%Info, \%Status],
[qw(*Info *Status)]);
$dump->Indent(1);
- if ( open(STATUS, ">$TopDir/log/status.pl") ) {
+ if ( open(STATUS, ">", "$TopDir/log/status.pl") ) {
print(STATUS $dump->Dump);
close(STATUS);
}
host => $host,
user => "BackupPC",
reqTime => time,
- cmd => "$BinDir/BackupPC_link $host"
+ cmd => ["$BinDir/BackupPC_link", $host],
});
$CmdQueueOn{$host} = 1;
}