projects
/
matthijs
/
upstream
/
backupninja.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tar: Support running on multiple backends.
[matthijs/upstream/backupninja.git]
/
handlers
/
dup.in
diff --git
a/handlers/dup.in
b/handlers/dup.in
index cae99097e814b764cacdb20d3ebfa6acb5fa2f46..c8dfcba6480340122769725e0d23942f1b4ded04 100644
(file)
--- a/
handlers/dup.in
+++ b/
handlers/dup.in
@@
-1,4
+1,5
@@
# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
+# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
#
# duplicity script for backupninja
# requires duplicity
#
# duplicity script for backupninja
# requires duplicity
@@
-25,6
+26,8
@@
setsection dest
getconf incremental yes
getconf keep 60
getconf desturl
getconf incremental yes
getconf keep 60
getconf desturl
+getconf awsaccesskeyid
+getconf awssecretaccesskey
getconf sshoptions
getconf bandwidthlimit 0
getconf desthost
getconf sshoptions
getconf bandwidthlimit 0
getconf desthost
@@
-35,8
+38,11
@@
destdir=${destdir%/}
### SANITY CHECKS ##############################################################
[ -n "$desturl" -o -n "$destdir" ] || fatal "The destination directory (destdir) must be set when desturl is not used."
### SANITY CHECKS ##############################################################
[ -n "$desturl" -o -n "$destdir" ] || fatal "The destination directory (destdir) must be set when desturl is not used."
-[ -n "$include" ] || fatal "No source includes specified"
+[ -n "$include"
-o -n "$vsinclude"
] || fatal "No source includes specified"
[ -n "$password" ] || fatal "The password option must be set."
[ -n "$password" ] || fatal "The password option must be set."
+if [ "`echo $desturl | @AWK@ -F ':' '{print $1}'`" == "s3+http" ]; then
+ [ -n "$awsaccesskeyid" -a -n "$awssecretaccesskey" ] || fatal "AWS access keys must be set for S3 backups."
+fi
### VServers
# If vservers are configured, check that the ones listed in $vsnames do exist.
### VServers
# If vservers are configured, check that the ones listed in $vsnames do exist.
@@
-66,9
+72,9
@@
if [ "$testconnect" == "yes" ]; then
if [ ! $test ]; then
result=`ssh $sshoptions -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'`
if [ "$result" != "1" ]; then
if [ ! $test ]; then
result=`ssh $sshoptions -o PasswordAuthentication=no $desthost -l $destuser 'echo -n 1'`
if [ "$result" != "1" ]; then
- fatal "Can't connect to $desthost as $destuser."
+
fatal "Can't connect to $desthost as $destuser."
else
else
- debug "Connected to $desthost as $destuser successfully"
+
debug "Connected to $desthost as $destuser successfully"
fi
fi
fi
fi
fi
fi
@@
-105,7
+111,10
@@
duplicity_sub="`echo $duplicity_version | @AWK@ -F '.' '{print $3}'`"
# --sftp-command ourselves
scpoptions="$sshoptions"
# --sftp-command ourselves
scpoptions="$sshoptions"
-[ "$bandwidthlimit" == 0 ] || scpoptions="$scpoptions -l $bandwidthlimit"
+if [ "$bandwidthlimit" != 0 ]; then
+ [ -z "$desturl" ] || warning 'The bandwidthlimit option is not used when desturl is set.'
+ scpoptions="$scpoptions -l $bandwidthlimit"
+fi
# < 0.4.2 : only uses ssh and scp
if [ "$duplicity_major" -le 0 -a "$duplicity_minor" -le 4 -a "$duplicity_sub" -lt 2 ]; then
# < 0.4.2 : only uses ssh and scp
if [ "$duplicity_major" -le 0 -a "$duplicity_minor" -le 4 -a "$duplicity_sub" -lt 2 ]; then
@@
-149,13
+158,18
@@
fi
# If incremental==no, force a full backup anyway.
if [ "$incremental" == "no" ]; then
# before 0.4.4, full was an option and not a command
# If incremental==no, force a full backup anyway.
if [ "$incremental" == "no" ]; then
# before 0.4.4, full was an option and not a command
- if [ "$duplicity_major" -le 0 -a "$duplicity_minor" -le 4 -a "$duplicity_sub" -lt 4 ]; then
+ if [ "$duplicity_major" -le 0 -a "$duplicity_minor" -le 4 -a "$duplicity_sub" -lt 4 ]; then
execstr_options="${execstr_options} --full"
else
execstr_command="full"
fi
fi
execstr_options="${execstr_options} --full"
else
execstr_command="full"
fi
fi
+### Cleanup options
+if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 6 -a "$duplicity_sub" -ge 1 ]; then
+ execstr_options="${execstr_options} --extra-clean"
+fi
+
### Temporary directory
precmd=
if [ -n "$tmpdir" ]; then
### Temporary directory
precmd=
if [ -n "$tmpdir" ]; then
@@
-163,6
+177,7
@@
if [ -n "$tmpdir" ]; then
info "Temporary directory ($tmpdir) does not exist, creating it."
mkdir -p "$tmpdir"
[ $? -eq 0 ] || fatal "Could not create temporary directory ($tmpdir)."
info "Temporary directory ($tmpdir) does not exist, creating it."
mkdir -p "$tmpdir"
[ $? -eq 0 ] || fatal "Could not create temporary directory ($tmpdir)."
+ chmod 0700 "$tmpdir"
fi
info "Using $tmpdir as TMPDIR"
precmd="${precmd}TMPDIR=$tmpdir "
fi
info "Using $tmpdir as TMPDIR"
precmd="${precmd}TMPDIR=$tmpdir "
@@
-184,26
+199,35
@@
fi
set -o noglob
# excludes
set -o noglob
# excludes
+SAVEIFS=$IFS
+IFS=$(echo -en "\n\b")
for i in $exclude; do
str="${i//__star__/*}"
execstr_source="${execstr_source} --exclude '$str'"
done
for i in $exclude; do
str="${i//__star__/*}"
execstr_source="${execstr_source} --exclude '$str'"
done
+IFS=$SAVEIFS
# includes
# includes
+SAVEIFS=$IFS
+IFS=$(echo -en "\n\b")
for i in $include; do
[ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'"
str="${i//__star__/*}"
execstr_source="${execstr_source} --include '$str'"
done
for i in $include; do
[ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'"
str="${i//__star__/*}"
execstr_source="${execstr_source} --include '$str'"
done
+IFS=$SAVEIFS
# vsincludes
if [ $usevserver = yes ]; then
for vserver in $vsnames; do
# vsincludes
if [ $usevserver = yes ]; then
for vserver in $vsnames; do
+ SAVEIFS=$IFS
+ IFS=$(echo -en "\n\b")
for vi in $vsinclude; do
for vi in $vsinclude; do
- str="${vi//__star__/*}"
- str="$VROOTDIR/$vserver$str"
- execstr_source="${execstr_source} --include '$str'"
+
str="${vi//__star__/*}"
+
str="$VROOTDIR/$vserver$str"
+
execstr_source="${execstr_source} --include '$str'"
done
done
+ IFS=$SAVEIFS
done
fi
done
fi
@@
-213,23
+237,29
@@
set +o noglob
execstr_source=${execstr_source//\\*/\\\\\\*}
execstr_source=${execstr_source//\\*/\\\\\\*}
+### If desturl is an S3 URL export the AWS environment variables
+if [ "`echo $desturl | @AWK@ -F ':' '{print $1}'`" == "s3+http" ]; then
+ export AWS_ACCESS_KEY_ID="$awsaccesskeyid"
+ export AWS_SECRET_ACCESS_KEY="$awssecretaccesskey"
+fi
+
### Cleanup commands (duplicity >= 0.4.4)
# cleanup
if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 4 -a "$duplicity_sub" -ge 4 ]; then
### Cleanup commands (duplicity >= 0.4.4)
# cleanup
if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 4 -a "$duplicity_sub" -ge 4 ]; then
- debug "$precmd duplicity cleanup $execstr_options $execstr_serverpart"
+ debug "$precmd duplicity cleanup
--force
$execstr_options $execstr_serverpart"
if [ ! $test ]; then
export PASSPHRASE=$password
output=`nice -n $nicelevel \
su -c \
if [ ! $test ]; then
export PASSPHRASE=$password
output=`nice -n $nicelevel \
su -c \
- "$precmd duplicity cleanup $execstr_options $execstr_serverpart 2>&1"`
+ "$precmd duplicity cleanup
--force
$execstr_options $execstr_serverpart 2>&1"`
exit_code=$?
if [ $exit_code -eq 0 ]; then
exit_code=$?
if [ $exit_code -eq 0 ]; then
- debug $output
- info "Duplicity cleanup finished successfully."
+
debug $output
+
info "Duplicity cleanup finished successfully."
else
else
- debug $output
- warning "Duplicity cleanup failed."
+
debug $output
+
warning "Duplicity cleanup failed."
fi
fi
fi
fi
fi
fi
@@
-237,20
+267,20
@@
fi
# remove-older-than
if [ "$keep" != "yes" ]; then
if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 4 -a "$duplicity_sub" -ge 4 ]; then
# remove-older-than
if [ "$keep" != "yes" ]; then
if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 4 -a "$duplicity_sub" -ge 4 ]; then
- debug "$precmd duplicity remove-older-than $keep $execstr_options $execstr_serverpart"
+ debug "$precmd duplicity remove-older-than $keep
--force
$execstr_options $execstr_serverpart"
if [ ! $test ]; then
export PASSPHRASE=$password
if [ ! $test ]; then
export PASSPHRASE=$password
- output=`nice -n $nicelevel \
+
output=`nice -n $nicelevel \
su -c \
su -c \
- "$precmd duplicity remove-older-than $keep $execstr_options $execstr_serverpart 2>&1"`
- exit_code=$?
- if [ $exit_code -eq 0 ]; then
- debug $output
- info "Duplicity remove-older-than finished successfully."
- else
- debug $output
- warning "Duplicity remove-older-than failed."
- fi
+ "$precmd duplicity remove-older-than $keep
--force
$execstr_options $execstr_serverpart 2>&1"`
+
exit_code=$?
+
if [ $exit_code -eq 0 ]; then
+
debug $output
+
info "Duplicity remove-older-than finished successfully."
+
else
+
debug $output
+
warning "Duplicity remove-older-than failed."
+
fi
fi
fi
fi
fi
fi
fi
@@
-258,18
+288,23
@@
fi
### Backup command
debug "$precmd duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart"
if [ ! $test ]; then
### Backup command
debug "$precmd duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart"
if [ ! $test ]; then
+ outputfile=`maketemp backupout`
export PASSPHRASE=$password
output=`nice -n $nicelevel \
su -c \
export PASSPHRASE=$password
output=`nice -n $nicelevel \
su -c \
- "$precmd duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart 2>&1"`
+ "$precmd duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart
>$outputfile
2>&1"`
exit_code=$?
exit_code=$?
+ debug $output
+ cat $outputfile | (while read output ; do
+ info $output
+ done
+ )
if [ $exit_code -eq 0 ]; then
if [ $exit_code -eq 0 ]; then
- debug $output
info "Duplicity finished successfully."
else
info "Duplicity finished successfully."
else
- debug $output
fatal "Duplicity failed."
fi
fatal "Duplicity failed."
fi
+ rm $outputfile
fi
return 0
fi
return 0