#!/bin/bash if [[ "${DEFAULT_BASH}" != "" ]] then return else declare -g DEFAULT_BASH=1 fi # Global Variable #----------------------------------------------------------------------------------------------------------------------------------- declare -g LOG_FILE="" declare -g LOG_LOCK="" declare -g LOG_ECHO="" declare -g LOG_TRACE="DISABLED" # Default Options #----------------------------------------------------------------------------------------------------------------------------------- shopt -s extglob # Print Version #----------------------------------------------------------------------------------------------------------------------------------- version_print() { echo "$VERSION" | sed -e 's/.*: //' -e 's/-/ /' -e 's/_/\./g' -e 's/\$$//' } # Prin Help #----------------------------------------------------------------------------------------------------------------------------------- help_print() { echo "${NAME} ${HELP}" } # Quote Str #----------------------------------------------------------------------------------------------------------------------------------- quote_str() { local quoted=${1//\'/\'\\\'\'} printf "'%s'" "$quoted" } # Escape Str #----------------------------------------------------------------------------------------------------------------------------------- escape_str() { echo "$*" | sed -e "s/\"/\\\\\"/g" } # Line Echo #----------------------------------------------------------------------------------------------------------------------------------- line_echo() { string="$1" count="$2" echo -en "\e[2K\r" if [[ "${count}" != "" ]] then printf "%05d: %s" "${count}" echo -en "${string}" fi } # Err Echo #----------------------------------------------------------------------------------------------------------------------------------- err_echo() { echo "$@" 1>&2 } # Exec CMD #----------------------------------------------------------------------------------------------------------------------------------- exec_cmd() { cmd="$1" if [[ "${verbose}" == "true" ]] then echo "${cmd}" 1>&2 fi if [[ "${dry_run}" != "true" ]] then eval "${cmd}" fi } #-------------------------------------------------------------------------------------------------------------------------- # tab_assign #-------------------------------------------------------------------------------------------------------------------------- tab_assign() { declare -n ta_tab=$1 ta_key=$2 ta_value=$3 if [[ "${ta_value}" == "-" ]] then ta_value="" fi ta_tab[${ta_key}]="${ta_value}" } #-------------------------------------------------------------------------------------------------------------------------- # var_assign #-------------------------------------------------------------------------------------------------------------------------- var_assign() { declare -n va_var=$1 va_value=$2 va_mode=$3 if [[ "${va_value}" == "-" ]] then va_value="" fi if [[ "${va_mode}" == "INC" ]] then va_var="${va_var} ${va_value}" else va_var="${va_value}" fi } #-------------------------------------------------------------------------------------------------------------------------- # file_dir_init #-------------------------------------------------------------------------------------------------------------------------- file_dir_init() { local File="$1" local Owner="$2" local Group="$3" local dir if [ ! -f ${File} ] then if [[ "$( id -u)" != "0" ]] then ${ECHO} "Can't perform file init of: [${File}] as non root user!" else dir="$( dirname ${File})" if [ ! -d ${dir} ] then ${ECHO} "Initializing directory: [${dir}]" mkdir ${dir} chmod ug+rwx ${dir} chown ${Owner}:${Group} ${dir} fi ${ECHO} "Initializing file: [${File}]" >${File} chmod ug+rw ${File} chown ${Owner}:${Group} ${File} fi fi } #-------------------------------------------------------------------------------------------------------------------------- # file_lock #-------------------------------------------------------------------------------------------------------------------------- file_lock() { local file="$1" local mode="$2" local desc="$3" if [[ ( "${mode}" == "EXCLUSIVE" ) || ( "${mode}" == "WRITE" ) ]] then flag="-x" else flag="-s" fi if [[ "${desc}" == "" ]] then desc="9" fi eval "exec ${desc}<>\"\${file}\"" if ! flock ${flag} -w 5 ${desc} then err_echo "Failed to acquire [${mode}] lock on: [${file}]" exit 1 fi } #-------------------------------------------------------------------------------------------------------------------------- # file_unlock #-------------------------------------------------------------------------------------------------------------------------- file_unlock() { local desc="$1" if [[ "${desc}" == "" ]] then desc="9" fi eval "exec ${desc}<&-" eval "exec ${desc}>&-" } #-------------------------------------------------------------------------------------------------------------------------- # log_set #-------------------------------------------------------------------------------------------------------------------------- log_set() { local log_file="$1" local lock_file="$2" local echo_function="$3" local log_trace="$4" LOG_FILE="${log_file}" LOG_LOCK="${lock_file}" LOG_ECHO="${echo_function}" if [[ ${log_trace} != "" ]] then LOG_TRACE="${log_trace}" fi } #-------------------------------------------------------------------------------------------------------------------------- # log_print #-------------------------------------------------------------------------------------------------------------------------- log_print() { local log_file="$1" local lock_file="$2" local echo_function="$3" local log_type="$4" local log_prefix="$5" shift; shift; shift; shift; shift if [[ "${log_type}" != "TRA" ]] || [[ "${LOG_TRACE}" != "DISABLED" ]] then ${echo_function} "($BASHPID):" "$*" if [[ "${log_file}" != "" ]] then if [[ "${lock_file}" != "" ]] then file_lock "${lock_file}" WRITE 8 fi printf >> "${log_file}" "%s %9s %3s %16s %s\n" "$(date --rfc-3339=seconds -u)" "($BASHPID)" "${log_type}" "${log_prefix}:" "$*" if [[ "${lock_file}" != "" ]] then file_unlock 8 fi fi fi } #-------------------------------------------------------------------------------------------------------------------------- # log_trace #-------------------------------------------------------------------------------------------------------------------------- log_trace() { log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "TRA" "$@" } #-------------------------------------------------------------------------------------------------------------------------- # log_info #-------------------------------------------------------------------------------------------------------------------------- log_info() { log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "INF" "$@" } #-------------------------------------------------------------------------------------------------------------------------- # log_warning #-------------------------------------------------------------------------------------------------------------------------- log_warning() { log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "WRN" "$@" } #-------------------------------------------------------------------------------------------------------------------------- # log_error #-------------------------------------------------------------------------------------------------------------------------- log_error() { log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "ERR" "$@" }