Make all indentation consistent.

Previously, there were many indentation styles in use: Real tabs, 2, 3
or 4 spaces, mixing these within the same file, function or even within
a single line.

This commit changes all bash scripts in the handlers, src and lib dirs
to use consistent indentation: three spaces are now used everywhere.
Other files (e.g. Makefiles) are left untouched.

Additionally, this commit removes all trailing whitespace.
This commit is contained in:
Matthijs Kooijman 2009-05-22 14:50:52 +02:00
parent 386c427594
commit 4ecaae9405
28 changed files with 1740 additions and 1745 deletions

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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 <<EOF
ssh -T -o PasswordAuthentication=no $desthost -l $destuser -i $destid_file <<EOF
##### BEGIN REMOTE SCRIPT #####
seconds_daily=86400
seconds_weekly=604800
seconds_monthly=2628000
keepdaily=$keepdaily
keepweekly=$keepweekly
keepmonthly=$keepmonthly
now=\`date +%s\`
seconds_daily=86400
seconds_weekly=604800
seconds_monthly=2628000
keepdaily=$keepdaily
keepweekly=$keepweekly
keepmonthly=$keepmonthly
now=\`date +%s\`
if [ ! -d "$backuproot" ]; then
echo "Debug: skipping rotate of $user. $backuproot doesn't exist."
exit
fi
for rottype in daily weekly monthly; do
seconds=\$((seconds_\${rottype}))
if [ ! -d "$backuproot" ]; then
echo "Debug: skipping rotate of $user. $backuproot doesn't exist."
exit
fi
for rottype in daily weekly monthly; do
seconds=\$((seconds_\${rottype}))
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
# 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
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 <<EOF
if [ ! -d $destdir ]; then
echo "Fatal: Destination directory $destdir does not exist on host $desthost."
exit 1
elif [ -d $dir.1 ]; then
if [ -f $dir.1/created ]; then
echo "Warning: $dir.1 already exists. Overwriting contents."
else
echo "Warning: we seem to be resuming a partially written $dir.1"
fi
else
if [ -d $tmpdir ]; then
mv $tmpdir $dir.1
if [ \$? == 1 ]; then
echo "Fatal: could mv $destdir/rotate.tmp $dir.1 on host $desthost"
exit 1
fi
else
mkdir --parents $dir.1
if [ \$? == 1 ]; then
echo "Fatal: could not create directory $dir.1 on host $desthost"
exit 1
fi
fi
if [ -d $dir.2 ]; then
echo "Debug: update links $backuptype.2 --> $backuptype.1"
cp -alf $dir.2/. $dir.1
#if [ \$? == 1 ]; then
# echo "Fatal: could not create hard links to $dir.1 on host $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 <<EOF
if [ ! -d $destdir ]; then
echo "Fatal: Destination directory $destdir does not exist on host $desthost."
exit 1
elif [ -d $dir.1 ]; then
if [ -f $dir.1/created ]; then
echo "Warning: $dir.1 already exists. Overwriting contents."
else
echo "Warning: we seem to be resuming a partially written $dir.1"
fi
else
if [ -d $tmpdir ]; then
mv $tmpdir $dir.1
if [ \$? == 1 ]; then
echo "Fatal: could mv $destdir/rotate.tmp $dir.1 on host $desthost"
exit 1
fi
else
mkdir --parents $dir.1
if [ \$? == 1 ]; then
echo "Fatal: could not create directory $dir.1 on host $desthost"
exit 1
fi
fi
if [ -d $dir.2 ]; then
echo "Debug: update links $backuptype.2 --> $backuptype.1"
cp -alf $dir.2/. $dir.1
#if [ \$? == 1 ]; then
# echo "Fatal: could not create hard links to $dir.1 on host $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

View File

@ -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 <<EOF
get_next_filename $configdirectory/20.makecd
cat >> $next_filename <<EOF
# TYP is cd or dvd AS WELL AS the disk inside!!
$burnertype
@ -88,10 +88,10 @@ $target
# exclude = /dev
EOF
for ((j=0; j < ${#makecd_excludes[@]} ; j++)); do
echo "exclude = ${makecd_excludes[$j]}" >> $next_filename
done
for ((j=0; j < ${#makecd_excludes[@]} ; j++)); do
echo "exclude = ${makecd_excludes[$j]}" >> $next_filename
done
chmod 600 $next_filename
}

View File

@ -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

View File

@ -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 <<EOF
### backupninja MySQL config file ###
@ -114,7 +114,7 @@ EOF
$mysql_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.
$mysql_databases
@ -122,43 +122,43 @@ EOF
if [ $host_or_vservers == vservers ]
then
cat >> $next_filename <<EOF
cat >> $next_filename <<EOF
#
# vsname = <vserver> (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 <<EOF
# show help.
helptmp="/tmp/backupninja.help.$$"
cat > $helptmp <<EOF
To connect to mysql, backupninja must authenticate.
There are three possible authentication methods:
USER
With this method, you specify a system user. Backupninja will
With this method, you specify a system user. Backupninja will
then become this user before running mysqldump or mysqlhotcopy.
The result is that ~/.my.cnf is used for authentication.
@ -199,11 +199,11 @@ DEBIAN
With this method, we use the debian-sys-maint user which is
already defined in /etc/mysql/debian.cnf. If you are running
debian, this is recommended, because no further configuration
is needed. The drawback is that this is incompatible with
is needed. The drawback is that this is incompatible with
mysqlhotcopy: you must use mysqldump.
EOF
dialog --textbox $helptmp 0 0
rm $helptmp
dialog --textbox $helptmp 0 0
rm $helptmp
fi
[ $status = 1 ] && return;
@ -213,5 +213,5 @@ EOF
"password") do_mysql_password;return;;
"debian") do_mysql_debian;return;;
esac
done
done
}

View File

@ -47,9 +47,9 @@ fi
ignore=''
for i in $ignores $nodata; do
ignore="$ignore --ignore-table=$i"
ignore="$ignore --ignore-table=$i"
done
# create backup dirs, $vroot will be empty if no vsname was specified
# and we will instead proceed to operate on the host
[ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir
@ -59,11 +59,11 @@ dumpdir="$backupdir/sqldump"
if [ $usevserver = yes ]
then
[ "$sqldump" == "no" -o -d $vroot$dumpdir ] || $VSERVER $vsname exec mkdir -p $dumpdir
[ "$hotcopy" == "no" -o -d $vroot$hotdir ] || $VSERVER $vsname exec mkdir -p $hotdir
[ "$sqldump" == "no" -o -d $vroot$dumpdir ] || $VSERVER $vsname exec mkdir -p $dumpdir
[ "$hotcopy" == "no" -o -d $vroot$hotdir ] || $VSERVER $vsname exec mkdir -p $hotdir
else
[ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir
[ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir
[ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir
[ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir
fi
#######################################################################
@ -87,29 +87,29 @@ defaultsfile=""
if [ "$dbusername" != "" -a "$dbpassword" != "" ]
then
if [ $usevserver = yes ]
then
vhome=`$VSERVER $vsname exec getent passwd "root" | @AWK@ -F: '{print $6}'`
home="$vroot$vhome"
else
home=`getent passwd "root" | @AWK@ -F: '{print $6}'`
fi
if [ $usevserver = yes ]
then
vhome=`$VSERVER $vsname exec getent passwd "root" | @AWK@ -F: '{print $6}'`
home="$vroot$vhome"
else
home=`getent passwd "root" | @AWK@ -F: '{print $6}'`
fi
[ -d $home ] || fatal "Can't find root's home directory ($home)."
mycnf="$home/.my.cnf"
if [ -f $mycnf ]
then
# rename temporarily
tmpcnf="$home/my.cnf.disable"
debug "mv $mycnf $tmpcnf"
mv $mycnf $tmpcnf
fi
oldmask=`umask`
umask 077
cat > $mycnf <<EOF
[ -d $home ] || fatal "Can't find root's home directory ($home)."
mycnf="$home/.my.cnf"
if [ -f $mycnf ]
then
# rename temporarily
tmpcnf="$home/my.cnf.disable"
debug "mv $mycnf $tmpcnf"
mv $mycnf $tmpcnf
fi
oldmask=`umask`
umask 077
cat > $mycnf <<EOF
# auto generated backupninja mysql conf
[mysql]
host=$dbhost
@ -126,41 +126,41 @@ host=$dbhost
user=$dbusername
password="$dbpassword"
EOF
umask $oldmask
if [ $usevserver = yes ]
then
defaultsfile="--defaults-extra-file=$vhome/.my.cnf"
else
defaultsfile="--defaults-extra-file=$mycnf"
fi
umask $oldmask
if [ $usevserver = yes ]
then
defaultsfile="--defaults-extra-file=$vhome/.my.cnf"
else
defaultsfile="--defaults-extra-file=$mycnf"
fi
fi
# if a user is not set, use $configfile, otherwise use $mycnf
if [ "$user" == "" ]; then
user=root;
defaultsfile="--defaults-extra-file=$configfile"
user=root;
defaultsfile="--defaults-extra-file=$configfile"
else
userset=true;
if [ $usevserver = yes ]
then
vuserhome=`$VSERVER $vsname exec getent passwd "$user" | @AWK@ -F: '{print $6}'`
if [ $? -eq 2 ]
then
fatal "User $user not found in /etc/passwd"
fi
userhome="$vroot$vuserhome"
else
userhome=`getent passwd "$user" | @AWK@ -F: '{print $6}'`
if [ $? -eq 2 ]
then
fatal "User $user not found in /etc/passwd"
fi
fi
debug "User home set to: $userhome"
[ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
defaultsfile="--defaults-extra-file=$userhome/.my.cnf"
debug "using $defaultsfile"
userset=true;
if [ $usevserver = yes ]
then
vuserhome=`$VSERVER $vsname exec getent passwd "$user" | @AWK@ -F: '{print $6}'`
if [ $? -eq 2 ]
then
fatal "User $user not found in /etc/passwd"
fi
userhome="$vroot$vuserhome"
else
userhome=`getent passwd "$user" | @AWK@ -F: '{print $6}'`
if [ $? -eq 2 ]
then
fatal "User $user not found in /etc/passwd"
fi
fi
debug "User home set to: $userhome"
[ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
defaultsfile="--defaults-extra-file=$userhome/.my.cnf"
debug "using $defaultsfile"
fi
#######################################################################
@ -168,55 +168,55 @@ fi
if [ "$hotcopy" == "yes" ]
then
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
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

View File

@ -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:

View File

@ -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

View File

@ -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 <<EOF
#
# If vservers = yes in /etc/backupninja.conf then the following variables can
@ -328,7 +328,7 @@ EOF
done
set +o noglob
fi
## excludes ##
set -o noglob
for ((i=0; i < ${#rdiff_excludes[@]} ; i++)); do
@ -340,7 +340,7 @@ EOF
######################################################
## destination section
## (where the files are copied to)
[dest]
type = remote
directory = $rdiff_directory
@ -382,7 +382,7 @@ rdiff_main_menu() {
}
rdiff_wizard() {
# Global variables
rdiff_title="rdiff-backup action wizard"
_src_done=
@ -401,7 +401,7 @@ rdiff_wizard() {
rdiff_excludes=(/home/*/.gnupg /home/*/.local/share/Trash /home/*/.Trash /home/*/.thumbnails /home/*/.beagle /home/*/.aMule /home/*/gtk-gnutella-downloads)
rdiff_vsincludes=
set +o noglob
rdiff_main_menu
}

View File

@ -7,68 +7,68 @@
### FUNCTIONS ###
function test_connection() {
# given a user and host,
# tests the connection.
# if user or host is missing, returns 0
# (ie, assume it's a local connection).
if [ $# -lt 2 ]; then
debug "(local is assumed to be a good connection)"
return 0
fi
local user=$1
local host=$2
debug "ssh $sshoptions -o PasswordAuthentication=no $host -l $user 'echo -n 1'"
local ret=`ssh $sshoptions -o PasswordAuthentication=no $host -l $user 'echo -n host is alive'`
if echo $ret | grep "host is alive"; then
debug "Connected to $host as $user successfully"
else
fatal "Can't connect to $host as $user."
fi
# given a user and host,
# tests the connection.
# if user or host is missing, returns 0
# (ie, assume it's a local connection).
if [ $# -lt 2 ]; then
debug "(local is assumed to be a good connection)"
return 0
fi
local user=$1
local host=$2
debug "ssh $sshoptions -o PasswordAuthentication=no $host -l $user 'echo -n 1'"
local ret=`ssh $sshoptions -o PasswordAuthentication=no $host -l $user 'echo -n host is alive'`
if echo $ret | grep "host is alive"; then
debug "Connected to $host as $user successfully"
else
fatal "Can't connect to $host as $user."
fi
}
function get_version() {
# given no arguments, returns the local version.
# given a user and host, returns the remote version.
# if user or host is missing, returns the local version.
if [ "$#" -lt 2 ]; then
debug "$RDIFFBACKUP -V"
echo `$RDIFFBACKUP -V`
else
local user=$1
local host=$2
debug "ssh $sshoptions $host -l $user '$RDIFFBACKUP -V'"
echo `ssh $sshoptions $host -l $user "$RDIFFBACKUP -V | grep rdiff-backup"`
fi
# given no arguments, returns the local version.
# given a user and host, returns the remote version.
# if user or host is missing, returns the local version.
if [ "$#" -lt 2 ]; then
debug "$RDIFFBACKUP -V"
echo `$RDIFFBACKUP -V`
else
local user=$1
local host=$2
debug "ssh $sshoptions $host -l $user '$RDIFFBACKUP -V'"
echo `ssh $sshoptions $host -l $user "$RDIFFBACKUP -V | grep rdiff-backup"`
fi
}
function check_consistency() {
local section=$1
local type=$2
local user=$3
local host=$4
if [ "$type" == "local" ]; then
if [ "$user" != "" ]; then
warning "User should not be specified for local $section."
fi
if [ "$host" != "" ]; then
warning "Host should not be specified for local $section."
fi
fi
if [ "$type" == "remote" ]; then
if [ "$user" == "" ]; then
fatal "User must be specified for remote $section."
fi
if [ "host" == "" ]; then
fatal "Host must be specifed for remote $section."
fi
fi
local section=$1
local type=$2
local user=$3
local host=$4
if [ "$type" == "local" ]; then
if [ "$user" != "" ]; then
warning "User should not be specified for local $section."
fi
if [ "$host" != "" ]; then
warning "Host should not be specified for local $section."
fi
fi
if [ "$type" == "remote" ]; then
if [ "$user" == "" ]; then
fatal "User must be specified for remote $section."
fi
if [ "host" == "" ]; then
fatal "Host must be specifed for remote $section."
fi
fi
}
function check_cstream() {
local cstream=$1
if [ ! -x $cstream ]; then
fatal "Can't find your cstream binary (trying: $cstream). If you use bwlimit you must have cstream installed."
fi
local cstream=$1
if [ ! -x $cstream ]; then
fatal "Can't find your cstream binary (trying: $cstream). If you use bwlimit you must have cstream installed."
fi
}
### GET CONFIG ###
@ -102,7 +102,7 @@ getconf sshoptions
check_consistency "destination" "$type" "$user" "$host"
if [ -n "$sshoptions" ] && echo $options | grep -qv "remote-schema"; then
options="$options --remote-schema 'ssh -C $sshoptions %s rdiff-backup --server'"
options="$options --remote-schema 'ssh -C $sshoptions %s rdiff-backup --server'"
fi
### CHECK CONFIG ###
@ -114,7 +114,7 @@ if [ $vservers_are_available = yes ]; then
vsnames="$found_vservers"
else
if ! vservers_exist "$vsnames" ; then
fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist."
fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist."
fi
fi
if [ -n "$vsinclude" ]; then
@ -128,40 +128,40 @@ fi
# check the connection at the source and destination
[ -n "$test" ] || test=0
if [ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]; then
test_connection $sourceuser $sourcehost
test_connection $destuser $desthost
test_connection $sourceuser $sourcehost
test_connection $destuser $desthost
fi
if [ "$ignore_version" != "yes" ]; then
# see that rdiff-backup has the same version at the source and destination
sourceversion=`get_version $sourceuser $sourcehost`
destversion=`get_version $destuser $desthost`
if [ "$sourceversion" != "$destversion" ]; then
fatal "rdiff-backup does not have the same version at the source and at the destination."
fi
# see that rdiff-backup has the same version at the source and destination
sourceversion=`get_version $sourceuser $sourcehost`
destversion=`get_version $destuser $desthost`
if [ "$sourceversion" != "$destversion" ]; then
fatal "rdiff-backup does not have the same version at the source and at the destination."
fi
fi
# source specific checks
case $sourcetype in
remote ) execstr_sourcepart="$sourceuser@$sourcehost::/" ;;
local ) execstr_sourcepart="/" ;;
* ) fatal "sourcetype '$sourcetype' is neither local nor remote" ;;
case $sourcetype in
remote ) execstr_sourcepart="$sourceuser@$sourcehost::/" ;;
local ) execstr_sourcepart="/" ;;
* ) fatal "sourcetype '$sourcetype' is neither local nor remote" ;;
esac
# destination specific checks
[ "$destdir" != "" ] || fatal "Destination directory not set"
case $desttype in
remote ) execstr_destpart="$destuser@$desthost::$destdir/$label" ;;
local ) execstr_destpart="$destdir/$label" ;;
* ) fatal "desttype '$desttype' is neither local nor remote" ;;
case $desttype in
remote ) execstr_destpart="$destuser@$desthost::$destdir/$label" ;;
local ) execstr_destpart="$destdir/$label" ;;
* ) fatal "desttype '$desttype' is neither local nor remote" ;;
esac
### REMOVE OLD BACKUPS ###
if [ "$keep" != yes ]; then
if [ "`echo $keep | tr -d 0-9`" == "" ]; then
# add D if no other date unit is specified
# add D if no other date unit is specified
keep="${keep}D"
fi
@ -175,27 +175,27 @@ if [ "$keep" != yes ]; then
if [ $test = 0 ]; then
output="`su -c "$removestr" 2>&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

