+ # This loop simply wants to be fed by a list of values (see below)
+ # made out of 5 columns.
+ # The first four are the array values for the stage function, the
+ # fifth tells us if we should background the stage call.
+ #
+ # - FUNC - the function name to call
+ # - ARGS - Possible arguments to hand to the function. Can be the empty string
+ # - TIME - The timestamp name. Can be the empty string
+ # - ERR - if this is the string false, then the call will be surrounded by
+ # set +e ... set -e calls, so errors in the function do not exit
+ # dinstall. Can be the empty string, meaning true.
+ # - BG - Background the function stage?
+ #
+ # ATTENTION: Spaces in arguments or timestamp names need to be escaped by \
+ #
+ # NOTE 1: There are two special values for the first column (FUNC).
+ # STATE - do not call stage function, call the state
+ # function to update the public statefile "where is dinstall"
+ # NOSTAGE - do not call stage function, call the command directly.
+ #
+ # Note 2: If you want to hand an empty value to the stage function,
+ # use the word "none" in the list below.
+ while read FUNC ARGS TIME ERR BACKGROUND; do
+ debug "FUNC: $FUNC ARGS: $ARGS TIME: $TIME ERR: $ERR BG: $BACKGROUND"
+
+ # Empty values in the value list are the string "none" (or the
+ # while read loop won't work). Here we ensure that variables that
+ # can be empty, are empty if the string none is set for them.
+ for var in ARGS TIME; do
+ if [[ ${!var} == none ]]; then
+ typeset ${var}=''
+ fi
+ done
+
+ # ERR/BACKGROUND are boolean, check that they are.
+ for var in ERR BACKGROUND; do
+ if [[ ${!var} != false ]] && [[ ${!var} != true ]]; then
+ error "Illegal value ${!var} for ${var} (should be true or false), line for function ${FUNC}"
+ fi
+ done
+
+ case ${FUNC} in
+ STATE)
+ state ${ARGS}
+ ;;
+ NOSTAGE)
+ ${ARGS}
+ ;;
+ *)
+ GO=(
+ FUNC=${FUNC}
+ TIME=${TIME}
+ ARGS=${ARGS}
+ ERR=${ERR}
+ )
+ if [[ ${BACKGROUND} == true ]]; then
+ stage $GO &
+ else
+ stage $GO
+ fi
+ ;;
+ esac
+ done < <(grep -v '^#' ${TASKLIST} )
+
+ # we need to wait for the background processes before the end of the cron script
+ wait
+
+
+ # Common to all cron scripts
+ log "Cron script successful, all done"
+ # Redirect output to another file, as we want to compress our logfile
+ # and ensure its no longer used
+ exec > "$logdir/after${PROGRAM}.log" 2>&1
+
+ case ${ARG} in
+ unchecked)