-#!/bin/perl
+#!/usr/bin/perl
#=============================================================
#
# BackupPC_archiveHost: Archive files for a single host
#
# AUTHOR
# Craig Barratt <cbarratt@users.sourceforge.net>
+# Josh Marshall
#
# COPYRIGHT
-# Copyright (C) 2001-2003 Craig Barratt
+# Copyright (C) 2001-2009 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
#
#========================================================================
#
-# Version 2.1.0beta0, released 20 Mar 2004.
+# Version 3.2.0, released 31 Jul 2010.
#
# See http://backuppc.sourceforge.net.
#
# Make sure the specified programs are executable
#
foreach my $prog ( ($tarCreate, $compPath, $splitPath, $parPath) ) {
+ if ( $prog =~ /[][;&()<>{}|^\n\r\t *\$\\'"`?]/ ) {
+ print("Error: executable path $prog contains suspicious characters\n");
+ exit(1);
+ }
next if ( $prog eq "" || -x $prog );
print("Error: $prog is not an executable program\n");
exit(1);
#
# Build the command we will run
#
-$share = $bpc->shellEscape($share);
-$host = $bpc->shellEscape($host);
+$share = $bpc->shellEscape($share);
+$host = $bpc->shellEscape($host);
+$bkupNum = $bpc->shellEscape($bkupNum);
+$fileExt = $bpc->shellEscape($fileExt);
+$splitSize = $bpc->shellEscape($splitSize);
+$parfile = $bpc->shellEscape($parfile);
+my $outLocE = $bpc->shellEscape($outLoc);
+
+#
+# We prefer to use /bin/csh because the exit status of a pipeline
+# is non-zero if any command is non zero. In contrast, /bin/sh
+# and /bin/bash use the convention that the exit status is just
+# the exit status of the last command of the pipeline.
+#
+my @shell;
+if ( -x "/bin/csh" ) {
+ @shell = ("/bin/csh", "-cf");
+} elsif ( -x "/bin/sh" ) {
+ @shell = ("/bin/sh", "-c");
+} else {
+ print("Error: Can't find executable /bin/csh or /bin/sh\n");
+ exit(1);
+}
my $cmd = "$tarCreate -t -h $host -n $bkupNum -s $share . ";
-$cmd .= "| $compPath " if ( $compPath ne "cat" && $compPath ne "" );
+$cmd .= "| $compPath " if ( $compPath ne "cat"
+ && $compPath ne "/bin/cat"
+ && $compPath ne "" );
if ( -b $outLoc || -c $outLoc || -f $outLoc ) {
#
# Output file is a device or a regular file, so don't use split
#
- $cmd .= ">> $outLoc";
+ $cmd .= ">> $outLocE";
$mesg .= " to $outLoc";
} else {
mkpath($outLoc) if ( !-d $outLoc );
print("Error: unable to create output directory $outLoc\n");
exit(1);
}
- if ( $splitSize && -x $splitPath ) {
- $cmd .= "| $splitPath -b $splitSize - $outLoc/$host.$bkupNum.tar$fileExt.";
- $mesg .= ", split to output files $outLoc/$host.$bkupNum.tar$fileExt.*";
+ if ( $splitSize > 0 && -x $splitPath ) {
+ $cmd .= "| $splitPath -b $splitSize - $outLocE/$host.$bkupNum.tar$fileExt.";
+ $mesg .= ", split to output files $outLocE/$host.$bkupNum.tar$fileExt.*";
} else {
- $cmd .= "> $outLoc/$host.$bkupNum.tar$fileExt";
- $mesg .= " to output file $outLoc/$host.$bkupNum.tar$fileExt";
+ $cmd .= "> $outLocE/$host.$bkupNum.tar$fileExt";
+ $mesg .= " to output file $outLocE/$host.$bkupNum.tar$fileExt";
}
}
print("$mesg\n");
#
# Run the command
#
-my $ret = system($cmd);
+my $ret = system(@shell, $cmd);
if ( $ret ) {
+ print("Executing: @shell $cmd\n");
print("Error: $tarCreate, compress or split failed\n");
exit(1);
}
# ie: not a tape device).
#
if ( -d $outLoc && -x $parPath ) {
- print("Running $parPath to create parity files\n");
- $ret = system("$parPath a -n $parfile $outLoc/$host.$bkupNum.tar$fileExt.par $outLoc/$host.$bkupNum.tar$fileExt.*");
- if ( $ret ) {
- print("Error: $parPath failed\n");
- exit(1);
+ if ( length($parfile) ) {
+ print("Running $parPath to create parity files\n");
+ my $parCmd = "$parPath c -r$parfile $outLocE/$host.$bkupNum.tar$fileExt.par2 $outLocE/$host.$bkupNum.tar$fileExt*";
+ $ret = system($parCmd);
+ if ( $ret ) {
+ print("Executing: $parCmd\n");
+ print("Error: $parPath failed\n");
+ exit(1);
+ }
}
}