226 lines
5.0 KiB
Bash
Executable File
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;
|