1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
#!/bin/sh
# vim: set filetype=sh :
# file: /usr/share/shellia/ia.debug
# copyright: Bernd Schumacher <bernd.schumacher@hpe.com> (2007-2020)
# license: GNU General Public License, version 3
# description: ia.debug - debug related functions used by shellia
# Global Variables used:
# TODO
# interactive_already_sourced
#
# Functions used:
# dbcheck
# dbgoff
# dbgon
# dbgtoggle
# interactive
# todo_add
# dbgon = dbgon $dbglevelmax = dbgon $dbglevelmax "empty" => (dbg_run_level=$dbglevelmax dbg_run_names="")
# dbg "txt" = dbg 1 "txt" = dbg x "" "txt" (dbglevel, dbgname) => writes dbg
#x dbgoff => turns dbg off
#x dbgtoggle => dbgon / dbgoff
#x dbg writes to stderr
# dbg output will not be checked by check
# dbg output (exactly what is turned on) will also go to ia_logfile if defined
#x dbg can also be used without ia.interactive lib
# dbg output will be prefixed with "|" and "d" if ia.interactive lib is used
#
# dbg_run_level=0 means dbg is off
# dbg_run_level=$dbglevelmax means print all debug information
# dbg_run_level=x 1<=x<=$dbglevelmax means print only debug information with level<=x
# ia_find_lib <lib>
# example:
# program "/nfs/host1/usr/local/bin/program" with line "ia_source_lib /usr/share/shellia/ia" called
# from directory "/tmp" will try "/tmp/ia", ... "/nfs/host1/usr/share/shellia/ia", ... and
# "/usr/share/shellia/ia" in the listed order.
ia_find_lib()
{
local i
local p
for i in "$@"; do
[ -f "./$(basename "$i")" ] && /bin/echo "./$(basename "$i")" && return 0
p="$0"
while :; do
[ "$p" != "$(dirname p)" ] || break
p="$(dirname "$p")"
[ -f "$p/$i" ] && /bin/echo "$p/$i" && return 0
done
[ -f "$i" ] && /bin/echo "$i" && return 0
return 1
done
}
if [ "${ia_prefix:=ia}" != "ia" ] || [ "${dbg_prefix:=dbg}" != "dbg" ]; then
[ -n "$(eval "/bin/echo \${${ia_prefix}_debug_already_sourced:=}")" ] && return
eval "$(sed -e "s/ia_/${ia_prefix}_/g" -e "s/ia()/${ia_prefix}()/g" \
-e "s/dbg/${dbg_prefix}/g" "$(ia_find_lib /usr/share/shellia/ia.debug)")"
return
fi
[ -n "${ia_debug_already_sourced:=}" ] && return || ia_debug_already_sourced=1
dbglevelmax=999
# redefines dbg to do nothing
dbgoff()
{
dbgtoggle "empty 0"
}
dbgcmd()
{
[ -n "${ia_interactive_already_sourced:=}" ] && ia_logerr "DEBUG $*" || /bin/echo "DEBUG $*" >&2
}
# SYNTAX: dbgintern <dbglevel> <dbgname> <txt>
# SYNTAX: dbgintern <txt> == dbgintern 1 <txt>
# SYNTAX: dbgintern <dbglevel> <txt> == dbgintern <dbglevel> "-" "txt"
# DESCRIPITON (dbglevel, dbgname)
dbgintern()
{
local dbglevel
local dbgname
if [ $# -ge 3 ]; then
dbglevel="$1"
dbgname="$2"
shift 2
elif [ $# -eq 2 ]; then
dbglevel="$1"
dbgname="none"
shift
elif [ $# -eq 1 ]; then
dbglevel="1"
dbgname="none"
else
/bin/echo "SCRIPT-ERROR dbg: Bad number of arguments=<$#> ($*)" >&2
return 1
fi
#ia_dev_dbg "dbgintern dbgname=<$dbgname> dbglevel=<$dbglevel> dbg_run_level=<$dbg_run_level> dbg_run_names=<$dbg_run_names>"
[ -n "$(/bin/echo "$dbglevel" | grep -E "^[0-9]+$")" ] || {
/bin/echo "SCRIPT-ERROR dbg: Bad level=<$dbglevel> topic=<$dbgname> output=<$*>" >&2
return 2
}
[ -n "$dbgname" ] && [ -n "$dbg_run_names" ] && [ -z "$(/bin/echo " $dbg_run_names " | grep -e " $dbgname ")" ] && return
[ "$dbg_run_level" -lt "$dbglevel" ] && return
dbgcmd "$@"
}
# SYNTAX: dbgon "[<name> <name> ...] [<level>]"
# DESCRIPTION: dbgon turns debug on
# dbgon redefines function dbg to print debug messages to stderr, sets global
# variable dbg_run_level to <level> and sets global variable dbg_run_names to <names>.
# dbgon is an abbreviation for: dbgon $dbglevelmax ""
# dbgon <level> is an abbreviation for: dbgon <level> ""
dbgon()
{
dbgtoggle "empty $dbglevelmax $*"
}
# toggles dbg function definition
# SYNTAX: dbgtoggle "[<name> <name> ...] [<level>]"
dbgtoggle()
{
local i
#ia_dev_dbg "dbgtoggle 1=<$1> dbg_run_names=<${dbg_run_names:-}> dbg_run_level=<${dbg_run_level:-}>"
for i in $1; do
if [ -n "$(/bin/echo "$i" | grep "^[0-9]\+$")" ]; then
dbg_run_level=$i
if [ $dbg_run_level -gt 0 ]; then
eval "dbg() { { set +x; } 2>/dev/null; dbgintern \"\$@\"; }"
else
eval "dbg() { { set +x; } 2>/dev/null; }"
fi
else
if [ -z "$(/bin/echo "$i" | grep -e "^[a-zA-Z][a-zA-Z0-9]*$")" ]; then
/bin/echo "WARNING dbgtoggle: ignoring $i because does not match [0-9]+ or [a-zA-Z][a-zA-Z0-9]*" >&2
continue
else
if [ "$i" = "empty" ]; then
dbg_run_names=""
elif [ -n "$(/bin/echo " $dbg_run_names " | grep " $i " )" ]; then
# delete
dbg_run_names="$(/bin/echo "$dbg_run_names $i" | xargs -n1 /bin/echo | grep -v -e "^$i$" | xargs)"
else
# add
dbg_run_names="$(/bin/echo "$dbg_run_names $i" | xargs -n1 /bin/echo | sort -u | grep -v -e "^*$" | xargs)"
fi
fi
fi
done
#ia_dev_dbg "dbgtoggle dbg_run_names=<$dbg_run_names> dbg_run_level=<$dbg_run_level>"
}
dbg_display()
{
dbg_run_names="$(/bin/echo "$dbg_run_names" | xargs -n1 /bin/echo | sort -u | xargs)"
[ -n "$dbg_run_names" ] && /bin/echo "$dbg_run_level $dbg_run_names" || /bin/echo "$dbg_run_level"
}
# initialize dbg
[ -n "${dbg_run_names:=}" ] || :
[ -n "${dbg_run_level:-}" ] && dbgtoggle "${dbg_run_level}" || dbgoff
|