diff --git a/handlers/dup.helper.in b/handlers/dup.helper.in index c1fbdd5..86745c8 100644 --- a/handlers/dup.helper.in +++ b/handlers/dup.helper.in @@ -13,11 +13,11 @@ do_dup_host_includes() { [ -z "$dup_includes" ] && dup_includes="$dup_default_includes" for i in $dup_includes; do formItem include "$i" - done - formItem include "" - formItem include "" - formItem include "" - formDisplay + done + formItem include "" + formItem include "" + formItem include "" + formDisplay [ $? = 0 ] || return 1 dup_includes="$REPLY" done @@ -37,10 +37,10 @@ do_dup_vserver() { [ -z "$dup_vsincludes" ] && dup_vsincludes="$dup_default_includes" for i in $dup_vsincludes; do formItem include "$i" - done - formItem include "" - formItem include "" - formItem include "" + done + formItem include "" + formItem include "" + formItem include "" formDisplay [ $? = 0 ] || return 1 dup_vsincludes="$REPLY" @@ -69,26 +69,26 @@ do_dup_src() { [ $? = 0 ] || return 1 case $host_or_vservers in 'host') - do_dup_host_includes - [ $? = 0 ] || return 1 - ;; + do_dup_host_includes + [ $? = 0 ] || return 1 + ;; 'vservers') - do_dup_vserver - [ $? = 0 ] || return 1 - ;; + do_dup_vserver + [ $? = 0 ] || return 1 + ;; 'both') - do_dup_host_includes - [ $? = 0 ] || return 1 - do_dup_vserver - [ $? = 0 ] || return 1 - ;; + do_dup_host_includes + [ $? = 0 ] || return 1 + do_dup_vserver + [ $? = 0 ] || return 1 + ;; *) - return 1 - ;; + return 1 + ;; esac do_dup_excludes [ $? = 0 ] || return 1 - + _src_done="(DONE)" setDefault dest } @@ -102,13 +102,13 @@ do_dup_dest() { REPLY= while [ -z "$REPLY" -o -z "$dup_destdir" -o -z "$dup_desthost" -o -z "$dup_destuser" ]; do formBegin "$dup_title - destination: first three items are compulsory" - formItem "desthost" "$dup_desthost" - formItem "destuser" "$dup_destuser" - formItem "destdir" "$dup_destdir" - formItem "keep" "$dup_keep" + formItem "desthost" "$dup_desthost" + formItem "destuser" "$dup_destuser" + formItem "destdir" "$dup_destdir" + formItem "keep" "$dup_keep" formItem "incremental" "$dup_incremental" - formItem "bandwidthlimit" "$dup_bandwidth" - formItem "sshoptions" "$dup_sshoptions" + formItem "bandwidthlimit" "$dup_bandwidth" + formItem "sshoptions" "$dup_sshoptions" formDisplay [ $? = 0 ] || return 1 @@ -117,7 +117,7 @@ do_dup_dest() { IFS=$':' thereply=($replyconverted) IFS=$' \t\n' - + dup_desthost=${thereply[0]} dup_destuser=${thereply[1]} dup_destdir=${thereply[2]} @@ -165,9 +165,9 @@ do_dup_gpg_signkey() { # signkey ? REPLY= while [ -z "$REPLY" -o -z "$dup_gpg_signkey" ]; do - inputBox "$dup_title - GnuPG" "Enter the ID of the private GnuPG key to be used to sign the backups:" "$dup_gpg_signkey" - [ $? = 0 ] || return 1 - dup_gpg_signkey="$REPLY" + inputBox "$dup_title - GnuPG" "Enter the ID of the private GnuPG key to be used to sign the backups:" "$dup_gpg_signkey" + [ $? = 0 ] || return 1 + dup_gpg_signkey="$REPLY" done fi } @@ -183,7 +183,7 @@ do_dup_gpg_passphrase() { } do_dup_gpg() { - + # symmetric or public key encryption ? booleanBox "$dup_title - GnuPG" "Use public key encryption? Otherwise, symmetric encryption will be used, and data signing will be impossible." "$dup_gpg_asymmetric_encryption" if [ $? = 0 ]; then @@ -197,7 +197,7 @@ do_dup_gpg() { do_dup_gpg_encryptkey ; [ $? = 0 ] || return 1 do_dup_gpg_sign ; [ $? = 0 ] || return 1 if [ "$dup_gpg_sign" == yes ]; then - do_dup_gpg_signkey ; [ $? = 0 ] || return 1 + do_dup_gpg_signkey ; [ $? = 0 ] || return 1 fi else dup_gpg_sign=no @@ -334,7 +334,7 @@ EOF if [ "$host_or_vservers" == host -o "$host_or_vservers" == both ]; then set -o noglob for i in $dup_includes; do - echo "include = $i" >> $next_filename + echo "include = $i" >> $next_filename done set +o noglob fi @@ -432,49 +432,49 @@ EOF dup_main_menu() { - while true; do - srcitem="choose files to include & exclude $_src_done" - destitem="configure backup destination $_dest_done" - gpgitem="configure GnuPG encryption/signing $_gpg_done" - conitem="set up ssh keys and test remote connection $_con_done" - advitem="edit advanced settings $_adv_done" - # TODO: add the following to the menu when do_dup_conn is written - # conn "$conitem" \ - menuBox "$dup_title" "choose a step:" \ - src "$srcitem" \ - dest "$destitem" \ - gpg "$gpgitem" \ - adv "$advitem" \ - finish "finish and create config file" - [ $? = 0 ] || return 1 - result="$REPLY" + while true; do + srcitem="choose files to include & exclude $_src_done" + destitem="configure backup destination $_dest_done" + gpgitem="configure GnuPG encryption/signing $_gpg_done" + conitem="set up ssh keys and test remote connection $_con_done" + advitem="edit advanced settings $_adv_done" + # TODO: add the following to the menu when do_dup_conn is written + # conn "$conitem" \ + menuBox "$dup_title" "choose a step:" \ + src "$srcitem" \ + dest "$destitem" \ + gpg "$gpgitem" \ + adv "$advitem" \ + finish "finish and create config file" + [ $? = 0 ] || return 1 + result="$REPLY" - case "$result" in - "src") do_dup_src;; - "dest") do_dup_dest;; - "gpg") do_dup_gpg;; - # TODO: enable the following when do_dup_conn is written - # "conn") do_dup_conn;; - "adv") do_dup_adv;; - "finish") - if [[ "$_dest_done$_gpg_done$_src_done" != "(DONE)(DONE)(DONE)" ]]; then - # TODO: replace the previous test by the following when do_dup_conn is written - # if [[ "$_con_done$_dest_done$_gpg_done$_src_done" != "(DONE)(DONE)(DONE)(DONE)" ]]; then - msgBox "$dup_title" "You cannot create the configuration file until the four first steps are completed." - else - do_dup_finish - break - fi - ;; - esac + case "$result" in + "src") do_dup_src;; + "dest") do_dup_dest;; + "gpg") do_dup_gpg;; + # TODO: enable the following when do_dup_conn is written + # "conn") do_dup_conn;; + "adv") do_dup_adv;; + "finish") + if [[ "$_dest_done$_gpg_done$_src_done" != "(DONE)(DONE)(DONE)" ]]; then + # TODO: replace the previous test by the following when do_dup_conn is written + # if [[ "$_con_done$_dest_done$_gpg_done$_src_done" != "(DONE)(DONE)(DONE)(DONE)" ]]; then + msgBox "$dup_title" "You cannot create the configuration file until the four first steps are completed." + else + do_dup_finish + break + fi + ;; + esac - done + done } ### Main function dup_wizard() { - + require_packages duplicity # Global variables diff --git a/handlers/dup.in b/handlers/dup.in index 9c6a493..60a4ce9 100644 --- a/handlers/dup.in +++ b/handlers/dup.in @@ -66,9 +66,9 @@ if [ "$testconnect" == "yes" ]; 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 - debug "Connected to $desthost as $destuser successfully" + debug "Connected to $desthost as $destuser successfully" fi fi fi @@ -152,7 +152,7 @@ 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 [ "$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" @@ -204,9 +204,9 @@ done if [ $usevserver = yes ]; then for vserver in $vsnames; 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 fi @@ -229,11 +229,11 @@ if [ "$duplicity_major" -ge 0 -a "$duplicity_minor" -ge 4 -a "$duplicity_sub" -g "$precmd duplicity cleanup --force $execstr_options $execstr_serverpart 2>&1"` exit_code=$? if [ $exit_code -eq 0 ]; then - debug $output - info "Duplicity cleanup finished successfully." + debug $output + info "Duplicity cleanup finished successfully." else - debug $output - warning "Duplicity cleanup failed." + debug $output + warning "Duplicity cleanup failed." fi fi fi @@ -244,17 +244,17 @@ if [ "$keep" != "yes" ]; then debug "$precmd duplicity remove-older-than $keep --force $execstr_options $execstr_serverpart" if [ ! $test ]; then export PASSPHRASE=$password - output=`nice -n $nicelevel \ + output=`nice -n $nicelevel \ su -c \ "$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 + 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 diff --git a/handlers/ldap.helper.in b/handlers/ldap.helper.in index 9251826..4870ae4 100644 --- a/handlers/ldap.helper.in +++ b/handlers/ldap.helper.in @@ -3,7 +3,7 @@ HELPERS="$HELPERS ldap:ldap_database_backup" ldap_create_file() { -while true; do + while true; do checkBox "ldap action wizard" "check options (slapcat OR ldapsearch)" \ "slapcat" "export ldif using slapcat" yes \ "ldapsearch" "export ldif using ldapsearch" no \ @@ -22,21 +22,21 @@ while true; do 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 - ;; + '"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 @@ -54,9 +54,9 @@ $tls # conf = /etc/ldap/slapd.conf # databases = all EOF - chmod 600 $next_filename - return -done + chmod 600 $next_filename + return + done } ldap_wizard() { @@ -71,7 +71,7 @@ ldap_wizard() { elif [ "$backend" == "ldbm" ]; then ldbm=yes fi - done + done if [ "$bdb" == "yes" -o "$hdb" == "yes" ]; then if [ "$ldbm" == "no" ]; then @@ -80,11 +80,11 @@ ldap_wizard() { 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 + 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 + 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 index 8ff1ccf..0b0166e 100644 --- a/handlers/ldap.in +++ b/handlers/ldap.in @@ -35,25 +35,25 @@ dbsuffixes=(`@AWK@ 'BEGIN {OFS=":"} /[:space:]*^database[:space:]*\w*/ {db=$2}; 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 - + fi + for db in $databases; do if [ `expr index "$db" "="` == "0" ]; then - # db is a number, get the suffix. + # db is a number, get the suffix. dbsuffix=${dbsuffixes[$db]/*:/} else dbsuffix=$db fi - # some databases don't have suffix (like monitor), skip these + # 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 @@ -74,16 +74,16 @@ if [ "$ldif" == "yes" ]; then debug "Shutting down ldap server..." /etc/init.d/slapd stop fi - - ext= - if [ "$compress" == "yes" ]; then - ext=".gz" - 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 > $dumpdir/$dbsuffix.ldif.gz" else @@ -99,13 +99,13 @@ if [ "$ldif" == "yes" ]; then 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 + done fi return 0 diff --git a/handlers/maildir.in b/handlers/maildir.in index d5731be..e88619d 100644 --- a/handlers/maildir.in +++ b/handlers/maildir.in @@ -6,17 +6,17 @@ # to a remote server. It is designed to be run with low overhead # in terms of cpu and bandwidth so it runs pretty slow. # Hardlinking is used to save storage space. -# +# # This handler expects that your maildir directory structure is # either one of the following: -# -# 1. /$srcdir/[a-zA-Z0-9]/$user for example: +# +# 1. /$srcdir/[a-zA-Z0-9]/$user for example: # /var/maildir/a/anarchist # /var/maildir/a/arthur # ... # /var/maildir/Z/Zaphod # /var/maildir/Z/Zebra -# +# # 2. or the following: # /var/maildir/domain.org/user1 # /var/maildir/domain.org/user2 @@ -25,7 +25,7 @@ # /var/maildir/anotherdomain.org/user2 # ... # -# if the configuration is setup to have keepdaily at 3, +# if the configuration is setup to have keepdaily at 3, # keepweekly is 2, and keepmonthly is 1, then each user's # maildir backup snapshot directory will contain these files: # daily.1 @@ -41,15 +41,15 @@ # We handle each maildir individually because it becomes very # unweldy to hardlink and rsync many hundreds of thousands # of files at once. It is much faster to take on smaller -# chunks at a time. +# chunks at a time. # -# For the backup rotation to work, destuser must be able to run +# For the backup rotation to work, destuser must be able to run # arbitrary bash commands on the desthost. # # Any maildir which is deleted from the source will be moved to -# "deleted" directory in the destination. It is up to you to +# "deleted" directory in the destination. It is up to you to # periodically remove this directory or old maildirs in it. -# +# ############################################################## getconf rotate yes @@ -91,33 +91,33 @@ excludes="--exclude '.Trash/\*' --exclude '.Mistakes/\*' --exclude '.Spam/\*'" ### FUNCTIONS function do_user() { - local user=$1 - local btype=$2 - local userdir=${3%/} - local source="$srcdir/$userdir/$user/" - local target="$destdir/$userdir/$user/$btype.1" - if [ ! -d $source ]; then - warning "maildir $source not found" - return - fi + local user=$1 + local btype=$2 + local userdir=${3%/} + local source="$srcdir/$userdir/$user/" + local target="$destdir/$userdir/$user/$btype.1" + if [ ! -d $source ]; then + warning "maildir $source not found" + return + fi - debug "syncing" - ret=`$RSYNC -e "ssh -p $destport -i $destid_file" -r \ - --links --ignore-existing --delete --size-only --bwlimit=$speedlimit \ - --exclude '.Trash/*' --exclude '.Mistakes/*' --exclude '.Spam/*' \ - $source $destuser@$desthost:$target \ - 2>&1` - ret=$? - # ignore 0 (success) and 24 (file vanished before it could be copied) - if [ $ret != 0 -a $ret != 24 ]; then - warning "rsync $user failed" - warning " returned: $ret" - let "failedcount = failedcount + 1" - if [ $failedcount -gt 100 ]; then - fatal "100 rsync errors -- something is not working right. bailing out." - fi - fi - ssh -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file "date +%c%n%s > $target/created" + debug "syncing" + ret=`$RSYNC -e "ssh -p $destport -i $destid_file" -r \ + --links --ignore-existing --delete --size-only --bwlimit=$speedlimit \ + --exclude '.Trash/*' --exclude '.Mistakes/*' --exclude '.Spam/*' \ + $source $destuser@$desthost:$target \ + 2>&1` + ret=$? + # ignore 0 (success) and 24 (file vanished before it could be copied) + if [ $ret != 0 -a $ret != 24 ]; then + warning "rsync $user failed" + warning " returned: $ret" + let "failedcount = failedcount + 1" + if [ $failedcount -gt 100 ]; then + fatal "100 rsync errors -- something is not working right. bailing out." + fi + fi + ssh -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file "date +%c%n%s > $target/created" } # remove any maildirs from backup which might have been deleted @@ -125,116 +125,116 @@ function do_user() { # (actually, it just moved them to the directory "deleted") function do_remove() { - local tmp1=`maketemp maildir-tmp-file` - local tmp2=`maketemp maildir-tmp-file` - - ssh -p $destport -i $destid_file $destuser@$desthost mkdir -p "$destdir/deleted" - cd "$srcdir" - for userdir in `ls -d1 */`; do - ls -1 "$srcdir/$userdir" | sort > $tmp1 - ssh -p $destport -i $destid_file $destuser@$desthost ls -1 "$destdir/$userdir" | sort > $tmp2 - for deluser in `join -v 2 $tmp1 $tmp2`; do - [ "$deluser" != "" ] || continue - info "removing $destuser@$desthost:$destdir/$userdir$deluser/" - ssh -p $destport -i $destid_file $destuser@$desthost mv "$destdir/$userdir$deluser/" "$destdir/deleted" - ssh -p $destport -i $destid_file $destuser@$desthost "date +%c%n%s > '$destdir/deleted/$deluser/deleted_on'" - done - done - rm $tmp1 - rm $tmp2 + local tmp1=`maketemp maildir-tmp-file` + local tmp2=`maketemp maildir-tmp-file` + + ssh -p $destport -i $destid_file $destuser@$desthost mkdir -p "$destdir/deleted" + cd "$srcdir" + for userdir in `ls -d1 */`; do + ls -1 "$srcdir/$userdir" | sort > $tmp1 + ssh -p $destport -i $destid_file $destuser@$desthost ls -1 "$destdir/$userdir" | sort > $tmp2 + for deluser in `join -v 2 $tmp1 $tmp2`; do + [ "$deluser" != "" ] || continue + info "removing $destuser@$desthost:$destdir/$userdir$deluser/" + ssh -p $destport -i $destid_file $destuser@$desthost mv "$destdir/$userdir$deluser/" "$destdir/deleted" + ssh -p $destport -i $destid_file $destuser@$desthost "date +%c%n%s > '$destdir/deleted/$deluser/deleted_on'" + done + done + rm $tmp1 + rm $tmp2 } function do_rotate() { - [ "$rotate" == "yes" ] || return; - local user=$1 - local userdir=${2%/} - local backuproot="$destdir/$userdir/$user" + [ "$rotate" == "yes" ] || return; + local user=$1 + local userdir=${2%/} + local backuproot="$destdir/$userdir/$user" ( - ssh -T -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file < 0; i-- )); do - if [ -d \$dir.\$i ]; then - if [ -f \$dir.\$i/created ]; then - created=\`tail -1 \$dir.\$i/created\` - else - created=0 - 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" - mv \$dir.\$i \$dir.\$next - date +%c%n%s > \$dir.\$next/rotated - else - echo "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)." - fi - fi - done - done + dir="$backuproot/\$rottype" + if [ ! -d \$dir.1 ]; then + echo "Debug: \$dir.1 does not exist, skipping." + continue 1 + elif [ ! -f \$dir.1/created ]; then + echo "Warning: \$dir.1/created does not exist. This backup may be only partially completed. Skipping rotation." + continue 1 + fi - max=\$((keepdaily+1)) - if [ \( \$keepweekly -gt 0 -a -d $backuproot/daily.\$max \) -a ! -d $backuproot/weekly.1 ]; then - echo "Debug: daily.\$max --> weekly.1" - mv $backuproot/daily.\$max $backuproot/weekly.1 - date +%c%n%s > $backuproot/weekly.1/rotated - 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\` + #echo "Debug: oldest \$oldest" + [ "\$oldest" == "" ] && oldest=0 + for (( i=\$oldest; i > 0; i-- )); do + if [ -d \$dir.\$i ]; then + if [ -f \$dir.\$i/created ]; then + created=\`tail -1 \$dir.\$i/created\` + else + created=0 + 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" + mv \$dir.\$i \$dir.\$next + date +%c%n%s > \$dir.\$next/rotated + else + echo "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)." + fi + fi + done + done - max=\$((keepweekly+1)) - if [ \( \$keepmonthly -gt 0 -a -d $backuproot/weekly.\$max \) -a ! -d $backuproot/monthly.1 ]; then - echo "Debug: weekly.\$max --> monthly.1" - mv $backuproot/weekly.\$max $backuproot/monthly.1 - date +%c%n%s > $backuproot/monthly.1/rotated - fi + max=\$((keepdaily+1)) + if [ \( \$keepweekly -gt 0 -a -d $backuproot/daily.\$max \) -a ! -d $backuproot/weekly.1 ]; then + echo "Debug: daily.\$max --> weekly.1" + mv $backuproot/daily.\$max $backuproot/weekly.1 + date +%c%n%s > $backuproot/weekly.1/rotated + 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" == "" ] && 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" - rm -rf $backuproot/rotate.tmp - fi - echo "Debug: moving \$rottype.\$i to rotate.tmp" - mv \$dir.\$i $backuproot/rotate.tmp - fi - done - done + max=\$((keepweekly+1)) + if [ \( \$keepmonthly -gt 0 -a -d $backuproot/weekly.\$max \) -a ! -d $backuproot/monthly.1 ]; then + echo "Debug: weekly.\$max --> monthly.1" + mv $backuproot/weekly.\$max $backuproot/monthly.1 + date +%c%n%s > $backuproot/monthly.1/rotated + 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" == "" ] && 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" + rm -rf $backuproot/rotate.tmp + fi + echo "Debug: moving \$rottype.\$i to rotate.tmp" + mv \$dir.\$i $backuproot/rotate.tmp + fi + done + done ####### END REMOTE SCRIPT ####### EOF ) | (while read a; do passthru $a; done) @@ -243,67 +243,67 @@ EOF function setup_remote_dirs() { - local user=$1 - local backuptype=$2 - local userdir=${3%/} - local dir="$destdir/$userdir/$user/$backuptype" - local tmpdir="$destdir/$userdir/$user/rotate.tmp" + local user=$1 + local backuptype=$2 + local userdir=${3%/} + local dir="$destdir/$userdir/$user/$backuptype" + local tmpdir="$destdir/$userdir/$user/rotate.tmp" ( - ssh -T -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file < $backuptype.1" - cp -alf $dir.2/. $dir.1 - #if [ \$? == 1 ]; then - # echo "Fatal: could not create hard links to $dir.1 on host $desthost" - # exit 1 - #fi - fi - fi - [ -f $dir.1/created ] && rm $dir.1/created - [ -f $dir.1/rotated ] && rm $dir.1/rotated - exit 0 + ssh -T -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file < $backuptype.1" + cp -alf $dir.2/. $dir.1 + #if [ \$? == 1 ]; then + # echo "Fatal: could not create hard links to $dir.1 on host $desthost" + # exit 1 + #fi + fi + fi + [ -f $dir.1/created ] && rm $dir.1/created + [ -f $dir.1/rotated ] && rm $dir.1/rotated + exit 0 EOF ) | (while read a; do passthru $a; done) - if [ $? == 1 ]; then exit; fi + if [ $? == 1 ]; then exit; fi } function start_mux() { - if [ "$multiconnection" == "yes" ]; then - debug "Starting dummy ssh connection" - ssh -p $destport -i $destid_file $destuser@$desthost sleep 1d & - sleep 1 - fi + if [ "$multiconnection" == "yes" ]; then + debug "Starting dummy ssh connection" + ssh -p $destport -i $destid_file $destuser@$desthost sleep 1d & + sleep 1 + fi } function end_mux() { - if [ "$multiconnection" == "yes" ]; then - debug "Stopping dummy ssh connection" - ssh -p $destport -i $destid_file $destuser@$desthost pkill sleep - fi + if [ "$multiconnection" == "yes" ]; then + debug "Stopping dummy ssh connection" + ssh -p $destport -i $destid_file $destuser@$desthost pkill sleep + fi } ### @@ -312,10 +312,10 @@ function end_mux() { # see if we can login debug "ssh -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file 'echo -n 1'" if [ ! $test ]; then - result=`ssh -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file 'echo -n 1' 2>&1` - if [ "$result" != "1" ]; then - fatal "Can't connect to $desthost as $destuser using $destid_file." - fi + result=`ssh -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file 'echo -n 1' 2>&1` + if [ "$result" != "1" ]; then + fatal "Can't connect to $desthost as $destuser using $destid_file." + fi fi end_mux @@ -324,47 +324,46 @@ start_mux ## SANITY CHECKS ## status=`ssh -p $destport -i $destid_file $destuser@$desthost "[ -d \"$destdir\" ] && echo 'ok'"` if [ "$status" != "ok" ]; then - end_mux - fatal "Destination directory $destdir doesn't exist!" - exit + end_mux + fatal "Destination directory $destdir doesn't exist!" + exit fi ### REMOVE OLD MAILDIRS ### if [ "$remove" == "yes" ]; then - do_remove + do_remove fi ### MAKE BACKUPS ### if [ "$backup" == "yes" ]; then - if [ $keepdaily -gt 0 ]; then btype=daily - elif [ $keepweekly -gt 0 ]; then btype=weekly - elif [ $keepmonthly -gt 0 ]; then btype=monthly - else fatal "keeping no backups"; fi - - if [ "$testuser" != "" ]; then - cd "$srcdir/${user:0:1}" - do_rotate $testuser - setup_remote_dirs $testuser $btype - do_user $testuser $btype - else - [ -d "$srcdir" ] || fatal "directory $srcdir not found." - cd "$srcdir" - for userdir in `ls -d1 */`; do - [ -d "$srcdir/$userdir" ] || fatal "directory $srcdir/$userdir not found." - cd "$srcdir/$userdir" - debug $userdir - for user in `ls -1`; do - [ "$user" != "" ] || continue - debug "$user $userdir" - do_rotate $user $userdir - setup_remote_dirs $user $btype $userdir - do_user $user $btype $userdir - done - done - fi + if [ $keepdaily -gt 0 ]; then btype=daily + elif [ $keepweekly -gt 0 ]; then btype=weekly + elif [ $keepmonthly -gt 0 ]; then btype=monthly + else fatal "keeping no backups"; fi + + if [ "$testuser" != "" ]; then + cd "$srcdir/${user:0:1}" + do_rotate $testuser + setup_remote_dirs $testuser $btype + do_user $testuser $btype + else + [ -d "$srcdir" ] || fatal "directory $srcdir not found." + cd "$srcdir" + for userdir in `ls -d1 */`; do + [ -d "$srcdir/$userdir" ] || fatal "directory $srcdir/$userdir not found." + cd "$srcdir/$userdir" + debug $userdir + for user in `ls -1`; do + [ "$user" != "" ] || continue + debug "$user $userdir" + do_rotate $user $userdir + setup_remote_dirs $user $btype $userdir + do_user $user $btype $userdir + done + done + fi fi end_mux - diff --git a/handlers/makecd.helper.in b/handlers/makecd.helper.in index f83b541..c8a6762 100644 --- a/handlers/makecd.helper.in +++ b/handlers/makecd.helper.in @@ -7,59 +7,59 @@ declare -a makecd_excludes makecd_wizard() { - inputBox "$wizardname" "specify a burner type cd or dvd:" - [ $? = 1 ] && return - burnertype="burnertype = $REPLY" + inputBox "$wizardname" "specify a burner type cd or dvd:" + [ $? = 1 ] && return + burnertype="burnertype = $REPLY" - booleanBox "$wizardname" "Make iso image only? or burn" - if [ $? = 0 ]; then - isoonly="isoonly = yes" - else - isoonly="isoonly = no" - fi + booleanBox "$wizardname" "Make iso image only? or burn" + if [ $? = 0 ]; then + isoonly="isoonly = yes" + else + isoonly="isoonly = no" + fi - # backupdir - inputBox "$wizardname" "Directory where to store the backups:" - [ $? = 1 ] && return - backupdir="backupdir = $REPLY" + # backupdir + inputBox "$wizardname" "Directory where to store the backups:" + [ $? = 1 ] && return + backupdir="backupdir = $REPLY" - inputBox "$wizardname" "what name to give to the image file?" - [ $? = 1 ] && return - imagefile="imagefile = $REPLY" + inputBox "$wizardname" "what name to give to the image file?" + [ $? = 1 ] && return + imagefile="imagefile = $REPLY" - inputBox "$wizardname" "specify a burner device:" - [ $? = 1 ] && return - device="device = $REPLY" + inputBox "$wizardname" "specify a burner device:" + [ $? = 1 ] && return + device="device = $REPLY" - # target - root of system to be included - inputBox "$wizardname" "root of filesystem for burn:" - [ $? = 1 ] && return - target="target = $REPLY" + # target - root of system to be included + inputBox "$wizardname" "root of filesystem for burn:" + [ $? = 1 ] && return + target="target = $REPLY" - # excludes + # excludes - formBegin "$wizardname: excludes" - for ((i=0; i < ${#makecd_excludes[@]} ; i++)); do - formItem exclude ${makecd_excludes[$i]} - done - formItem exclude - formItem exclude - formItem exclude - formItem exclude - formItem exclude - formItem exclude - formItem exclude - formItem exclude - formItem exclude - formDisplay - [ $? = 1 ] && return; + formBegin "$wizardname: excludes" + for ((i=0; i < ${#makecd_excludes[@]} ; i++)); do + formItem exclude ${makecd_excludes[$i]} + done + formItem exclude + formItem exclude + formItem exclude + formItem exclude + formItem exclude + formItem exclude + formItem exclude + formItem exclude + formItem exclude + formDisplay + [ $? = 1 ] && return; - unset makecd_excludes - makecd_excludes=($REPLY) + unset makecd_excludes + makecd_excludes=($REPLY) - get_next_filename $configdirectory/20.makecd - cat >> $next_filename <> $next_filename <> $next_filename - done - + for ((j=0; j < ${#makecd_excludes[@]} ; j++)); do + echo "exclude = ${makecd_excludes[$j]}" >> $next_filename + done + chmod 600 $next_filename } diff --git a/handlers/makecd.in b/handlers/makecd.in index 1a95d6d..78e5454 100644 --- a/handlers/makecd.in +++ b/handlers/makecd.in @@ -31,7 +31,7 @@ DVDINFO="/usr/bin/dvd+rw-mediainfo" [ -x "$CDRDAO" ] || debug 3 "echo executable $CDRDAO not present" if [ "$isoonly" == "no" ]; then - [ -e $device ] || fatal "No Burner device available" + [ -e $device ] || fatal "No Burner device available" fi outputfile="$backupdir/$imagefile" @@ -40,7 +40,7 @@ execstr="nice -n $nicelevel $MKISOFS --quiet -R -o $outputfile " str="" # excludes for i in $exclude; do - str=" -x ${i}$str" + str=" -x ${i}$str" done debug 0 "echo $str " @@ -50,39 +50,39 @@ debug 0 "echo $execstr " output=` $execstr 2>&1 ` code=$? if [ "$code" == "0" ]; then - debug $output - info "Successfully finished creation of iso" + debug $output + info "Successfully finished creation of iso" else - warning $output - warning "Failed to create iso" + warning $output + warning "Failed to create iso" fi if [ "$isoonly" == "no" ]; then - if [ "$burnertype" == "cd" ]; then - # burning iso to CD - $CDRECORD -v gracetime=2 dev=$device speed=8 -dao -data $outputfile - code=$? - if [ "$code" == "0" ]; then - debug $output - info "Successfully burned CD" - else - warning $output - warning "Failed to create CD" - fi - fi - if [ "$burnertype" == "dvd" ]; then - # burning iso dvd - $GROWISOFS -speed=2 -Z $device=$outputfile -use-the-force-luke=notray -use-the-force-luke=tty - code=$? - if [ "$code" == "0" ]; then - debug $output - info "Successfully burned DVD" - else - warning $output - warning "Failed to create DVD" - fi - fi + if [ "$burnertype" == "cd" ]; then + # burning iso to CD + $CDRECORD -v gracetime=2 dev=$device speed=8 -dao -data $outputfile + code=$? + if [ "$code" == "0" ]; then + debug $output + info "Successfully burned CD" + else + warning $output + warning "Failed to create CD" + fi + fi + if [ "$burnertype" == "dvd" ]; then + # burning iso dvd + $GROWISOFS -speed=2 -Z $device=$outputfile -use-the-force-luke=notray -use-the-force-luke=tty + code=$? + if [ "$code" == "0" ]; then + debug $output + info "Successfully burned DVD" + else + warning $output + warning "Failed to create DVD" + fi + fi fi return 0 diff --git a/handlers/mysql.helper.in b/handlers/mysql.helper.in index 00eeca0..fb9f11d 100644 --- a/handlers/mysql.helper.in +++ b/handlers/mysql.helper.in @@ -13,43 +13,43 @@ do_mysql_databases() { while [ -z "$REPLY" ]; do formBegin "$mysql_title: databases" formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" formDisplay [ $? = 0 ] || return 1 mysql_databases="databases = " for i in $REPLY; do - [ -n "$i" ] && mysql_databases="$mysql_databases $i" + [ -n "$i" ] && mysql_databases="$mysql_databases $i" done done } do_mysql_password() { - inputBox "$mysql_title" "specify a mysql user:" - [ $? = 1 ] && return - user=$REPLY - inputBox "$mysql_title" "specify the mysql user's password:" - [ $? = 1 ] && return - password=$REPLY - do_mysql_final "dbusername = $user\ndbpassword = $password" + inputBox "$mysql_title" "specify a mysql user:" + [ $? = 1 ] && return + user=$REPLY + inputBox "$mysql_title" "specify the mysql user's password:" + [ $? = 1 ] && return + password=$REPLY + do_mysql_final "dbusername = $user\ndbpassword = $password" } do_mysql_debian() { - _DISABLE_HOTCOPY=yes - do_mysql_final "configfile = /etc/mysql/debian.cnf" + _DISABLE_HOTCOPY=yes + do_mysql_final "configfile = /etc/mysql/debian.cnf" } do_mysql_user() { - inputBox "$mysql_title" "what system user does mysql backup use?" - [ $? = 1 ] && return - do_mysql_final "user = $REPLY" + inputBox "$mysql_title" "what system user does mysql backup use?" + [ $? = 1 ] && return + do_mysql_final "user = $REPLY" } do_mysql_final() { @@ -69,18 +69,18 @@ do_mysql_final() { hotcopy="hotcopy = no" fi - [ $status = 1 ] && return; + [ $status = 1 ] && return; result="$REPLY" compress="compress = no" for opt in $result; do case $opt in - '"sqldump"') sqldump="sqldump = yes";; - '"hotcopy"') hotcopy="hotcopy = yes";; - '"compress"') compress="compress = yes";; + '"sqldump"') sqldump="sqldump = yes";; + '"hotcopy"') hotcopy="hotcopy = yes";; + '"compress"') compress="compress = yes";; esac done get_next_filename $configdirectory/20.mysql - + cat >> $next_filename < (default = all) -# which databases to backup. should either be the word 'all' or a +# which databases to backup. should either be the word 'all' or a # space separated list of database names. $mysql_databases @@ -122,43 +122,43 @@ EOF if [ $host_or_vservers == vservers ] then - cat >> $next_filename <> $next_filename < (no default) -# vsname indicates which vserver to operate on, this is only used if +# vsname indicates which vserver to operate on, this is only used if # vserver is set to yes in /etc/backupninja.conf # NOTE: if you do not specify a vsname the host will be operated on -# alsoNOTE: if operating on a vserver, $VROOTDIR will be +# alsoNOTE: if operating on a vserver, $VROOTDIR will be # prepended to backupdir. EOF echo -e "$mysql_vsname\n" >> $next_filename fi echo -e $@ >> $next_filename - + chmod 600 $next_filename } mysql_wizard() { - + # Global variables mysql_title="MySQL action wizard" - + # backup the host system or a Vserver? choose_host_or_one_vserver "$mysql_title" [ $? = 0 ] || return 1 if [ $host_or_vservers == vservers ] then - do_mysql_vserver - [ $? = 0 ] || return 1 + do_mysql_vserver + [ $? = 0 ] || return 1 fi - + # backupdir if [ $host_or_vservers == vservers ] then - inputBox "$mysql_title" "Directory where to store the backups:`echo \"\n(Relative to chosen vserver's root directory)\"`" "/var/backups/mysql" + inputBox "$mysql_title" "Directory where to store the backups:`echo \"\n(Relative to chosen vserver's root directory)\"`" "/var/backups/mysql" else - inputBox "$mysql_title" "Directory where to store the backups" "/var/backups/mysql" + inputBox "$mysql_title" "Directory where to store the backups" "/var/backups/mysql" fi [ $? = 1 ] && return mysql_backupdir="backupdir = $REPLY" @@ -171,23 +171,23 @@ mysql_wizard() { do_mysql_databases [ $? = 0 ] || return 1 fi - + while true; do _DISABLE_HOTCOPY= menuBoxHelpFile "$mysql_title" "choose a mysql authentication method:" \ - user "change to a linux user first." \ - password "manually specify mysql user and password." \ - debian "use default mysql user debian-sys-maint." + user "change to a linux user first." \ + password "manually specify mysql user and password." \ + debian "use default mysql user debian-sys-maint." status=$? if [ $status = 2 ]; then - # show help. - helptmp="/tmp/backupninja.help.$$" - cat > $helptmp < $helptmp < $mycnf < $mycnf <&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished hotcopy of all mysql databases" - else - warning $output - warning "Failed to hotcopy all mysql databases" - fi - fi - else - for db in $databases - do - if [ $usevserver = yes ] - then - execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir" - else - execstr="$MYSQLHOTCOPY --allowold $db $hotdir" - fi - debug 'su $user -c \"$execstr\"' - if [ ! $test ] - then - output=`su $user -c "$execstr" 2>&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished hotcopy of mysql database $db" - else - warning $output - warning "Failed to hotcopy mysql database $db" - fi - fi - done - fi + info "Initializing hotcopy method" + if [ "$databases" == "all" ] + then + if [ $usevserver = yes ] + then + info "dbhost: $dbhost" + execstr="$VSERVER $vsname exec $MYSQLHOTCOPY -h $dbhost --quiet --allowold --regexp /.\*/./.\*/ $hotdir" + else + execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir" + fi + debug "su $user -c \"$execstr\"" + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of all mysql databases" + else + warning $output + warning "Failed to hotcopy all mysql databases" + fi + fi + else + for db in $databases + do + if [ $usevserver = yes ] + then + execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir" + else + execstr="$MYSQLHOTCOPY --allowold $db $hotdir" + fi + debug 'su $user -c \"$execstr\"' + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished hotcopy of mysql database $db" + else + warning $output + warning "Failed to hotcopy mysql database $db" + fi + fi + done + fi fi ########################################################################## @@ -224,97 +224,97 @@ fi if [ "$sqldump" == "yes" ] then - info "Initializing SQL dump method" - if [ "$databases" == "all" ] - then - if [ $usevserver = yes ] - then - debug 'echo show databases | $VSERVER $vsname exec su $user -c \"$MYSQL $defaultsfile\" | grep -v Database' - databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database` - if [ $? -ne 0 ] - then - fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" - fi - else - databases=$(su $user -c "$MYSQL $defaultsfile -N -B -e 'show databases'" | sed 's/|//g;/\+----/d') - if [ $? -ne 0 ] - then - fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" - fi - fi - fi + info "Initializing SQL dump method" + if [ "$databases" == "all" ] + then + if [ $usevserver = yes ] + then + debug 'echo show databases | $VSERVER $vsname exec su $user -c \"$MYSQL $defaultsfile\" | grep -v Database' + databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database` + if [ $? -ne 0 ] + then + fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" + fi + else + databases=$(su $user -c "$MYSQL $defaultsfile -N -B -e 'show databases'" | sed 's/|//g;/\+----/d') + if [ $? -ne 0 ] + then + fatal "Authentication problem, maybe user/password is wrong or mysqld is not running?" + fi + fi + fi - for db in $databases - do - DUMP_BASE="$MYSQLDUMP $defaultsfile $sqldumpoptions" + for db in $databases + do + DUMP_BASE="$MYSQLDUMP $defaultsfile $sqldumpoptions" - # Dumping structure and data - DUMP="$DUMP_BASE $ignore $db" + # Dumping structure and data + DUMP="$DUMP_BASE $ignore $db" - # If requested, dump only the table structure for this database - if echo "$nodata" | grep -E '(^|[[:space:]])'"$db\." >/dev/null - then - # Get the structure of the tables, without data - DUMP_STRUCT="$DUMP_BASE --no-data $db" - for qualified_table in $nodata - do - table=$( expr match "$qualified_table" "$db\.\([^\w]*\)" ) - DUMP_STRUCT="$DUMP_STRUCT $table" - done - DUMP="( $DUMP; $DUMP_STRUCT )" - fi - if [ $usevserver = yes ] - then - # Test to make sure mysqld is running, if it is not sqldump will not work - $VSERVER $vsname exec su $user -c "$MYSQLADMIN $defaultsfile ping 2>&1 >/dev/null" - if [ $? -ne 0 ]; then - fatal "mysqld doesn't appear to be running!" - fi - if [ "$compress" == "yes" ]; then - execstr="$VSERVER $vsname exec $DUMP | $GZIP > $vroot$dumpdir/${db}.sql.gz" - else - execstr="$VSERVER $vsname exec $DUMP -r $vroot$dumpdir/${db}.sql" - fi - else - # Test to make sure mysqld is running, if it is not sqldump will not work - su $user -c "$MYSQLADMIN $defaultsfile ping 2>&1 >/dev/null" - if [ $? -ne 0 ]; then - fatal "mysqld doesn't appear to be running!" - fi - if [ "$compress" == "yes" ]; then - execstr="$DUMP | $GZIP > $dumpdir/${db}.sql.gz" - else - execstr="$DUMP -r $dumpdir/${db}.sql" - fi - fi - debug "su $user -c \"$execstr\"" - if [ ! $test ] - then - output=`su $user -c "$execstr" 2>&1` - code=$? - if [ "$code" == "0" ] - then - debug $output - info "Successfully finished dump of mysql database $db" - else - warning $output - warning "Failed to dump mysql databases $db" - fi - fi - done + # If requested, dump only the table structure for this database + if echo "$nodata" | grep -E '(^|[[:space:]])'"$db\." >/dev/null + then + # Get the structure of the tables, without data + DUMP_STRUCT="$DUMP_BASE --no-data $db" + for qualified_table in $nodata + do + table=$( expr match "$qualified_table" "$db\.\([^\w]*\)" ) + DUMP_STRUCT="$DUMP_STRUCT $table" + done + DUMP="( $DUMP; $DUMP_STRUCT )" + fi + if [ $usevserver = yes ] + then + # Test to make sure mysqld is running, if it is not sqldump will not work + $VSERVER $vsname exec su $user -c "$MYSQLADMIN $defaultsfile ping 2>&1 >/dev/null" + if [ $? -ne 0 ]; then + fatal "mysqld doesn't appear to be running!" + fi + if [ "$compress" == "yes" ]; then + execstr="$VSERVER $vsname exec $DUMP | $GZIP > $vroot$dumpdir/${db}.sql.gz" + else + execstr="$VSERVER $vsname exec $DUMP -r $vroot$dumpdir/${db}.sql" + fi + else + # Test to make sure mysqld is running, if it is not sqldump will not work + su $user -c "$MYSQLADMIN $defaultsfile ping 2>&1 >/dev/null" + if [ $? -ne 0 ]; then + fatal "mysqld doesn't appear to be running!" + fi + if [ "$compress" == "yes" ]; then + execstr="$DUMP | $GZIP > $dumpdir/${db}.sql.gz" + else + execstr="$DUMP -r $dumpdir/${db}.sql" + fi + fi + debug "su $user -c \"$execstr\"" + if [ ! $test ] + then + output=`su $user -c "$execstr" 2>&1` + code=$? + if [ "$code" == "0" ] + then + debug $output + info "Successfully finished dump of mysql database $db" + else + warning $output + warning "Failed to dump mysql databases $db" + fi + fi + done fi # clean up tmp config file if [ "$dbusername" != "" -a "$dbpassword" != "" ] then - ## clean up tmp config file - debug "rm $mycnf" - rm $mycnf - if [ -f "$tmpcnf" ] - then - debug "mv $tmpcnf $mycnf" - mv $tmpcnf $mycnf - fi + ## clean up tmp config file + debug "rm $mycnf" + rm $mycnf + if [ -f "$tmpcnf" ] + then + debug "mv $tmpcnf $mycnf" + mv $tmpcnf $mycnf + fi fi return 0 diff --git a/handlers/pgsql.helper.in b/handlers/pgsql.helper.in index 8024616..48bf047 100644 --- a/handlers/pgsql.helper.in +++ b/handlers/pgsql.helper.in @@ -13,20 +13,20 @@ do_pgsql_databases() { while [ -z "$REPLY" ]; do formBegin "$pgsql_title: databases" formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" - formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" + formItem "Database:" formDisplay [ $? = 0 ] || return 1 pgsql_databases="databases = " for i in $REPLY; do - [ -n "$i" ] && pgsql_databases="$pgsql_databases $i" + [ -n "$i" ] && pgsql_databases="$pgsql_databases $i" done done } @@ -86,14 +86,14 @@ EOF $pgsql_backupdir # databases = < all | db1 db2 db3 > (default = all) -# which databases to backup. should either be the word 'all' or a +# which databases to backup. should either be the word 'all' or a # space separated list of database names. # Note: when using 'all', pg_dumpall is used instead of pg_dump, which means # that cluster-wide data (such as users and groups) are saved. $pgsql_databases # compress = < yes | no > (default = yes) -# if yes, compress the pg_dump/pg_dumpall output. +# if yes, compress the pg_dump/pg_dumpall output. $pgsql_compress ### You can also set the following variables in backupninja.conf: diff --git a/handlers/pgsql.in b/handlers/pgsql.in index f334bf2..b7e4262 100644 --- a/handlers/pgsql.in +++ b/handlers/pgsql.in @@ -36,18 +36,18 @@ if [ $usevserver = yes ]; then debug "Examining vserver '$vsname'." if [ "$databases" == "all" ]; then [ -x "$vroot`$VSERVER $vsname exec which $PGSQLDUMPALL`" ] || \ - fatal "Can't find $PGSQLDUMPALL in vserver $vsname." + fatal "Can't find $PGSQLDUMPALL in vserver $vsname." else [ -x "$vroot`$VSERVER $vsname exec which $PGSQLDUMP`" ] || \ - fatal "Can't find $PGSQLDUMP in vserver $vsname." + fatal "Can't find $PGSQLDUMP in vserver $vsname." fi else if [ "$databases" == "all" ]; then [ -x "`which $PGSQLDUMPALL`" ] || \ - fatal "Can't find $PGSQLDUMPALL." + fatal "Can't find $PGSQLDUMPALL." else [ -x "`which $PGSQLDUMP`" ] || \ - fatal "Can't find $PGSQLDUMP." + fatal "Can't find $PGSQLDUMP." fi fi @@ -64,7 +64,7 @@ else pguid=`getent passwd $PGSQLUSER | @AWK@ -F: '{print $3}'` fi [ -n "$pguid" ] || \ - fatal "No user called $PGSQLUSER`[ $usevserver = no ] || echo \" on vserver $vsname\"`." + fatal "No user called $PGSQLUSER`[ $usevserver = no ] || echo \" on vserver $vsname\"`." debug "chown $pguid $vroot$backupdir" chown $pguid $vroot$backupdir debug "chmod 700 $vroot$backupdir" @@ -72,61 +72,61 @@ chmod 700 $vroot$backupdir # if $databases = all, use pg_dumpall if [ "$databases" == "all" ]; then - if [ $usevserver = yes ]; then - if [ "$compress" == "yes" ]; then - execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMPALL | $GZIP > $backupdir/${vsname}.sql.gz\"" - else - execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMPALL > $backupdir/${vsname}.sql\"" - fi - else - if [ "$compress" == "yes" ]; then - execstr="su - $PGSQLUSER -c \"$PGSQLDUMPALL | $GZIP > $backupdir/${localhost}-all.sql.gz\"" - else - execstr="su - $PGSQLUSER -c \"$PGSQLDUMPALL > $backupdir/${localhost}-all.sql\"" - fi - fi - debug "$execstr" - if [ ! $test ]; then - output=`eval $execstr 2>&1` - code=$? - if [ "$code" == "0" ]; then - debug $output - info "Successfully finished dump of pgsql cluster" - else - warning $output - warning "Failed to dump pgsql cluster" - fi - fi - + if [ $usevserver = yes ]; then + if [ "$compress" == "yes" ]; then + execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMPALL | $GZIP > $backupdir/${vsname}.sql.gz\"" + else + execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMPALL > $backupdir/${vsname}.sql\"" + fi + else + if [ "$compress" == "yes" ]; then + execstr="su - $PGSQLUSER -c \"$PGSQLDUMPALL | $GZIP > $backupdir/${localhost}-all.sql.gz\"" + else + execstr="su - $PGSQLUSER -c \"$PGSQLDUMPALL > $backupdir/${localhost}-all.sql\"" + fi + fi + debug "$execstr" + if [ ! $test ]; then + output=`eval $execstr 2>&1` + code=$? + if [ "$code" == "0" ]; then + debug $output + info "Successfully finished dump of pgsql cluster" + else + warning $output + warning "Failed to dump pgsql cluster" + fi + fi + # else use pg_dump on each specified database else - for db in $databases; do - if [ $usevserver = yes ]; then - if [ "$compress" == "yes" ]; then - execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMP $db | $GZIP > $backupdir/${db}.sql.gz\"" - else - execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMP $db | > $backupdir/${db}.sql\"" - fi - else - if [ "$compress" == "yes" ]; then - execstr="su - $PGSQLUSER -c \"$PGSQLDUMP $db | $GZIP > $backupdir/${db}.sql.gz\"" - else - execstr="su - $PGSQLUSER -c \"$PGSQLDUMP $db > $backupdir/${db}.sql\"" - fi - fi - debug "$execstr" - if [ ! $test ]; then - output=`eval $execstr 2>&1` - code=$? - if [ "$code" == "0" ]; then - debug $output - info "Successfully finished dump of pgsql database ${db}" - else - warning $output - warning "Failed to dump pgsql database ${db}" - fi - fi - done + for db in $databases; do + if [ $usevserver = yes ]; then + if [ "$compress" == "yes" ]; then + execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMP $db | $GZIP > $backupdir/${db}.sql.gz\"" + else + execstr="$VSERVER $vsname exec su - $PGSQLUSER -c \"$PGSQLDUMP $db | > $backupdir/${db}.sql\"" + fi + else + if [ "$compress" == "yes" ]; then + execstr="su - $PGSQLUSER -c \"$PGSQLDUMP $db | $GZIP > $backupdir/${db}.sql.gz\"" + else + execstr="su - $PGSQLUSER -c \"$PGSQLDUMP $db > $backupdir/${db}.sql\"" + fi + fi + debug "$execstr" + if [ ! $test ]; then + output=`eval $execstr 2>&1` + code=$? + if [ "$code" == "0" ]; then + debug $output + info "Successfully finished dump of pgsql database ${db}" + else + warning $output + warning "Failed to dump pgsql database ${db}" + fi + fi + done fi return 0 diff --git a/handlers/rdiff.helper.in b/handlers/rdiff.helper.in index 1055280..c673723 100644 --- a/handlers/rdiff.helper.in +++ b/handlers/rdiff.helper.in @@ -18,9 +18,9 @@ do_rdiff_host_includes() { for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do formItem include ${rdiff_includes[$i]} done - formItem include - formItem include - formItem include + formItem include + formItem include + formItem include formDisplay [ $? = 0 ] || return unset rdiff_includes @@ -41,7 +41,7 @@ do_rdiff_vserver() { while [ -z "$REPLY" ]; do formBegin "$rdiff_title - vsincludes (backup these directories from every vserver)" [ -z "$rdiff_vsincludes" ] && rdiff_vsincludes="$rdiff_default_includes" - + for i in $rdiff_vsincludes; do formItem include "$i" done @@ -52,19 +52,19 @@ do_rdiff_vserver() { [ $? = 0 ] || return 1 rdiff_vsincludes=($REPLY) done - + set +o noglob } do_rdiff_excludes() { set -o noglob - formBegin "$rdiff_title: excludes" + formBegin "$rdiff_title: excludes" for ((i=0; i < ${#rdiff_excludes[@]} ; i++)) do formItem exclude ${rdiff_excludes[$i]} done - formItem exclude - formItem exclude + formItem exclude + formItem exclude formDisplay [ $? = 0 ] || return unset rdiff_excludes @@ -102,10 +102,10 @@ do_rdiff_src() { do_rdiff_dest() { declare -a tmp_array - + set -o noglob REPLY= - while [ -z "$REPLY" -o -z "$rdiff_directory" -o -z "$rdiff_host" -o -z "$rdiff_user" ] + while [ -z "$REPLY" -o -z "$rdiff_directory" -o -z "$rdiff_host" -o -z "$rdiff_user" ] do formBegin "$rdiff_title - destination: last three items are required" formItem "keep" "$rdiff_keep" @@ -119,11 +119,11 @@ do_rdiff_dest() { rdiff_keep=${tmp_array[0]} rdiff_directory=${tmp_array[1]} rdiff_host=${tmp_array[2]} - rdiff_user=${tmp_array[3]} + rdiff_user=${tmp_array[3]} rdiff_type=${tmp_array[4]} done set +o noglob - + _dest_done="(DONE)" setDefault conn } @@ -155,7 +155,7 @@ do_rdiff_ssh_con() { echo "Done. hit return to continue" read fi - + ssh -o PreferredAuthentications=publickey $rdiff_host -l $rdiff_user "exit" 2> /dev/null if [ $? -ne 0 ]; then echo "Copying root's public ssh key to authorized_keys of $rdiff_user@$rdiff_host. When prompted, specify the password for user $rdiff_user@$rdiff_host." @@ -171,7 +171,7 @@ do_rdiff_ssh_con() { 1 ) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but unable to write. Check ownership and modes of ~$rdiff_user on $rdiff_host." ;; 255 ) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." ;; * ) msgBox "$rdiff_title: error" "Unexpected error." ;; - esac + esac return else echo "Done. hit return to continue" @@ -195,20 +195,20 @@ do_rdiff_ssh_con() { else booleanBox "Remote directory does not exist" "The destination backup directory does not exist, do you want me to create it for you?" if [ $? = 0 ]; then - ssh $rdiff_user@$rdiff_host "mkdir -p ${rdiff_directory}" + ssh $rdiff_user@$rdiff_host "mkdir -p ${rdiff_directory}" result=$? case $result in 0) msgBox "$rdiff_title: success" "Creation of the remote destination directory was a success!";; - 1) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to create the destination directory, check the directory permissions." + 1) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to create the destination directory, check the directory permissions." remote_status=failed;; - 255) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." + 255) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." remote_status=failed;; - *) msgBox "$rdiff_title: error" "Unexpected error." + *) msgBox "$rdiff_title: error" "Unexpected error." remote_status=failed;; esac fi fi - + if [ "$remote_status" = "ok" ]; then do_rdiff_con fi @@ -231,12 +231,12 @@ do_rdiff_con() { echo "Hit return to continue." read case $result in - 0) msgBox "$rdiff_title: success" "Installation of rdiff-backup was a success!" + 0) msgBox "$rdiff_title: success" "Installation of rdiff-backup was a success!" do_rdiff_con;; 1) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to install the package for some reason.";; 255) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host.";; *) msgBox "$rdiff_title: error" "Unexpected error.";; - esac + esac return fi else @@ -256,9 +256,9 @@ do_rdiff_con() { fi fi else - echo "SUCCESS: Everything looks good!" - echo "Hit return to continue." - read + echo "SUCCESS: Everything looks good!" + echo "Hit return to continue." + read fi _con_done="(DONE)" @@ -298,11 +298,11 @@ EOF set -o noglob for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do echo "include = ${rdiff_includes[$i]}" >> $next_filename - done + done set +o noglob fi - if [ "$host_or_vservers" == vservers -o "$host_or_vservers" == both ]; then + if [ "$host_or_vservers" == vservers -o "$host_or_vservers" == both ]; then cat >> $next_filename <&1`" if [ $? = 0 ]; then - debug $output - info "Removing backups older than $keep days succeeded." + debug $output + info "Removing backups older than $keep days succeeded." else - warning $output - warning "Failed removing backups older than $keep." + warning $output + warning "Failed removing backups older than $keep." fi fi fi -# Add cstream +# Add cstream if [ ! -z $bwlimit ]; then - check_cstream $CSTREAM; - if [ "$desttype" = "remote" ]; then - RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'cstream -t $bwlimit | ssh %s \''rdiff-backup --server\'''" - elif [ "$sourcetype" = "remote" ]; then - RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'ssh %s \''rdiff-backup --server\'' | cstream -t $bwlimit'" - else - fatal "You specified a bandwidth limit but neither your source nor destination types are remote." - fi + check_cstream $CSTREAM; + if [ "$desttype" = "remote" ]; then + RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'cstream -t $bwlimit | ssh %s \''rdiff-backup --server\'''" + elif [ "$sourcetype" = "remote" ]; then + RDIFFBACKUP="$RDIFFBACKUP --remote-schema 'ssh %s \''rdiff-backup --server\'' | cstream -t $bwlimit'" + else + fatal "You specified a bandwidth limit but neither your source nor destination types are remote." + fi fi ### EXECUTE ### @@ -212,7 +212,7 @@ for i in $exclude; do str="${i//__star__/*}" execstr="${execstr}--exclude '$str' " done -# includes +# includes for i in $include; do [ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'" str="${i//__star__/*}" @@ -223,10 +223,10 @@ done if [ $usevserver = yes ]; then for vserver in $vsnames; do for vi in $vsinclude; do - str="${vi//__star__/*}" - str="$VROOTDIR/$vserver$str" + str="${vi//__star__/*}" + str="$VROOTDIR/$vserver$str" if [ -n "$str" ]; then - execstr="${execstr}--include '$str' " + execstr="${execstr}--include '$str' " else warning "vsinclude statement '${vi//__star__/*}' will be ignored for VServer $vserver. $symlinks_warning" fi @@ -238,20 +238,20 @@ set +o noglob # exclude everything else [ "$include" != "" -o "$vsinclude" != "" ] && execstr="${execstr}--exclude '/*' " - + # include client-part and server-part execstr="${execstr}$execstr_sourcepart $execstr_destpart" debug "$execstr" if [ $test = 0 ]; then - output=`nice -n $nicelevel su -c "$execstr" 2>&1` - if [ $? = 0 ]; then - debug $output - info "Successfully finished backing up source $label" - else - warning $output - warning "Failed backup up source $label" - fi -fi + output=`nice -n $nicelevel su -c "$execstr" 2>&1` + if [ $? = 0 ]; then + debug $output + info "Successfully finished backing up source $label" + else + warning $output + warning "Failed backup up source $label" + fi +fi return 0 diff --git a/handlers/rsync.in b/handlers/rsync.in index 9baa2f2..9e5e4f9 100644 --- a/handlers/rsync.in +++ b/handlers/rsync.in @@ -102,40 +102,40 @@ getconf service function rotate { - if [[ "$2" < 4 ]]; then - error "Rotate: minimum of 4 rotations" - exit 1 - fi + if [[ "$2" < 4 ]]; then + error "Rotate: minimum of 4 rotations" + exit 1 + fi - if [ -d $1.$2 ]; then - $nice $mv /$1.$2 /$1.tmp - fi + if [ -d $1.$2 ]; then + $nice $mv /$1.$2 /$1.tmp + fi - for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do - if [ -d $1.$n ]; then - dest=`echo "$n + 1" | bc` - $nice $mv /$1.$n /$1.$dest - $touch /$1.$dest - fi - done + for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do + if [ -d $1.$n ]; then + dest=`echo "$n + 1" | bc` + $nice $mv /$1.$n /$1.$dest + $touch /$1.$dest + fi + done - if [ -d $1.tmp ]; then - $nice $mv /$1.tmp /$1.0 - fi + if [ -d $1.tmp ]; then + $nice $mv /$1.tmp /$1.0 + fi - if [ -d $1.1 ]; then - $nice $cp -alf /$1.1/. /$1.0 - fi + if [ -d $1.1 ]; then + $nice $cp -alf /$1.1/. /$1.0 + fi } function move_files { - ref=$tmp/makesnapshot-mymv-$$; - $touch -r $1 $ref; - $mv $1 $2; - $touch -r $ref $2; - $rm $ref; + ref=$tmp/makesnapshot-mymv-$$; + $touch -r $1 $ref; + $mv $1 $2; + $touch -r $ref $2; + $rm $ref; } @@ -143,54 +143,54 @@ backupdir="$mountpoint/$backupdir" # does $backupdir exists? -if [ ! -d "$backupdir" ]; then - error "Backupdir $backupdir does not exist" - exit 1 +if [ ! -d "$backupdir" ]; then + error "Backupdir $backupdir does not exist" + exit 1 fi # setup number of increments if [ -z "$days" ]; then - keep="4" + keep="4" else - keep="`echo $days - 1 | bc -l`" + keep="`echo $days - 1 | bc -l`" fi # lockfile setup if [ ! -z "$lockfile" ]; then - $touch $lockfile || warning "Could not create lockfile $lockfile" + $touch $lockfile || warning "Could not create lockfile $lockfile" fi # nicelevel setup -if [ ! -z "$nicelevel" ]; then - nice="nice -n $nicelevel" -else - nice="" +if [ ! -z "$nicelevel" ]; then + nice="nice -n $nicelevel" +else + nice="" fi # connection test if [ "$from" == "remote" ] && [ "$testconnect" == "yes" ]; then - debug "$ssh -o PasswordAuthentication=no $user@$host 'echo -n 1'" - result=`ssh -o PasswordAuthentication=no $user@$host 'echo -n 1'` - if [ "$result" != "1" ]; then - fatal "Can't connect to $host as $user." - else - debug "Connected to $srchost successfully" - fi + debug "$ssh -o PasswordAuthentication=no $user@$host 'echo -n 1'" + result=`ssh -o PasswordAuthentication=no $user@$host 'echo -n 1'` + if [ "$result" != "1" ]; then + fatal "Can't connect to $host as $user." + else + debug "Connected to $srchost successfully" + fi fi # rsync options for local sources if [ "$from" == "local" ]; then - rsync_local_options="$rsync_options" + rsync_local_options="$rsync_options" - if [ ! -z "$numericids" ]; then - rsync_local_options="$rsync_local_options --numeric-ids " - fi + if [ ! -z "$numericids" ]; then + rsync_local_options="$rsync_local_options --numeric-ids " + fi fi @@ -198,41 +198,41 @@ fi if [ "$from" == "remote" ]; then - rsync_remote_options="$rsync_options --rsync-path=$remote_rsync" + rsync_remote_options="$rsync_options --rsync-path=$remote_rsync" - if [ "$compress" == "1" ]; then - rsync_remote_options="$rsync_remote_options --compress" - fi + if [ "$compress" == "1" ]; then + rsync_remote_options="$rsync_remote_options --compress" + fi - if [ ! -z "$bandwidthlimit" ]; then - rsync_remote_options="$rsync_remote_options --bwlimit=$bandwidthlimit" - fi + if [ ! -z "$bandwidthlimit" ]; then + rsync_remote_options="$rsync_remote_options --bwlimit=$bandwidthlimit" + fi - if [ ! -z "$numericids" ]; then - rsync_remote_options="$rsync_remote_options --numeric-ids" - fi + if [ ! -z "$numericids" ]; then + rsync_remote_options="$rsync_remote_options --numeric-ids" + fi fi # set mv procedure if [ $enable_mv_timestamp_bug == "yes" ]; then - mv=move_files + mv=move_files fi # set excludes for path in $exclude; do - EXCLUDES="$EXCLUDES --exclude=$path" + EXCLUDES="$EXCLUDES --exclude=$path" done # stop services if [ ! -z "$service" ]; then - for daemon in $service; do - info "Stopping service $daemon..." - $initscripts/$daemon stop - done + for daemon in $service; do + info "Stopping service $daemon..." + $initscripts/$daemon stop + done fi echo "Starting backup at `date`" >> $log @@ -240,110 +240,110 @@ echo "Starting backup at `date`" >> $log # mount backup destination folder as read-write if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then - if [ -d "$mountpoint" ]; then - mount -o remount,rw $mountpoint - if (($?)); then - error "Could not mount $mountpoint" - exit 1 - fi - fi + if [ -d "$mountpoint" ]; then + mount -o remount,rw $mountpoint + if (($?)); then + error "Could not mount $mountpoint" + exit 1 + fi + fi fi # add vservers to included folders if [ "$vservers_are_available" == "yes" ]; then - # sane permission on backup - mkdir -p $backupdir/$VROOTDIR - chmod 000 $backupdir/$VROOTDIR + # sane permission on backup + mkdir -p $backupdir/$VROOTDIR + chmod 000 $backupdir/$VROOTDIR - for candidate in $found_vservers; do - candidate="`basename $candidate`" - found_excluded_vserver="0" - for excluded_vserver in $exclude_vserver; do - if [ "$excluded_vserver" == "$candidate" ]; then - found_excluded_vserver="1" - break + for candidate in $found_vservers; do + candidate="`basename $candidate`" + found_excluded_vserver="0" + for excluded_vserver in $exclude_vserver; do + if [ "$excluded_vserver" == "$candidate" ]; then + found_excluded_vserver="1" + break + fi + done + if [ "$found_excluded_vserver" == "0" ]; then + include="$include $VROOTDIR/$candidate" fi - done - if [ "$found_excluded_vserver" == "0" ]; then - include="$include $VROOTDIR/$candidate" - fi - done + done fi # the backup procedure for SECTION in $include; do - section="`basename $SECTION`" + section="`basename $SECTION`" - if [ ! -d "$backupdir/$SECTION/$section.0" ]; then - mkdir -p $backupdir/$SECTION/$section.0 - fi - - info "Rotating $backupdir/$SECTION/$section..." - echo "Rotating $backupdir/$SECTION/$section..." >> $log - rotate $backupdir/$SECTION/$section $keep - info "Syncing $SECTION on $backupdir/$SECTION/$section.0..." + if [ ! -d "$backupdir/$SECTION/$section.0" ]; then + mkdir -p $backupdir/$SECTION/$section.0 + fi - if [ "$from" == "local" ]; then - debug $rsync $rsync_local_options $EXCLUDES /$SECTION/ $backupdir/$SECTION/$section.0/ - $nice $rsync $rsync_local_options $EXCLUDES /$SECTION/ $backupdir/$SECTION/$section.0/ >> $log - if [ "$?" != "0" ]; then - warning "Rsync error when trying to transfer $SECTION" - fi - elif [ "$from" == "remote" ]; then - if [ -z "$user" ] || [ -z "$host" ]; then - error "Config file error: either user or host was not specified" - exit 1 - else - debug $nice $rsync $rsync_remote_options $EXCLUDES -e "$ssh" $user@$host:/$SECTION/ $backupdir/$SECTION/$section.0 - $nice $rsync $rsync_remote_options $EXCLUDES -e "$ssh" $user@$host:/$SECTION/ $backupdir/$SECTION/$section.0 >> $log + info "Rotating $backupdir/$SECTION/$section..." + echo "Rotating $backupdir/$SECTION/$section..." >> $log + rotate $backupdir/$SECTION/$section $keep + info "Syncing $SECTION on $backupdir/$SECTION/$section.0..." + + if [ "$from" == "local" ]; then + debug $rsync $rsync_local_options $EXCLUDES /$SECTION/ $backupdir/$SECTION/$section.0/ + $nice $rsync $rsync_local_options $EXCLUDES /$SECTION/ $backupdir/$SECTION/$section.0/ >> $log if [ "$?" != "0" ]; then - warning "Rsync error when trying to transfer $SECTION" + warning "Rsync error when trying to transfer $SECTION" fi - fi - else - error "Invalid source $from" - exit 1 - fi + elif [ "$from" == "remote" ]; then + if [ -z "$user" ] || [ -z "$host" ]; then + error "Config file error: either user or host was not specified" + exit 1 + else + debug $nice $rsync $rsync_remote_options $EXCLUDES -e "$ssh" $user@$host:/$SECTION/ $backupdir/$SECTION/$section.0 + $nice $rsync $rsync_remote_options $EXCLUDES -e "$ssh" $user@$host:/$SECTION/ $backupdir/$SECTION/$section.0 >> $log + if [ "$?" != "0" ]; then + warning "Rsync error when trying to transfer $SECTION" + fi + fi + else + error "Invalid source $from" + exit 1 + fi - $touch $backupdir/$SECTION/$section.0 + $touch $backupdir/$SECTION/$section.0 done # remount backup destination as read-only if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then - mount -o remount,ro $mountpoint + mount -o remount,ro $mountpoint fi # check partition for errors if [ "$fscheck" == "1" ] || [ "$fscheck" == "yes" ]; then - umount $mountpoint - if (($?)); then - warning "Could not umount $mountpoint to run fsck" - else - $nice $fsck -v -y $partition >> $log - mount $mountpoint - fi + umount $mountpoint + if (($?)); then + warning "Could not umount $mountpoint to run fsck" + else + $nice $fsck -v -y $partition >> $log + mount $mountpoint + fi fi # restart services if [ ! -z "$service" ]; then - for daemon in $service; do - info "Starting service $daemon..." - $initscripts/$daemon start - done + for daemon in $service; do + info "Starting service $daemon..." + $initscripts/$daemon start + done fi # removes the lockfile if [ ! -z "$lockfile" ]; then - $rm $lockfile || warning "Could not remove lockfile $lockfile" + $rm $lockfile || warning "Could not remove lockfile $lockfile" fi echo "Finnishing backup at `date`" >> $log diff --git a/handlers/sh.in b/handlers/sh.in index f9f1926..4edfd9a 100644 --- a/handlers/sh.in +++ b/handlers/sh.in @@ -2,6 +2,6 @@ # # shell script handler for backupninja # runs the file /etc/backup.d/scriptname.sh -# +# [ $test ] || ( . $1 ) diff --git a/handlers/svn.in b/handlers/svn.in index d19b0b8..97d1701 100644 --- a/handlers/svn.in +++ b/handlers/svn.in @@ -7,7 +7,7 @@ getconf src /var/lib/svn getconf dest /var/backups/svn getconf tmp /var/backups/svn.tmp getconf HOTBACKUP "/usr/bin/svnadmin hotcopy" -getconf vsname +getconf vsname error=0 @@ -35,43 +35,43 @@ fi cd $vroot$src for repo in `find . -name svnserve.conf` do - repo=`dirname $repo` - repo=`dirname $repo` + repo=`dirname $repo` + repo=`dirname $repo` - ret=`mkdir -p $vroot$tmp/$repo 2>&1` - code=$? - if [ "$ret" ]; then - debug "$ret" - fi - if [ $code != 0 ]; then - error "command failed mkdir -p $vroot$tmp/$repo" - fi + ret=`mkdir -p $vroot$tmp/$repo 2>&1` + code=$? + if [ "$ret" ]; then + debug "$ret" + fi + if [ $code != 0 ]; then + error "command failed mkdir -p $vroot$tmp/$repo" + fi - if [ $usevserver = yes ] - then - ret=`$VSERVER $vsname exec $HOTBACKUP $src/$repo $tmp/$repo 2>&1` - else - ret=`$HOTBACKUP $src/$repo $tmp/$repo 2>&1` - fi - code=$? - if [ "$ret" ]; then - debug "$ret" - fi - if [ $code != 0 ]; then - error "command failed -- $HOTBACKUP $vroot$src/$repo $vroot$tmp/$repo" - error=1 - fi + if [ $usevserver = yes ] + then + ret=`$VSERVER $vsname exec $HOTBACKUP $src/$repo $tmp/$repo 2>&1` + else + ret=`$HOTBACKUP $src/$repo $tmp/$repo 2>&1` + fi + code=$? + if [ "$ret" ]; then + debug "$ret" + fi + if [ $code != 0 ]; then + error "command failed -- $HOTBACKUP $vroot$src/$repo $vroot$tmp/$repo" + error=1 + fi done if [ $error -eq 1 ]; then - echo "Error: because of earlier errors, we are leaving svn backups in $vroot$tmp instead of $vroot$dest" + echo "Error: because of earlier errors, we are leaving svn backups in $vroot$tmp instead of $vroot$dest" else - if [ -d $vroot$dest -a -d $vroot$tmp ]; then - rm -rf $vroot$dest - fi - if [ -d $vroot$tmp ]; then - mv $vroot$tmp $vroot$dest - fi + if [ -d $vroot$dest -a -d $vroot$tmp ]; then + rm -rf $vroot$dest + fi + if [ -d $vroot$tmp ]; then + mv $vroot$tmp $vroot$dest + fi fi exit 0 diff --git a/handlers/sys.helper.in b/handlers/sys.helper.in index c5892a9..c823712 100644 --- a/handlers/sys.helper.in +++ b/handlers/sys.helper.in @@ -5,13 +5,13 @@ HELPERS="$HELPERS sys:general_hardware_and_system_info" sys_wizard() { require_packages hwinfo debconf-utils checkBox "new sys action" "check options" \ - "packages" "list of all installed packages." on \ - "partitions" "the partition table of all disks." on \ - "sfdisk" "use sfdisk to get partition information." on \ - "hardware" "detailed hardware information" on \ - "luksheaders" "Luks headers of all Luks partitions." off \ - "lvm" "LVM metadata for all volume groups." off - [ $? = 1 ] && return; + "packages" "list of all installed packages." on \ + "partitions" "the partition table of all disks." on \ + "sfdisk" "use sfdisk to get partition information." on \ + "hardware" "detailed hardware information" on \ + "luksheaders" "Luks headers of all Luks partitions." off \ + "lvm" "LVM metadata for all volume groups." off + [ $? = 1 ] && return; result="$REPLY" packages="packages = no" partitions="partitions = no" @@ -21,12 +21,12 @@ sys_wizard() { lvm="lvm = no" for opt in $result; do case $opt in - '"packages"') packages="packages = yes";; - '"partitions"') partitions="partitions = yes";; - '"sfdisk"') sfdisk="dosfdisk = yes";; - '"hardware"') hardware="hardware = yes";; - '"luksheaders"') luksheaders="luksheaders = yes";; - '"lvm"') lvm="lvm = yes";; + '"packages"') packages="packages = yes";; + '"partitions"') partitions="partitions = yes";; + '"sfdisk"') sfdisk="dosfdisk = yes";; + '"hardware"') hardware="hardware = yes";; + '"luksheaders"') luksheaders="luksheaders = yes";; + '"lvm"') lvm="lvm = yes";; esac done get_next_filename $configdirectory/10.sys diff --git a/handlers/sys.in b/handlers/sys.in index e6cb273..2ab5871 100755 --- a/handlers/sys.in +++ b/handlers/sys.in @@ -11,17 +11,17 @@ # (2) a list of all the packages installed and removed. # this file can be used to restore the state of installed packages # by running "dpkg --set-selections < dpkg-selections.txt and -# then run "apt-get -u dselect-upgrade". If you have the +# then run "apt-get -u dselect-upgrade". If you have the # debconf-set-selections file from (1), you should restore those first. -# -# (3) the partition table of all disks. +# +# (3) the partition table of all disks. # this partition table can be used to format another disk of -# the same size. this can be handy if using software raid and +# the same size. this can be handy if using software raid and # you have a disk go bad. just replace the disk and partition it # by running "sfdisk /dev/sdb < partitions.sdb.txt" # (MAKE SURE YOU PARTITION THE CORRECT DISK!!!) # -# (4) hardware information. +# (4) hardware information. # write to a text file the important things which hwinfo can gleen. # # (5) the Luks header of every Luks block device, if option luksheaders @@ -55,7 +55,7 @@ getconf dohwinfo yes if [ ! -d $parentdir ]; then mkdir -p $parentdir fi - + if [ $os = "debian" ] then getconf packagesfile $parentdir/dpkg-selections.txt @@ -65,9 +65,9 @@ then getconf debconfgetselections `which debconf-get-selections` elif [ $os = "redhat" ] then - getconf packagesfile $parentdir/rpmpackages.txt - getconf packagemgr `which rpm` - getconf packagemgroptions ' -qa ' + getconf packagesfile $parentdir/rpmpackages.txt + getconf packagemgr `which rpm` + getconf packagemgroptions ' -qa ' getconf SYSREPORT `which sysreport` getconf sysreport_options ' -norpm ' @@ -163,7 +163,7 @@ if [ "$packages" == "yes" ]; then # don't expand * since it can be used in $packagemgroptions set -o noglob debug "$VSERVER $vserver exec $packagemgr $packagemgroptions > $VROOTDIR/$vserver$packagesfile" - $VSERVER $vserver exec $packagemgr $packagemgroptions > $VROOTDIR/$vserver$packagesfile || fatal "can not save $packagemgr info to $packagesfile" + $VSERVER $vserver exec $packagemgr $packagemgroptions > $VROOTDIR/$vserver$packagesfile || fatal "can not save $packagemgr info to $packagesfile" set +o noglob fi # is $debconfgetselections available inside $vserver ? @@ -184,9 +184,9 @@ if [ "$packages" == "yes" ]; then unset found done fi - + # We want to perform this on the host as well - if [ -z "$packagemgr" -o ! -x "$packagemgr" ]; then + if [ -z "$packagemgr" -o ! -x "$packagemgr" ]; then warning "can't find ${packagemgr}, skipping installed packages report." else # don't expand * since it can be used in $packagemgroptions @@ -235,7 +235,7 @@ catiffile () { done fi echo $DASHES >> $sysreportfile -} +} catifexec () { if [ -x $1 ]; then @@ -245,12 +245,12 @@ catifexec () { $* >> $sysreportfile 2>&1 || info "executing of $1 failed" fi } - + STATUS="Determining $os version:" catiffile $osversion -STATUS="Determinding your current hostname: " +STATUS="Determinding your current hostname: " catifexec "/bin/hostname" STATUS="Getting the date:" @@ -272,17 +272,17 @@ if [ $os = "redhat" ]; then catiffile "/bin/ls /etc/rc.d/rc*.d/" elif [ $os = "debian" ]; then - for level in 0 1 2 3 4 5 6 S; do - echo "Level: $level" >> $sysreportfile - for f in /etc/rc${level}.d/*; do - # Remove /etc/Knn or Snn from beginning - ff=$(echo $f | @SED@ 's_/etc/rc..d/[KS][0-9][0-9]__') - if [ $f != $ff ]; then - echo $ff >> $sysreportfile - fi - done - echo "" >> $sysreportfile - done + for level in 0 1 2 3 4 5 6 S; do + echo "Level: $level" >> $sysreportfile + for f in /etc/rc${level}.d/*; do + # Remove /etc/Knn or Snn from beginning + ff=$(echo $f | @SED@ 's_/etc/rc..d/[KS][0-9][0-9]__') + if [ $f != $ff ]; then + echo $ff >> $sysreportfile + fi + done + echo "" >> $sysreportfile + done fi STATUS="Getting bootloader information:" @@ -291,34 +291,34 @@ catifexec "/bin/ls" "-alR /boot" # This covers sparc, alpha, and intel (respectively) # updated for grub -mpg if [ -f /etc/silo.conf ]; then - STATUS="Collecting information about the boot process (silo):" - catiffile "/etc/silo.conf" + STATUS="Collecting information about the boot process (silo):" + catiffile "/etc/silo.conf" fi if [ -f /etc/milo.conf ]; then - STATUS="Collecting information about the boot process (milo):" - catiffile "/etc/milo.conf" + STATUS="Collecting information about the boot process (milo):" + catiffile "/etc/milo.conf" fi if [ -f /etc/lilo.conf ]; then - STATUS="Collecting information about the boot process (lilo):" - catiffile "/etc/lilo.conf" - catifexec "/sbin/lilo" "-q" + STATUS="Collecting information about the boot process (lilo):" + catiffile "/etc/lilo.conf" + catifexec "/sbin/lilo" "-q" fi if [ -d /boot/grub -a -f /boot/grub/grub.conf -a -f /boot/grub/device.map ]; then - STATUS="Collecting information about the boot process (grub.conf):" - catiffile "/boot/grub/grub.conf" - STATUS="Collecting information about the boot process (grub.map):" - catiffile "/boot/grub/device.map" + STATUS="Collecting information about the boot process (grub.conf):" + catiffile "/boot/grub/grub.conf" + STATUS="Collecting information about the boot process (grub.map):" + catiffile "/boot/grub/device.map" fi if [ -f /etc/cluster.conf -o -f /etc/cluster.xml ] ; then - STATUS="Gathering information on cluster setup" - # 2.1 AS - if [ -f /etc/cluster.conf ] ; then - catiffile "/etc/cluster.conf" - fi - # Taroon - if [ -f /etc/cluster.xml ] ; then - catiffile "/etc/cluster.xml" - fi + STATUS="Gathering information on cluster setup" + # 2.1 AS + if [ -f /etc/cluster.conf ] ; then + catiffile "/etc/cluster.conf" + fi + # Taroon + if [ -f /etc/cluster.xml ] ; then + catiffile "/etc/cluster.xml" + fi fi STATUS="Gathering sysctl information (sysctl -a):" @@ -349,10 +349,10 @@ STATUS="Getting kernel version:" catifexec "/bin/uname" "-a" STATUS="Checking module information:" catifexec "/sbin/lsmod" -for x in $(/sbin/lsmod | /bin/cut -f1 -d" " 2>/dev/null | /bin/grep -v Module 2>/dev/null +for x in $(/sbin/lsmod | /bin/cut -f1 -d" " 2>/dev/null | /bin/grep -v Module 2>/dev/null ) ; do - STATUS="Checking module information $x:" - catifexec "/sbin/modinfo" "$x" + STATUS="Checking module information $x:" + catifexec "/sbin/modinfo" "$x" done STATUS="Gathering information about your filesystems:" @@ -375,27 +375,27 @@ STATUS="Collecting information regarding kernel modules" VER=`uname -r` catiffile "/lib/modules/$VER/modules.dep" if [ -f /etc/conf.modules ]; then - STATUS="Collecting information regarding kernel modules (conf.modules)" - catiffile "/etc/conf.modules" + STATUS="Collecting information regarding kernel modules (conf.modules)" + catiffile "/etc/conf.modules" fi if [ -f /etc/modules.conf ]; then - STATUS="Collecting information regarding kernel modules (modules.conf)" - catiffile "/etc/modules.conf" + STATUS="Collecting information regarding kernel modules (modules.conf)" + catiffile "/etc/modules.conf" fi if [ -f /etc/modprobe.conf ]; then - STATUS="Collecting information regarding kernel modules (modeprobe.conf)" - catiffile "/etc/modprobe.conf" + STATUS="Collecting information regarding kernel modules (modeprobe.conf)" + catiffile "/etc/modprobe.conf" fi # dkms status if [ -x /usr/sbin/dkms ] ; then STATUS="Gathering current status of modules, versions and kernels (dkms):" - catifexec "/usr/sbin/dkms" "status" + catifexec "/usr/sbin/dkms" "status" fi if [ -f /etc/sysconfig/isdncard ] ; then - STATUS="Gathering information about ISDN:" - catiffile "/etc/sysconfig/isdncard" + STATUS="Gathering information about ISDN:" + catiffile "/etc/sysconfig/isdncard" fi STATUS="Collecting information from the proc directory:" @@ -481,18 +481,18 @@ fi STATUS="Collecting device-mapper (dm) information:" catifexec '/sbin/dmsetup' 'info' - + STATUS="Collecting SCSI Tape information (/etc/stinit.def)" catiffile "/etc/stinit.def" if [ -x /sbin/lsusb ] ; then - STATUS="Collecting USB devices list (lsusb):" - catifexec "/sbin/lsusb" + STATUS="Collecting USB devices list (lsusb):" + catifexec "/sbin/lsusb" fi if [ -x /usr/bin/lshal ] ; then - STATUS="Collecting global devices list (lshal):" - catifexec "/usr/bin/lshal" + STATUS="Collecting global devices list (lshal):" + catifexec "/usr/bin/lshal" fi @@ -511,24 +511,24 @@ fi if [ "$partitions" == "yes" ]; then if [ "$dosfdisk" == "yes" ]; then - if [ ! -x "$SFDISK" ]; then - warning "can't find sfdisk, skipping sfdisk report." - partitions="no" - fi + if [ ! -x "$SFDISK" ]; then + warning "can't find sfdisk, skipping sfdisk report." + partitions="no" + fi fi if [ "$dohwinfo" == "yes" ]; then - if [ ! -x "$HWINFO" ]; then - warning "can't find hwinfo, skipping partition report." - partitions="no" - fi + if [ ! -x "$HWINFO" ]; then + warning "can't find hwinfo, skipping partition report." + partitions="no" + fi fi fi if [ "$hardware" == "yes" ]; then - if [ ! -x "$HWINFO" ]; then - warning "can't find hwinfo, skipping hardware report." - hardware="no" - fi + if [ ! -x "$HWINFO" ]; then + warning "can't find hwinfo, skipping hardware report." + hardware="no" + fi fi ## HARDWARE ############################# @@ -536,47 +536,47 @@ fi # # here we use hwinfo to dump a table listing all the # information we can find on the hardware of this machine -# +# if [ "$hardware" == "yes" ]; then if [ "dohwinfo" == "yes" ]; then if [ -f $hardwarefile ]; then - rm $hardwarefile + rm $hardwarefile fi touch $hardwarefile echo -e "\n\n====================== summary ======================\n" >> $hardwarefile debug "$HWINFO --short --cpu --network --disk --pci >> $hardwarefile" $HWINFO --short --cpu --network --disk --pci >> $hardwarefile for flag in cpu network bios pci; do - echo -e "\n\n====================== $flag ======================\n" >> $hardwarefile - $HWINFO --$flag >> $hardwarefile + echo -e "\n\n====================== $flag ======================\n" >> $hardwarefile + $HWINFO --$flag >> $hardwarefile done fi fi ## PARTITIONS ############################# -# here we use sfdisk to dump a listing of all the partitions. +# here we use sfdisk to dump a listing of all the partitions. # these files can be used to directly partition a disk of the same size. if [ "$partitions" == "yes" ]; then if [ "$dosfdisk" == "yes" ]; then devices=`LC_ALL=C $SFDISK -l 2>/dev/null | grep "^Disk /dev" | @AWK@ '{print $2}' | cut -d: -f1` - if [ "$devices" == "" ]; then - warning "No harddisks found" - fi - for dev in $devices; do - debug "$SFDISK will try to backup partition tables for device $dev" - [ -b $dev ] || continue - label=${dev#/dev/} - label=${label//\//-} - outputfile=${partitionsfile//__star__/$label} - debug "$SFDISK $sfdisk_options -d $dev > $outputfile 2>/dev/null" - $SFDISK $sfdisk_options -d $dev > $outputfile 2>/dev/null - if [ $? -ne 0 ]; then - warning "The partition table for $dev could not be saved." - fi - done + if [ "$devices" == "" ]; then + warning "No harddisks found" + fi + for dev in $devices; do + debug "$SFDISK will try to backup partition tables for device $dev" + [ -b $dev ] || continue + label=${dev#/dev/} + label=${label//\//-} + outputfile=${partitionsfile//__star__/$label} + debug "$SFDISK $sfdisk_options -d $dev > $outputfile 2>/dev/null" + $SFDISK $sfdisk_options -d $dev > $outputfile 2>/dev/null + if [ $? -ne 0 ]; then + warning "The partition table for $dev could not be saved." + fi + done fi if [ "$dohwinfo" == "yes" ]; then debug "Using $HWINFO to get all available disk information" @@ -639,8 +639,8 @@ function doLvmBackup () { fi fi if [ ! -w "$lvmdir" ]; then - echo "can not write to directory $lvmdir" - return 2 + echo "can not write to directory $lvmdir" + return 2 fi debug "Let's try to gather the list of LVM volume groups" debug "$VGS --options vg_name --noheadings | @SED@ 's/^[ ]*//' | @SED@ 's/[ ]*$//' | tr '\n' ' '" diff --git a/handlers/tar.helper.in b/handlers/tar.helper.in index cc9a89b..2665382 100644 --- a/handlers/tar.helper.in +++ b/handlers/tar.helper.in @@ -14,7 +14,7 @@ tar_wizard() { inputBox "$tar_title" "\"Name\" of backups" "$backupname" [ $? = 1 ] && return tar_backupname="backupname = $REPLY" - backupname="$REPLY" + backupname="$REPLY" inputBox "$tar_title" "Directory where to store the backups" "/net/backups/$backupname" [ $? = 1 ] && return @@ -24,8 +24,8 @@ tar_wizard() { "none" "do not filter trough" off \ "compress" "filter trough compress" off \ "gzip" "filter trough gzip" off \ - "bzip" "filter trough bzip" on - [ $? = 1 ] && return; + "bzip" "filter trough bzip" on + [ $? = 1 ] && return; result="$REPLY" tar_compress="compress = $REPLY " @@ -47,14 +47,14 @@ tar_wizard() { [ $? = 0 ] || return 1 tar_includes="includes = " for i in $REPLY; do - [ -n "$i" ] && tar_includes="$tar_includes $i" + [ -n "$i" ] && tar_includes="$tar_includes $i" done done REPLY= while [ -z "$REPLY" ]; do formBegin "$tar_title: Excludes" - formItem "Exclude:" /tmp + formItem "Exclude:" /tmp formItem "Exclude:" /proc formItem "Exclude:" /sys formItem "Exclude:" /dev @@ -63,17 +63,17 @@ tar_wizard() { formItem "Exclude:" /misc formItem "Exclude:" /net formItem "Exclude:" /selinux - formItem "Exclude:" + formItem "Exclude:" formItem "Exclude:" formDisplay [ $? = 0 ] || return 1 tar_excludes="excludes = " for i in $REPLY; do - [ -n "$i" ] && tar_excludes="$tar_excludes $i" + [ -n "$i" ] && tar_excludes="$tar_excludes $i" done done -# Save the config +# Save the config get_next_filename $configdirectory/10.tar cat > $next_filename < "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.list \ 2> "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.err -[ $? -ne 0 ] && fatal "Tar backup failed" +[ $? -ne 0 ] && fatal "Tar backup failed" diff --git a/handlers/trac.in b/handlers/trac.in index a4b7bdf..f387d42 100644 --- a/handlers/trac.in +++ b/handlers/trac.in @@ -12,39 +12,38 @@ getconf tmp /var/backups/trac.tmp cd $src for repo in `find . -name VERSION` do + repo=`dirname $repo` + if [ "$repo" == "." ] + then + repo="" + fi - repo=`dirname $repo` - if [ "$repo" == "." ] - then - repo="" - fi + # Just make the parent directory for $tmp/$repo + parentdir=`dirname $tmp/$repo` + ret=`mkdir -p $parentdir 2>&1` + code=$? + if [ "$ret" ]; then + debug "$ret" + fi + if [ $code != 0 ]; then + error "command failed mkdir -p $parentdir" + fi - # Just make the parent directory for $tmp/$repo - parentdir=`dirname $tmp/$repo` - ret=`mkdir -p $parentdir 2>&1` - code=$? - if [ "$ret" ]; then - debug "$ret" - fi - if [ $code != 0 ]; then - error "command failed mkdir -p $parentdir" - fi - - ret=`trac-admin $src/$repo hotcopy $tmp/$repo 2>&1` - code=$? - if [ "$ret" ]; then - debug "$ret" - fi - if [ $code != 0 ]; then - error "command failed -- trac-admin $src/$repo hotcopy $tmp/$repo" - fi + ret=`trac-admin $src/$repo hotcopy $tmp/$repo 2>&1` + code=$? + if [ "$ret" ]; then + debug "$ret" + fi + if [ $code != 0 ]; then + error "command failed -- trac-admin $src/$repo hotcopy $tmp/$repo" + fi done if [ -d $dest -a -d $tmp ]; then - rm -rf $dest + rm -rf $dest fi if [ -d $tmp ]; then - mv $tmp $dest + mv $tmp $dest fi exit 0 diff --git a/handlers/wget b/handlers/wget index 51054ea..0c363eb 100644 --- a/handlers/wget +++ b/handlers/wget @@ -77,84 +77,82 @@ getconf folder function rotate { - if [[ "$2" < 4 ]]; then - error "Rotate: minimum of 4 rotations" - exit 1 - fi + if [[ "$2" < 4 ]]; then + error "Rotate: minimum of 4 rotations" + exit 1 + fi - if [ -d $1.$2 ]; then - $nice $mv /$1.$2 /$1.tmp - fi + if [ -d $1.$2 ]; then + $nice $mv /$1.$2 /$1.tmp + fi - for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do - if [ -d $1.$n ]; then - dest=`echo "$n + 1" | bc` - $nice $mv /$1.$n /$1.$dest - $touch /$1.$dest - fi - done + for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do + if [ -d $1.$n ]; then + dest=`echo "$n + 1" | bc` + $nice $mv /$1.$n /$1.$dest + $touch /$1.$dest + fi + done - if [ -d $1.tmp ]; then - $nice $mv /$1.tmp /$1.0 - fi + if [ -d $1.tmp ]; then + $nice $mv /$1.tmp /$1.0 + fi - if [ -d $1.1 ]; then - $nice $cp -alf /$1.1/. /$1.0 - fi + if [ -d $1.1 ]; then + $nice $cp -alf /$1.1/. /$1.0 + fi } function move_files { - - ref=$tmp/makesnapshot-mymv-$$; - $touch -r $1 $ref; - $mv $1 $2; - $touch -r $ref $2; - $rm $ref; - + ref=$tmp/makesnapshot-mymv-$$; + $touch -r $1 $ref; + $mv $1 $2; + $touch -r $ref $2; + $rm $ref; } backupdir="$mountpoint/$backupdir" # does $backupdir exists? -if [ ! -d "$backupdir" ]; then - error "Backupdir $backupdir does not exist" - exit 1 +if [ ! -d "$backupdir" ]; then + error "Backupdir $backupdir does not exist" + exit 1 fi # setup number of increments if [ -z "$days" ]; then - keep="4" + keep="4" else - keep="`echo $days - 1 | bc -l`" + keep="`echo $days - 1 | bc -l`" fi # lockfile setup if [ ! -z "$lockfile" ]; then - $touch $lockfile || warning "Could not create lockfile $lockfile" + $touch $lockfile || warning "Could not create lockfile $lockfile" fi # nicelevel setup -if [ ! -z "$nicelevel" ]; then - nice="nice -n $nicelevel" -else - nice="" +if [ ! -z "$nicelevel" ]; then + nice="nice -n $nicelevel" +else + nice="" fi # set mv procedure if [ $enable_mv_timestamp_bug == "yes" ]; then - mv=move_files + mv=move_files fi # set excludes for path in $exclude; do - EXCLUDES="$EXCLUDES --exclude=$path" + EXCLUDES="$EXCLUDES --exclude=$path" done echo "Starting backup at `date`" >> $log @@ -162,19 +160,19 @@ echo "Starting backup at `date`" >> $log # mount backup destination folder as read-write if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then - if [ -d "$mountpoint" ]; then - mount -o remount,rw $mountpoint - if (($?)); then - error "Could not mount $mountpoint" - exit 1 - fi - fi + if [ -d "$mountpoint" ]; then + mount -o remount,rw $mountpoint + if (($?)); then + error "Could not mount $mountpoint" + exit 1 + fi + fi fi # the backup procedure if [ ! -d "$backupdir/$folder/$folder.0" ]; then - mkdir -p $backupdir/$folder/$folder.0 + mkdir -p $backupdir/$folder/$folder.0 fi info "Rotating $backupdir/$folder/$folder..." @@ -183,7 +181,7 @@ rotate $backupdir/$folder/$folder $keep info "Wget'ing $SECTION on $backupdir/$folder/$folder.0..." if [ ! -z "$badnwidth" ]; then - limit_rate="--limit-rate=$badnwidth""k" + limit_rate="--limit-rate=$badnwidth""k" fi cd $backupdir/$folder/$folder.0 @@ -195,25 +193,25 @@ $touch $backupdir/$folder/$folder.0 # remount backup destination as read-only if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then - mount -o remount,ro $mountpoint + mount -o remount,ro $mountpoint fi # check partition for errors if [ "$fscheck" == "1" ] || [ "$fscheck" == "yes" ]; then - umount $mountpoint - if (($?)); then - warning "Could not umount $mountpoint to run fsck" - else - $nice $fsck -v -y $partition >> $log - mount $mountpoint - fi + umount $mountpoint + if (($?)); then + warning "Could not umount $mountpoint to run fsck" + else + $nice $fsck -v -y $partition >> $log + mount $mountpoint + fi fi # removes the lockfile if [ ! -z "$lockfile" ]; then - $rm $lockfile || warning "Could not remove lockfile $lockfile" + $rm $lockfile || warning "Could not remove lockfile $lockfile" fi echo "Finnishing backup at `date`" >> $log diff --git a/lib/easydialog.in b/lib/easydialog.in index 056c76c..a0495a7 100644 --- a/lib/easydialog.in +++ b/lib/easydialog.in @@ -20,43 +20,43 @@ DIALOG=dialog HELP= setApplicationTitle() { - BACKTITLE=$* + BACKTITLE=$* } setHelp() { - HELP="$@" + HELP="$@" } setDimension() { - WIDTH=$1 - HEIGHT=$2 + WIDTH=$1 + HEIGHT=$2 } booleanBox() { - $DIALOG --backtitle "$BACKTITLE" --title "$1" \ - `[ "$3" == no ] && echo '--defaultno'` --yesno "$2" $HEIGHT $WIDTH + $DIALOG --backtitle "$BACKTITLE" --title "$1" \ + `[ "$3" == no ] && echo '--defaultno'` --yesno "$2" $HEIGHT $WIDTH } msgBox() { - $DIALOG --backtitle "$BACKTITLE" --title "$1" \ - --msgbox "$2" $HEIGHT $WIDTH + $DIALOG --backtitle "$BACKTITLE" --title "$1" \ + --msgbox "$2" $HEIGHT $WIDTH } gaugeBox() { - $DIALOG --backtitle "$BACKTITLE" --title "$1" \ - --gauge "$2" $HEIGHT $WIDTH 0 + $DIALOG --backtitle "$BACKTITLE" --title "$1" \ + --gauge "$2" $HEIGHT $WIDTH 0 } inputBox() { - local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 - trap "rm -f $temp" 0 - REPLY= - $DIALOG --backtitle "$BACKTITLE" --title "$1" \ - --inputbox "$2" $HEIGHT $WIDTH "$3" 2> $temp - local status=$? - [ $status = 0 ] && REPLY=$(cat $temp) - rm -f $temp - return $status + local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 + trap "rm -f $temp" 0 + REPLY= + $DIALOG --backtitle "$BACKTITLE" --title "$1" \ + --inputbox "$2" $HEIGHT $WIDTH "$3" 2> $temp + local status=$? + [ $status = 0 ] && REPLY=$(cat $temp) + rm -f $temp + return $status } # Xdialog and {dialog,whiptail} use different mechanism to "qoute" the @@ -67,7 +67,7 @@ inputBox() { # mechanism to the standard double-quoting one. it receives two # arguements, the file that has the data and the box type. _listReplyHook() { - cat $1 + cat $1 } # this is the base implementation of all the list based boxes, it works @@ -75,79 +75,79 @@ _listReplyHook() { # this function with an extra argument specifying the actual box that # needs to be rendered. _genericListBox() { - local box=$1 - shift 1 - local title=$1 - local text=$2 - shift 2 - local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 - trap "rm -f $temp" 0 - REPLY= - $DIALOG $HELP $_DEFAULT --backtitle "$BACKTITLE" --title "$title" \ - $box "$text" $HEIGHT $WIDTH 10 \ - "$@" 2> $temp - local status=$? - [ $status = 0 ] && REPLY=$(_listReplyHook $temp $box) - rm -f $temp - _DEFAULT= - return $status + local box=$1 + shift 1 + local title=$1 + local text=$2 + shift 2 + local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 + trap "rm -f $temp" 0 + REPLY= + $DIALOG $HELP $_DEFAULT --backtitle "$BACKTITLE" --title "$title" \ + $box "$text" $HEIGHT $WIDTH 10 \ + "$@" 2> $temp + local status=$? + [ $status = 0 ] && REPLY=$(_listReplyHook $temp $box) + rm -f $temp + _DEFAULT= + return $status } setDefault() { - _DEFAULT="--default-item $1" + _DEFAULT="--default-item $1" } menuBox() { - _genericListBox --menu "$@" + _genericListBox --menu "$@" } ## a menu box with additional help info displayed ## at the bottom of the window when an item is selected menuBoxHelp() { - HELP="--item-help" - _genericListBox --menu "$@" - status=$? - HELP= - return $status + HELP="--item-help" + _genericListBox --menu "$@" + status=$? + HELP= + return $status } ## a menu box with an addition button 'help' menuBoxHelpFile() { - HELP="--help-button" - _genericListBox --menu "$@" - status=$? - HELP= - return $status + HELP="--help-button" + _genericListBox --menu "$@" + status=$? + HELP= + return $status } checkBox() { - _genericListBox --checklist "$@" + _genericListBox --checklist "$@" } radioBox() { - _genericListBox --radiolist "$@" + _genericListBox --radiolist "$@" } textBox() { - $DIALOG --backtitle "$BACKTITLE" --title "$1" --textbox "$2" $HEIGHT $WIDTH + $DIALOG --backtitle "$BACKTITLE" --title "$1" --textbox "$2" $HEIGHT $WIDTH } passwordBox() { - local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 - trap "rm -f $temp" 0 - REPLY= - $DIALOG --backtitle "$BACKTITLE" --title "$1" \ - --passwordbox "$2" $HEIGHT $WIDTH 2> $temp - local status=$? - [ $status = 0 ] && REPLY=$(cat $temp) - rm -f $temp - return $status + local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 + trap "rm -f $temp" 0 + REPLY= + $DIALOG --backtitle "$BACKTITLE" --title "$1" \ + --passwordbox "$2" $HEIGHT $WIDTH 2> $temp + local status=$? + [ $status = 0 ] && REPLY=$(cat $temp) + rm -f $temp + return $status } ######################################################### ## begin-item-display style lists -## +## ## these lists are built by calling fuctions multiple times. ## this can make it easier to build your list in a loop ## @@ -177,7 +177,7 @@ listDisplay() { boxtype=$1 local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 trap "rm -f $temp" 0 - + local label local text local status @@ -188,13 +188,13 @@ listDisplay() { echo -ne " --$boxtype '$_menu_msg' " echo -ne " $HEIGHT $WIDTH 10 " for ((i=0; i < $_menu_items ; i++)); do - label=${_menu_labels[$i]} - text=${_menu_text[$i]} - status=${_menu_status[$i]} - echo -ne " $label '$text' $status " + label=${_menu_labels[$i]} + text=${_menu_text[$i]} + status=${_menu_status[$i]} + echo -ne " $label '$text' $status " done ) | xargs $DIALOG 2> $temp - + local status=$? REPLY="" [ $status = 0 ] && REPLY=`cat $temp` @@ -219,10 +219,10 @@ formItem() { _form_text[$_form_items]=$2 let "_form_items += 1" } - + formDisplay() { local temp=$(@MKTEMP@ -t backupninja.XXXXXX) || exit 1 - + max_length=0 for ((i=0; i < ${#_form_labels[@]} ; i++)); do label=${_form_labels[$i]} @@ -232,19 +232,19 @@ formDisplay() { fi done let "max_length += 2" - + local xpos=1 ( echo -n -e "--form '$_form_title' 0 0 20" for ((i=0; i < $_form_items ; i++)); do - label=${_form_labels[$i]} - text=${_form_text[$i]} - echo -n -e " $label $xpos 1 '$text' $xpos $max_length 30 30" - let "xpos += _form_gap" + label=${_form_labels[$i]} + text=${_form_text[$i]} + echo -n -e " $label $xpos 1 '$text' $xpos $max_length 30 30" + let "xpos += _form_gap" done ) | xargs $DIALOG 2> $temp local status=$? - + ## ## the exit status is meaningless, it is always 0. ## i can't figure out how to get the exit status of dialog @@ -254,7 +254,7 @@ formDisplay() { ## swallowed by xargs. xargs should return different exit status ## depending on the exit status of the command run, but i have ## never been able to get that to work. - ## + ## REPLY= if [ $status = 0 ]; then diff --git a/lib/tools.in b/lib/tools.in index 0005be9..0d368b8 100644 --- a/lib/tools.in +++ b/lib/tools.in @@ -10,39 +10,39 @@ # create a temporary file in a secure way. # function maketemp() { - local tempfile=`mktemp /tmp/$1.XXXXXXXX` - echo $tempfile + local tempfile=`mktemp /tmp/$1.XXXXXXXX` + echo $tempfile } ##################################################### ## CONFIG-FILE RELATED FUNCTIONS function setfile() { - CURRENT_CONF_FILE=$1 + CURRENT_CONF_FILE=$1 } function setsection() { - CURRENT_SECTION=$1 + CURRENT_SECTION=$1 } # # sets a global var with name equal to $1 # to the value of the configuration parameter $1 # $2 is the default. -# +# function getconf() { - CURRENT_PARAM=$1 - ret=`@AWK@ -f $libdirectory/parseini S=$CURRENT_SECTION P=$CURRENT_PARAM $CURRENT_CONF_FILE` - # if nothing is returned, set the default - if [ "$ret" == "" -a "$2" != "" ]; then - ret="$2" - fi + CURRENT_PARAM=$1 + ret=`@AWK@ -f $libdirectory/parseini S=$CURRENT_SECTION P=$CURRENT_PARAM $CURRENT_CONF_FILE` + # if nothing is returned, set the default + if [ "$ret" == "" -a "$2" != "" ]; then + ret="$2" + fi - # replace * with %, so that it is not globbed. - ret="${ret//\\*/__star__}" + # replace * with %, so that it is not globbed. + ret="${ret//\\*/__star__}" - # this is weird, but single quotes are needed to - # allow for returned values with spaces. $ret is still expanded - # because it is in an 'eval' statement. - eval $1='$ret' + # this is weird, but single quotes are needed to + # allow for returned values with spaces. $ret is still expanded + # because it is in an 'eval' statement. + eval $1='$ret' } diff --git a/lib/vserver.in b/lib/vserver.in index 153a9b0..cc96a71 100644 --- a/lib/vserver.in +++ b/lib/vserver.in @@ -66,7 +66,7 @@ init_vservers() { found_vservers=`ls $VROOTDIR | grep -E -v "lost\+found|ARCHIVES" | tr "\n" " "` if [ -z "$found_vservers" ]; then `if [ "$arg" = nodialog ]; then echo warning; else echo "msgBox warning"; fi` \ - "vservers enabled in $conffile, but no vserver was found in $VROOTDIR."; + "vservers enabled in $conffile, but no vserver was found in $VROOTDIR."; return fi vservers_are_available=yes @@ -142,9 +142,9 @@ choose_one_vserver() { while [ -z "$REPLY" ]; do [ -n "$selected_vservers" ] && setDefault $selected_vservers listBegin "$title" "Choose at least one Linux-Vserver to backup:" - for vserver in $found_vservers; do - listItem "$vserver" "Backup $vserver vserver" - done + for vserver in $found_vservers; do + listItem "$vserver" "Backup $vserver vserver" + done listDisplay menu [ $? = 0 ] || return 1 done @@ -152,17 +152,17 @@ choose_one_vserver() { } ## -## If Vservers are not enabled, set host_or_vservers='host' and then return +## If Vservers are not enabled, set host_or_vservers='host' and then return ## Else, have the user choose if he/she wants to perform the backup on the host ## system or on one Vserver. ## Set, respectively, $host_or_vservers to 'host' or 'vservers'. ## Returns 1 if cancelled. ## choose_host_or_one_vserver() { - if [ "$vservers_are_available" != "yes" ] + if [ "$vservers_are_available" != "yes" ] then - host_or_vservers='host' - return + host_or_vservers='host' + return fi local title=$1 # if there is one, set the previously chosen item as the default @@ -173,11 +173,11 @@ choose_host_or_one_vserver() { [ $? = 0 ] || return 1 case $REPLY in "host") - host_or_vservers='host' - ;; + host_or_vservers='host' + ;; "vserver") - host_or_vservers='vservers' - ;; + host_or_vservers='vservers' + ;; esac } @@ -191,10 +191,10 @@ choose_host_or_one_vserver() { ## Returns 1 if cancelled. ## choose_host_or_vservers_or_both() { - if [ "$vservers_are_available" != "yes" ] + if [ "$vservers_are_available" != "yes" ] then - host_or_vservers='host' - return + host_or_vservers='host' + return fi local title=$1 # if there is one, set the previously chosen item as the default @@ -206,14 +206,14 @@ choose_host_or_vservers_or_both() { [ $? = 0 ] || return 1 case $REPLY in "host") - host_or_vservers='host' - ;; + host_or_vservers='host' + ;; "vservers") - host_or_vservers='vservers' - ;; + host_or_vservers='vservers' + ;; "both") - host_or_vservers='both' - ;; + host_or_vservers='both' + ;; esac } @@ -236,13 +236,13 @@ choose_one_or_more_vservers() { local vserver_was_selected= REPLY= while [ -z "$REPLY" ]; do - listBegin "$title" "Choose at least one Linux-Vserver to backup:" - # list existing vservers, preselecting the previously selected ones - for vserver in $found_vservers; do - listItem "$vserver" "Backup $vserver vserver" `vserver_is_selected $vserver` - done - listDisplay checklist - [ $? = 0 ] || return 1 + listBegin "$title" "Choose at least one Linux-Vserver to backup:" + # list existing vservers, preselecting the previously selected ones + for vserver in $found_vservers; do + listItem "$vserver" "Backup $vserver vserver" `vserver_is_selected $vserver` + done + listDisplay checklist + [ $? = 0 ] || return 1 done # remove quotes around each vserver name selected_vservers=`echo $REPLY | tr -d '"'` diff --git a/src/backupninja.in b/src/backupninja.in index 2a1b76e..ca5074c 100755 --- a/src/backupninja.in +++ b/src/backupninja.in @@ -22,31 +22,31 @@ ## FUNCTIONS function setupcolors () { - BLUE="\033[34;01m" - GREEN="\033[32;01m" - YELLOW="\033[33;01m" - PURPLE="\033[35;01m" - RED="\033[31;01m" - OFF="\033[0m" - CYAN="\033[36;01m" - COLORS=($BLUE $GREEN $YELLOW $RED $PURPLE $CYAN) + BLUE="\033[34;01m" + GREEN="\033[32;01m" + YELLOW="\033[33;01m" + PURPLE="\033[35;01m" + RED="\033[31;01m" + OFF="\033[0m" + CYAN="\033[36;01m" + COLORS=($BLUE $GREEN $YELLOW $RED $PURPLE $CYAN) } function colorize () { - if [ "$usecolors" == "yes" ]; then - local typestr=`echo "$@" | @SED@ 's/\(^[^:]*\).*$/\1/'` - [ "$typestr" == "Debug" ] && type=0 - [ "$typestr" == "Info" ] && type=1 - [ "$typestr" == "Warning" ] && type=2 - [ "$typestr" == "Error" ] && type=3 - [ "$typestr" == "Fatal" ] && type=4 - [ "$typestr" == "Halt" ] && type=5 - color=${COLORS[$type]} - endcolor=$OFF - echo -e "$color$@$endcolor" - else - echo -e "$@" - fi + if [ "$usecolors" == "yes" ]; then + local typestr=`echo "$@" | @SED@ 's/\(^[^:]*\).*$/\1/'` + [ "$typestr" == "Debug" ] && type=0 + [ "$typestr" == "Info" ] && type=1 + [ "$typestr" == "Warning" ] && type=2 + [ "$typestr" == "Error" ] && type=3 + [ "$typestr" == "Fatal" ] && type=4 + [ "$typestr" == "Halt" ] && type=5 + color=${COLORS[$type]} + endcolor=$OFF + echo -e "$color$@$endcolor" + else + echo -e "$@" + fi } # We have the following message levels: @@ -65,71 +65,71 @@ echo_debug_msg=0 usecolors=yes function printmsg() { - [ ${#@} -gt 1 ] || return + [ ${#@} -gt 1 ] || return - type=$1 - shift - if [ $type == 100 ]; then - typestr=`echo "$@" | @SED@ 's/\(^[^:]*\).*$/\1/'` - [ "$typestr" == "Debug" ] && type=0 - [ "$typestr" == "Info" ] && type=1 - [ "$typestr" == "Warning" ] && type=2 - [ "$typestr" == "Error" ] && type=3 - [ "$typestr" == "Fatal" ] && type=4 - [ "$typestr" == "Halt" ] && type=5 - typestr="" - else - types=(Debug Info Warning Error Fatal Halt) - typestr="${types[$type]}: " - fi - - print=$[4-type] - - if [ $echo_debug_msg == 1 ]; then - echo -e "$typestr$@" >&2 - elif [ $debug ]; then - colorize "$typestr$@" >&2 - fi - - if [ $print -lt $loglevel ]; then - logmsg "$typestr$@" - fi + type=$1 + shift + if [ $type == 100 ]; then + typestr=`echo "$@" | @SED@ 's/\(^[^:]*\).*$/\1/'` + [ "$typestr" == "Debug" ] && type=0 + [ "$typestr" == "Info" ] && type=1 + [ "$typestr" == "Warning" ] && type=2 + [ "$typestr" == "Error" ] && type=3 + [ "$typestr" == "Fatal" ] && type=4 + [ "$typestr" == "Halt" ] && type=5 + typestr="" + else + types=(Debug Info Warning Error Fatal Halt) + typestr="${types[$type]}: " + fi + + print=$[4-type] + + if [ $echo_debug_msg == 1 ]; then + echo -e "$typestr$@" >&2 + elif [ $debug ]; then + colorize "$typestr$@" >&2 + fi + + if [ $print -lt $loglevel ]; then + logmsg "$typestr$@" + fi } function logmsg() { - if [ -w "$logfile" ]; then - echo -e `LC_ALL=C date "+%h %d %H:%M:%S"` "$@" >> $logfile - fi + if [ -w "$logfile" ]; then + echo -e `LC_ALL=C date "+%h %d %H:%M:%S"` "$@" >> $logfile + fi } function passthru() { - printmsg 100 "$@" + printmsg 100 "$@" } function debug() { - printmsg 0 "$@" + printmsg 0 "$@" } function info() { - printmsg 1 "$@" + printmsg 1 "$@" } function warning() { - printmsg 2 "$@" + printmsg 2 "$@" } function error() { - printmsg 3 "$@" + printmsg 3 "$@" } function fatal() { - printmsg 4 "$@" - exit 2 + printmsg 4 "$@" + exit 2 } function halt() { - printmsg 5 "$@" - exit 2 + printmsg 5 "$@" + exit 2 } msgcount=0 function msg { - messages[$msgcount]=$1 - let "msgcount += 1" + messages[$msgcount]=$1 + let "msgcount += 1" } # @@ -158,7 +158,7 @@ function check_perms() { echo "Configuration files must be owned by root! Dying on file $file" fatal "Configuration files must be owned by root! Dying on file $file" fi - + if [ "$wperm" != '---' ]; then echo "Configuration files must not be world writable/readable! Dying on file $file" fatal "Configuration files must not be world writable/readable! Dying on file $file" @@ -180,12 +180,12 @@ function check_perms() { # simple lowercase function function tolower() { - echo "$1" | tr '[:upper:]' '[:lower:]' + echo "$1" | tr '[:upper:]' '[:lower:]' } # simple to integer function function toint() { - echo "$1" | tr -d '[:alpha:]' + echo "$1" | tr -d '[:alpha:]' } # @@ -206,39 +206,39 @@ nowdayofweek=`LC_ALL=C date +%A` nowdayofweek=`tolower "$nowdayofweek"` function isnow() { - local when="$1" - set -- $when + local when="$1" + set -- $when - [ "$when" == "manual" ] && return 0 + [ "$when" == "manual" ] && return 0 - whendayofweek=$1; at=$2; whentime=$3; - whenday=`toint "$whendayofweek"` - whendayofweek=`tolower "$whendayofweek"` - whentime=`echo "$whentime" | @SED@ 's/:[0-9][0-9]$//' | @SED@ -r 's/^([0-9])$/0\1/'` + whendayofweek=$1; at=$2; whentime=$3; + whenday=`toint "$whendayofweek"` + whendayofweek=`tolower "$whendayofweek"` + whentime=`echo "$whentime" | @SED@ 's/:[0-9][0-9]$//' | @SED@ -r 's/^([0-9])$/0\1/'` - if [ "$whendayofweek" == "everyday" -o "$whendayofweek" == "daily" ]; then - whendayofweek=$nowdayofweek - fi + if [ "$whendayofweek" == "everyday" -o "$whendayofweek" == "daily" ]; then + whendayofweek=$nowdayofweek + fi - if [ "$whenday" == "" ]; then - if [ "$whendayofweek" != "$nowdayofweek" ]; then - whendayofweek=${whendayofweek%s} - if [ "$whendayofweek" != "$nowdayofweek" ]; then - return 0 - fi - fi - elif [ "$whenday" != "$nowday" ]; then - return 0 - fi + if [ "$whenday" == "" ]; then + if [ "$whendayofweek" != "$nowdayofweek" ]; then + whendayofweek=${whendayofweek%s} + if [ "$whendayofweek" != "$nowdayofweek" ]; then + return 0 + fi + fi + elif [ "$whenday" != "$nowday" ]; then + return 0 + fi - [ "$at" == "at" ] || return 0 - [ "$whentime" == "$nowtime" ] || return 0 + [ "$at" == "at" ] || return 0 + [ "$whentime" == "$nowtime" ] || return 0 - return 1 + return 1 } function usage() { - cat << EOF + cat << EOF $0 usage: This script allows you to coordinate system backup by dropping a few simple configuration files into @CFGDIR@/backup.d/. Typically, this @@ -257,18 +257,18 @@ The following options are available: -n, --now Perform actions now, instead of when they might be scheduled. No output will be created unless also run with -d. - --run FILE Execute the specified action file and then exit. + --run FILE Execute the specified action file and then exit. Also puts backupninja in debug mode. - + When in debug mode, output to the console will be colored: EOF - usecolors=yes - colorize "Debug: Debugging info (when run with -d)" - colorize "Info: Informational messages (verbosity level 4)" - colorize "Warning: Warnings (verbosity level 3 and up)" - colorize "Error: Errors (verbosity level 2 and up)" - colorize "Fatal: Errors which halt a given backup action (always shown)" - colorize "Halt: Errors which halt the whole backupninja run (always shown)" + usecolors=yes + colorize "Debug: Debugging info (when run with -d)" + colorize "Info: Informational messages (verbosity level 4)" + colorize "Warning: Warnings (verbosity level 3 and up)" + colorize "Error: Errors (verbosity level 2 and up)" + colorize "Fatal: Errors which halt a given backup action (always shown)" + colorize "Halt: Errors which halt the whole backupninja run (always shown)" } ## @@ -279,89 +279,89 @@ EOF ## function process_action() { - local file="$1" - local suffix="$2" - local run="no" - setfile $file + local file="$1" + local suffix="$2" + local run="no" + setfile $file - # skip over this config if "when" option - # is not set to the current time. - getconf when "$defaultwhen" - if [ "$processnow" == 1 ]; then - info ">>>> starting action $file (because of --now)" - run="yes" - elif [ "$when" == "hourly" ]; then - info ">>>> starting action $file (because 'when = hourly')" - run="yes" - else - IFS=$'\t\n' - for w in $when; do - IFS=$' \t\n' - isnow "$w" - ret=$? - IFS=$'\t\n' - if [ $ret == 0 ]; then - debug "skipping $file because current time does not match $w" - else - info ">>>> starting action $file (because current time matches $w)" - run="yes" - fi - done - IFS=$' \t\n' - fi - debug $run - [ "$run" == "no" ] && return - - let "actions_run += 1" + # skip over this config if "when" option + # is not set to the current time. + getconf when "$defaultwhen" + if [ "$processnow" == 1 ]; then + info ">>>> starting action $file (because of --now)" + run="yes" + elif [ "$when" == "hourly" ]; then + info ">>>> starting action $file (because 'when = hourly')" + run="yes" + else + IFS=$'\t\n' + for w in $when; do + IFS=$' \t\n' + isnow "$w" + ret=$? + IFS=$'\t\n' + if [ $ret == 0 ]; then + debug "skipping $file because current time does not match $w" + else + info ">>>> starting action $file (because current time matches $w)" + run="yes" + fi + done + IFS=$' \t\n' + fi + debug $run + [ "$run" == "no" ] && return - # call the handler: - local bufferfile=`maketemp backupninja.buffer` - echo "" > $bufferfile - echo_debug_msg=1 - ( - . $scriptdirectory/$suffix $file - ) 2>&1 | ( - while read a; do - echo $a >> $bufferfile - [ $debug ] && colorize "$a" - done - ) - retcode=$? - # ^^^^^^^^ we have a problem! we can't grab the return code "$?". grrr. - echo_debug_msg=0 + let "actions_run += 1" - _warnings=`cat $bufferfile | grep "^Warning: " | wc -l` - _errors=`cat $bufferfile | grep "^Error: " | wc -l` - _fatals=`cat $bufferfile | grep "^Fatal: " | wc -l` - _halts=`cat $bufferfile | grep "^Halt: " | wc -l` - - ret=`grep "\(^Warning: \|^Error: \|^Fatal: \|Halt: \)" $bufferfile` - rm $bufferfile - if [ $_halts != 0 ]; then - msg "*halt* -- $file" - errormsg="$errormsg\n== halt request from $file==\n\n$ret\n" - passthru "Halt: <<<< finished action $file: FAILED" - elif [ $_fatals != 0 ]; then - msg "*failed* -- $file" - errormsg="$errormsg\n== fatal errors from $file ==\n\n$ret\n" - passthru "Fatal: <<<< finished action $file: FAILED" - elif [ $_errors != 0 ]; then - msg "*error* -- $file" - errormsg="$errormsg\n== errors from $file ==\n\n$ret\n" - error "<<<< finished action $file: ERROR" - elif [ $_warnings != 0 ]; then - msg "*warning* -- $file" - errormsg="$errormsg\n== warnings from $file ==\n\n$ret\n" - warning "<<<< finished action $file: WARNING" - else - msg "success -- $file" - info "<<<< finished action $file: SUCCESS" - fi + # call the handler: + local bufferfile=`maketemp backupninja.buffer` + echo "" > $bufferfile + echo_debug_msg=1 + ( + . $scriptdirectory/$suffix $file + ) 2>&1 | ( + while read a; do + echo $a >> $bufferfile + [ $debug ] && colorize "$a" + done + ) + retcode=$? + # ^^^^^^^^ we have a problem! we can't grab the return code "$?". grrr. + echo_debug_msg=0 - let "halts += _halts" - let "fatals += _fatals" - let "errors += _errors" - let "warnings += _warnings" + _warnings=`cat $bufferfile | grep "^Warning: " | wc -l` + _errors=`cat $bufferfile | grep "^Error: " | wc -l` + _fatals=`cat $bufferfile | grep "^Fatal: " | wc -l` + _halts=`cat $bufferfile | grep "^Halt: " | wc -l` + + ret=`grep "\(^Warning: \|^Error: \|^Fatal: \|Halt: \)" $bufferfile` + rm $bufferfile + if [ $_halts != 0 ]; then + msg "*halt* -- $file" + errormsg="$errormsg\n== halt request from $file==\n\n$ret\n" + passthru "Halt: <<<< finished action $file: FAILED" + elif [ $_fatals != 0 ]; then + msg "*failed* -- $file" + errormsg="$errormsg\n== fatal errors from $file ==\n\n$ret\n" + passthru "Fatal: <<<< finished action $file: FAILED" + elif [ $_errors != 0 ]; then + msg "*error* -- $file" + errormsg="$errormsg\n== errors from $file ==\n\n$ret\n" + error "<<<< finished action $file: ERROR" + elif [ $_warnings != 0 ]; then + msg "*warning* -- $file" + errormsg="$errormsg\n== warnings from $file ==\n\n$ret\n" + warning "<<<< finished action $file: WARNING" + else + msg "success -- $file" + info "<<<< finished action $file: SUCCESS" + fi + + let "halts += _halts" + let "fatals += _fatals" + let "errors += _errors" + let "warnings += _warnings" } ##################################################### @@ -374,71 +374,71 @@ loglevel=3 ## process command line options while [ $# -ge 1 ]; do - case $1 in - -h|--help) usage;; - -d|--debug) debug=1;; - -t|--test) test=1;debug=1;; - -n|--now) processnow=1;; - -f|--conffile) - if [ -f $2 ]; then - conffile=$2 - else - echo "-f|--conffile option must be followed by an existing filename" - fatal "-f|--conffile option must be followed by an existing filename" - usage - fi - # we shift here to avoid processing the file path - shift - ;; - --run) - debug=1 - if [ -f $2 ]; then - singlerun=$2 - processnow=1 - else - echo "--run option must be followed by a backupninja action file" - fatal "--run option must be followed by a backupninja action file" - usage - fi - shift - ;; - *) - debug=1 - echo "Unknown option $1" - fatal "Unknown option $1" - usage - exit - ;; - esac - shift -done + case $1 in + -h|--help) usage;; + -d|--debug) debug=1;; + -t|--test) test=1;debug=1;; + -n|--now) processnow=1;; + -f|--conffile) + if [ -f $2 ]; then + conffile=$2 + else + echo "-f|--conffile option must be followed by an existing filename" + fatal "-f|--conffile option must be followed by an existing filename" + usage + fi + # we shift here to avoid processing the file path + shift + ;; + --run) + debug=1 + if [ -f $2 ]; then + singlerun=$2 + processnow=1 + else + echo "--run option must be followed by a backupninja action file" + fatal "--run option must be followed by a backupninja action file" + usage + fi + shift + ;; + *) + debug=1 + echo "Unknown option $1" + fatal "Unknown option $1" + usage + exit + ;; + esac + shift +done #if [ $debug ]; then -# usercolors=yes +# usercolors=yes #fi ## Load and confirm basic configuration values # bootstrap if [ ! -r "$conffile" ]; then - echo "Configuration file $conffile not found." - fatal "Configuration file $conffile not found." + echo "Configuration file $conffile not found." + fatal "Configuration file $conffile not found." fi # find $libdirectory libdirectory=`grep '^libdirectory' $conffile | @AWK@ '{print $3}'` if [ -z "$libdirectory" ]; then - if [ -d "@libdir@" ]; then - libdirectory="@libdir@" - else - echo "Could not find entry 'libdirectory' in $conffile." - fatal "Could not find entry 'libdirectory' in $conffile." - fi + if [ -d "@libdir@" ]; then + libdirectory="@libdir@" + else + echo "Could not find entry 'libdirectory' in $conffile." + fatal "Could not find entry 'libdirectory' in $conffile." + fi else - if [ ! -d "$libdirectory" ]; then - echo "Lib directory $libdirectory not found." - fatal "Lib directory $libdirectory not found." - fi + if [ ! -d "$libdirectory" ]; then + echo "Lib directory $libdirectory not found." + fatal "Lib directory $libdirectory not found." + fi fi # include shared functions @@ -482,15 +482,15 @@ getconf admingroup root init_vservers nodialog if [ ! -d "$configdirectory" ]; then - echo "Configuration directory '$configdirectory' not found." - fatal "Configuration directory '$configdirectory' not found." + echo "Configuration directory '$configdirectory' not found." + fatal "Configuration directory '$configdirectory' not found." fi [ -f "$logfile" ] || touch $logfile if [ "$UID" != "0" ]; then - echo "`basename $0` can only be run as root" - exit 1 + echo "`basename $0` can only be run as root" + exit 1 fi ## Process each configuration file @@ -507,34 +507,34 @@ actions_run=0 errormsg="" if [ "$singlerun" ]; then - files=$singlerun + files=$singlerun else - files=`find $configdirectory -follow -mindepth 1 -maxdepth 1 -type f ! -name '.*.swp' | sort -n` + files=`find $configdirectory -follow -mindepth 1 -maxdepth 1 -type f ! -name '.*.swp' | sort -n` - if [ -z "$files" ]; then - fatal "No backup actions configured in '$configdirectory', run ninjahelper!" - fi + if [ -z "$files" ]; then + fatal "No backup actions configured in '$configdirectory', run ninjahelper!" + fi fi for file in $files; do - [ -f "$file" ] || continue - [ "$halts" = "0" ] || continue + [ -f "$file" ] || continue + [ "$halts" = "0" ] || continue - check_perms ${file%/*} # check containing dir - check_perms $file - suffix="${file##*.}" - base=`basename $file` - if [ "${base:0:1}" == "0" -o "$suffix" == "disabled" ]; then - info "Skipping $file" - continue - fi + check_perms ${file%/*} # check containing dir + check_perms $file + suffix="${file##*.}" + base=`basename $file` + if [ "${base:0:1}" == "0" -o "$suffix" == "disabled" ]; then + info "Skipping $file" + continue + fi - if [ -e "$scriptdirectory/$suffix" ]; then - process_action $file $suffix - else - error "Can't process file '$file': no handler script for suffix '$suffix'" - msg "*missing handler* -- $file" - fi + if [ -e "$scriptdirectory/$suffix" ]; then + process_action $file $suffix + else + error "Can't process file '$file': no handler script for suffix '$suffix'" + msg "*missing handler* -- $file" + fi done ## mail the messages to the report address @@ -549,38 +549,38 @@ else doit=0 fi if [ $doit == 1 ]; then - debug "send report to $reportemail" - hostname=`hostname` - [ $warnings == 0 ] || subject="WARNING" - [ $errors == 0 ] || subject="ERROR" - [ $fatals == 0 ] || subject="FAILED" - - { - for ((i=0; i < ${#messages[@]} ; i++)); do - echo ${messages[$i]} - done - echo -e "$errormsg" - if [ "$reportspace" == "yes" ]; then - previous="" - for i in $(ls "$configdirectory"); do - backuploc=$(grep ^directory "$configdirectory"/"$i" | @AWK@ '{print $3}') - if [ "$backuploc" != "$previous" -a -n "$backuploc" ]; then - df -h "$backuploc" - previous="$backuploc" - fi - done - fi - } | mail -s "backupninja: $hostname $subject" $reportemail + debug "send report to $reportemail" + hostname=`hostname` + [ $warnings == 0 ] || subject="WARNING" + [ $errors == 0 ] || subject="ERROR" + [ $fatals == 0 ] || subject="FAILED" + + { + for ((i=0; i < ${#messages[@]} ; i++)); do + echo ${messages[$i]} + done + echo -e "$errormsg" + if [ "$reportspace" == "yes" ]; then + previous="" + for i in $(ls "$configdirectory"); do + backuploc=$(grep ^directory "$configdirectory"/"$i" | @AWK@ '{print $3}') + if [ "$backuploc" != "$previous" -a -n "$backuploc" ]; then + df -h "$backuploc" + previous="$backuploc" + fi + done + fi + } | mail -s "backupninja: $hostname $subject" $reportemail fi if [ $actions_run != 0 ]; then - info "FINISHED: $actions_run actions run. $fatals fatal. $errors error. $warnings warning." - if [ "$halts" != "0" ]; then - info "Backup was halted prematurely. Some actions may not have run." - fi + info "FINISHED: $actions_run actions run. $fatals fatal. $errors error. $warnings warning." + if [ "$halts" != "0" ]; then + info "Backup was halted prematurely. Some actions may not have run." + fi fi if [ -n "$reporthost" ]; then - debug "send $logfile to $reportuser@$reporthost:$reportdirectory" - rsync -qt $logfile $reportuser@$reporthost:$reportdirectory + debug "send $logfile to $reportuser@$reporthost:$reportdirectory" + rsync -qt $logfile $reportuser@$reporthost:$reportdirectory fi diff --git a/src/ninjahelper.in b/src/ninjahelper.in index 040727b..7bbef1f 100755 --- a/src/ninjahelper.in +++ b/src/ninjahelper.in @@ -27,7 +27,7 @@ get_next_filename() { require_packages() { for pkg in "$@"; do installed=`dpkg -s $pkg | grep 'ok installed'` - if [ -z "$installed" ]; then + if [ -z "$installed" ]; then booleanBox "install $pkg?" "This backup action requires package $pkg. Do you want to install it now?" if [ $? = 0 ]; then apt-get install $pkg @@ -54,7 +54,7 @@ donew() { listItem $helper_function "$helper_info" done listDisplay menu - + [ $? = 1 ] && return result="$REPLY" [ "$result" = "return" -o "$result" = "" ] && return @@ -62,10 +62,10 @@ donew() { $run_wizard result=$? # 0 is ok, 1 is cancel, anything else is bad. - if [ $result != 1 -a $result != 0 ]; then + if [ $result != 1 -a $result != 0 ]; then echo "An error occurred ($result), bailing out. Hit return to continue." read - fi + fi } do_rm_action() { @@ -84,17 +84,17 @@ do_run() { do_xedit() { if [ -z "$EDITOR" -o ! -x "`which $EDITOR`" ]; then if [ -h /etc/alternatives/editor -a -x "`readlink /etc/alternatives/editor`" ]; then - EDITOR="`readlink /etc/alternatives/editor`" + EDITOR="`readlink /etc/alternatives/editor`" elif [ -x "`which nano`" ]; then - EDITOR="`which nano`" + EDITOR="`which nano`" elif [ -x "`which vim`" ]; then - EDITOR="`which vim`" + EDITOR="`which vim`" elif [ -x "`which vi`" ]; then - EDITOR="`which vi`" + EDITOR="`which vi`" else - echo "No suitable editor found." - echo "Please define $EDITOR or configure /etc/alternatives/editor." - exit + echo "No suitable editor found." + echo "Please define $EDITOR or configure /etc/alternatives/editor." + exit fi fi $EDITOR $1 @@ -138,17 +138,17 @@ doaction() { name "change the filename" \ run "run this action now" \ test "do a test run" \ - kill "remove this action" + kill "remove this action" [ $? = 1 ] && return; result="$REPLY" case "$result" in - "view") dialog --textbox $action 0 0;; + "view") dialog --textbox $action 0 0;; "xedit") do_xedit $action;; "disable") do_disable $action; return;; "enable") do_enable $action; return;; "name") do_rename $action; return;; "run") do_run $action;; - "test") do_run_test $action;; + "test") do_run_test $action;; "kill") do_rm_action $action; return;; "main") return;; esac @@ -178,7 +178,7 @@ fi # bootstrap conffile="@CFGDIR@/backupninja.conf" if [ ! -r "$conffile" ]; then - echo "Configuration file $conffile not found." + echo "Configuration file $conffile not found." exit 1 fi @@ -188,12 +188,12 @@ if [ -z "$libdirectory" ]; then if [ -d "@libdir@" ]; then libdirectory="@libdir@" else - echo "Could not find entry 'libdirectory' in $conffile." + echo "Could not find entry 'libdirectory' in $conffile." exit 1 fi else if [ ! -d "$libdirectory" ]; then - echo "Lib directory $libdirectory not found." + echo "Lib directory $libdirectory not found." exit 1 fi fi @@ -247,7 +247,7 @@ done menuBox "main menu" "Select a backup action for more options, or create a new action:" $menulist \ new "create a new backup action" \ - quit "leave ninjahelper" + quit "leave ninjahelper" [ $? = 1 -o $? = 255 ] && exit 0; diff --git a/src/ninjareport.in b/src/ninjareport.in index b68efb8..56a7209 100755 --- a/src/ninjareport.in +++ b/src/ninjareport.in @@ -13,7 +13,7 @@ # . check for logs that are never updating and warn # . change constantly updating logs (maildir) to be more friendly # . documentation -# . maybe make config option that lists all hosts that should report-in, and if +# . maybe make config option that lists all hosts that should report-in, and if # one doesn't then warn # . restrict rsync somehow? # . abstract path for logtail @@ -29,7 +29,7 @@ process() { # # note: some backups never finish, such as the maildir one, need to handle these # perhaps by looking for FAILED messages? -# note2: what about logs that aren't being updated? this is a failure case and +# note2: what about logs that aren't being updated? this is a failure case and # should be looked for # note3: there are also these entries: # Jan 20 14:00:01 Fatal: No backup actions configured in '/etc/backup.d', run ninjahelper! @@ -38,27 +38,27 @@ process() { logupdates=`maketemp ninjadata` /usr/sbin/logtail -f $host > $logupdates -grep FINISHED $logupdates | +grep FINISHED $logupdates | ( - fatal=0 - warning=0 - error=0 + fatal=0 + warning=0 + error=0 - while read line - do - line_array=($line) - fatal=$(($fatal + ${line_array[8]})) - error=$(($error + ${line_array[10]})) - warning=$(($warning + ${line_array[12]})) - done - if (( $fatal || $warning || $error )); then - echo "`basename $host .log`: $fatal fatals found, $error errors found, $warning warnings found" >> $statusfile - echo "" >> $reportappend - echo "`basename $host .log` log entries since last ninjareport" >> $reportappend - echo "---------" >> $reportappend - cat $logupdates >> $reportappend - rm $logupdates - fi + while read line + do + line_array=($line) + fatal=$(($fatal + ${line_array[8]})) + error=$(($error + ${line_array[10]})) + warning=$(($warning + ${line_array[12]})) + done + if (( $fatal || $warning || $error )); then + echo "`basename $host .log`: $fatal fatals found, $error errors found, $warning warnings found" >> $statusfile + echo "" >> $reportappend + echo "`basename $host .log` log entries since last ninjareport" >> $reportappend + echo "---------" >> $reportappend + cat $logupdates >> $reportappend + rm $logupdates + fi ) } @@ -69,31 +69,31 @@ reportfile=`maketemp ninjareport` # Generate a report, only if there are failures if [ -s $statusfile ]; then - echo " backupninja mission failures - `date`" >> $reportfile - echo " --------------------------------------------------------------" >> $reportfile - echo "" >> $reportfile - cat $statusfile | column -t >> $reportfile - echo "" >> $reportfile - echo " log entries from failed reports" >> $reportfile - echo " -----------------------------------" >> $reportfile - cat $reportappend >> $reportfile + echo " backupninja mission failures - `date`" >> $reportfile + echo " --------------------------------------------------------------" >> $reportfile + echo "" >> $reportfile + cat $statusfile | column -t >> $reportfile + echo "" >> $reportfile + echo " log entries from failed reports" >> $reportfile + echo " -----------------------------------" >> $reportfile + cat $reportappend >> $reportfile fi } usage() { - cat << EOF + cat << EOF This script generates a backupninja status report for all configured systems. It requires that each status report is placed in a spot where ninjareport can read it, reports are mailed to the reportemail configured in @CFGDIR@/backupninja.conf. The following options are available: --h, --help This usage message --f, --conffile FILE Use FILE for the configuration instead - of @CFGDIR@/backupninja.conf --m, --mail Mail the report to this address --o, --out Don't mail the report, just display it +-h, --help This usage message +-f, --conffile FILE Use FILE for the configuration instead + of @CFGDIR@/backupninja.conf +-m, --mail Mail the report to this address +-o, --out Don't mail the report, just display it EOF } @@ -106,45 +106,45 @@ conffile="@CFGDIR@/backupninja.conf" ## process command line options while [ $# -ge 1 ]; do - case $1 in - -h|--help) - usage - exit 0 - ;; - -f|--conffile) - if [ -f $2 ]; then - conffile=$2 - else - echo "-f|--conffile option must be followed by an existing filename" - fatal "-f|--conffile option must be followed by an existing filename" - usage - fi - # we shift here to avoid processing the file path - shift - ;; - -m|--mail) - reportemail=$2 - shift - ;; - -o|--out) - mail=0 - display=1 - ;; - *) - echo "Unknown option $1" - usage - exit - ;; - esac - shift -done + case $1 in + -h|--help) + usage + exit 0 + ;; + -f|--conffile) + if [ -f $2 ]; then + conffile=$2 + else + echo "-f|--conffile option must be followed by an existing filename" + fatal "-f|--conffile option must be followed by an existing filename" + usage + fi + # we shift here to avoid processing the file path + shift + ;; + -m|--mail) + reportemail=$2 + shift + ;; + -o|--out) + mail=0 + display=1 + ;; + *) + echo "Unknown option $1" + usage + exit + ;; + esac + shift +done ## Load and confirm basic configuration values # bootstrap if [ ! -r "$conffile" ]; then - echo "Configuration file $conffile not found." - fatal "Configuration file $conffile not found." + echo "Configuration file $conffile not found." + fatal "Configuration file $conffile not found." fi # find $libdirectory @@ -153,12 +153,12 @@ if [ -z "$libdirectory" ]; then if [ -d "@libdir@" ]; then libdirectory="@libdir@" else - echo "Could not find entry 'libdirectory' in $conffile." + echo "Could not find entry 'libdirectory' in $conffile." exit 1 fi else if [ ! -d "$libdirectory" ]; then - echo "Lib directory $libdirectory not found." + echo "Lib directory $libdirectory not found." exit 1 fi fi @@ -176,17 +176,17 @@ getconf reportemail hosts=`find $reportdirectory -follow -mindepth 1 -maxdepth 1 -type f ! -name '*.offset' | sort -n` if [ -z "$hosts" ]; then - echo "Fatal: No backupninja reports found in '$reportdirectory'!" - mail=0 + echo "Fatal: No backupninja reports found in '$reportdirectory'!" + mail=0 fi statusfile=`maketemp ninjastatus` reportappend=`maketemp ninjaappend` for host in $hosts; do - [ -f "$host" ] || continue - # Check somehow that the file is a valid report file - process $host + [ -f "$host" ] || continue + # Check somehow that the file is a valid report file + process $host done generatereport @@ -194,12 +194,11 @@ generatereport ## mail the report to the report address or display it if [ -s $reportfile ]; then - if [ $mail == 1 ]; then - mail -s "backupninja mission failure report" $reportemail < $reportfile - fi + if [ $mail == 1 ]; then + mail -s "backupninja mission failure report" $reportemail < $reportfile + fi fi if [ $display == 1 ]; then - cat $reportfile + cat $reportfile fi -