aboutsummaryrefslogtreecommitdiff
path: root/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'handlers')
-rw-r--r--handlers/Makefile.am8
-rw-r--r--handlers/Makefile.in98
-rw-r--r--handlers/dup.helper.in35
-rw-r--r--handlers/dup.in65
-rw-r--r--handlers/ldap.helper.in91
-rw-r--r--handlers/ldap.in112
-rw-r--r--handlers/maildir.in1
-rw-r--r--handlers/mysql.in2
-rw-r--r--handlers/pgsql.in2
-rw-r--r--handlers/rdiff.in4
-rw-r--r--handlers/rsync.in240
-rw-r--r--handlers/wget6
12 files changed, 300 insertions, 364 deletions
diff --git a/handlers/Makefile.am b/handlers/Makefile.am
index 54155e8..bad53bb 100644
--- a/handlers/Makefile.am
+++ b/handlers/Makefile.am
@@ -3,16 +3,20 @@ HANDLERS = dup dup.helper maildir makecd \
makecd.helper mysql mysql.helper pgsql pgsql.helper rdiff \
rdiff.helper rsync sh svn sys sys.helper trac tar tar.helper
+DIST_HANDLERS = dup.in dup.helper.in maildir.in makecd.in \
+ makecd.helper.in mysql.in mysql.helper.in pgsql.in pgsql.helper.in rdiff.in \
+ rdiff.helper.in rsync.in sh.in svn.in sys.in sys.helper.in trac.in tar.in tar.helper.in wget
+
CLEANFILES = $(HANDLERS)
-EXTRA_DIST = Makefile.am $(HANDLERS)
+EXTRA_DIST = Makefile.am $(DIST_HANDLERS)
edit = sed \
-e "s,@BASH\@,$(BASH),g" \
-e "s,@AWK\@,$(AWK),g" \
-e "s,@SED\@,$(SED),g"
-dist_pkgdata_DATA = $(HANDLERS)
+pkgdata_DATA = $(HANDLERS)
dup: $(srcdir)/dup.in
rm -f dup
diff --git a/handlers/Makefile.in b/handlers/Makefile.in
index 99ffc0f..7d92075 100644
--- a/handlers/Makefile.in
+++ b/handlers/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.5 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -16,6 +16,23 @@
@SET_MAKE@
VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -33,8 +50,7 @@ NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
subdir = handlers
-DIST_COMMON = $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -44,6 +60,11 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -65,8 +86,14 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(pkgdatadir)"
-DATA = $(dist_pkgdata_DATA)
+DATA = $(pkgdata_DATA)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -152,14 +179,18 @@ HANDLERS = dup dup.helper maildir makecd \
makecd.helper mysql mysql.helper pgsql pgsql.helper rdiff \
rdiff.helper rsync sh svn sys sys.helper trac tar tar.helper
+DIST_HANDLERS = dup.in dup.helper.in maildir.in makecd.in \
+ makecd.helper.in mysql.in mysql.helper.in pgsql.in pgsql.helper.in rdiff.in \
+ rdiff.helper.in rsync.in sh.in svn.in sys.in sys.helper.in trac.in tar.in tar.helper.in wget
+
CLEANFILES = $(HANDLERS)
-EXTRA_DIST = Makefile.am $(HANDLERS)
+EXTRA_DIST = Makefile.am $(DIST_HANDLERS)
edit = sed \
-e "s,@BASH\@,$(BASH),g" \
-e "s,@AWK\@,$(AWK),g" \
-e "s,@SED\@,$(SED),g"
-dist_pkgdata_DATA = $(HANDLERS)
+pkgdata_DATA = $(HANDLERS)
all: all-am
.SUFFIXES:
@@ -193,10 +224,13 @@ $(top_srcdir)/configure: $(am__configure_deps)
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
+install-pkgdataDATA: $(pkgdata_DATA)
@$(NORMAL_INSTALL)
- test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)"
- @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+ fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
@@ -206,13 +240,11 @@ install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
$(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
done
-uninstall-dist_pkgdataDATA:
+uninstall-pkgdataDATA:
@$(NORMAL_UNINSTALL)
- @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+ @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files
+ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
tags: TAGS
TAGS:
@@ -267,10 +299,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -303,7 +340,7 @@ info: info-am
info-am:
-install-data-am: install-dist_pkgdataDATA
+install-data-am: install-pkgdataDATA
install-dvi: install-dvi-am
@@ -347,21 +384,20 @@ ps: ps-am
ps-am:
-uninstall-am: uninstall-dist_pkgdataDATA
+uninstall-am: uninstall-pkgdataDATA
.MAKE: install-am install-strip
.PHONY: all all-am check check-am clean clean-generic distclean \
distclean-generic distdir dvi dvi-am html html-am info info-am \
- install install-am install-data install-data-am \
- install-dist_pkgdataDATA install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
- pdf-am ps ps-am uninstall uninstall-am \
- uninstall-dist_pkgdataDATA
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-pkgdataDATA install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+ uninstall-am uninstall-pkgdataDATA
dup: $(srcdir)/dup.in
diff --git a/handlers/dup.helper.in b/handlers/dup.helper.in
index 7f82c2f..ea794c9 100644
--- a/handlers/dup.helper.in
+++ b/handlers/dup.helper.in
@@ -286,6 +286,12 @@ nicelevel = $dup_nicelevel
# if 'desturl' is set below, 'testconnect' must be set to 'no' for now.
testconnect = $dup_testconnect
+## temporary directory used by duplicity, set to some other location if your /tmp is small
+## default is either /tmp or /usr/tmp, depending on the system
+##
+## Default:
+# tmpdir = /tmp
+
######################################################
## gpg section
## (how to encrypt and optionally sign the backups)
@@ -448,6 +454,16 @@ keepincroffulls = $dup_keepincroffulls
#awsaccesskeyid = YOUR_AWS_ACCESS_KEY_ID
#awssecretaccesskey = YOUR_AWS_SECRET_KEY
+## RackSpace's CloudFiles username, API key, and authentication URL.
+## cfusername = YOUR_CF_USERNAME
+## cfapikey = YOUR_CF_API_KEY
+## cfauthurl = YOUR_CF_AUTH_URL
+##
+## Default:
+# cfusername =
+# cfapikey =
+# cfauthurl =
+
# FTP password, needed for backups using desturl = ftp://...
#ftp_password =
@@ -457,11 +473,20 @@ keepincroffulls = $dup_keepincroffulls
#bandwidthlimit = 128
bandwidthlimit = $dup_bandwidth
-# passed directly to ssh, scp (and sftp in duplicity >=0.4.2)
-# warning: sftp does not support all scp options, especially -i; as
-# a workaround, you can use "-o <SSHOPTION>"
-#sshoptions = -o IdentityFile=/root/.ssh/id_rsa_duplicity
-sshoptions = $dup_sshoptions
+## duplicity < 0.6.17
+## ------------------
+## passed directly to ssh, scp (and sftp in duplicity >=0.4.2)
+## warning: sftp does not support all scp options, especially -i; as
+## a workaround, you can use "-o <SSHOPTION>"
+## an example setting would be:
+## sshoptions = -o IdentityFile=/root/.ssh/id_rsa_duplicity
+##
+## duplicity >= 0.6.17
+## ------------------
+## supports only "-o IdentityFile=..."
+##
+## Default:
+# sshoptions =
# put the backups under this destination directory
# if using 'desturl' above, this must not be set
diff --git a/handlers/dup.in b/handlers/dup.in
index 40f6723..9eb2fbb 100644
--- a/handlers/dup.in
+++ b/handlers/dup.in
@@ -30,6 +30,9 @@ getconf keepincroffulls all
getconf desturl
getconf awsaccesskeyid
getconf awssecretaccesskey
+getconf cfusername
+getconf cfapikey
+getconf cfauthurl
getconf ftp_password
getconf sshoptions
getconf bandwidthlimit 0
@@ -46,6 +49,9 @@ destdir=${destdir%/}
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
+if [ "`echo $desturl | @AWK@ -F ':' '{print $1}'`" == "cf+http" ]; then
+ [ -n "$cfusername" -a -n "$cfapikey" ] || fatal "Cloudfiles access keys must be set for S3 backups."
+fi
if [ "`echo $desturl | @AWK@ -F ':' '{print $1}'`" == "ftp" ]; then
[ -n "$ftp_password" ] || fatal "ftp_password must be set for FTP backups."
fi
@@ -89,6 +95,7 @@ fi
### COMMAND-LINE MANGLING ######################################################
### initialize $execstr*
+execstr_precmd=
execstr_command=
execstr_options="$options --no-print-statistics"
execstr_source=
@@ -108,13 +115,27 @@ duplicity_minor="`echo $duplicity_version | @AWK@ -F '.' '{print $2}'`"
duplicity_sub="`echo $duplicity_version | @AWK@ -F '.' '{print $3}'`"
### ssh/scp/sftp options (duplicity < 0.4.3 is unsupported)
-scpoptions="$sshoptions"
-if [ "$bandwidthlimit" != 0 ]; then
- [ -z "$desturl" ] || warning 'The bandwidthlimit option is not used when desturl is set.'
- scpoptions="$scpoptions -l $bandwidthlimit"
+## duplicity >= 0.6.17 : paramiko backend
+if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 6 -a "$duplicity_sub" -ge 17 ]; then
+ if [ -n "$sshoptions" ]; then
+ echo "$sshoptions" | grep -Eqs '^-o[[:space:]]*IdentityFile=[^ ]+$' \
+ || warning 'duplicity >= 0.6.17 only supports the IdentityFile SSH option'
+ fi
+ execstr_options="${execstr_options} --ssh-options '$sshoptions'"
+ if [ "$bandwidthlimit" != 0 ]; then
+ [ -z "$desturl" ] || warning 'The bandwidthlimit option is not used when desturl is set.'
+ execstr_precmd="trickle -s -d $bandwidthlimit -u $bandwidthlimit"
+ fi
+## duplicity < 0.6.17 : scp/sftp backend
+else
+ scpoptions="$sshoptions"
+ if [ "$bandwidthlimit" != 0 ]; then
+ [ -z "$desturl" ] || warning 'The bandwidthlimit option is not used when desturl is set.'
+ scpoptions="$scpoptions -l $bandwidthlimit"
+ fi
+ sftpoptions="$sshoptions"
+ execstr_options="${execstr_options} --scp-command 'scp $scpoptions' --sftp-command 'sftp $sftpoptions'"
fi
-sftpoptions="$sshoptions"
-execstr_options="${execstr_options} --scp-command 'scp $scpoptions' --sftp-command 'sftp $sftpoptions'"
### Symmetric or asymmetric (public/private key pair) encryption
if [ -n "$encryptkey" ]; then
@@ -232,16 +253,26 @@ if [ "`echo $desturl | @AWK@ -F ':' '{print $1}'`" == "s3+http" ]; then
export AWS_SECRET_ACCESS_KEY="$awssecretaccesskey"
fi
+### If desturl is a RackSpace's CloudFiles URL export the relevant
+### environment variables
+if [ "`echo $desturl | @AWK@ -F ':' '{print $1}'`" == "cf+http" ]; then
+ export CLOUDFILES_USERNAME="$cfusername"
+ export CLOUDFILES_APIKEY="$cfapikey"
+ if [ -n "$cfauthurl" ]; then
+ export CLOUDFILES_AUTHURL="$cfauthurl"
+ fi
+fi
+
### Cleanup commands (duplicity >= 0.4.4)
# cleanup
-debug "duplicity cleanup --force $execstr_options $execstr_serverpart"
+debug "$execstr_precmd duplicity cleanup --force $execstr_options $execstr_serverpart"
if [ ! $test ]; then
export PASSPHRASE=$password
export FTP_PASSWORD=$ftp_password
output=`nice -n $nicelevel \
su -c \
- "duplicity cleanup --force $execstr_options $execstr_serverpart 2>&1"`
+ "$execstr_precmd duplicity cleanup --force $execstr_options $execstr_serverpart 2>&1"`
exit_code=$?
if [ $exit_code -eq 0 ]; then
debug $output
@@ -254,13 +285,13 @@ fi
# remove-older-than
if [ "$keep" != "yes" ]; then
- debug "duplicity remove-older-than $keep --force $execstr_options $execstr_serverpart"
+ debug "$execstr_precmd duplicity remove-older-than $keep --force $execstr_options $execstr_serverpart"
if [ ! $test ]; then
export PASSPHRASE=$password
export FTP_PASSWORD=$ftp_password
output=`nice -n $nicelevel \
su -c \
- "duplicity remove-older-than $keep --force $execstr_options $execstr_serverpart 2>&1"`
+ "$execstr_precmd duplicity remove-older-than $keep --force $execstr_options $execstr_serverpart 2>&1"`
exit_code=$?
if [ $exit_code -eq 0 ]; then
debug $output
@@ -276,13 +307,13 @@ fi
if [ "$keep" != "yes" ]; then
if [ "$keepincroffulls" != "all" ]; then
if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 6 -a "$duplicity_sub" -ge 10 ]; then
- debug "$precmd duplicity remove-all-inc-of-but-n-full $keepincroffulls --force $execstr_options $execstr_serverpart"
+ debug "$execstr_precmd duplicity remove-all-inc-of-but-n-full $keepincroffulls --force $execstr_options $execstr_serverpart"
if [ ! $test ]; then
export PASSPHRASE=$password
export FTP_PASSWORD=$ftp_password
output=`nice -n $nicelevel \
su -c \
- "$precmd duplicity remove-all-inc-of-but-n-full $keepincroffulls --force $execstr_options $execstr_serverpart 2>&1"`
+ "$execstr_precmd duplicity remove-all-inc-of-but-n-full $keepincroffulls --force $execstr_options $execstr_serverpart 2>&1"`
exit_code=$?
if [ $exit_code -eq 0 ]; then
debug $output
@@ -297,18 +328,22 @@ if [ "$keep" != "yes" ]; then
fi
### Backup command
-debug "duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart"
+debug "$execstr_precmd duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart"
if [ ! $test ]; then
outputfile=`maketemp backupout`
export PASSPHRASE=$password
export FTP_PASSWORD=$ftp_password
output=`nice -n $nicelevel \
su -c \
- "duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart >$outputfile 2>&1"`
+ "$execstr_precmd duplicity $execstr_command $execstr_options $execstr_source --exclude '**' / $execstr_serverpart >$outputfile 2>&1"`
exit_code=$?
debug $output
cat $outputfile | (while read output ; do
- info $output
+ if [ $exit_code -eq 0 ]; then
+ info $output
+ else
+ error $output
+ fi
done
)
if [ $exit_code -eq 0 ]; then
diff --git a/handlers/ldap.helper.in b/handlers/ldap.helper.in
deleted file mode 100644
index 4154cc6..0000000
--- a/handlers/ldap.helper.in
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
-# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
-
-HELPERS="$HELPERS ldap:ldap_database_backup"
-
-ldap_create_file() {
- while true; do
- checkBox "ldap action wizard" "check options (slapcat OR ldapsearch)" \
- "slapcat" "export ldif using slapcat" yes \
- "ldapsearch" "export ldif using ldapsearch" no \
- "compress" "compress the ldif output files" yes \
- "ssl" "use SSL (deprecated)" no \
- "tls" "use TLS extended operations (RFC2246, RFC2830)" yes
- status=$?
- compress="compress = no"
- method="method = <unset>"
- restart="restart = no"
- binddn=""
- passwordfile=""
- ssl="ssl = no"
- tls="tls = no"
- [ $status = 1 ] && return;
- result="$REPLY"
- for opt in $result; do
- case $opt in
- '"compress"') compress="compress = yes";;
- '"slapcat"')
- method="method = slapcat"
- [ "$_RESTART" == "yes" ] && restart="restart = yes"
- ;;
- '"ldapsearch"')
- method="method = ldapsearch"
- inputBox "ldap action wizard" "ldapsearch requires authentication. Specify here what password file to use. It must have the password with no trailing return and it should not be world readable."
- [ $? = 1 ] && return
- passwordfile="passwordfile = $REPLY"
- inputBox "ldap action wizard" "ldapsearch requires authentication. Specify here what DN to bind as:"
- [ $? = 1 ] && return
- binddn="binddn = $REPLY"
- require_packages ldap-utils
- ;;
- '"ssl"') ssl="ssl = yes";;
- '"tls"') tls="tls = yes";;
- esac
- done
- get_next_filename $configdirectory/30.ldap
- cat > $next_filename <<EOF
-$method
-$compress
-$restart
-$binddn
-$passwordfile
-$ssl
-$tls
-# backupdir = /var/backups/ldap
-# conf = /etc/ldap/slapd.conf
-# databases = all
-EOF
- chmod 600 $next_filename
- return
- done
-}
-
-ldap_wizard() {
- bdb=no
- hdb=no
- ldbm=no
- for backend in `grep -e "^backend" /etc/ldap/slapd.conf | @AWK@ '{print $2}'`; do
- if [ "$backend" == "bdb" ]; then
- bdb=yes
- elif [ "$backend" == "hdb" ]; then
- hdb=yes
- elif [ "$backend" == "ldbm" ]; then
- ldbm=yes
- fi
- done
-
- if [ "$bdb" == "yes" -o "$hdb" == "yes" ]; then
- if [ "$ldbm" == "no" ]; then
- msgBox "ldap action wizard" "It looks like the backend in your slapd.conf is set to BDB or HDB. If this is not the case, exit this wizard! From this point on, we will assume BDB or HDB backend, which might have disasterious consequences if this is incorrect."
- _RESTART=no
- ldap_create_file
- fi
- elif [ "$ldbm" == "yes" ]; then
- msgBox "ldap action wizard" "It looks like the backend in your slapd.conf is set to LDBM. Because of this, you will have less options (because it is not safe to use slapcat while slapd is running LDBM)."
- _RESTART=yes
- ldap_create_file
- else
- msgBox "ldap action wizard" "I couldn't find any supported backend in your slapd.conf. Bailing out."
- return
- fi
-}
diff --git a/handlers/ldap.in b/handlers/ldap.in
deleted file mode 100644
index 600f172..0000000
--- a/handlers/ldap.in
+++ /dev/null
@@ -1,112 +0,0 @@
-# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
-# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
-#
-# openldap backup handler script for backupninja
-#
-
-getconf backupdir /var/backups/ldap
-getconf conf /etc/ldap/slapd.conf
-getconf databases all
-getconf compress yes
-getconf ldif yes
-getconf restart no
-getconf method ldapsearch
-getconf passwordfile
-getconf binddn
-getconf ldaphost
-getconf ssl yes
-getconf tls no
-
-if [ $ssl = 'yes' ]; then
- URLBASE="ldaps"
-else
- URLBASE="ldap"
-fi
-
-status="ok"
-
-[ -f $conf ] || fatal "slapd config file ($conf) not found"
-[ -d $backupdir ] || mkdir -p $backupdir
-[ -d $backupdir ] || fatal "Backup directory '$backupdir'"
-
-dbsuffixes=(`@AWK@ 'BEGIN {OFS=":"} /[:space:]*^database[:space:]*\w*/ {db=$2}; /^[:space:]*suffix[:space:]*\w*/ {if (db=="bdb"||db=="hdb"||db="ldbm") print db,$2}' $conf|@SED@ -e 's/[" ]//g'`)
-
-## LDIF DUMP
-
-if [ "$ldif" == "yes" ]; then
- dumpdir="$backupdir"
- [ -d $dumpdir ] || mkdir -p $dumpdir
-
- if [ "$databases" == 'all' ]; then
- dbcount=`grep '^database' $conf | wc -l`
- let "dbcount = dbcount - 1"
- databases=`seq 0 $dbcount`;
- fi
-
- for db in $databases; do
- if [ `expr index "$db" "="` == "0" ]; then
- # db is a number, get the suffix.
- dbsuffix=${dbsuffixes[$db]/*:/}
- else
- dbsuffix=$db
- fi
- # some databases don't have suffix (like monitor), skip these
- if [ "$dbsuffix" == "" ]; then
- continue;
- fi
-
- if [ "$method" == "slapcat" ]; then
- execstr="$SLAPCAT -f $conf -b $dbsuffix"
- else
- LDAPARGS=""
- if [ "$tls" == "yes" ]; then
- LDAPARGS="-ZZ"
- fi
- if [ -n "$ldaphost" ]; then
- execstr="$LDAPSEARCH $LDAPARGS -H $URLBASE://$ldaphost -x -L -b ""$dbsuffix"" -D ""$binddn"" -y $passwordfile"
- else
- execstr="$LDAPSEARCH -H $URLBASE://$ldaphost -x -L -b ""$dbsuffix"" -D ""$binddn"" -y $passwordfile"
- fi
- [ -f "$passwordfile" ] || fatal "Password file $passwordfile not found. When method is set to ldapsearch, you must also specify a password file."
- debug "$execstr"
- fi
- if [ ! $test ]; then
- if [ "$restart" == "yes" ]; then
- debug "Shutting down ldap server..."
- /etc/init.d/slapd stop
- fi
-
- ext=
- if [ "$compress" == "yes" ]; then
- ext=".gz"
- fi
- touch $dumpdir/$dbsuffix.ldif$ext
- if [ ! -f $dumpdir/$dbsuffix.ldif$ext ]; then
- fatal "Couldn't create ldif dump file: $dumpdir/$dbsuffix.ldif$ext"
- fi
-
- if [ "$compress" == "yes" ]; then
- execstr="$execstr | $GZIP $GZIP_OPTS > $dumpdir/$dbsuffix.ldif.gz"
- else
- execstr="$execstr > $dumpdir/$dbsuffix.ldif"
- fi
- debug "$execstr"
- output=`su root -s /bin/bash -c "set -o pipefail ; $execstr" 2>&1`
- code=$?
- if [ "$code" == "0" ]; then
- debug $output
- info "Successfully finished ldif export of $dbsuffix"
- else
- warning $output
- warning "Failed ldif export of $dbsuffix"
- fi
-
- if [ "$restart" == "yes" ]; then
- debug "Starting ldap server..."
- /etc/init.d/slapd start
- fi
- fi
- done
-fi
-
-return 0
diff --git a/handlers/maildir.in b/handlers/maildir.in
index 148c30d..912c0e6 100644
--- a/handlers/maildir.in
+++ b/handlers/maildir.in
@@ -57,7 +57,6 @@ getconf rotate yes
getconf remove yes
getconf backup yes
-getconf loadlimit 5
getconf speedlimit 0
getconf keepdaily 5
getconf keepweekly 3
diff --git a/handlers/mysql.in b/handlers/mysql.in
index 185a98a..65deebb 100644
--- a/handlers/mysql.in
+++ b/handlers/mysql.in
@@ -256,7 +256,7 @@ then
for db in $databases
do
DUMP_BASE="$MYSQLDUMP $defaultsfile $sqldumpoptions"
- if [ "$db" = "information_schema" ]
+ if [ "$db" = "information_schema" ] || [ "$db" = "performance_schema" ]
then
DUMP_BASE="${DUMP_BASE} --skip-lock-tables"
fi
diff --git a/handlers/pgsql.in b/handlers/pgsql.in
index a50d3c7..fc337a0 100644
--- a/handlers/pgsql.in
+++ b/handlers/pgsql.in
@@ -186,7 +186,7 @@ else
if [ "$compress" == "yes" ]; then
dumpcmd="set -o pipefail ; $PGSQLDUMP --format=$format ${disablecustomcompress} $db | $GZIP $GZIP_OPTS > '$backupdir/${db}.${dumpext}.gz'"
else
- dumpcmd="$PGSQLDUMP --format=$format ${disablecustomcompress} $db | > '$backupdir/${db}.${dumpext}'"
+ dumpcmd="$PGSQLDUMP --format=$format ${disablecustomcompress} $db > '$backupdir/${db}.${dumpext}'"
fi
if [ $usevserver = yes ]; then
execstr="$VSERVER $vsname exec su - $PGSQLUSER -s /bin/bash -c \"$dumpcmd\""
diff --git a/handlers/rdiff.in b/handlers/rdiff.in
index c2f5aa0..c3c8d1d 100644
--- a/handlers/rdiff.in
+++ b/handlers/rdiff.in
@@ -271,8 +271,8 @@ if [ $test = 0 ]; then
debug $output
info "Successfully finished backing up source $label"
else
- warning $output
- warning "Failed backup up source $label"
+ error $output
+ fatal "Failed backup up source $label"
fi
fi
diff --git a/handlers/rsync.in b/handlers/rsync.in
index 6c772e1..386255e 100644
--- a/handlers/rsync.in
+++ b/handlers/rsync.in
@@ -35,11 +35,10 @@
# mountpoint = backup partition mountpoint or backup main folder (either local or remote)
# backupdir = folder relative do $mountpoint where the backup should be stored (local or remote)
# format = specify backup storage format: short, long or mirror (i.e, no rotations)
-# days = for short storage format, specify the number of backup increments (min = 5)
+# days = for short storage format, specify the number of backup increments (min = 2, set to 1 or less to disable)
# keepdaily = for long storage format, specify the number of daily backup increments
# keepweekly = for long storage format, specify the number of weekly backup increments
# keepmonthly = for long storage format, specify the number of monthly backup increments
-# lockfile = lockfile to be kept during backup execution
# nicelevel = rsync command nice level
# enable_mv_timestamp_bug = set to "yes" if your system isnt handling timestamps correctly
# tmp = temp folder
@@ -60,7 +59,7 @@
# exclude_vserver = vserver-name (valid only if vservers = yes on backupninja.conf)
# numericids = when set to 1, use numeric ids instead of user/group mappings on rsync
# compress = if set to 1, compress data on rsync (remote source only)
-# bandwidthlimit = set a badnwidth limit in KB/s (remote source only)
+# bandwidthlimit = set a bandwidth limit in KB/s (remote source only)
# remote_rsync = remote rsync program (remote source only)
# id_file = ssh key file (remote source only)
# batch = set to "yes" to rsync use a batch file as source
@@ -79,7 +78,7 @@
# port = remote port number (remote destination only)
# user = remote user name (remote destination only)
# id_file = ssh key file (remote destination only)
-# bandwidthlimit = set a badnwidth limit in KB/s (remote destination only)
+# bandwidthlimit = set a bandwidth limit in KB/s (remote destination only)
# remote_rsync = remote rsync program (remote dest only)
# batch = set to "yes" to rsync write a batch file from the changes
# batchbase = folder where the batch file should be written
@@ -125,11 +124,10 @@ function eval_config {
getconf mountpoint
getconf backupdir
getconf format short
- getconf days
+ getconf days 7
getconf keepdaily 5
getconf keepweekly 3
getconf keepmonthly 1
- getconf lockfile
getconf nicelevel 0
getconf enable_mv_timestamp_bug no
getconf tmp /tmp
@@ -230,19 +228,16 @@ function eval_config {
if [ "$dest" != "local" ] && [ "$from" == "remote" ]; then
fatal "When source is remote, destination should be local."
- exit 1
fi
if [ "$from" != "local" ] && [ "$from" != "remote" ]; then
fatal "Invalid source $from"
- exit 1
fi
backupdir="$mountpoint/$backupdir"
if [ "$dest" == "local" ] && [ ! -d "$backupdir" ]; then
- error "Backupdir $backupdir does not exist"
- exit 1
+ fatal "Backupdir $backupdir does not exist"
fi
if [ ! -z "$log" ]; then
@@ -280,9 +275,7 @@ function eval_config {
mv=move_files
fi
- for path in $exclude; do
- excludes="$excludes --exclude=$path"
- done
+ excludes=`echo "$exclude" | @SED@ -e "s/^/--exclude='/g" -e "s/ /' --exclude='/g" -e "s/$/'/"`
}
@@ -293,9 +286,9 @@ function rotate_short {
local keep="$2"
local metadata="`dirname $folder`/metadata"
- if [[ "$keep" -lt 4 ]]; then
- error "Rotate: minimum of 4 rotations"
- exit 1
+ # No rotations
+ if [[ "$keep" -lt 1 ]]; then
+ return
fi
if [ -d $folder.$keep ]; then
@@ -320,6 +313,14 @@ function rotate_short {
$nice $cp -alf /$folder.1/. /$folder.0
fi
+ # Cleanup orphaned metadata
+ for file in `ls $metadata`; do
+ if [ ! -d "`dirname $folder`/$file" ]; then
+ debug "removing orphaned metadata $file"
+ rm -rf $metadata/$file
+ fi
+ done
+
}
function rotate_short_remote {
@@ -328,9 +329,9 @@ function rotate_short_remote {
local metadata="`dirname $folder`/metadata"
local keep="$2"
- if [[ "$2" -lt 4 ]]; then
- error "Rotate: minimum of 4 rotations"
- exit 1
+ # No rotations
+ if [[ "$keep" -lt 1 ]]; then
+ return
fi
(
@@ -358,6 +359,14 @@ function rotate_short_remote {
if [ -d $folder.1 ]; then
$nice $cp -alf /$folder.1/. /$folder.0
fi
+
+ # Cleanup orphaned metadata
+ for file in \`ls $metadata\`; do
+ if [ ! -d "`dirname $folder`/\$file" ]; then
+ echo "Debug: removing orphaned metadata \$file"
+ rm -rf $metadata/\$file
+ fi
+ done
##### END REMOTE SCRIPT #######
EOF
) | (while read a; do passthru $a; done)
@@ -378,8 +387,8 @@ function rotate_long {
local metadata
if [ ! -d "$backuproot" ]; then
- echo "Debug: skipping rotate of $backuproot as it doesn't exist."
- exit
+ warning "Skipping rotate of $backuproot as it doesn't exist."
+ return
fi
for rottype in daily weekly monthly; do
@@ -392,12 +401,12 @@ function rotate_long {
echo "Debug: $dir.1 does not exist, skipping."
continue 1
elif [ ! -f $metadata.1/created ] && [ ! -f $metadata.1/rotated ]; then
- echo "Warning: metadata does not exist for $dir.1. This backup may be only partially completed. Skipping rotation."
+ warning "Warning: metadata does not exist for $dir.1. This backup may be only partially completed. Skipping rotation."
continue 1
fi
# Rotate the current list of backups, if we can.
- oldest=`find $backuproot -maxdepth 1 -type d -name $rottype'.*' | @SED@ 's/^.*\.//' | sort -n | tail -1`
+ oldest=`find $backuproot -maxdepth 1 -type d -name $rottype'.*' | @SED@ -e 's/^.*\.//' | sort -n | tail -1`
[ "$oldest" == "" ] && oldest=0
for (( i=$oldest; i > 0; i-- )); do
if [ -d $dir.$i ]; then
@@ -408,19 +417,27 @@ function rotate_long {
else
created=0
fi
+ # Validate created date
+ if [ -z "$created" ] || echo $created | grep -v -q -e '^[0-9]*$'; then
+ warning "Invalid metadata $created. Skipping rotation."
+ break
+ fi
cutoff_time=$(( now - (seconds*(i-1)) ))
if [ ! $created -gt $cutoff_time ]; then
next=$(( i + 1 ))
if [ ! -d $dir.$next ]; then
- echo "Debug: $rottype.$i --> $rottype.$next"
+ debug "$rottype.$i --> $rottype.$next"
$nice mv $dir.$i $dir.$next
mkdir -p $metadata.$next
date +%c%n%s > $metadata.$next/rotated
+ if [ -f $metadata.$i/created ]; then
+ $nice mv $metadata.$i/created $metadata.$next
+ fi
else
- echo "Debug: skipping rotation of $dir.$i because $dir.$next already exists."
+ debug "skipping rotation of $dir.$i because $dir.$next already exists."
fi
else
- echo "Debug: skipping rotation of $dir.$i because it was created" $(( (now-created)/86400)) "days ago ("$(( (now-cutoff_time)/86400))" needed)."
+ debug "skipping rotation of $dir.$i because it was created" $(( (now-created)/86400)) "days ago ("$(( (now-cutoff_time)/86400))" needed)."
fi
fi
done
@@ -428,38 +445,52 @@ function rotate_long {
max=$((keepdaily+1))
if [ $keepweekly -gt 0 -a -d $backuproot/daily.$max -a ! -d $backuproot/weekly.1 ]; then
- echo "Debug: daily.$max --> weekly.1"
+ debug "daily.$max --> weekly.1"
$nice mv $backuproot/daily.$max $backuproot/weekly.1
mkdir -p $backuproot/metadata/weekly.1
date +%c%n%s > $backuproot/metadata/weekly.1/rotated
+ #if [ -f $backuproot/metadata/daily.$max/created ]; then
+ # $nice mv $backuproot/metadata/daily.$max/created $backuproot/metadata/weekly.1/
+ #fi
fi
max=$((keepweekly+1))
if [ $keepmonthly -gt 0 -a -d $backuproot/weekly.$max -a ! -d $backuproot/monthly.1 ]; then
- echo "Debug: weekly.$max --> monthly.1"
+ debug "weekly.$max --> monthly.1"
$nice mv $backuproot/weekly.$max $backuproot/monthly.1
mkdir -p $backuproot/metadata/monthly.1
date +%c%n%s > $backuproot/metadata/monthly.1/rotated
+ #if [ -f $backuproot/metadata/weekly.$max/created ]; then
+ # $nice mv $backuproot/metadata/weekly.$max/created $backuproot/metadata/weekly.1/
+ #fi
fi
for rottype in daily weekly monthly; do
max=$((keep${rottype}+1))
dir="$backuproot/$rottype"
- oldest=`find $backuproot -maxdepth 1 -type d -name $rottype'.*' | @SED@ 's/^.*\.//' | sort -n | tail -1`
+ oldest=`find $backuproot -maxdepth 1 -type d -name $rottype'.*' | @SED@ -e 's/^.*\.//' | sort -n | tail -1`
[ "$oldest" == "" ] && oldest=0
# if we've rotated the last backup off the stack, remove it.
for (( i=$oldest; i >= $max; i-- )); do
if [ -d $dir.$i ]; then
if [ -d $backuproot/rotate.tmp ]; then
- echo "Debug: removing rotate.tmp"
+ debug "removing rotate.tmp"
$nice rm -rf $backuproot/rotate.tmp
fi
- echo "Debug: moving $rottype.$i to rotate.tmp"
+ debug "moving $rottype.$i to rotate.tmp"
$nice mv $dir.$i $backuproot/rotate.tmp
fi
done
done
+ # Cleanup orphaned metadata
+ for file in `ls $backuproot/metadata`; do
+ if [ ! -d "$backuproot/$file" ]; then
+ debug "removing orphaned metadata $file"
+ rm -rf $backuproot/metadata/$file
+ fi
+ done
+
}
function rotate_long_remote {
@@ -479,7 +510,7 @@ function rotate_long_remote {
now=\`date +%s\`
if [ ! -d "$backuproot" ]; then
- echo "Debug: skipping rotate of $backuproot as it doesn't exist."
+ echo "Fatal: skipping rotate of $backuproot as it doesn't exist."
exit
fi
@@ -498,7 +529,7 @@ function rotate_long_remote {
fi
# Rotate the current list of backups, if we can.
- oldest=\`find $backuproot -maxdepth 1 -type d -name \$rottype'.*' | @SED@ 's/^.*\.//' | sort -n | tail -1\`
+ oldest=\`find $backuproot -maxdepth 1 -type d -name \$rottype'.*' | @SED@ -e 's/^.*\.//' | sort -n | tail -1\`
[ "\$oldest" == "" ] && oldest=0
for (( i=\$oldest; i > 0; i-- )); do
if [ -d \$dir.\$i ]; then
@@ -509,6 +540,11 @@ function rotate_long_remote {
else
created=0
fi
+ # Validate created date
+ if [ -z "\$created" ] || echo \$created | grep -v -q -e '^[0-9]*$'; then
+ echo "Warning: Invalid metadata \$created. Skipping rotation."
+ break
+ fi
cutoff_time=\$(( now - (seconds*(i-1)) ))
if [ ! \$created -gt \$cutoff_time ]; then
next=\$(( i + 1 ))
@@ -517,6 +553,9 @@ function rotate_long_remote {
$nice mv \$dir.\$i \$dir.\$next
mkdir -p \$metadata.\$next
date +%c%n%s > \$metadata.\$next/rotated
+ if [ -f \$metadata.\$i/created ]; then
+ $nice mv \$metadata.\$i/created \$metadata.\$next
+ fi
else
echo "Debug: skipping rotation of \$dir.\$i because \$dir.\$next already exists."
fi
@@ -533,6 +572,9 @@ function rotate_long_remote {
$nice mv $backuproot/daily.\$max $backuproot/weekly.1
mkdir -p $backuproot/metadata/weekly.1
date +%c%n%s > $backuproot/metadata/weekly.1/rotated
+ #if [ -f $backuproot/metadata/daily.\$max/created ]; then
+ # $nice mv $backuproot/metadata/daily.\$max/created $backuproot/metadata/weekly.1/
+ #fi
fi
max=\$((keepweekly+1))
@@ -541,12 +583,15 @@ function rotate_long_remote {
$nice mv $backuproot/weekly.\$max $backuproot/monthly.1
mkdir -p $backuproot/metadata/monthly.1
date +%c%n%s > $backuproot/metadata/monthly.1/rotated
+ #if [ -f $backuproot/metadata/weekly.\$max/created ]; then
+ # $nice mv $backuproot/metadata/weekly.\$max/created $backuproot/metadata/weekly.1/
+ #fi
fi
for rottype in daily weekly monthly; do
max=\$((keep\${rottype}+1))
dir="$backuproot/\$rottype"
- oldest=\`find $backuproot -maxdepth 1 -type d -name \$rottype'.*' | @SED@ 's/^.*\.//' | sort -n | tail -1\`
+ oldest=\`find $backuproot -maxdepth 1 -type d -name \$rottype'.*' | @SED@ -e 's/^.*\.//' | sort -n | tail -1\`
[ "\$oldest" == "" ] && oldest=0
# if we've rotated the last backup off the stack, remove it.
for (( i=\$oldest; i >= \$max; i-- )); do
@@ -560,6 +605,14 @@ function rotate_long_remote {
fi
done
done
+
+ # Cleanup orphaned metadata
+ for file in \`ls $backuproot/metadata\`; do
+ if [ ! -d "$backuproot/\$file" ]; then
+ echo "Debug: removing orphaned metadata \$file"
+ rm -rf $backuproot/metadata/\$file
+ fi
+ done
##### END REMOTE SCRIPT #######
EOF
) | (while read a; do passthru $a; done)
@@ -589,22 +642,19 @@ function setup_long_dirs {
if [ -d $tmpdir ]; then
mv $tmpdir $dir.1
if [ $? == 1 ]; then
- echo "Fatal: could mv $destdir/rotate.tmp $dir.1 on host $host"
- exit 1
+ fatal "Could not move $tmpdir to $dir.1 on host $host"
fi
else
mkdir --parents $dir.1
if [ $? == 1 ]; then
- echo "Fatal: could not create directory $dir.1 on host $host"
- exit 1
+ fatal "Could not create directory $dir.1 on host $host"
fi
fi
if [ -d $dir.2 ]; then
echo "Debug: update links $backuptype.2 --> $backuptype.1"
cp -alf $dir.2/. $dir.1
#if [ $? == 1 ]; then
- # echo "Fatal: could not create hard links to $dir.1 on host $host"
- # exit 1
+ # fatal "Could not create hard links to $dir.1 on host $host"
#fi
fi
fi
@@ -705,7 +755,6 @@ function prepare_storage {
btype=monthly
else
fatal "keeping no backups";
- exit 1
fi
suffix="$btype.1"
@@ -724,7 +773,6 @@ function prepare_storage {
suffix=""
else
fatal "Invalid backup format $format"
- exit 1
fi
}
@@ -768,7 +816,6 @@ function set_batch_mode {
batch_option="--read-batch=$batch_file"
else
fatal "Batch file not found: $batch_file"
- exit 1
fi
elif [ "$batch" == "write" ]; then
mkdir -p `dirname $batch_file`
@@ -785,7 +832,11 @@ function update_metadata {
if [ "$dest" == "local" ]; then
metadata="`dirname $dest_path`/metadata/`basename $dest_path`"
mkdir -p $metadata
- date +%c%n%s > $metadata/created
+ # Use the backup start time and not the time the backup was
+ # finished, otherwise daily rotations might not take place.
+ # If we used backup end time, in the next handler run
+ # we might not have $now - $created >= 24:00
+ echo "$starttime" > $metadata/created
$touch $backupdir/$SECTION/$suffix
else
folder="`echo $dest_path | cut -d : -f 2`"
@@ -795,7 +846,11 @@ function update_metadata {
$ssh_cmd <<EOF
##### BEGIN REMOTE SCRIPT #####
mkdir -p $metadata
- date +%c%n%s > $metadata/created
+ # Use the backup start time and not the time the backup was
+ # finished, otherwise daily rotations might not take place.
+ # If we used backup end time, in the next handler run
+ # we might not have $now - $created >= 24:00
+ echo "$starttime" > $metadata/created
##### END REMOTE SCRIPT #######
EOF
) | (while read a; do passthru $a; done)
@@ -813,7 +868,6 @@ function test_connect {
if [ -z "$host" ] || [ -z "$user" ]; then
fatal "Remote host or user not set"
- exit 1
fi
debug "$ssh_cmd 'echo -n 1'"
@@ -821,52 +875,12 @@ function test_connect {
if [ "$result" != "1" ]; then
fatal "Can't connect to $host as $user."
- exit 1
else
debug "Connected to $host successfully"
fi
}
-function set_lockfile {
-
- if [ ! -z "$lockfile" ]; then
- mkdir -p `dirname $lockfile`
- if ( set -o noclobber; echo "$$" > "$lockfile" ) &> /dev/null; then
- trap 'unset_lockfile' INT TERM EXIT
- else
- fatal "Could not create lockfile $lockfile, exiting"
- fi
- fi
-
-}
-
-function unset_lockfile {
-
- if [ ! -z "$lockfile" ]; then
- $rm -f $lockfile || warning "Could not remove lockfile $lockfile"
- fi
-
-}
-
-function check_lockfile {
-
- local pid process
-
- if [ ! -z "$lockfile" ] && [ -f "$lockfile" ]; then
- pid="`cat $lockfile`"
- process="`ps --no-headers -o comm $pid`"
- if [ "$?" == "0" ] && [ "`ps --no-headers -o comm $$`" == "$process" ]; then
- info "Another backup is running for $lockfile, skipping run"
- exit
- else
- info "Found old lockfile $lockfile, removing it"
- unset_lockfile
- fi
- fi
-
-}
-
function set_filelist {
filelist_flag=""
@@ -887,13 +901,13 @@ function set_filelist {
function set_rsync_options {
- if [ ! -z "$numericids" ]; then
+ if [ "$numericids" != "0" ]; then
rsync_options="$rsync_options --numeric-ids"
fi
if [ "$from" == "local" ] || [ "$dest" == "local" ]; then
# rsync options for local sources or destinations
- rsync_options=($rsync_options)
+ true
fi
if [ "$from" == "remote" ] || [ "$dest" == "remote" ]; then
@@ -912,12 +926,9 @@ function set_rsync_options {
remote_rsync="$remote_rsync --fake-super"
fi
- rsync_options=($rsync_options --rsync-path="$remote_rsync")
-
if [ "$protocol" == "ssh" ]; then
if [ ! -e "$id_file" ]; then
fatal "SSH Identity file $id_file not found"
- exit 1
else
debug RSYNC_RSH=\"$ssh_cmd_base\"
echo RSYNC_RSH=\"$ssh_cmd_base\" >> $log
@@ -927,6 +938,14 @@ function set_rsync_options {
fi
+ # Mangle rsync_options so we can use quotes after all other
+ # options were evaluated.
+ if [ "$from" == "local" ] && [ "$dest" == "local" ]; then
+ rsync_options=($rsync_options)
+ else
+ rsync_options=($rsync_options --rsync-path="$remote_rsync")
+ fi
+
include_vservers
}
@@ -964,8 +983,7 @@ function mount_rw {
if [ -d "$mountpoint" ]; then
mount -o remount,rw $mountpoint
if (($?)); then
- error "Could not mount $mountpoint"
- exit 1
+ fatal "Could not mount $mountpoint"
fi
fi
fi
@@ -1049,17 +1067,38 @@ function end_mux {
}
+function set_pipefail {
+
+ # Save initial pipefail status for later restoration
+ if echo "$SHELLOPTS" | grep -q ":pipefail"; then
+ pipefail="-o"
+ else
+ pipefail="+o"
+ fi
+
+ # Ensure that a non-zero rsync exit status is caught by our handler
+ set -o pipefail
+
+}
+
+function restore_pipefail {
+
+ if [ ! -z "$pipefail" ]; then
+ set $pipefail pipefail
+ fi
+
+}
+
# the backup procedure
eval_config
-check_lockfile
-set_lockfile
set_rsync_options
start_mux
stop_services
mount_rw
-echo "Starting backup at `date`" >> $log
+starttime="`date +%c%n%s`"
+echo "Starting backup at `echo "$starttime" | head -n 1`" >> $log
for SECTION in $include; do
@@ -1070,13 +1109,15 @@ for SECTION in $include; do
set_dest
info "Syncing $SECTION on $dest_path..."
- debug $nice $rsync $rsync_options $filelist_flag $excludes $batch_option $orig $dest_path
- $nice $rsync $rsync_options $filelist_flag $excludes $batch_option $orig $dest_path | tee -a $log
+ debug $nice $rsync "${rsync_options[@]}" $filelist_flag "$excludes" $batch_option $orig $dest_path
+ set_pipefail
+ $nice $rsync "${rsync_options[@]}" $filelist_flag "$excludes" $batch_option $orig $dest_path | tee -a $log
if [ "$?" != "0" ]; then
- warning "Rsync error when trying to transfer $SECTION"
+ fatal "Rsync error when trying to transfer $SECTION"
fi
+ restore_pipefail
update_metadata
done
@@ -1084,7 +1125,6 @@ done
mount_ro
run_fsck
start_services
-unset_lockfile
end_mux
echo "Finnishing backup at `date`" >> $log
diff --git a/handlers/wget b/handlers/wget
index 67425fc..79aa22c 100644
--- a/handlers/wget
+++ b/handlers/wget
@@ -26,7 +26,7 @@
# wget = wget program
# wget_options = wget command options
# url = remote data url
-# bandwidthlimit = set a badnwidth limit in kbps (remote source only)
+# bandwidthlimit = set a bandwidth limit in kbps (remote source only)
#
# [destination]
# folder = local folder
@@ -182,8 +182,8 @@ echo "Rotating $backupdir/$folder/$folder..." >> $log
rotate $backupdir/$folder/$folder $keep
info "Wget'ing $SECTION on $backupdir/$folder/$folder.0..."
-if [ ! -z "$badnwidth" ]; then
- limit_rate="--limit-rate=$badnwidth""k"
+if [ ! -z "$bandwidth" ]; then
+ limit_rate="--limit-rate=$bandwidth""k"
fi
cd $backupdir/$folder/$folder.0