A little rearranging to get to autotools
[matthijs/upstream/backupninja.git] / backupninja
index b7d4a149e2e73683745e92f224faf899abd1c71f..d653144a66520082f9ffd0472d59533a59c4f025 100755 (executable)
@@ -3,7 +3,7 @@
 # B A C K U P N I N J A   /()/
 #                         `\|
 #
-# Copyright (C) 2004 riseup.net -- property is theft.
+# Copyright (C) 2004-05 riseup.net -- property is theft.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -87,9 +87,13 @@ function printmsg() {
        fi
        
        if [ $print -lt $loglevel ]; then
-               if [ -w "$logfile" ]; then
-                       colorize "$typestr$@" >> $logfile
-               fi
+               logmsg "$typestr$@"
+       fi
+}
+
+function logmsg() {
+       if [ -w "$logfile" ]; then
+               echo -e `date "+%h %d %H:%M:%S"` "$@" >> $logfile
        fi
 }
 
@@ -127,6 +131,23 @@ function setsection() {
        CURRENT_SECTION=$1
 }
 
+
+#
+# create a temporary file in a secure way.
+#
+function maketemp() {
+       if [ -x /bin/mktemp ]
+       then
+               local tempfile=`mktemp /tmp/$1.XXXXXXXX`
+       else
+               DATE=`date`
+               sectmp=`echo $DATE | /usr/bin/md5sum | cut -d- -f1`
+               local tempfile=/tmp/$1.$sectmp
+       fi
+       echo $tempfile
+}
+
+
 #
 # sets a global var with name equal to $1
 # to the value of the configuration parameter $1
@@ -159,9 +180,11 @@ function check_perms() {
        local perms=`ls -ld $file`
        perms=${perms:4:6}
        if [ "$perms" != "------" ]; then
-               fatal "Configuration files must not be group or world readable! Dying on file $file"
+               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
 }