View File

@ -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

View File

@ -2,6 +2,6 @@
#
# shell script handler for backupninja
# runs the file /etc/backup.d/scriptname.sh
#
#
[ $test ] || ( . $1 )

View File

@ -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

View File

@ -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

View File

@ -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' ' '"

View File

@ -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 <<EOF
$tar_when_run
@ -85,8 +85,8 @@ $tar_excludes
# tar binary - have to be GNU tar
#TAR=/bin/tar
#DATE /bin/date
#DATEFORMAT "%Y.%m.%d-%H%M"
#DATE /bin/date
#DATEFORMAT "%Y.%m.%d-%H%M"
EOF
chmod 600 $next_filename

View File

@ -2,16 +2,16 @@
#
# tar handler script for backupninja
getconf backupname `hostname --fqdn`
getconf backupdir /var/backups/`hostname --fqdn`
getconf compress bzip
getconf includes "/etc /home /usr/local"
getconf excludes "/tmp /proc /dev /sys /net /misc /media /srv /selinux"
getconf backupname `hostname --fqdn`
getconf backupdir /var/backups/`hostname --fqdn`
getconf compress bzip
getconf includes "/etc /home /usr/local"
getconf excludes "/tmp /proc /dev /sys /net /misc /media /srv /selinux"
getconf TAR `which tar`
getconf EXTENSION tar
getconf DATE `which date`
getconf DATEFORMAT "%Y.%m.%d-%H%M"
getconf TAR `which tar`
getconf EXTENSION tar
getconf DATE `which date`
getconf DATEFORMAT "%Y.%m.%d-%H%M"
# See if vservers are configured
if [ "$vservers" = "yes" ]
@ -65,7 +65,7 @@ done
debug "Running backup: " $TAR -c -p -v $compress_option $exclude_options \
-f "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`".$EXTENSION" \
$includes
$includes
$TAR -c -p -v $compress_option $exclude_options \
-f "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`".$EXTENSION" \
@ -73,7 +73,7 @@ $TAR -c -p -v $compress_option $exclude_options \
> "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.list \
2> "$backupdir/$backupname-"`$DATE "+$DATEFORMAT"`.err
[ $? -ne 0 ] && fatal "Tar backup failed"
[ $? -ne 0 ] && fatal "Tar backup failed"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'
}

View File

@ -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 '"'`

View File

@ -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

View File

@ -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;

View File

@ -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 <email> 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 <email> 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