# # This file contains 'scripting' run-time support utility functions. # # NOTE: This file must be "sourced" (not executed). # # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # Low level developer's support utility functions. # # WARNING: No NLS support here. # # # Outputs arguments to "stderr". # _report() { >&2 echo "$@" } _report_error() { _report "INTERNAL ERROR:" "$@" } # # Aborts execution printing diagnostic message. # _abort_execution() { if [ $# -ne 0 ] ; then _report_error "ABORT: '$@', execution aborted" else _report_error "ABORT: execution aborted" fi exit 1 } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # Scripts debugging support. # # # Outputs arguments to "stderr" if "DEBUG_STDERR" environment variable is not # empty. # # Appends arguments to "${DEBUG_LOG_FILE}" file if "DEBUG_LOG_FILE" environment # variable is not empty. # # Appends arguments to "${SCRIPT_LOG_FILE}" file if "SCRIPT_LOG_FILE" # environment variable is not empty. # # Appends arguments to "${PACKAGE_LOG_FILE}" file if "PACKAGE_LOG_FILE" # environment variable is not empty. # log_message() { local LOG_MSG local PID PID="$$" LOG_MSG="${PID} $@" if [ -n "${DEBUG_STDERR}" ] ; then >&2 echo "DEBUG: ${LOG_MSG}" fi if [ -n "${DEBUG_LOG_FILE}" ] ; then >>"${DEBUG_LOG_FILE}" echo "${LOG_MSG}" fi if [ -n "${SCRIPT_LOG_FILE}" ] ; then >>"${SCRIPT_LOG_FILE}" echo "${LOG_MSG}" fi if [ -n "${PACKAGE_LOG_FILE}" ] ; then >>"${PACKAGE_LOG_FILE}" echo "${LOG_MSG}" fi } # # Depending on enabled debug outputs copies everything from "stdin" into one of # "${PACKAGE_LOG_FILE}", "${SCRIPT_LOG_FILE}", "${DEBUG_LOG_FILE}", "stderr" or # simply discards everything. # log_redirected_output() { #log_message "vvvvv redirected_output vvvvv" if [ -n "${PACKAGE_LOG_FILE}" ] ; then >>"${PACKAGE_LOG_FILE}" cat elif [ -n "${SCRIPT_LOG_FILE}" ] ; then >>"${SCRIPT_LOG_FILE}" cat elif [ -n "${DEBUG_LOG_FILE}" ] ; then >>"${DEBUG_LOG_FILE}" cat elif [ -n "${DEBUG_STDERR}" ] ; then >&2 cat else >/dev/null cat fi #log_message "^^^^^ redirected_output ^^^^^" } # # Outputs variable name and value to debug log. # log_variable() { if [ -z "$1" ] ; then _abort_execution "variable name unspecified" ; fi #log_message $(eval echo "${1}=\${${1}}") log_message $(eval echo "\"${1}='\${${1}}'\"") } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # # If "sh" is "bash" then debugging can be a bit more comfortable. # # "${SCRIPTS_DIR}/bash_debugging" contains "bash"-specific # "_abort_execution()", "log_message()", "log_redirected_output()", # "log_variable()" implementations. # if [ -n "${BASH_VERSION}" ] && [ -n "${SCRIPTS_DIR}" ] && [ -r "${SCRIPTS_DIR}/bash_debugging" ] ; then . "${SCRIPTS_DIR}/bash_debugging" fi # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - script_log_init() { local SCRIPT local USER_NAME SCRIPT="$1" ; if [ -z "${SCRIPT}" ] ; then _abort_execution "'SCRIPT' is unspecified" ; fi log_variable SCRIPT USER_NAME="$(id -un)" SCRIPT_LOG_FILE="/tmp/${SCRIPT}_${USER_NAME}.log" log_variable SCRIPT_LOG_FILE export SCRIPT_LOG_FILE rm -f "${SCRIPT_LOG_FILE}" } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Converts possibly relative directory path into absolute form absolute_dir_path() { (cd "$1" && pwd) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log_message "EOF"