#!/bin/bash -e

##########################################################################################
#### template for bash scripts #### START BELOW ##########################################
##########################################################################################

############################################################################ begin logging
# check if stdout is a terminal...
if test -t 1; then

    # see if it supports colors...
    ncolors=$(tput colors)

    if test -n "$ncolors" && test $ncolors -ge 8; then
        bold="$(tput bold)"
        underline="$(tput smul)"
        standout="$(tput smso)"
        normal="$(tput sgr0)"
        black="$(tput setaf 0)"
        red="$(tput setaf 1)"
        green="$(tput setaf 2)"
        yellow="$(tput setaf 3)"
        blue="$(tput setaf 4)"
        magenta="$(tput setaf 5)"
        cyan="$(tput setaf 6)"
        white="$(tput setaf 7)"
    fi
fi

append_msg() {
    if test $# -ne 0; then
        echo -n ": ${bold}$*"
    fi
    echo "${normal}"
}

# write a message
message() {
    if test $# -eq 0; then
        return
    fi
    echo "${bold}${white}$*${normal}" 1>&2
}

# write a success message
success() {
    echo -n "${bold}${green}success" 1>&2
    append_msg $* 1>&2
}

# write a notice
notice() {
    echo -n "${bold}${yellow}notice" 1>&2
    append_msg $* 1>&2
}

# write a warning message
warning() {
    echo -en "${bold}${red}warning" 1>&2
    append_msg $* 1>&2
}

# write error message
error() {
    echo -en "${bold}${red}error" 1>&2
    append_msg $* 1>&2
}

# run a command, print the result and abort in case of error
# option: --ignore: ignore the result, continue in case of error
run() {
    ignore=1
    while test $# -gt 0; do
        case "$1" in
            (--ignore) ignore=0;;
            (*) break;;
        esac
        shift;
    done
    echo -n "${bold}${yellow}running:${white} $*${normal} … "
    set +e
    result=$($* 2>&1)
    res=$?
    set -e
    if test $res -ne 0; then
        if test $ignore -eq 1; then
            error "failed with return code: $res"
            if test -n "$result"; then
                echo "$result"
            fi
            exit 1
        else
            warning "ignored return code: $res"
        fi
    else
        success
    fi
}

############################################################################ error handler
function traperror() {
    set +x
    local err=($1) # error status
    local line="$2" # LINENO
    local linecallfunc="$3"
    local command="$4"
    local funcstack="$5"
    IFS=" "
    for e in ${err[@]}; do
        if test -n "$e" -a "$e" != "0"; then
            error "line $line - command '$command' exited with status: $e (${err[@]})"
            if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then
                echo -n "   ... error at ${funcstack} " 1>&2
                if [ "$linecallfunc" != "" ]; then
                    echo -n "called at line $linecallfunc" 1>&2
                fi
                echo
            fi
            exit $e
        fi
    done
    success
    exit 0
}

# catch errors
trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT



##########################################################################################
#### START HERE ##########################################################################
##########################################################################################

######################################################### commandline parameter evaluation
while test $# -gt 0; do
    case "$1" in
        (--help|-h) less <<EOF
SYNOPSIS

  $0 [OPTIONS]

OPTIONS

  --help, -h                 show this help

DESCRIPTION

EOF
            exit;;
        (*) error "unknow option $1, try $0 --help"; exit 1;;
    esac
    if test $# -eq 0; then
        error "missing parameter, try $0 --help"; exit 1
    fi
    shift;
done

##################################################################################### Main

