From aa581c5ce104f13ddf74a45b4a3cbebb811c9ed4 Mon Sep 17 00:00:00 2001 From: deajan Date: Wed, 17 Aug 2016 10:00:23 +0200 Subject: [PATCH] Improved batch runner --- dev/common_batch.sh | 183 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100755 dev/common_batch.sh diff --git a/dev/common_batch.sh b/dev/common_batch.sh new file mode 100755 index 0000000..a7fb5bd --- /dev/null +++ b/dev/common_batch.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash +SUBPROGRAM=[prgname] +PROGRAM="$SUBPROGRAM-batch" # Batch program to run osync / obackup instances sequentially and rerun failed ones +AUTHOR="(L) 2013-2016 by Orsiris de Jong" +CONTACT="http://www.netpower.fr - ozy@netpower.fr" +PROGRAM_BUILD=2016081701 + +## Runs an osync /obackup instance for every conf file found +## If an instance fails, run it again if time permits + +## Configuration file path. The path where all the osync / obackup conf files are, usually /etc/osync or /etc/obackup +CONF_FILE_PATH=/etc/$SUBPROGRAM + +## If maximum execution time is not reached, failed instances will be rerun. Max exec time is in seconds. Example is set to 10 hours. +MAX_EXECUTION_TIME=36000 + +## Specifies the number of total runs an instance may get +MAX_RUNS=3 + +## Log file path +if [ -w /var/log ]; then + LOG_FILE=/var/log/$SUBPROGRAM-batch.log +else + LOG_FILE=./$SUBPROGRAM-batch.log +fi + +# No need to edit under this line ############################################################## + +function _logger { + local value="${1}" # What to log + echo -e "$value" >> "$LOG_FILE" +} + +function Logger { + local value="${1}" # What to log + local level="${2}" # Log level: DEBUG, NOTICE, WARN, ERROR, CRITIAL + + prefix="$(date) - " + + if [ "$level" == "CRITICAL" ]; then + _logger "$prefix\e[41m$value\e[0m" + elif [ "$level" == "ERROR" ]; then + _logger "$prefix\e[91m$value\e[0m" + elif [ "$level" == "WARN" ]; then + _logger "$prefix\e[93m$value\e[0m" + elif [ "$level" == "NOTICE" ]; then + _logger "$prefix$value" + elif [ "$level" == "DEBUG" ]; then + if [ "$DEBUG" == "yes" ]; then + _logger "$prefix$value" + fi + else + _logger "\e[41mLogger function called without proper loglevel.\e[0m" + _logger "$prefix$value" + fi +} + +function CheckEnvironment { + ## osync / obackup executable full path can be set here if it cannot be found on the system + if ! type $SUBPROGRAM.sh > /dev/null 2>&1 + then + if [ -f /usr/local/bin/$SUBPROGRAM.sh ] + then + SUBPROGRAM_EXECUTABLE=/usr/local/bin/$SUBPROGRAM.sh + else + Logger "Could not find $SUBPROGRAM.sh" "CRITICAL" + exit 1 + fi + else + SUBPROGRAM_EXECUTABLE=$(type -p $SUBPROGRAM.sh) + fi + + ## Check for CONF_FILE_PATH + if [ ! -d "$CONF_FILE_PATH" ]; then + Logger "Cannot find conf file path $CONF_FILE_PATH" "CRITICAL" + Usage + fi +} + +function Batch { + local runs=0 # Number of batch runs + local runList # Actual conf file list to run + local runAgainList # List of failed conf files sto run again + + local confFile + local result + + ## Get list of .conf files + for confFile in "$CONF_FILE_PATH/*.conf" + do + if [ "$runList" == "" ]; then + runList="$confFile" + else + runList=$runList" $confFile" + fi + done + + while ([ $MAX_EXECUTION_TIME -gt $SECONDS ] || [ $MAX_EXECUTION_TIME -eq 0 ]) && [ "$runList" != "" ] && [ $MAX_RUNS -gt $runs ] + do + Logger "$SUBPROGRAM instances will be run for: $runList" "NOTICE" + for confFile in $runList + do + $SUBPROGRAM_EXECUTABLE "$confFile" $opts & + wait $! + result=$? + if [ $result != 0 ]; then + if [ $result == 1 ] || [ $result == 120 ] || [ $result == 128 ]; then + Logger "Run instance $(basename $confFile) failed with exit code [$result]." "ERROR" + if [ "$runAgainList" == "" ]; then + runAgainList="$confFile" + else + runAgainList=$runAgainList" $confFile" + fi + elif [ $result == 2 ]; then + Logger "Run instance $(basename $confFile) finished with warnings." "WARN" + fi + else + Logger "Run instance $(basename $confFile) succeed." "NOTICE" + fi + done + runList="$runAgainList" + runAgainList="" + runs=$(($runs + 1)) + done +} + +function Usage { + echo "$PROGRAM $PROGRAM_BUILD" + echo $AUTHOR + echo $CONTACT + echo "" + echo "Batch script to sequentially run osync or obackup instances and rerun failed ones." + echo "Usage: $SUBPROGRAM-batch.sh [OPTIONS]" + echo "" + echo "[OPTIONS]" + echo "--path=/path/to/conf Path to osync / obackup conf files, defaults to /etc/osync or /etc/obackup" + echo "--max-reruns=X Number of runs max for failed instances, (defaults to 3)" + echo "--max-exec-time=X Retry failed instances only if max execution time not reached (defaults to 36000 seconds). Set to 0 to bypass execution time check." + echo "--no-maxtime Run osync / obackup without honoring conf file defined timeouts" + echo "--dry Will run osync / obackup without actually doing anything; just testing" + echo "--silent Will run osync / obackup without any output to stdout, used for cron jobs" + echo "--verbose Increases output" + exit 128 +} + +opts="" +for i in "$@" +do + case $i in + --silent) + opts=$opts" --silent" + ;; + --dry) + opts=$opts" --dry" + ;; + --verbose) + opts=$opts" --verbose" + ;; + --no-maxtime) + opts=$opts" --no-maxtime" + ;; + --path=*) + CONF_FILE_PATH=${i##*=} + ;; + --max-reruns=*) + MAX_RERUNS=${i##*=} + ;; + --max-exec-time=*) + MAX_EXECUTION_TIME=${i##*=} + ;; + --help|-h|-?) + Usage + ;; + *) + Logger "Unknown param '$i'" "CRITICAL" + Usage + ;; + esac +done + +CheckEnvironment +Logger "$(date) $SUBPROGRAM batch run" "NOTICE" +Batch