diff options
Diffstat (limited to 'handlers')
-rw-r--r-- | handlers/Makefile.am | 8 | ||||
-rw-r--r-- | handlers/Makefile.in | 98 | ||||
-rw-r--r-- | handlers/dup.helper.in | 35 | ||||
-rw-r--r-- | handlers/dup.in | 65 | ||||
-rw-r--r-- | handlers/ldap.helper.in | 91 | ||||
-rw-r--r-- | handlers/ldap.in | 112 | ||||
-rw-r--r-- | handlers/maildir.in | 1 | ||||
-rw-r--r-- | handlers/mysql.in | 2 | ||||
-rw-r--r-- | handlers/pgsql.in | 2 | ||||
-rw-r--r-- | handlers/rdiff.in | 4 | ||||
-rw-r--r-- | handlers/rsync.in | 240 | ||||
-rw-r--r-- | handlers/wget | 6 |
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 |