@@ -199,9 +222,9 @@ function isnow() {
        whendayofweek=$1; at=$2; whentime=$3;
        whenday=`toint "$whendayofweek"`
        whendayofweek=`tolower "$whendayofweek"`
-       whentime=`echo "$whentime" | sed 's/:[0-9][0-9]$//'`
+       whentime=`echo "$whentime" | sed 's/:[0-9][0-9]$//' | sed -r 's/^([0-9])$/0\1/'`
 
-       if [ "$whendayofweek" == "everyday" ]; then
+       if [ "$whendayofweek" == "everyday" -o "$whendayofweek" == "daily" ]; then
                whendayofweek=$nowdayofweek
        fi
 
@@ -235,11 +258,17 @@ The following options are available:
                      output to the current shell.
 -f, --conffile FILE  Use FILE for the main configuration instead
                      of /etc/backupninja.conf
--t, --test           Run in test mode, no actions are actually taken.
--n, --now            Perform actions now, instead of when they
-                     might be scheduled.
+-t, --test           Test run mode. This will test if the backup
+                     could run, without actually preforming any
+                     backups. For example, it will attempt to authenticate
+                     or test that ssh keys are set correctly.
+-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.    
-When using colored output, there are:
+                     Also puts backupninja in debug mode.
+                     
+When in debug mode, output to the console will be colored:
 EOF
        debug=1
        debug   "Debugging info (when run with -d)"
@@ -259,14 +288,18 @@ EOF
 function process_action() {
        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 "running $file because of --now"
+               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
@@ -276,18 +309,20 @@ function process_action() {
                        IFS=$'\t\n'
                        if [ $ret == 0 ]; then
                                debug "skipping $file because it is not $w"
-                               return
                        else
-                               info "running $file because it is $w"
+                               info ">>>> starting action $file (because it is $w)"
+                               run="yes"
                        fi
                done
                IFS=$' \t\n'
        fi
+       debug $run
+       [ "$run" == "no" ] && return
        
        let "actions_run += 1"
 
        # call the handler:
-       local bufferfile="/tmp/backupninja.buffer.$$"
+       local bufferfile=`maketemp backupninja.buffer`
        echo "" > $bufferfile
        echo_debug_msg=1
        (
@@ -310,19 +345,19 @@ function process_action() {
        rm $bufferfile
        if [ $_fatals != 0 ]; then
                msg "*failed* -- $file"
-               errormsg="$errormsg\n== failures from $file ==\n\n$ret\n"
+               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"
-#      elif [ $retcode == 0 ]; then
-#              msg "success -- $file"
-#      else
-#              msg "unknown -- $file"
+               info "<<<< finished action $file: SUCCESS"
        fi
 
        let "fatals += _fatals"
@@ -349,6 +384,7 @@ while [ $# -ge 1 ]; do
                        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
@@ -361,6 +397,7 @@ while [ $# -ge 1 ]; do
                                singlerun=$2
                                processnow=1
                        else
+                               echo "--run option must be fallowed by a backupninja action file"
                                fatal "--run option must be fallowed by a backupninja action file"
                                usage
                        fi
@@ -368,6 +405,7 @@ while [ $# -ge 1 ]; do
                        ;;
                *)
                        debug=1
+                       echo "Unknown option $1"
                        fatal "Unknown option $1"
                        usage
                        exit
@@ -383,10 +421,22 @@ done
 ## Load and confirm basic configuration values
 
 # bootstrap
-[ -r "$conffile" ] || fatal "Configuration file $conffile not found."
+if [ ! -r "$conffile" ]; then
+       echo "Configuration file $conffile not found." 
+       fatal "Configuration file $conffile not found."
+fi
+
 scriptdir=`grep scriptdirectory $conffile | awk '{print $3}'`
-[ -n "$scriptdir" ] || fatal "Cound not find entry 'scriptdirectory' in $conffile"
-[ -d "$scriptdir" ] || fatal "Script directory $scriptdir not found."
+if [ ! -n "$scriptdir" ]; then
+       echo "Cound not find entry 'scriptdirectory' in $conffile" 
+       fatal "Cound not find entry 'scriptdirectory' in $conffile"
+fi
+
+if [ ! -d "$scriptdir" ]; then
+       echo "Script directory $scriptdir not found." 
+       fatal "Script directory $scriptdir not found."
+fi
+
 setfile $conffile
 
 # get global config options (second param is the default)
@@ -400,20 +450,37 @@ defaultwhen=$when
 getconf logfile /var/log/backupninja.log
 getconf usecolors "yes"
 getconf SLAPCAT /usr/sbin/slapcat
+getconf LDAPSEARCH /usr/bin/ldapsearch
 getconf RDIFFBACKUP /usr/bin/rdiff-backup
 getconf MYSQL /usr/bin/mysql
 getconf MYSQLHOTCOPY /usr/bin/mysqlhotcopy
 getconf MYSQLDUMP /usr/bin/mysqldump
+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`
+
+if [ ! -d "$configdirectory" ]; then
+       echo "Configuration directory '$configdirectory' not found."
+       fatal "Configuration directory '$configdirectory' not found."
+fi
 
-[ -d "$configdirectory" ] || fatal "Configuration directory '$configdirectory' not found."
+[ -f "$logfile" ] || touch $logfile
 
 if [ "$UID" != "0" ]; then
        echo "$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.
@@ -429,7 +496,7 @@ errormsg=""
 if [ "$singlerun" ]; then
        files=$singlerun
 else
-       files=`find $configdirectory -mindepth 1 `
+       files=`find $configdirectory -mindepth 1 ! -name '.*.swp' | sort -n`
 fi
 
 for file in $files; do
@@ -438,7 +505,7 @@ for file in $files; do
        check_perms $file
        suffix="${file##*.}"
        base=`basename $file`
-       if [ "${base:0:1}" == "0" ]; then
+       if [ "${base:0:1}" == "0" -o "$suffix" == "disabled" ]; then
                info "Skipping $file"
                continue
        fi
@@ -477,3 +544,6 @@ if [ $doit == 1 ]; then
        } | mail $reportemail -s "backupninja: $hostname $subject"
 fi
 
+if [ $actions_run != 0 ]; then
+       info "FINISHED: $actions_run actions run. $fatals fatal. $errors error. $warnings warning."
+fi