#!/bin/bash ## Sequencer script is doing nothing on its own. It is included by a step definition ## script which uses the sequencer to provide sequencial operations with or without ## user interaction (see template.sh) ## Start of generic script part QUIET=0 ERNO=0 TEMPLATE_NAME=stepTemplateExample.sh function helpSequencer() { 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 )" } # 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 } # Creating a minimal step definition template function createTemplate() { if [ -f $TEMPLATE_NAME ] ; then return 1 fi echo "#!/bin/bash" > $TEMPLATE_NAME echo >> $TEMPLATE_NAME echo "function step_1 {" >> $TEMPLATE_NAME echo " echo \"My custom step one\"" >> $TEMPLATE_NAME echo "}" >> $TEMPLATE_NAME echo >> $TEMPLATE_NAME echo "help() {" >> $TEMPLATE_NAME echo " echo \" Step Documentation\"" >> $TEMPLATE_NAME echo " echo \" 1: My custom step\"" >> $TEMPLATE_NAME echo "}" >> $TEMPLATE_NAME echo >> $TEMPLATE_NAME echo ". $0" >> $TEMPLATE_NAME chmod +x $TEMPLATE_NAME return 0 } # Always display sequencer help and, if available, definition script help function displayHelp() { local NOTFOUND=0 helpSequencer # check if help function exists declare -F help &>>/dev/null || NOTFOUND=1 if [ $NOTFOUND -eq 1 ] ; then echo -e "\n It seems ${0##*/} was called directly." echo -e " Please create a step definition script first.\n" read -p " Create a step definition template now? y/n(default)? " answer case $answer in [yY]) createTemplate if [ $? -eq 0 ] ; then echo -e "\n $TEMPLATE_NAME created." else echo -e "\n $TEMPLATE_NAME exists...Nothing to do!" fi ;; *) echo -e "\n Nothing to do!" ;; esac exit 1; else help fi } main() { # detect if option quiet is available if [ ! -z "$1" ] && [ $1 == "-q" ] ; then QUIET=1 shift fi # display help if [ -z "$1" ] ; then displayHelp 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;