Files
shell_sequencer/sequencer.sh

226 lines
5.0 KiB
Bash
Executable File

#!/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] <Step Number>
# -q: don't stop and don't report step functions which cannot be found
# execute given step_<Step Number> 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 <Starting Step Number>
# (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 <Step Number List (separated by space)>
# 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;