diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 34 | ||||
-rwxr-xr-x | src/backupninja.in | 586 | ||||
-rwxr-xr-x | src/ninjahelper.in | 268 | ||||
-rwxr-xr-x | src/ninjareport.in | 205 |
4 files changed, 0 insertions, 1093 deletions
diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index 3d5bdb8..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -# tyhle vygenerujeme ... -sbin_SCRIPTS = backupninja ninjahelper - -# a proto je taky musÃme smazat ... -CLEANFILES = $(sbin_SCRIPTS) - -EXTRA_DIST = backupninja.in ninjahelper.in ninjareport.in - -edit = sed \ - -e "s,@CFGDIR\@,$(CFGDIR),g" \ - -e "s,@BASH\@,$(BASH),g" \ - -e "s,@AWK\@,$(AWK),g" \ - -e "s,@SED\@,$(SED),g" \ - -e 's,@datadir\@,$(pkgdatadir),g' \ - -e "s,@libdir\@,$(pkglibdir),g" \ - -e 's,@localstatedir\@,$(localstatedir),g' \ - -e 's,@prefix\@,$(prefix),g' - -#install-exec-hook: - -backupninja: $(srcdir)/backupninja.in - rm -f backupninja - $(edit) $(srcdir)/backupninja.in > backupninja - chmod ugo+x backupninja - -ninjahelper: $(srcdir)/ninjahelper.in - rm -f ninjahelper - $(edit) $(srcdir)/ninjahelper.in > ninjahelper - chmod ugo+x ninjahelper - -ninjareport: $(srcdir)/ninjareport.in - rm -f ninjareport - $(edit) $(srcdir)/ninjareport.in > ninjareport - chmod ugo+x ninjareport diff --git a/src/backupninja.in b/src/backupninja.in deleted file mode 100755 index 2a1b76e..0000000 --- a/src/backupninja.in +++ /dev/null @@ -1,586 +0,0 @@ -#!@BASH@ -# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- -# -# |\_ -# B A C K U P N I N J A /()/ -# `\| -# -# 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 -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# - -##################################################### -## 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) -} - -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 -} - -# We have the following message levels: -# 0 - debug - blue -# 1 - normal messages - green -# 2 - warnings - yellow -# 3 - errors - red -# 4 - fatal - purple -# 5 - halt - cyan -# First variable passed is the error level, all others are printed - -# if 1, echo out all warnings, errors, or fatal -# used to capture output from handlers -echo_debug_msg=0 - -usecolors=yes - -function printmsg() { - [ ${#@} -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 -} - -function logmsg() { - if [ -w "$logfile" ]; then - echo -e `LC_ALL=C date "+%h %d %H:%M:%S"` "$@" >> $logfile - fi -} - -function passthru() { - printmsg 100 "$@" -} -function debug() { - printmsg 0 "$@" -} -function info() { - printmsg 1 "$@" -} -function warning() { - printmsg 2 "$@" -} -function error() { - printmsg 3 "$@" -} -function fatal() { - printmsg 4 "$@" - exit 2 -} -function halt() { - printmsg 5 "$@" - exit 2 -} - -msgcount=0 -function msg { - messages[$msgcount]=$1 - let "msgcount += 1" -} - -# -# enforces very strict permissions on configuration file $file. -# - -function check_perms() { - local file=$1 - debug "check_perms $file" - local perms - local owners - - perms=($(stat -L --format='%A' $file)) - debug "perms: $perms" - local gperm=${perms:4:3} - debug "gperm: $gperm" - local wperm=${perms:7:3} - debug "wperm: $wperm" - - owners=($(stat -L --format='%g %G %u %U' $file)) - local gid=${owners[0]} - local group=${owners[1]} - local owner=${owners[2]} - - 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" != '---' ]; 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" != '---' ]; then - case "$admingroup" in - $gid|$group) :;; - - *) - if [ "$gid" != 0 ]; then - echo "Configuration files must not be writable/readable by group $group! Use the admingroup option in backupninja.conf. Dying on file $file" - fatal "Configuration files must not be writable/readable by group $group! Use the admingroup option in backupninja.conf. Dying on file $file" - fi - ;; - esac - fi -} - -# simple lowercase function -function tolower() { - echo "$1" | tr '[:upper:]' '[:lower:]' -} - -# simple to integer function -function toint() { - echo "$1" | tr -d '[:alpha:]' -} - -# -# function isnow(): returns 1 if the time/day passed as $1 matches -# the current time/day. -# -# format is <day> at <time>: -# sunday at 16 -# 8th at 01 -# everyday at 22 -# - -# we grab the current time once, since processing -# all the configs might take more than an hour. -nowtime=`LC_ALL=C date +%H` -nowday=`LC_ALL=C date +%d` -nowdayofweek=`LC_ALL=C date +%A` -nowdayofweek=`tolower "$nowdayofweek"` - -function isnow() { - local when="$1" - set -- $when - - [ "$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/'` - - 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 - - [ "$at" == "at" ] || return 0 - [ "$whentime" == "$nowtime" ] || return 0 - - return 1 -} - -function usage() { - 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 -script is run hourly from cron. - -The following options are available: --h, --help This usage message --d, --debug Run in debug mode, where all log messages are - output to the current shell. --f, --conffile FILE Use FILE for the main configuration instead - of @CFGDIR@/backupninja.conf --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. - 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)" -} - -## -## this function handles the running of a backup action -## -## these globals are modified: -## halts, fatals, errors, warnings, actions_run, errormsg -## - -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 ">>>> 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" - - # 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 - - _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" -} - -##################################################### -## MAIN - -setupcolors -conffile="@CFGDIR@/backupninja.conf" -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 - -#if [ $debug ]; then -# 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." -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 -else - if [ ! -d "$libdirectory" ]; then - echo "Lib directory $libdirectory not found." - fatal "Lib directory $libdirectory not found." - fi -fi - -# include shared functions -. $libdirectory/tools -. $libdirectory/vserver - -setfile $conffile - -# get global config options (second param is the default) -getconf configdirectory @CFGDIR@/backup.d -getconf scriptdirectory @datadir@ -getconf reportdirectory -getconf reportemail -getconf reporthost -getconf reportspace -getconf reportsuccess yes -getconf reportuser -getconf reportwarning yes -getconf loglevel 3 -getconf when "Everyday at 01:00" -defaultwhen=$when -getconf logfile @localstatedir@/log/backupninja.log -getconf usecolors "yes" -getconf SLAPCAT /usr/sbin/slapcat -getconf LDAPSEARCH /usr/bin/ldapsearch -getconf RDIFFBACKUP /usr/bin/rdiff-backup -getconf CSTREAM /usr/bin/cstream -getconf MYSQLADMIN /usr/bin/mysqladmin -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 PGSQLUSER postgres -getconf GZIP /bin/gzip -getconf RSYNC /usr/bin/rsync -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." - 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 -fi - -## Process each configuration file - -# by default, don't make files which are world or group readable. -umask 077 - -# these globals are set by process_action() -halts=0 -fatals=0 -errors=0 -warnings=0 -actions_run=0 -errormsg="" - -if [ "$singlerun" ]; then - files=$singlerun -else - 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 - [ "$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 - - 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 - -if [ $actions_run == 0 ]; then doit=0 -elif [ "$reportemail" == "" ]; then doit=0 -elif [ $fatals != 0 ]; then doit=1 -elif [ $errors != 0 ]; then doit=1 -elif [ "$reportsuccess" == "yes" ]; then doit=1 -elif [ "$reportwarning" == "yes" -a $warnings != 0 ]; then doit=1 -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 -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 -fi - -if [ -n "$reporthost" ]; then - debug "send $logfile to $reportuser@$reporthost:$reportdirectory" - rsync -qt $logfile $reportuser@$reporthost:$reportdirectory -fi diff --git a/src/ninjahelper.in b/src/ninjahelper.in deleted file mode 100755 index 040727b..0000000 --- a/src/ninjahelper.in +++ /dev/null @@ -1,268 +0,0 @@ -#!@BASH@ -# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- - -#################################################### -## Functions - -## -## returns the next available file name given a file -## in the form @CFGDIR@/backup.d/10.sys -## sets variable $next_filename -## -get_next_filename() { - next_filename=$1 - dir=`dirname $next_filename` - file=`basename $next_filename` - number=${file:0:2} - suffix=${file:3} - while [ -f $next_filename ]; do - let "number += 1" - next_filename="$dir/$number.$suffix" - done -} - -## -## installs packages (passed in as $@) if not present -## -require_packages() { - for pkg in "$@"; do - installed=`dpkg -s $pkg | grep 'ok installed'` - 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 - echo "hit return to continue...." - read - fi - fi - done -} - -## -## menu for the wizards -## -donew() { - # (re-)initialize vservers support - init_vservers - # menu - listBegin "new action menu" "select an action to create" - listItem return "return to main menu" - for data in $HELPERS; do - data=${data//_/ } - helper_function=${data%%:*} - helper_info=${data##*:} - listItem $helper_function "$helper_info" - done - listDisplay menu - - [ $? = 1 ] && return - result="$REPLY" - [ "$result" = "return" -o "$result" = "" ] && return - run_wizard=${result}_wizard - $run_wizard - result=$? - # 0 is ok, 1 is cancel, anything else is bad. - if [ $result != 1 -a $result != 0 ]; then - echo "An error occurred ($result), bailing out. Hit return to continue." - read - fi -} - -do_rm_action() { - booleanBox "remove action" "Are you sure you want to remove action file $1?" - if [ $? = 0 ]; then - rm $1; - fi -} - -do_run() { - backupninja --run $1 - echo "Hit return to continue..." - read -} - -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`" - elif [ -x "`which nano`" ]; then - EDITOR="`which nano`" - elif [ -x "`which vim`" ]; then - EDITOR="`which vim`" - elif [ -x "`which vi`" ]; then - EDITOR="`which vi`" - else - echo "No suitable editor found." - echo "Please define $EDITOR or configure /etc/alternatives/editor." - exit - fi - fi - $EDITOR $1 -} - -do_run_test() { - backupninja --test --run $1 - echo "Hit return to continue..." - read -} - -do_disable() { - mv $1 $1.disabled -} - -do_enable() { - mv $1 ${1%.*} -} - -do_rename() { - dir=`dirname $1` - filename=`basename $1` - inputBox "rename action" "enter a new filename" $filename - mv $dir/$filename $dir/$REPLY -} - -doaction() { - action=$1 - base=`basename $action` - if [ "${base##*.}" == "disabled" ]; then - enable="enable"; - else - enable="disable"; - fi - while true; do - menuBox "action menu" "$action $first" \ - main "return to main menu" \ - view "view configuration" \ - xedit "launch external editor" \ - $enable "$enable action" \ - name "change the filename" \ - run "run this action now" \ - test "do a test run" \ - kill "remove this action" - [ $? = 1 ] && return; - result="$REPLY" - case "$result" in - "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;; - "kill") do_rm_action $action; return;; - "main") return;; - esac - done -} - -##################################################### -## begin program - -if [ ! -x "`which dialog`" ]; then - echo "ninjahelper is a menu based wizard for backupninja." - echo "It requires 'dialog' in order to run. Do you want to install dialog now?" - while true; do - echo -n "(yes/no): " - read install - if [ "$install" == "yes" ]; then - apt-get install dialog - break - elif [ "$install" == "no" ]; then - exit - else - echo "You must answer 'yes' or 'no'" - fi - done -fi - -# bootstrap -conffile="@CFGDIR@/backupninja.conf" -if [ ! -r "$conffile" ]; then - echo "Configuration file $conffile not found." - exit 1 -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." - exit 1 - fi -else - if [ ! -d "$libdirectory" ]; then - echo "Lib directory $libdirectory not found." - exit 1 - fi -fi - -# include shared functions -. $libdirectory/easydialog -. $libdirectory/tools -. $libdirectory/vserver - -# am I running as root? -if [ "$UID" != "0" ]; then - msgBox "warning" "`basename $0` must be run by root!" - exit 1 -fi - -# get global config options (second param is the default) -setfile $conffile -getconf configdirectory @CFGDIR@/backup.d -if [ ! -d $configdirectory ]; then - msgBox "warning" "The backupninja configuration directory $configdirectory does not exist. Ninjahelper cannot run without it!" - exit 1 -fi -getconf scriptdirectory @datadir@ - -# load all the helpers -HELPERS="" -for file in `find $scriptdirectory -follow -name '*.helper'`; do - . $file - if [ $? != 0 ]; then - echo "An error occurred while loading $file. Hit return to continue." - read - fi -done - -setApplicationTitle "ninjahelper" -setDimension 75 19 - -##################################################### -## main event loop - -while true; do - -menulist= -action= -let "i = 1" -for file in `find ${configdirectory} -follow -mindepth 1 -maxdepth 1 -type f ! -name '.*.swp' | sort -n`; do - menulist="$menulist $i $file" - actions[$i]=$file - let "i += 1" -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" - -[ $? = 1 -o $? = 255 ] && exit 0; - -choice="$REPLY" -if [ "$choice" == "new" ]; then - donew; -elif [ "$choice" == "quit" ]; then - exit 0; -else - action=${actions[$choice]}; - if [ -f "$action" ]; then - doaction $action - else - msgBox "error" "error: cannot find the file '$action'" - fi -fi - -done diff --git a/src/ninjareport.in b/src/ninjareport.in deleted file mode 100755 index b68efb8..0000000 --- a/src/ninjareport.in +++ /dev/null @@ -1,205 +0,0 @@ -#!@BASH@ -# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*- -# -# -# Ninjareport - generate a single simple report for a lot of hosts -# -# requires logtail -# -# Copyright (C) 2007 - riseup.net -- property is theft. - -# TODO: -# -# . 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 -# one doesn't then warn -# . restrict rsync somehow? -# . abstract path for logtail -# . on the report master, the reportdirectory should be set where the reports will be going, note this - -mail=1 -display=0 - -process() { - -# look in the logfile for any lines like the following: -# Jan 20 01:02:46 Info: FINISHED: 2 actions run. 0 fatal. 0 error. 0 warning. -# -# 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 -# 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! - -# The following has to be done without invoking a subshell (see BashFAQ #24) -logupdates=`maketemp ninjadata` - -/usr/sbin/logtail -f $host > $logupdates -grep FINISHED $logupdates | -( - 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 -) - -} - -generatereport() { - -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 -fi - -} - -usage() { - 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 - -EOF -} - -##################################################### -## MAIN - -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 - -## Load and confirm basic configuration values - -# bootstrap -if [ ! -r "$conffile" ]; then - 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." - exit 1 - fi -else - if [ ! -d "$libdirectory" ]; then - echo "Lib directory $libdirectory not found." - exit 1 - fi -fi - -# include shared functions -. $libdirectory/tools - -setfile $conffile - -getconf reportdirectory -getconf reportemail - -## Process each configuration file - -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 -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 -done - -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 -fi - -if [ $display == 1 ]; then - cat $reportfile -fi - |