X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fbackupninja.in;h=3bf0ad161e4ab7896d2ad6f504d7c48bd7787c42;hb=4ce9c573c8533d3b2f1ec6063342fadd06356540;hp=f43eaabd2eb1f2767764025bb6b6053785f24335;hpb=9208b449da1a1df50c2759946c9931f456af1e87;p=matthijs%2Fupstream%2Fbackupninja.git diff --git a/src/backupninja.in b/src/backupninja.in index f43eaab..3bf0ad1 100755 --- a/src/backupninja.in +++ b/src/backupninja.in @@ -1,4 +1,6 @@ #!@BASH@ +# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- +# # |\_ # B A C K U P N I N J A /()/ # `\| @@ -19,7 +21,7 @@ ##################################################### ## FUNCTIONS -setupcolors () { +function setupcolors () { BLUE="\033[34;01m" GREEN="\033[32;01m" YELLOW="\033[33;01m" @@ -27,18 +29,20 @@ setupcolors () { RED="\033[31;01m" OFF="\033[0m" CYAN="\033[36;01m" + COLORS=($BLUE $GREEN $YELLOW $RED $PURPLE) } -colorize () { +function colorize () { if [ "$usecolors" == "yes" ]; then local typestr=`echo "$@" | sed 's/\(^[^:]*\).*$/\1/'` - [ "$typestr" == "Debug" ] && COLOR=$BLUE - [ "$typestr" == "Info" ] && COLOR=$GREEN - [ "$typestr" == "Warning" ] && COLOR=$YELLOW - [ "$typestr" == "Error" ] && COLOR=$RED - [ "$typestr" == "Fatal" ] && COLOR=$PURPLE + [ "$typestr" == "Debug" ] && type=0 + [ "$typestr" == "Info" ] && type=1 + [ "$typestr" == "Warning" ] && type=2 + [ "$typestr" == "Error" ] && type=3 + [ "$typestr" == "Fatal" ] && type=4 + color=${COLORS[$type]} endcolor=$OFF - echo -e "$COLOR$@$endcolor" + echo -e "$color$@$endcolor" else echo -e "$@" fi @@ -126,17 +130,37 @@ function msg { # function check_perms() { - local file=$1 - local perms=`ls -ld $file` - perms=${perms:4:6} - if [ "$perms" != "------" ]; then - echo "Configuration files must not be group or world writable/readable! Dying on file $file" - fatal "Configuration files must not be group or world writable/readable! Dying on file $file" - fi - if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then - 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 + local file=$1 + local perms + perms=($(stat -L --format='%a %g %G %u %U' $file)) + local gperm=${perms[0]:1:1} + local wperm=${perms[0]:2:1} + local gid=${perms[1]} + local group=${perms[2]} + local owner=${perms[3]} + + if [ "$owner" != 0 ]; then + 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 -gt 0 ]; 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" + fi + + if [ $gperm -gt 0 ]; then + case "$admingroup" in + $gid|$group) :;; + + *) + if [ "$gid" != 0 ]; then + echo "Configuration files must writable/readable by group ${perms[2]}! Dying on file $file" + fatal "Configuration files must writable/readable by group ${perms[2]}! Dying on file $file" + fi + ;; + esac + fi } # simple lowercase function @@ -146,7 +170,7 @@ function tolower() { # simple to integer function function toint() { - echo "$1" | tr [:alpha:] -d + echo "$1" | tr -d [:alpha:] } # @@ -394,6 +418,7 @@ fi # include shared functions . $libdirectory/tools +. $libdirectory/vserver setfile $conffile @@ -401,6 +426,7 @@ setfile $conffile getconf configdirectory @CFGDIR@/backup.d getconf scriptdirectory @datadir@ getconf reportemail +getconf reportspace getconf reportsuccess yes getconf reportwarning yes getconf loglevel 3 @@ -418,10 +444,11 @@ getconf PGSQLDUMP /usr/bin/pg_dump getconf PGSQLDUMPALL /usr/bin/pg_dumpall getconf GZIP /bin/gzip getconf RSYNC /usr/bin/rsync -getconf vservers no -getconf VSERVERINFO /usr/sbin/vserver-info -getconf VSERVER /usr/sbin/vserver -getconf VROOTDIR `if [ -f "$VSERVERINFO" ]; then $VSERVERINFO info SYSINFO |grep vserver-Rootdir | awk '{print $2}'; fi` +getconf admingroup root + +# initialize vservers support +# (get config variables and check real vservers availability) +init_vservers nodialog if [ ! -d "$configdirectory" ]; then echo "Configuration directory '$configdirectory' not found." @@ -431,15 +458,10 @@ fi [ -f "$logfile" ] || touch $logfile if [ "$UID" != "0" ]; then - echo "$0 can only be run as root" + echo "`basename $0` can only be run as root" exit 1 fi -if [ "$vservers" == "yes" -a ! -d "$VROOTDIR" ]; then - echo "vservers option set in config, but $VROOTDIR is not a directory!" - fatal "vservers option set in config, but $VROOTDIR is not a directory!" -fi - ## Process each configuration file # by default, don't make files which are world or group readable. @@ -455,12 +477,17 @@ errormsg="" if [ "$singlerun" ]; then files=$singlerun else - files=`find $configdirectory -mindepth 1 ! -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 fi for file in $files; do [ -f "$file" ] || continue + check_perms ${file%/*} # check containing dir check_perms $file suffix="${file##*.}" base=`basename $file` @@ -500,7 +527,18 @@ if [ $doit == 1 ]; then echo ${messages[$i]} done echo -e "$errormsg" - } | mail $reportemail -s "backupninja: $hostname $subject" + if [ "$reportspace" == "yes" ]; then + previous="" + for i in $(ls "$configdirectory"); do + backuploc=$(grep ^directory "$configdirectory"/"$i" | awk '{print $3}') + if [ "$backuploc" != "$previous" ]; then + mountdev=$(mount | grep "$backuploc" | awk '{print $1}') + df -h "$mountdev" + previous="$backuploc" + fi + done + fi + } | mail -s "backupninja: $hostname $subject" $reportemail fi if [ $actions_run != 0 ]; then