diff --git a/sequencer.sh b/sequencer.sh new file mode 100755 index 0000000..4d476d4 --- /dev/null +++ b/sequencer.sh @@ -0,0 +1,208 @@ +#!/bin/bash + +# Automatic sequence control script + +# +## Start of customization part + +function step_1 { + echo -e "Eins" + cat .nofile + saveReturn $? +} + +function step_2 { + echo -e "Zwei" + endReturn + echo zwo +} + +function step_3 { + echo -e "Drei" + echo drei +} + +function step_10 { + echo -e "Zehn" + echo zehn +} + +function step_11 { + echo -e"Elf" + echo elf +} + +help() { + echo "Usage: ${0##*/} [Options] [Step Number(s)]" + echo + echo " [Options]" + echo " -q : Don't ask for permission to execute next step" + echo " If called without starting step number only this help is shown" + echo + echo " [Step Number(s) 1-255]" + echo " Single step number : starting point of process" + echo " Multiple step numbers : execute only given steps" + echo " execute only one step with using special step 0" + echo " ( e.g. only execute step 4: $0 4 0 )" + echo " Step Documentation" + echo " 1: Step with failure and saveReturn" + echo " 2: Step with endReturn at the beginning" + echo " 3: Regular step without return check (last step when starting with 1 or 2)" + echo + echo " 10: Regular step without return check (staring point for separate sequence)" + echo " 11: Regular step without return check (last step of sequence starting with 10)" +} + +# +## Start of generic script part +## (do not change) + +QUIET=0 +ERNO=0 + +# endCheckEmpty [VariableName] [DESCRIPTION] +# DESCRIPTION : Optional text for error +function endCheckEmpty() { + local errorText=$1 + eval 'local ref=$'$1 + + if [ ! -z "$2" ] ; then + errorText=$2 + fi + if [ -z $ref ] ; then + echo -e "[Error] $errorText must not be empty.\nAborting installation." + exit 666 + fi +} + +function saveReturn() { + if [ $1 -ne 0 ] ; then + ERNO=$1 + fi +} + +# endReturn [-f] +# -f : force exit with $ERNO without user input +function endReturn() { + if [[ ( $ERNO -ne 0 && $QUIET -ne 0 ) || ( $ERNO -ne 0 && ! -z $1 && $1 == "-f" ) ]] ; then + echo + echo -e "[Error] Return value $ERNO detected.\nAborting installation." + exit $ERNO + fi + if [ $ERNO -ne 0 ] ; then + echo + echo "[Error] Return value $ERNO detected." + read -p "End installation: y(default)/n? " answer + case $answer in + [nN]) + echo + echo Continuing installation... + ;; + *) + echo + echo Installation aborted + exit $ERNO; + ;; + esac + fi +} + +# execute [-q] +# -q: don't stop and don't report step functions which cannot be found +# execute given step_ function +function execute() { + local NOTFOUND=0 + local NOREPORT=0 + + if [ $1 == "-q" ] ; then + NOREPORT=1 + shift + fi + + # check if step function exists + declare -F step_$1 &>>/dev/null || NOTFOUND=1 + if [ $NOTFOUND -eq 1 ] && [ $NOREPORT -ne 1 ] ; then + echo "Step $1 not found" + exit 1; + fi + + # don't execute step functions which are not available + if [ $NOTFOUND -eq 1 ] ; then + return $NOTFOUND + fi + + echo -en "\n[STEP $1] " + if [ $QUIET -ne 1 ] ; then + read -p "Start: y/n(default)? " answer + case $answer in + [yY]) + step_$1 $1 + ;; + *) + echo Aborting installation at step $1 + exit 1; + ;; + esac + else + step_$1 $1 + fi +} + +# continous +# (max 255) +# execute installation continously from given starting step +function continous() { + for ((i=$1; i<=255; i++)); do + execute -q $i + local res=$? + if [ $res -ne 0 ] ; then + break; + fi + done +} + +# selection +# execute given step list +# e.g.: selection -q 1 4 12 +function selection() { + for i in $@ ; do + # stop on step 0 + if [ $i -eq 0 ] ; then + break + else + execute $i + fi + done +} + +main() { + # detect if option quiet is available + if [ ! -z "$1" ] && [ $1 == "-q" ] ; then + QUIET=1 + shift + fi + + # display help + if [ -z "$1" ] ; then + help + START=1 + if [ $QUIET -eq 1 ] ; then + exit 1; + fi + else + START=$1 + fi + + # check if more than one step is given and select execution mode + if [ ! -z $2 ] ; then + selection $@ + else + continous $START + fi + + echo + echo "${0##*/} finished" +} + +main "$@" +exit 0;