Generalised messaging function¶
Called function¶
finalise: called after generating an error message
Function msg¶
#!/bin/bash <- Does nothing but triggers editor syntax highlighting
# Copyright (C) 2013 Charles Atkinson
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#--------------------------
# Name: msg
# Purpose: generalised messaging interface
# Arguments:
# $1 class: D, E, I or W indicating Debug, Error, Information or Warning
# $2 message text
# $3 logger control. Optional
# If "logger" then also send class I messages with logger (to syslog)
# If "no_logger" then do not also send class W and E messages with
# logger (to syslog).
# Global variables read: none
# Output: information messages to stdout; the rest to stderr
# Returns:
# Does not return (calls finalise) when class is E for error
# Otherwise returns 0
#--------------------------
function msg {
local buf class i logger_flag logger_msg message_text prefix
local -r regex='^(|(logger)|(no_logger))$'
local -r max_logger_chars=100000
# Process arguments
# ~~~~~~~~~~~~~~~~~
class="${1:-}"
message_text="${2:-}"
[[ ! ${3:-} =~ $regex ]] && msg E "Programming error: invalid ${FUNCNAME[0]} third argument '${3:-}' (does not match regex $regex)"
# Class-dependent set-up
# ~~~~~~~~~~~~~~~~~~~~~~
logger_flag=$false
case "$class" in
D )
[[ ! $debugging_flag ]] && return
prefix='DEBUG: '
[[ ${3:-} = logger ]] && logger_flag=$true
;;
E )
error_flag=$true
prefix='ERROR: '
[[ ${3:-} != no_logger ]] && logger_flag=$true
;;
I )
prefix=
[[ ${3:-} = logger ]] && logger_flag=$true
;;
W )
warning_flag=$true
prefix='WARN: '
[[ ${3:-} != no_logger ]] && logger_flag=$true
;;
* )
msg E "msg: invalid class '$class': '$*'"
esac
# Write to syslog
# ~~~~~~~~~~~~~~~
if [[ $logger_flag ]]; then
preamble=<whatever is appropriate for your app>
logger_msg=("$prefix$message_text")
if ((${#logger_msg}>max_logger_chars)); then
unset logger_msg
logger_msg+=("${prefix}Message too big (>$max_logger_chars characters)")
logger_msg+=('The message is split into pieces:')
buf=$message_text
while ((${#buf}>0))
do
logger_msg+=("${buf:0:$max_logger_chars}")
buf=${buf:$max_logger_chars}
done
fi
for ((i=0;i<${#logger_msg[*]};i++))
do
buf=$(logger -t "$preamble" -- "${logger_msg[i]}" 2>&1)
[[ $buf != '' ]] && msg W "${FUNCNAME[0]}: problem writing to syslog: $buf"
done
fi
# Write to stdout or stderr
# ~~~~~~~~~~~~~~~~~~~~~~~~~
# Which is to log if such redirection is set up, as is usual
message_text="$(date "$log_date_format") $prefix$message_text"
if [[ $class = I ]]; then
echo "$message_text"
else
echo "$message_text" >&2
if [[ $class = E ]]; then
[[ ! $finalising_flag ]] && finalise 1
fi
fi
return 0
} # end of function msg