alpha_omega 1.1.1 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/VERSION +1 -1
  2. data/bin/alpha_omega +2 -10
  3. data/lib/alpha_omega/deploy.rb +2 -16
  4. data/libexec/ao +15 -0
  5. data/libexec/ao-activate +22 -0
  6. data/libexec/ao-build +22 -0
  7. data/libexec/ao-check +22 -0
  8. data/libexec/ao-compare +22 -0
  9. data/libexec/ao-cook +22 -0
  10. data/libexec/ao-deploy +22 -0
  11. data/libexec/ao-dist +22 -0
  12. data/libexec/ao-lock +31 -0
  13. data/libexec/ao-migrate +22 -0
  14. data/libexec/ao-plan +22 -0
  15. data/libexec/ao-release +22 -0
  16. data/libexec/ao-restart +22 -0
  17. data/libexec/ao-rollback +22 -0
  18. data/libexec/ao-shell +22 -0
  19. data/libexec/ao-stage +22 -0
  20. data/libexec/ao-task +23 -0
  21. data/libexec/ao-unlock +31 -0
  22. data/sbin/_bump +126 -0
  23. data/sbin/_jason +172 -0
  24. data/sbin/_log4sh +3840 -0
  25. data/sbin/_meat +172 -0
  26. data/sbin/_prime +8 -0
  27. data/sbin/_shflags +1012 -0
  28. data/sbin/_shunit +1048 -0
  29. data/sbin/_sub +37 -0
  30. data/sbin/_treadstone +8 -0
  31. data/sbin/_versions +174 -0
  32. data/sbin/ao +15 -0
  33. data/sbin/stub +15 -0
  34. metadata +31 -57
  35. data/libexec/activate +0 -199
  36. data/libexec/build +0 -30
  37. data/libexec/build.orig +0 -199
  38. data/libexec/bump.orig +0 -32
  39. data/libexec/check +0 -199
  40. data/libexec/compare +0 -199
  41. data/libexec/config +0 -199
  42. data/libexec/debug +0 -199
  43. data/libexec/deploy +0 -199
  44. data/libexec/dist +0 -199
  45. data/libexec/dna +0 -199
  46. data/libexec/hosts +0 -199
  47. data/libexec/invoke +0 -199
  48. data/libexec/lock +0 -199
  49. data/libexec/migrate +0 -199
  50. data/libexec/plan +0 -199
  51. data/libexec/release +0 -199
  52. data/libexec/repl +0 -199
  53. data/libexec/restart +0 -199
  54. data/libexec/rollback +0 -199
  55. data/libexec/shell +0 -199
  56. data/libexec/stage +0 -199
  57. data/libexec/task +0 -199
  58. data/libexec/unlock +0 -199
data/libexec/ao-unlock ADDED
@@ -0,0 +1,31 @@
1
+ #!/bin/bash
2
+
3
+ #/ NAME
4
+ #/ ao-unlock -- unlock a deploy
5
+ #/
6
+ #/ SYNOPSIS
7
+ #/ ao unlock [deploy_set...]
8
+ #/ ao unlock migrate|compare [deploy_set...]
9
+
10
+ # figure out the project root under which bin, lib live
11
+ shome="$(cd -P -- "$(dirname -- "$BASH_SOURCE")/.." && pwd -P)"
12
+
13
+ # load a jason bourne library
14
+ source "$shome/sbin/_treadstone"
15
+
16
+ # parse the command-line
17
+
18
+ # entry point
19
+ function main {
20
+ case "${1}" in
21
+ compare|migrate)
22
+ nm_lock="${1}"; shift
23
+ bundle exec cap "$@" "deploy:unlock_${nm_lock}"
24
+ ;;
25
+ *)
26
+ bundle exec cap "$@" deploy:unlock
27
+ ;;
28
+ esac
29
+ }
30
+
31
+ require 'sub' "$BASH_SOURCE" "$@"
data/sbin/_bump ADDED
@@ -0,0 +1,126 @@
1
+ #!/bin/bash
2
+
3
+ function bump_version {
4
+ local dirty="$1"; shift
5
+
6
+ if [[ "$dirty" = "$FLAGS_FALSE" ]]; then
7
+ ensure_clean_git_status
8
+ fi
9
+
10
+ local_file=
11
+ if [[ -f VERSION || -L VERSION ]]; then
12
+ local_file=1
13
+ if [[ ! -e VERSION ]]; then
14
+ logger_fatal "cannot write to VERSION file"
15
+ exit 1
16
+ fi
17
+ fi
18
+
19
+ tmp_version=$(mktemp -t XXXXXXXXX)
20
+ if [[ -n $local_file ]]; then
21
+ cat VERSION | perl -ne 'm{^\s*v?(\d+)\.(\d+)\.(\d+)\s*$} && printf("%03d.%03d.%03d %d.%d.%d\n",$1,$2,$3,$1,$2,$3)' | sort -r | head -1 | awk '{print $2}' > $tmp_version
22
+ else
23
+ git tag | perl -ne 'm{^v(\d+)\.(\d+)\.(\d+)$} && printf("%03d.%03d.%03d %d.%d.%d\n",$1,$2,$3,$1,$2,$3)' | sort -r | head -1 | awk '{print $2}' > $tmp_version
24
+ fi
25
+
26
+ if [[ ! -s "$tmp_version" ]]; then
27
+ logger_fatal "need at least one git tag (in the form v0.0.0) or a version in file VERSION (in the form 0.0.0)"
28
+ exit 1
29
+ fi
30
+
31
+ case "$1" in
32
+ patch|minor|major)
33
+ bump=$1; shift
34
+ set -- $(cat $tmp_version | sed 's#\.# #g')
35
+ case "$bump" in
36
+ patch)
37
+ echo "$1.$2.$(($3 + 1))"
38
+ ;;
39
+ minor)
40
+ echo "$1.$(($2 + 1)).0"
41
+ ;;
42
+ major)
43
+ echo "$(($1 + 1)).0.0"
44
+ ;;
45
+ esac > $tmp_version
46
+ ;;
47
+ *)
48
+ ver_new=$1; shift
49
+ ver_new=${ver_new#v}
50
+ echo $ver_new > $tmp_version
51
+ ;;
52
+ esac
53
+
54
+ ver_new=$(cat $tmp_version)
55
+ set -- $(echo "$ver_new" | sed 's#\.# #g') 0
56
+ M=$1; shift
57
+ m=$1; shift
58
+ p=$1; shift
59
+
60
+ (echo "$(($M+0)).$(($m+0)).$(($p+0))" > $tmp_version) 2>&-
61
+ ver_new_same=$(cat $tmp_version)
62
+
63
+ if [[ $ver_new != $ver_new_same ]]; then
64
+ logger_fatal "invalid version: $ver_new"
65
+ exit 1
66
+ fi
67
+
68
+ ver_bumped="v$(cat $tmp_version)"
69
+ rm -f $tmp_version
70
+ ensure_git_tag_available $ver_bumped
71
+
72
+ if [[ -n $local_file ]]; then
73
+ echo ${ver_bumped#v} > VERSION
74
+ git add VERSION
75
+ if [[ -f Gemfile ]]; then
76
+ bundle check 2>&1 >/dev/null || { bundle --quiet install --local --path vendor/bundle || bundle check > /dev/null; }
77
+ git add Gemfile.lock
78
+ fi
79
+
80
+ git commit -m "bump: $ver_bumped"
81
+ git push
82
+ fi
83
+
84
+ git_tag "$ver_bumped"
85
+ echo $ver_bumped
86
+ }
87
+
88
+ function ensure_git_tag_available {
89
+ version=$1; shift
90
+ git fetch --tags
91
+ remote_sha=$(git ls-remote origin $version | awk '{print $1}')
92
+ if [[ -n $remote_sha ]]; then
93
+ logger_fatal "already a remote tag $version, bump again"
94
+ exit 1
95
+ fi
96
+
97
+ local_sha=$(git show-ref $version | awk '{print $1}')
98
+ if [[ -n $local_sha ]]; then
99
+ logger_fatal "already a local tag $version"
100
+ exit 1
101
+ fi
102
+ }
103
+
104
+ function git_tag {
105
+ local version=$1; shift
106
+
107
+ ensure_git_tag_available "$version"
108
+
109
+ git tag $version
110
+ git push origin tag $version
111
+ remote_sha=$(git ls-remote origin $version | awk '{print $1}')
112
+ local_sha=$(git show-ref $version | awk '{print $1}')
113
+ if [[ $remote_sha != $local_sha ]]; then
114
+ logger_fatal "remote tag $version does not match local SHA"
115
+ exit 1
116
+ fi
117
+ }
118
+
119
+ function ensure_clean_git_status {
120
+ local lines=$(git status -s -uno | wc -l | awk '{print $1}')
121
+ if [[ $lines != "0" ]]; then
122
+ logger_fatal "git status is not clean, cannot tag"
123
+ git status -s -uno
124
+ exit 1
125
+ fi
126
+ }
data/sbin/_jason ADDED
@@ -0,0 +1,172 @@
1
+ #!/bin/bash
2
+
3
+ : ${__meat__:=x}
4
+ if [[ "$__meat__" != 'x' ]]; then
5
+ return 0
6
+ fi
7
+ __meat__='y'
8
+
9
+ if [[ -z "${shome:-}" ]]; then
10
+ shome="$(cd -P -- "$(dirname -- "${BASH_SOURCE}")/.." && pwd -P)"
11
+ fi
12
+
13
+ function get_started {
14
+ # if getting-started bootstrap is detected, put this in the path
15
+ # mainly useful for getopt on os x
16
+ if [[ -d "$HOME/.getting-started/bootstrap" ]]; then
17
+ PATH="$HOME/.getting-started/bootstrap:$PATH"
18
+ hash -r
19
+ fi
20
+ }
21
+
22
+ function check_help {
23
+ # taken from shocco
24
+ if expr -- "$*" : ".*--help" >/dev/null; then
25
+ display_help
26
+ exit 0
27
+ fi
28
+ }
29
+
30
+ function display_help {
31
+ flags_help
32
+ echo
33
+
34
+ # taken from shocco
35
+ grep '^#/' <"$shome/$(basename $(dirname -- "$0"))/$(basename -- "$0")" | cut -c4-
36
+ }
37
+
38
+ # Exits the script with the last error code. Servers as a marker in $0 to
39
+ # begin ronn documentation until end of file.
40
+ function __MAN__ {
41
+ exit "$!"
42
+ }
43
+
44
+ # Extracts ronn-style Markdown after __MAN__ to stdout. If a line is "MAN", it
45
+ # is assumed that a here document is used (for syntactical reasons).
46
+ #
47
+ # A limitation of detecting "MAN" will truncate the Markdown if "MAN" is a
48
+ # legimate text.
49
+ #
50
+ # __MAN__ << "MAN"
51
+ # raw ronn-style Markdown
52
+ # MAN
53
+ function display_man {
54
+ awk '/^__MAN__/,/^MAN$/ {print}' <"$shome/sbin/$(basename -- "$0")" | tail -n +2 | egrep -v '^MAN$'
55
+ }
56
+
57
+ function display_synopsis {
58
+ awk '/^#/ && !/^#!/ { print } /^[^#]/ || /^$/ { exit }' <"$shome/sbin/$(basename -- "$0")" | cut -c3-
59
+ }
60
+
61
+ function which_library {
62
+ local library="$1"; shift
63
+ if [[ -r "$shome/sbin/_$library" ]]; then
64
+ echo "$shome/sbin/_$library"
65
+ elif [[ -r "$shome/.$library/bin/_profile" ]]; then
66
+ echo "$shome/.$library/bin/_profile"
67
+ elif [[ -r "$shome/.$library/.profile" ]]; then
68
+ echo "$shome/.$library/.profile"
69
+ else
70
+ local nm_library="${library%%/*}"
71
+ if [[ "$nm_library" != "$library" ]]; then
72
+ local nm_right="${library##*/}"
73
+ if [[ -r "$shome/.$nm_library/bin/_$nm_right" ]]; then
74
+ echo "$shome/.$nm_library/bin/_$nm_right"
75
+ fi
76
+ fi
77
+ fi
78
+ }
79
+
80
+ function require {
81
+ local nm_library="$1"; shift
82
+ local pth_lib="$(which_library "$nm_library")"
83
+ if [[ -r "$pth_lib" ]]; then
84
+ if [[ "$#" == 0 ]]; then
85
+ set --
86
+ fi
87
+ source "$pth_lib" "$@"
88
+ fi
89
+ }
90
+
91
+ function parse_command_line {
92
+ if [[ "$FLAGS_SUB" = "$FLAGS_TRUE" && "$@" > 0 ]]; then
93
+ local argv
94
+ declare -a argv
95
+
96
+ local argc="0"
97
+ local arg
98
+ local passthrough=
99
+ for arg in "$@"; do
100
+ if [[ -z "$passthrough" && ! "$arg" =~ ^- ]]; then
101
+ argv[argc]="--"
102
+ argc="$((argc + 1))"
103
+ passthrough=1
104
+ fi
105
+
106
+ argv[argc]="$arg"
107
+ argc="$((argc + 1))"
108
+ done
109
+
110
+ set -- "${argv[@]}"
111
+ fi
112
+
113
+ if ! FLAGS "$@"; then
114
+ if [[ "$flags_error" = "help requested" ]]; then
115
+ echo ""
116
+ display_help
117
+ exit 0
118
+ fi
119
+
120
+ return 4
121
+ fi
122
+ return 0
123
+ }
124
+
125
+ function configure_logging {
126
+ # load log4sh (disabling properties file warning) and clear the default
127
+ # configuration
128
+ LOG4SH_CONFIGURATION='none' require 'log4sh'
129
+ log4sh_resetConfiguration
130
+
131
+ # set the global logging level to INFO
132
+ logger_setLevel INFO
133
+
134
+ # add and configure a FileAppender that outputs to STDERR, and activate the
135
+ # configuration
136
+ logger_addAppender stderr
137
+ appender_setType stderr FileAppender
138
+ appender_file_setFile stderr STDERR
139
+ appender_activateOptions stderr
140
+ }
141
+
142
+ function ryaml {
143
+ ruby -ryaml -e 'def ps x; unless x.nil?; puts x; end; end; ps ARGV[1..-1].inject(YAML.load(File.read(ARGV[0]))) {|acc, key| acc[key] }' "$@" 2>&-
144
+ }
145
+
146
+ function random_str {
147
+ echo "$(date +%s).$$.$RANDOM"
148
+ }
149
+
150
+ function runmany {
151
+ local cpu="$1"; shift
152
+ local args="$1"; shift
153
+ if [[ "$#" = 0 ]]; then
154
+ cat
155
+ else
156
+ echo "$@"
157
+ fi | xargs -P $cpu -n $args -- bash -c "$*" ""
158
+ }
159
+
160
+ function _main {
161
+ if [[ -z "$shome" ]]; then
162
+ shome="$(cd -P -- "$(dirname -- "${BASH_SOURCE}")/.." && pwd -P)"
163
+ fi
164
+
165
+ require 'shflags'
166
+
167
+ configure_logging
168
+
169
+ PATH="$shome/sbin:$PATH"
170
+ }
171
+
172
+ _main "$@"
data/sbin/_log4sh ADDED
@@ -0,0 +1,3840 @@
1
+ # $Id: log4sh 574 2007-06-02 20:09:15Z sfsetse $
2
+ # vim:syntax=sh:sts=2
3
+ # vim:foldmethod=marker:foldmarker=/**,*/
4
+ #
5
+ #/**
6
+ # <?xml version="1.0" encoding="UTF-8"?>
7
+ # <s:shelldoc xmlns:s="http://www.forestent.com/2005/XSL/ShellDoc">
8
+ # <s:header>
9
+ # log4sh 1.4.2
10
+ #
11
+ # http://log4sh.sourceforge.net/
12
+ #
13
+ # written by Kate Ward &lt;kate.ward@forestent.com>
14
+ # released under the LGPL
15
+ #
16
+ # this module implements something like the log4j module from the Apache group
17
+ #
18
+ # notes:
19
+ # *) the default appender is a ConsoleAppender named stdout with a level
20
+ # of ERROR and layout of SimpleLayout
21
+ # *) the appender levels are as follows (decreasing order of output):
22
+ # TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
23
+ # </s:header>
24
+ #*/
25
+
26
+ # shell flags for log4sh:
27
+ # u - treat unset variables as an error when performing parameter expansion
28
+ __LOG4SH_SHELL_FLAGS='u'
29
+
30
+ # save the current set of shell flags, and then set some for log4sh
31
+ __log4sh_oldShellFlags=$-
32
+ for _log4sh_shellFlag in `echo "${__LOG4SH_SHELL_FLAGS}" |sed 's/\(.\)/\1 /g'`
33
+ do
34
+ set -${_log4sh_shellFlag}
35
+ done
36
+
37
+ #
38
+ # constants
39
+ #
40
+ __LOG4SH_VERSION='1.4.2'
41
+
42
+ __LOG4SH_TRUE=0
43
+ __LOG4SH_FALSE=1
44
+ __LOG4SH_ERROR=2
45
+ __LOG4SH_NULL='~'
46
+
47
+ __LOG4SH_APPENDER_FUNC_PREFIX='_log4sh_app_'
48
+ __LOG4SH_APPENDER_INCLUDE_EXT='.inc'
49
+
50
+ __LOG4SH_TYPE_CONSOLE='ConsoleAppender'
51
+ __LOG4SH_TYPE_DAILY_ROLLING_FILE='DailyRollingFileAppender'
52
+ __LOG4SH_TYPE_FILE='FileAppender'
53
+ __LOG4SH_TYPE_ROLLING_FILE='RollingFileAppender'
54
+ __LOG4SH_TYPE_ROLLING_FILE_MAX_BACKUP_INDEX=1
55
+ __LOG4SH_TYPE_ROLLING_FILE_MAX_FILE_SIZE=10485760
56
+ __LOG4SH_TYPE_SMTP='SMTPAppender'
57
+ __LOG4SH_TYPE_SYSLOG='SyslogAppender'
58
+ __LOG4SH_TYPE_SYSLOG_FACILITY_NAMES=' kern user mail daemon auth security syslog lpr news uucp cron authpriv ftp local0 local1 local2 local3 local4 local5 local6 local7 '
59
+ __LOG4SH_TYPE_SYSLOG_FACILITY='user'
60
+
61
+ __LOG4SH_LAYOUT_HTML='HTMLLayout'
62
+ __LOG4SH_LAYOUT_SIMPLE='SimpleLayout'
63
+ __LOG4SH_LAYOUT_PATTERN='PatternLayout'
64
+
65
+ __LOG4SH_LEVEL_TRACE=0
66
+ __LOG4SH_LEVEL_TRACE_STR='TRACE'
67
+ __LOG4SH_LEVEL_DEBUG=1
68
+ __LOG4SH_LEVEL_DEBUG_STR='DEBUG'
69
+ __LOG4SH_LEVEL_INFO=2
70
+ __LOG4SH_LEVEL_INFO_STR='INFO'
71
+ __LOG4SH_LEVEL_WARN=3
72
+ __LOG4SH_LEVEL_WARN_STR='WARN'
73
+ __LOG4SH_LEVEL_ERROR=4
74
+ __LOG4SH_LEVEL_ERROR_STR='ERROR'
75
+ __LOG4SH_LEVEL_FATAL=5
76
+ __LOG4SH_LEVEL_FATAL_STR='FATAL'
77
+ __LOG4SH_LEVEL_OFF=6
78
+ __LOG4SH_LEVEL_OFF_STR='OFF'
79
+ __LOG4SH_LEVEL_CLOSED=255
80
+ __LOG4SH_LEVEL_CLOSED_STR='CLOSED'
81
+
82
+ __LOG4SH_PATTERN_DEFAULT='%d %p - %m%n'
83
+ __LOG4SH_THREAD_DEFAULT='main'
84
+
85
+ __LOG4SH_CONFIGURATION="${LOG4SH_CONFIGURATION:-log4sh.properties}"
86
+ __LOG4SH_CONFIG_PREFIX="${LOG4SH_CONFIG_PREFIX:-log4sh}"
87
+ __LOG4SH_CONFIG_LOG4J_CP='org.apache.log4j'
88
+
89
+ # the following IFS is *supposed* to be on two lines!!
90
+ __LOG4SH_IFS_ARRAY="
91
+ "
92
+ __LOG4SH_IFS_DEFAULT=' '
93
+
94
+ __LOG4SH_SECONDS=`eval "expr \`date '+%H \* 3600 + %M \* 60 + %S'\`"`
95
+
96
+ # configure log4sh debugging. set the LOG4SH_INFO environment variable to any
97
+ # non-empty value to enable info output, LOG4SH_DEBUG enable debug output, or
98
+ # LOG4SH_TRACE to enable trace output. log4sh ERROR and above messages are
99
+ # always printed. to send the debug output to a file, set the LOG4SH_DEBUG_FILE
100
+ # with the filename you want debug output to be written to.
101
+ __LOG4SH_TRACE=${LOG4SH_TRACE:+'_log4sh_trace '}
102
+ __LOG4SH_TRACE=${__LOG4SH_TRACE:-':'}
103
+ [ -n "${LOG4SH_TRACE:-}" ] && LOG4SH_DEBUG=1
104
+ __LOG4SH_DEBUG=${LOG4SH_DEBUG:+'_log4sh_debug '}
105
+ __LOG4SH_DEBUG=${__LOG4SH_DEBUG:-':'}
106
+ [ -n "${LOG4SH_DEBUG:-}" ] && LOG4SH_INFO=1
107
+ __LOG4SH_INFO=${LOG4SH_INFO:+'_log4sh_info '}
108
+ __LOG4SH_INFO=${__LOG4SH_INFO:-':'}
109
+
110
+ # set the constants to readonly
111
+ for _log4sh_const in `set |grep "^__LOG4SH_" |cut -d= -f1`; do
112
+ readonly ${_log4sh_const}
113
+ done
114
+ unset _log4sh_const
115
+
116
+ #
117
+ # internal variables
118
+ #
119
+
120
+ __log4sh_filename=`basename -- $0`
121
+ __log4sh_tmpDir=''
122
+ __log4sh_trapsFile=''
123
+
124
+ __log4sh_alternative_mail='mail'
125
+
126
+ __log4sh_threadName=${__LOG4SH_THREAD_DEFAULT}
127
+ __log4sh_threadStack=${__LOG4SH_THREAD_DEFAULT}
128
+
129
+ __log4sh_seconds=0
130
+ __log4sh_secondsLast=0
131
+ __log4sh_secondsWrap=0
132
+
133
+ # workarounds for various commands
134
+ __log4sh_wa_strictBehavior=${__LOG4SH_FALSE}
135
+ (
136
+ # determine if the set builtin needs to be evaluated. if the string is parsed
137
+ # into two separate strings (common in ksh), then set needs to be evaled.
138
+ str='x{1,2}'
139
+ set -- ${str}
140
+ test ! "$1" = 'x1' -a ! "${2:-}" = 'x2'
141
+ )
142
+ __log4sh_wa_setNeedsEval=$?
143
+
144
+
145
+ #=============================================================================
146
+ # Log4sh
147
+ #
148
+
149
+ #-----------------------------------------------------------------------------
150
+ # internal debugging
151
+ #
152
+
153
+ #/**
154
+ # <s:function group="Log4sh" modifier="private">
155
+ # <entry align="right">
156
+ # <emphasis>void</emphasis>
157
+ # </entry>
158
+ # <entry>
159
+ # <funcsynopsis>
160
+ # <funcprototype>
161
+ # <funcdef><function>_log4sh_log</function></funcdef>
162
+ # <paramdef>string <parameter>level</parameter></paramdef>
163
+ # </funcprototype>
164
+ # </funcsynopsis>
165
+ # <para>
166
+ # This is an internal debugging function. It should not be called.
167
+ # </para>
168
+ # <funcsynopsis>
169
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
170
+ # </funcsynopsis>
171
+ # </entry>
172
+ # </s:function>
173
+ #*/
174
+ _log4sh_log()
175
+ {
176
+ _ll__level=$1
177
+ shift
178
+ if [ -z "${LOG4SH_DEBUG_FILE:-}" ]; then
179
+ echo "log4sh:${_ll__level} $@" >&2
180
+ else
181
+ echo "${_ll__level} $@" >>${LOG4SH_DEBUG_FILE}
182
+ fi
183
+ unset _ll__level
184
+ }
185
+
186
+ #/**
187
+ # <s:function group="Log4sh" modifier="private">
188
+ # <entry align="right">
189
+ # <emphasis>void</emphasis>
190
+ # </entry>
191
+ # <entry>
192
+ # <funcsynopsis>
193
+ # <funcprototype>
194
+ # <funcdef><function>_log4sh_trace</function></funcdef>
195
+ # <paramdef>string <parameter>level</parameter></paramdef>
196
+ # </funcprototype>
197
+ # </funcsynopsis>
198
+ # <para>
199
+ # This is an internal debugging function. It should not be called.
200
+ # </para>
201
+ # <funcsynopsis>
202
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
203
+ # </funcsynopsis>
204
+ # </entry>
205
+ # </s:function>
206
+ #*/
207
+ _log4sh_trace()
208
+ {
209
+ _log4sh_log "${__LOG4SH_LEVEL_TRACE_STR}" "${BASH_LINENO:+(${BASH_LINENO}) }- $@";
210
+ }
211
+
212
+ #/**
213
+ # <s:function group="Log4sh" modifier="private">
214
+ # <entry align="right">
215
+ # <emphasis>void</emphasis>
216
+ # </entry>
217
+ # <entry>
218
+ # <funcsynopsis>
219
+ # <funcprototype>
220
+ # <funcdef><function>_log4sh_debug</function></funcdef>
221
+ # <paramdef>string <parameter>level</parameter></paramdef>
222
+ # </funcprototype>
223
+ # </funcsynopsis>
224
+ # <para>
225
+ # This is an internal debugging function. It should not be called.
226
+ # </para>
227
+ # <funcsynopsis>
228
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
229
+ # </funcsynopsis>
230
+ # </entry>
231
+ # </s:function>
232
+ #*/
233
+ _log4sh_debug()
234
+ {
235
+ _log4sh_log "${__LOG4SH_LEVEL_DEBUG_STR}" "${BASH_LINENO:+(${BASH_LINENO}) }- $@";
236
+ }
237
+
238
+ #/**
239
+ # <s:function group="Log4sh" modifier="private">
240
+ # <entry align="right">
241
+ # <emphasis>void</emphasis>
242
+ # </entry>
243
+ # <entry>
244
+ # <funcsynopsis>
245
+ # <funcprototype>
246
+ # <funcdef><function>_log4sh_info</function></funcdef>
247
+ # <paramdef>string <parameter>level</parameter></paramdef>
248
+ # </funcprototype>
249
+ # </funcsynopsis>
250
+ # <para>
251
+ # This is an internal debugging function. It should not be called.
252
+ # </para>
253
+ # <funcsynopsis>
254
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
255
+ # </funcsynopsis>
256
+ # </entry>
257
+ # </s:function>
258
+ #*/
259
+ _log4sh_info()
260
+ {
261
+ _log4sh_log "${__LOG4SH_LEVEL_INFO_STR}" "${BASH_LINENO:+(${BASH_LINENO}) }- $@";
262
+ }
263
+
264
+ #/**
265
+ # <s:function group="Log4sh" modifier="private">
266
+ # <entry align="right">
267
+ # <emphasis>void</emphasis>
268
+ # </entry>
269
+ # <entry>
270
+ # <funcsynopsis>
271
+ # <funcprototype>
272
+ # <funcdef><function>_log4sh_warn</function></funcdef>
273
+ # <paramdef>string <parameter>level</parameter></paramdef>
274
+ # </funcprototype>
275
+ # </funcsynopsis>
276
+ # <para>
277
+ # This is an internal debugging function. It should not be called.
278
+ # </para>
279
+ # <funcsynopsis>
280
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
281
+ # </funcsynopsis>
282
+ # </entry>
283
+ # </s:function>
284
+ #*/
285
+ _log4sh_warn()
286
+ {
287
+ echo "log4sh:${__LOG4SH_LEVEL_WARN_STR} $@" >&2
288
+ [ -n "${LOG4SH_DEBUG_FILE:-}" ] \
289
+ && _log4sh_log "${__LOG4SH_LEVEL_WARN_STR}" "$@"
290
+ }
291
+
292
+ #/**
293
+ # <s:function group="Log4sh" modifier="private">
294
+ # <entry align="right">
295
+ # <emphasis>void</emphasis>
296
+ # </entry>
297
+ # <entry>
298
+ # <funcsynopsis>
299
+ # <funcprototype>
300
+ # <funcdef><function>_log4sh_error</function></funcdef>
301
+ # <paramdef>string <parameter>level</parameter></paramdef>
302
+ # </funcprototype>
303
+ # </funcsynopsis>
304
+ # <para>
305
+ # This is an internal debugging function. It should not be called.
306
+ # </para>
307
+ # <funcsynopsis>
308
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
309
+ # </funcsynopsis>
310
+ # </entry>
311
+ # </s:function>
312
+ #*/
313
+ _log4sh_error()
314
+ {
315
+ echo "log4sh:${__LOG4SH_LEVEL_ERROR_STR} $@" >&2
316
+ [ -n "${LOG4SH_DEBUG_FILE:-}" ] \
317
+ && _log4sh_log "${__LOG4SH_LEVEL_ERROR_STR}" "$@"
318
+ }
319
+
320
+ #/**
321
+ # <s:function group="Log4sh" modifier="private">
322
+ # <entry align="right">
323
+ # <emphasis>void</emphasis>
324
+ # </entry>
325
+ # <entry>
326
+ # <funcsynopsis>
327
+ # <funcprototype>
328
+ # <funcdef><function>_log4sh_fatal</function></funcdef>
329
+ # <paramdef>string <parameter>level</parameter></paramdef>
330
+ # </funcprototype>
331
+ # </funcsynopsis>
332
+ # <para>
333
+ # This is an internal debugging function. It should not be called.
334
+ # </para>
335
+ # <funcsynopsis>
336
+ # <funcsynopsisinfo>_log4sh_log</funcsynopsisinfo>
337
+ # </funcsynopsis>
338
+ # </entry>
339
+ # </s:function>
340
+ #*/
341
+ _log4sh_fatal()
342
+ {
343
+ echo "log4sh:${__LOG4SH_LEVEL_FATAL_STR} $@" >&2
344
+ [ -n "${LOG4SH_DEBUG_FILE:-}" ] \
345
+ && _log4sh_log "${__LOG4SH_LEVEL_FATAL_STR}" "$@"
346
+ }
347
+
348
+ #-----------------------------------------------------------------------------
349
+ # miscellaneous
350
+ #
351
+
352
+ #/**
353
+ # <s:function group="Log4sh" modifier="private">
354
+ # <entry align="right">
355
+ # <code>string</code>
356
+ # </entry>
357
+ # <entry>
358
+ # <funcsynopsis>
359
+ # <funcprototype>
360
+ # <funcdef><function>_log4sh_mktempDir</function></funcdef>
361
+ # <void />
362
+ # </funcprototype>
363
+ # </funcsynopsis>
364
+ # <para>
365
+ # Creates a secure temporary directory within which temporary files can be
366
+ # created. Honors the <code>TMPDIR</code> environment variable if it is
367
+ # set.
368
+ # </para>
369
+ # <funcsynopsis>
370
+ # <funcsynopsisinfo>tmpDir=`_log4sh_mktempDir`</funcsynopsisinfo>
371
+ # </funcsynopsis>
372
+ # </entry>
373
+ # </s:function>
374
+ #*/
375
+ _log4sh_mktempDir()
376
+ {
377
+ _lmd_tmpPrefix='log4sh'
378
+
379
+ # try the standard mktemp function
380
+ ( exec mktemp -dqt ${_lmd_tmpPrefix}.XXXXXX 2>/dev/null ) && return
381
+
382
+ # the standard mktemp didn't work. doing our own.
383
+ if [ -n "${RANDOM:-}" ]; then
384
+ # $RANDOM works
385
+ _lmd_random=${RANDOM}${RANDOM}${RANDOM}$$
386
+ elif [ -r '/dev/urandom' ]; then
387
+ _lmd_random=`od -vAn -N4 -tu4 </dev/urandom |sed 's/^[^0-9]*//'`
388
+ else
389
+ # $RANDOM doesn't work
390
+ _lmd_date=`date '+%Y%m%d%H%M%S'`
391
+ _lmd_random=`expr ${_lmd_date} / $$`
392
+ unset _lmd_date
393
+ fi
394
+
395
+ _lmd_tmpDir="${TMPDIR:-/tmp}/${_lmd_tmpPrefix}.${_lmd_random}"
396
+ ( umask 077 && mkdir "${_lmd_tmpDir}" ) || {
397
+ _log4sh_fatal 'could not create temporary directory! exiting'
398
+ exit 1
399
+ }
400
+
401
+ ${__LOG4SH_DEBUG} "created temporary directory (${_lmd_tmpDir})"
402
+ echo "${_lmd_tmpDir}"
403
+ unset _lmd_random _lmd_tmpDir _lmd_tmpPrefix
404
+ }
405
+
406
+ #/**
407
+ # <s:function group="Log4sh" modifier="private">
408
+ # <entry align="right">
409
+ # <emphasis>void</emphasis>
410
+ # </entry>
411
+ # <entry>
412
+ # <funcsynopsis>
413
+ # <funcprototype>
414
+ # <funcdef><function>_log4sh_updateSeconds</function></funcdef>
415
+ # <void />
416
+ # </funcprototype>
417
+ # </funcsynopsis>
418
+ # <para>
419
+ # Set the <code>__log4sh_seconds</code> variable to the number of seconds
420
+ # elapsed since the start of the script.
421
+ # </para>
422
+ # <funcsynopsis>
423
+ # <funcsynopsisinfo>_log4sh_updateSeconds`</funcsynopsisinfo>
424
+ # </funcsynopsis>
425
+ # </entry>
426
+ # </s:function>
427
+ #*/
428
+ _log4sh_updateSeconds()
429
+ {
430
+ if [ -n "${SECONDS:-}" ]; then
431
+ __log4sh_seconds=${SECONDS}
432
+ else
433
+ _lgs__date=`date '+%H \* 3600 + %M \* 60 + %S'`
434
+ _lgs__seconds=`eval "expr ${_lgs__date} + ${__log4sh_secondsWrap} \* 86400"`
435
+ if [ ${_lgs__seconds} -lt ${__log4sh_secondsLast} ]; then
436
+ __log4sh_secondsWrap=`expr ${__log4sh_secondsWrap} + 1`
437
+ _lgs__seconds=`expr ${_lgs_seconds} + 86400`
438
+ fi
439
+ __log4sh_seconds=`expr ${_lgs__seconds} - ${__LOG4SH_SECONDS}`
440
+ __log4sh_secondsLast=${__log4sh_seconds}
441
+ unset _lgs__date _lgs__seconds
442
+ fi
443
+ }
444
+
445
+ #/**
446
+ # <s:function group="Log4sh" modifier="public">
447
+ # <entry align="right">
448
+ # <emphasis>void</emphasis>/boolean
449
+ # </entry>
450
+ # <entry>
451
+ # <funcsynopsis>
452
+ # <funcprototype>
453
+ # <funcdef><function>log4sh_enableStrictBehavior</function></funcdef>
454
+ # <void />
455
+ # </funcprototype>
456
+ # </funcsynopsis>
457
+ # <para>
458
+ # Enables strict log4j behavior.
459
+ # </para>
460
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
461
+ # <funcsynopsis>
462
+ # <funcsynopsisinfo>log4sh_enableStrictBehavior</funcsynopsisinfo>
463
+ # </funcsynopsis>
464
+ # </entry>
465
+ # </s:function>
466
+ #*/
467
+ log4sh_enableStrictBehavior()
468
+ {
469
+ __log4sh_wa_strictBehavior=${__LOG4SH_TRUE}
470
+ }
471
+
472
+ #/**
473
+ # <s:function group="Log4sh" modifier="public">
474
+ # <entry align="right">
475
+ # <emphasis>void</emphasis>/boolean
476
+ # </entry>
477
+ # <entry>
478
+ # <funcsynopsis>
479
+ # <funcprototype>
480
+ # <funcdef><function>log4sh_setAlternative</function></funcdef>
481
+ # <paramdef>string <parameter>command</parameter></paramdef>
482
+ # <paramdef>string <parameter>path</parameter></paramdef>
483
+ # <paramdef>boolean <parameter>useRuntimePath</parameter> (optional)</paramdef>
484
+ # </funcprototype>
485
+ # </funcsynopsis>
486
+ # <para>
487
+ # Specifies an alternative path for a command.
488
+ # </para>
489
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
490
+ # <funcsynopsis>
491
+ # <funcsynopsisinfo>log4sh_setAlternative nc /bin/nc</funcsynopsisinfo>
492
+ # </funcsynopsis>
493
+ # </entry>
494
+ # </s:function>
495
+ #*/
496
+ log4sh_setAlternative()
497
+ {
498
+ if [ $# -lt 2 ]; then
499
+ _log4sh_error 'log4sh_setAlternative(): invalid number of parameters'
500
+ return ${__LOG4SH_FALSE}
501
+ fi
502
+
503
+ lsa_cmdName=$1
504
+ lsa_cmdPath=$2
505
+ lsa_useRuntimePath=${3:-}
506
+ __log4sh_return=${__LOG4SH_TRUE}
507
+
508
+ # check that the alternative command exists and is executable
509
+ if [ \
510
+ ! -x "${lsa_cmdPath}" \
511
+ -a ${lsa_useRuntimePath:-${__LOG4SH_FALSE}} -eq ${__LOG4SH_FALSE} \
512
+ ]; then
513
+ # the alternative command is not executable
514
+ _log4sh_error "log4sh_setAlternative(): ${lsa_cmdName}: command not found"
515
+ __log4sh_return=${__LOG4SH_ERROR}
516
+ fi
517
+
518
+ # check for valid alternative
519
+ if [ ${__log4sh_return} -eq ${__LOG4SH_TRUE} ]; then
520
+ case ${lsa_cmdName} in
521
+ mail) ;;
522
+ nc)
523
+ lsa_cmdVers=`${lsa_cmdPath} --version 2>&1 |head -1`
524
+ if echo "${lsa_cmdVers}" |grep '^netcat' >/dev/null; then
525
+ # GNU Netcat
526
+ __log4sh_alternative_nc_opts='-c'
527
+ else
528
+ # older netcat (v1.10)
529
+ if nc -q 0 2>&1 |grep '^no destination$' >/dev/null 2>&1; then
530
+ # supports -q option
531
+ __log4sh_alternative_nc_opts='-q 0'
532
+ else
533
+ # doesn't support the -q option
534
+ __log4sh_alternative_nc_opts=''
535
+ fi
536
+ fi
537
+ unset lsa_cmdVers
538
+ ;;
539
+ *)
540
+ # the alternative is not valid
541
+ _log4sh_error "unrecognized command alternative '${lsa_cmdName}'"
542
+ __log4sh_return=${__LOG4SH_FALSE}
543
+ ;;
544
+ esac
545
+ fi
546
+
547
+ # set the alternative
548
+ if [ ${__log4sh_return} -eq ${__LOG4SH_TRUE} ]; then
549
+ eval __log4sh_alternative_${lsa_cmdName}="\${lsa_cmdPath}"
550
+ ${__LOG4SH_DEBUG} "alternative '${lsa_cmdName}' command set to '${lsa_cmdPath}'"
551
+ fi
552
+
553
+ unset lsa_cmdName lsa_cmdPath
554
+ return ${__log4sh_return}
555
+ }
556
+
557
+ #-----------------------------------------------------------------------------
558
+ # array handling
559
+ #
560
+ # note: arrays are '1' based
561
+ #
562
+
563
+ #/**
564
+ # <s:function group="Log4sh" modifier="private">
565
+ # <entry align="right">
566
+ # <code>integer</code>
567
+ # </entry>
568
+ # <entry>
569
+ # <funcsynopsis>
570
+ # <funcprototype>
571
+ # <funcdef><function>_log4sh_findArrayElement</function></funcdef>
572
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
573
+ # <paramdef>string <parameter>element</parameter></paramdef>
574
+ # </funcprototype>
575
+ # </funcsynopsis>
576
+ # <para>Find the position of element in an array</para>
577
+ # <funcsynopsis>
578
+ # <funcsynopsisinfo>
579
+ # pos=`_log4sh_findArrayElement "$array" $element`
580
+ # </funcsynopsisinfo>
581
+ # </funcsynopsis>
582
+ # </entry>
583
+ # </s:function>
584
+ #*/
585
+ _log4sh_findArrayElement()
586
+ {
587
+ __pos=`echo "$1" |awk '$0==e{print NR}' e="$2"`
588
+ [ -n "${__pos}" ] && echo "${__pos}" || echo 0
589
+ unset __pos
590
+ }
591
+
592
+ #/**
593
+ # <s:function group="Log4sh" modifier="private">
594
+ # <entry align="right">
595
+ # <code>string</code>
596
+ # </entry>
597
+ # <entry>
598
+ # <funcsynopsis>
599
+ # <funcprototype>
600
+ # <funcdef><function>_log4sh_getArrayElement</function></funcdef>
601
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
602
+ # <paramdef>integer <parameter>position</parameter></paramdef>
603
+ # </funcprototype>
604
+ # </funcsynopsis>
605
+ # <para>Retrieve the element at the given position from an array</para>
606
+ # <funcsynopsis>
607
+ # <funcsynopsisinfo>element=`_log4sh_getArrayElement "$array" $position`</funcsynopsisinfo>
608
+ # </funcsynopsis>
609
+ # </entry>
610
+ # </s:function>
611
+ #*/
612
+ _log4sh_getArrayElement()
613
+ {
614
+ [ -n "${FUNCNAME:-}" ] && ${__LOG4SH_TRACE} "${FUNCNAME}()${BASH_LINENO:+'(called from ${BASH_LINENO})'}"
615
+ _lgae_array=$1
616
+ _lgae_index=$2
617
+ ${__LOG4SH_TRACE} "_lgae_array='${_lgae_array}' _lgae_index='${_lgae_index}'"
618
+
619
+ _lgae_oldIFS=${IFS} IFS=${__LOG4SH_IFS_ARRAY}
620
+ if [ ${__log4sh_wa_setNeedsEval} -eq 0 ]; then
621
+ set -- junk ${_lgae_array}
622
+ else
623
+ eval "set -- junk \"${_lgae_array}\""
624
+ _lgae_arraySize=$#
625
+
626
+ if [ ${_lgae_arraySize} -le ${__log4shAppenderCount} ]; then
627
+ # the evaled set *didn't* work; failing back to original set command and
628
+ # disabling the work around. (pdksh)
629
+ __log4sh_wa_setNeedsEval=${__LOG4SH_FALSE}
630
+ set -- junk ${_lgae_array}
631
+ fi
632
+ fi
633
+ IFS=${_lgae_oldIFS}
634
+
635
+ shift ${_lgae_index}
636
+ ${__LOG4SH_TRACE} "1='${1:-}' 2='${2:-}' 3='${3:-}' ..."
637
+ echo "$1"
638
+
639
+ unset _lgae_array _lgae_arraySize _lgae_index _lgae_oldIFS
640
+ return ${__LOG4SH_TRUE}
641
+ }
642
+
643
+ #/**
644
+ # <s:function group="Log4sh" modifier="private">
645
+ # <entry align="right">
646
+ # <code>integer</code>
647
+ # </entry>
648
+ # <entry align="left">
649
+ # <funcsynopsis>
650
+ # <funcprototype>
651
+ # <funcdef><function>_log4sh_getArrayLength</function></funcdef>
652
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
653
+ # </funcprototype>
654
+ # </funcsynopsis>
655
+ # <para>Get the length of an array</para>
656
+ # <funcsynopsis>
657
+ # <funcsynopsisinfo>length=`_log4sh_getArrayLength "$array"`</funcsynopsisinfo>
658
+ # </funcsynopsis>
659
+ # </entry>
660
+ # </s:function>
661
+ #*/
662
+ _log4sh_getArrayLength()
663
+ {
664
+ _oldIFS=${IFS} IFS=${__LOG4SH_IFS_ARRAY}
665
+ set -- $1
666
+ IFS=${_oldIFS} unset _oldIFS
667
+ echo $#
668
+ }
669
+
670
+ #/**
671
+ # <s:function group="Log4sh" modifier="private">
672
+ # <entry align="right">
673
+ # <code>string[]</code>
674
+ # </entry>
675
+ # <entry>
676
+ # <funcsynopsis>
677
+ # <funcprototype>
678
+ # <funcdef><function>_log4sh_setArrayElement</function></funcdef>
679
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
680
+ # <paramdef>integer <parameter>position</parameter></paramdef>
681
+ # <paramdef>string <parameter>element</parameter></paramdef>
682
+ # </funcprototype>
683
+ # </funcsynopsis>
684
+ # <para>Place an element at a given location in an array</para>
685
+ # <funcsynopsis>
686
+ # <funcsynopsisinfo>newArray=`_log4sh_setArrayElement "$array" $position $element`</funcsynopsisinfo>
687
+ # </funcsynopsis>
688
+ # </entry>
689
+ # </s:function>
690
+ #*/
691
+ _log4sh_setArrayElement()
692
+ {
693
+ echo "$1" |awk '{if(NR==r){print e}else{print $0}}' r=$2 e="$3"
694
+ }
695
+
696
+ #/**
697
+ # <s:function group="Log4sh" modifier="private">
698
+ # <entry align="right">
699
+ # <code>string</code>
700
+ # </entry>
701
+ # <entry>
702
+ # <funcsynopsis>
703
+ # <funcprototype>
704
+ # <funcdef><function>_log4sh_peekStack</function></funcdef>
705
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
706
+ # </funcprototype>
707
+ # </funcsynopsis>
708
+ # <para>Return the topmost element on a stack without removing the
709
+ # element.</para>
710
+ # <funcsynopsis>
711
+ # <funcsynopsisinfo>element=`_log4sh_peekStack "$array"`</funcsynopsisinfo>
712
+ # </funcsynopsis>
713
+ # </entry>
714
+ # </s:function>
715
+ #*/
716
+ _log4sh_peekStack()
717
+ {
718
+ echo "$@" |awk '{line=$0}END{print line}'
719
+ }
720
+
721
+ #/**
722
+ # <s:function group="Log4sh" modifier="private">
723
+ # <entry align="right">
724
+ # <code>string[]</code>
725
+ # </entry>
726
+ # <entry>
727
+ # <funcsynopsis>
728
+ # <funcprototype>
729
+ # <funcdef><function>_log4sh_popStack</function></funcdef>
730
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
731
+ # </funcprototype>
732
+ # </funcsynopsis>
733
+ # <para>Remove the top-most element from a stack. This command takes a
734
+ # normal log4sh string array as input, but treats it as though it were a
735
+ # stack.</para>
736
+ # <funcsynopsis>
737
+ # <funcsynopsisinfo>newArray=`_log4sh_popStack "$array"`</funcsynopsisinfo>
738
+ # </funcsynopsis>
739
+ # </entry>
740
+ # </s:function>
741
+ #*/
742
+ _log4sh_popStack()
743
+ {
744
+ _array=$1
745
+ _length=`_log4sh_getArrayLength "${_array}"`
746
+ echo "${_array}" |awk '{if(NR<r){print $0}}' r=${_length}
747
+ unset _array _length
748
+ }
749
+
750
+ #/**
751
+ # <s:function group="Log4sh" modifier="private">
752
+ # <entry align="right">
753
+ # <code>string</code>
754
+ # </entry>
755
+ # <entry>
756
+ # <funcsynopsis>
757
+ # <funcprototype>
758
+ # <funcdef><function>_log4sh_pushStack</function></funcdef>
759
+ # <paramdef>string[] <parameter>array</parameter></paramdef>
760
+ # <paramdef>string <parameter>element</parameter></paramdef>
761
+ # </funcprototype>
762
+ # </funcsynopsis>
763
+ # <para>Add a new element to the top of a stack. This command takes a normal
764
+ # log4sh string array as input, but treats it as though it were a
765
+ # stack.</para>
766
+ # <funcsynopsis>
767
+ # <funcsynopsisinfo>newArray=`_log4sh_pushStack "$array" $element`</funcsynopsisinfo>
768
+ # </funcsynopsis>
769
+ # </entry>
770
+ # </s:function>
771
+ #*/
772
+ _log4sh_pushStack()
773
+ {
774
+ echo "${1:+$1${__LOG4SH_IFS_ARRAY}}$2"
775
+ }
776
+
777
+ #=============================================================================
778
+ # Appender
779
+ #
780
+
781
+ #/**
782
+ # <s:function group="Appender" modifier="public">
783
+ # <entry align="right">
784
+ # <emphasis>void</emphasis>
785
+ # </entry>
786
+ # <entry>
787
+ # <funcsynopsis>
788
+ # <funcprototype>
789
+ # <funcdef><function>appender_activateOptions</function></funcdef>
790
+ # <paramdef>string <parameter>appender</parameter></paramdef>
791
+ # </funcprototype>
792
+ # </funcsynopsis>
793
+ # <para>
794
+ # Activate an appender's configuration. This should be called after
795
+ # reconfiguring an appender via code. It needs only to be called once
796
+ # before any logging statements are called. This calling of this function
797
+ # will be required in log4sh 1.4.x.
798
+ # </para>
799
+ # <funcsynopsis>
800
+ # <funcsynopsisinfo>appender_activateAppender myAppender</funcsynopsisinfo>
801
+ # </funcsynopsis>
802
+ # </entry>
803
+ # </s:function>
804
+ #*/
805
+ appender_activateOptions()
806
+ {
807
+ _aao_appender=$1
808
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${_aao_appender}_activateOptions
809
+ unset _aao_appender
810
+ }
811
+
812
+ #/**
813
+ # <s:function group="Appender" modifier="public">
814
+ # <entry align="right">
815
+ # <emphasis>void</emphasis>
816
+ # </entry>
817
+ # <entry>
818
+ # <funcsynopsis>
819
+ # <funcprototype>
820
+ # <funcdef><function>appender_close</function></funcdef>
821
+ # <paramdef>string <parameter>appender</parameter></paramdef>
822
+ # </funcprototype>
823
+ # </funcsynopsis>
824
+ # <para>Disable any further logging via an appender. Once closed, the
825
+ # appender can be reopened by setting it to any logging Level (e.g.
826
+ # INFO).</para>
827
+ # <funcsynopsis>
828
+ # <funcsynopsisinfo>appender_close myAppender</funcsynopsisinfo>
829
+ # </funcsynopsis>
830
+ # </entry>
831
+ # </s:function>
832
+ #*/
833
+ appender_close()
834
+ {
835
+ appender_setLevel $1 ${__LOG4SH_LEVEL_CLOSED_STR}
836
+ }
837
+
838
+ #/**
839
+ # <s:function group="Appender" modifier="public">
840
+ # <entry align="right">
841
+ # <code>boolean</code>
842
+ # </entry>
843
+ # <entry>
844
+ # <funcsynopsis>
845
+ # <funcprototype>
846
+ # <funcdef><function>appender_exists</function></funcdef>
847
+ # <paramdef>string <parameter>appender</parameter></paramdef>
848
+ # </funcprototype>
849
+ # </funcsynopsis>
850
+ # <para>Checks for the existance of a named appender</para>
851
+ # <funcsynopsis>
852
+ # <funcsynopsisinfo>exists=`appender_exists myAppender`</funcsynopsisinfo>
853
+ # </funcsynopsis>
854
+ # </entry>
855
+ # </s:function>
856
+ #*/
857
+ appender_exists()
858
+ {
859
+ _ae_index=`_log4sh_findArrayElement "${__log4shAppenders}" $1`
860
+ [ "${_ae_index}" -gt 0 ] \
861
+ && _ae_return=${__LOG4SH_TRUE} \
862
+ || _ae_return=${__LOG4SH_FALSE}
863
+ unset _ae_index
864
+ return ${_ae_return}
865
+ }
866
+
867
+ #/**
868
+ # <s:function group="Appender" modifier="public">
869
+ # <entry align="right">
870
+ # <code>string</code>
871
+ # </entry>
872
+ # <entry>
873
+ # <funcsynopsis>
874
+ # <funcprototype>
875
+ # <funcdef><function>appender_getLayout</function></funcdef>
876
+ # <paramdef>string <parameter>appender</parameter></paramdef>
877
+ # </funcprototype>
878
+ # </funcsynopsis>
879
+ # <para>Gets the Layout of an Appender</para>
880
+ # <funcsynopsis>
881
+ # <funcsynopsisinfo>type=`appender_getLayout myAppender`</funcsynopsisinfo>
882
+ # </funcsynopsis>
883
+ # </entry>
884
+ # </s:function>
885
+ #*/
886
+ appender_getLayout()
887
+ {
888
+ _agl_index=`_log4sh_findArrayElement "${__log4shAppenders}" $1`
889
+ _log4sh_getArrayElement "${__log4shAppenderLayouts}" ${_agl_index}
890
+ unset _agl_index
891
+ }
892
+
893
+ #/**
894
+ # <s:function group="Appender" modifier="public">
895
+ # <entry align="right">
896
+ # <emphasis>void</emphasis>
897
+ # </entry>
898
+ # <entry>
899
+ # <funcsynopsis>
900
+ # <funcprototype>
901
+ # <funcdef><function>appender_setLayout</function></funcdef>
902
+ # <paramdef>string <parameter>appender</parameter></paramdef>
903
+ # <paramdef>string <parameter>layout</parameter></paramdef>
904
+ # </funcprototype>
905
+ # </funcsynopsis>
906
+ # <para>Sets the Layout of an Appender (e.g. PatternLayout)</para>
907
+ # <funcsynopsis>
908
+ # <funcsynopsisinfo>appender_setLayout myAppender PatternLayout</funcsynopsisinfo>
909
+ # </funcsynopsis>
910
+ # </entry>
911
+ # </s:function>
912
+ #*/
913
+ appender_setLayout()
914
+ {
915
+ _asl_appender=$1
916
+ _asl_layout=$2
917
+
918
+ case ${_asl_layout} in
919
+ ${__LOG4SH_LAYOUT_HTML}|\
920
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_LAYOUT_HTML})
921
+ _asl_layout=${__LOG4SH_LAYOUT_HTML}
922
+ ;;
923
+
924
+ ${__LOG4SH_LAYOUT_SIMPLE}|\
925
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_LAYOUT_SIMPLE})
926
+ _asl_layout=${__LOG4SH_LAYOUT_SIMPLE}
927
+ ;;
928
+
929
+ ${__LOG4SH_LAYOUT_PATTERN}|\
930
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_LAYOUT_PATTERN})
931
+ _asl_layout=${__LOG4SH_LAYOUT_PATTERN}
932
+ ;;
933
+
934
+ *)
935
+ _log4sh_error "unknown layout: ${_asl_layout}"
936
+ return ${__LOG4SH_FALSE}
937
+ ;;
938
+ esac
939
+
940
+ _asl_index=`_log4sh_findArrayElement "${__log4shAppenders}" $1`
941
+ __log4shAppenderLayouts=`_log4sh_setArrayElement \
942
+ "${__log4shAppenderLayouts}" ${_asl_index} "${_asl_layout}"`
943
+
944
+ # resource the appender
945
+ _appender_cache ${_asl_appender}
946
+
947
+ unset _asl_appender _asl_index _asl_layout
948
+ return ${__LOG4SH_TRUE}
949
+ }
950
+
951
+ #/**
952
+ # <s:function group="Appender" modifier="private">
953
+ # <entry align="right">
954
+ # <code>string</code>
955
+ # </entry>
956
+ # <entry>
957
+ # <funcsynopsis>
958
+ # <funcprototype>
959
+ # <funcdef><function>_appender_getLayoutByIndex</function></funcdef>
960
+ # <paramdef>integer <parameter>index</parameter></paramdef>
961
+ # </funcprototype>
962
+ # </funcsynopsis>
963
+ # <para>Gets the Layout of an Appender at the given array index</para>
964
+ # <funcsynopsis>
965
+ # <funcsynopsisinfo>type=`_appender_getLayoutByIndex 3`</funcsynopsisinfo>
966
+ # </funcsynopsis>
967
+ # </entry>
968
+ # </s:function>
969
+ #*/
970
+ _appender_getLayoutByIndex()
971
+ {
972
+ _log4sh_getArrayElement "${__log4shAppenderLayouts}" $1
973
+ }
974
+
975
+ #/**
976
+ # <s:function group="Appender" modifier="public">
977
+ # <entry align="right">
978
+ # <code>string</code>/boolean
979
+ # </entry>
980
+ # <entry>
981
+ # <funcsynopsis>
982
+ # <funcprototype>
983
+ # <funcdef><function>appender_getLevel</function></funcdef>
984
+ # <paramdef>string <parameter>appender</parameter></paramdef>
985
+ # </funcprototype>
986
+ # </funcsynopsis>
987
+ # <para>Gets the current logging Level of an Appender</para>
988
+ # <funcsynopsis>
989
+ # <funcsynopsisinfo>type=`appender_getLevel myAppender`</funcsynopsisinfo>
990
+ # </funcsynopsis>
991
+ # </entry>
992
+ # </s:function>
993
+ #*/
994
+ appender_getLevel()
995
+ {
996
+ if [ $# -ne 1 ]; then
997
+ _log4sh_error 'appender_getLevel(): invalid number of parameters'
998
+ return ${__LOG4SH_FALSE}
999
+ fi
1000
+
1001
+ agl_appender=$1
1002
+
1003
+ agl_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${agl_appender}`
1004
+ # TODO: put check for valid index here
1005
+ agl_level=`_log4sh_getArrayElement \
1006
+ "${__log4shAppenderLevels}" ${agl_index}`
1007
+ __log4sh_return=$?
1008
+
1009
+ echo "${agl_level}"
1010
+
1011
+ unset agl_appender agl_index agl_level
1012
+ return ${__log4sh_return}
1013
+ }
1014
+
1015
+ #/**
1016
+ # <s:function group="Appender" modifier="public">
1017
+ # <entry align="right">
1018
+ # <emphasis>void</emphasis>/<code>boolean</code>
1019
+ # </entry>
1020
+ # <entry>
1021
+ # <funcsynopsis>
1022
+ # <funcprototype>
1023
+ # <funcdef><function>appender_setLevel</function></funcdef>
1024
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1025
+ # <paramdef>string <parameter>level</parameter></paramdef>
1026
+ # </funcprototype>
1027
+ # </funcsynopsis>
1028
+ # <para>Sets the Level of an Appender (e.g. INFO)</para>
1029
+ # <funcsynopsis>
1030
+ # <funcsynopsisinfo>appender_setLevel myAppender INFO</funcsynopsisinfo>
1031
+ # </funcsynopsis>
1032
+ # </entry>
1033
+ # </s:function>
1034
+ #*/
1035
+ appender_setLevel()
1036
+ {
1037
+ asl_appender=$1
1038
+ asl_level=$2
1039
+
1040
+ _index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asl_appender}`
1041
+ __log4shAppenderLevels=`_log4sh_setArrayElement \
1042
+ "${__log4shAppenderLevels}" ${_index} "${asl_level}"`
1043
+
1044
+ # resource the appender
1045
+ _appender_cache ${asl_appender}
1046
+
1047
+ unset asl_appender asl_level _index
1048
+ return ${__LOG4SH_TRUE}
1049
+ }
1050
+
1051
+ #/**
1052
+ # <s:function group="Appender" modifier="private">
1053
+ # <entry align="right">
1054
+ # <code>string</code>
1055
+ # </entry>
1056
+ # <entry>
1057
+ # <funcsynopsis>
1058
+ # <funcprototype>
1059
+ # <funcdef><function>_appender_getLevelByIndex</function></funcdef>
1060
+ # <paramdef>integer <parameter>index</parameter></paramdef>
1061
+ # </funcprototype>
1062
+ # </funcsynopsis>
1063
+ # <para>Gets the current logging Level of an Appender at the given array
1064
+ # index</para>
1065
+ # <funcsynopsis>
1066
+ # <funcsynopsisinfo>type=`_appender_getLevelByIndex 3`</funcsynopsisinfo>
1067
+ # </funcsynopsis>
1068
+ # </entry>
1069
+ # </s:function>
1070
+ #*/
1071
+ _appender_getLevelByIndex()
1072
+ {
1073
+ [ -n "${FUNCNAME:-}" ] && ${__LOG4SH_TRACE} "${FUNCNAME}()${BASH_LINENO:+'(called from ${BASH_LINENO})'}"
1074
+ _log4sh_getArrayElement "${__log4shAppenderLevels}" $1
1075
+ }
1076
+
1077
+ #/**
1078
+ # <s:function group="Appender" modifier="public">
1079
+ # <entry align="right">
1080
+ # <code>string</code>
1081
+ # </entry>
1082
+ # <entry>
1083
+ # <funcsynopsis>
1084
+ # <funcprototype>
1085
+ # <funcdef><function>appender_getPattern</function></funcdef>
1086
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1087
+ # </funcprototype>
1088
+ # </funcsynopsis>
1089
+ # <para>Gets the Pattern of an Appender</para>
1090
+ # <funcsynopsis>
1091
+ # <funcsynopsisinfo>pattern=`appender_getPattern myAppender`</funcsynopsisinfo>
1092
+ # </funcsynopsis>
1093
+ # </entry>
1094
+ # </s:function>
1095
+ #*/
1096
+ appender_getPattern()
1097
+ {
1098
+ _index=`_log4sh_findArrayElement "$__log4shAppenders" $1`
1099
+ _log4sh_getArrayElement "$__log4shAppenderPatterns" $_index
1100
+ unset _index
1101
+ }
1102
+
1103
+ #/**
1104
+ # <s:function group="Appender" modifier="public">
1105
+ # <entry align="right">
1106
+ # <emphasis>void</emphasis>/<code>boolean</code>
1107
+ # </entry>
1108
+ # <entry>
1109
+ # <funcsynopsis>
1110
+ # <funcprototype>
1111
+ # <funcdef><function>appender_setPattern</function></funcdef>
1112
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1113
+ # <paramdef>string <parameter>pattern</parameter></paramdef>
1114
+ # </funcprototype>
1115
+ # </funcsynopsis>
1116
+ # <para>Sets the Pattern of an Appender</para>
1117
+ # <funcsynopsis>
1118
+ # <funcsynopsisinfo>appender_setPattern myAppender '%d %p - %m%n'</funcsynopsisinfo>
1119
+ # </funcsynopsis>
1120
+ # </entry>
1121
+ # </s:function>
1122
+ #*/
1123
+ appender_setPattern()
1124
+ {
1125
+ asp_appender=$1
1126
+ asp_pattern=$2
1127
+
1128
+ _index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asp_appender}`
1129
+ __log4shAppenderPatterns=`_log4sh_setArrayElement \
1130
+ "${__log4shAppenderPatterns}" ${_index} "${asp_pattern}"`
1131
+
1132
+ # resource the appender
1133
+ _appender_cache ${asp_appender}
1134
+
1135
+ unset asp_appender asp_pattern _index
1136
+ return ${__LOG4SH_TRUE}
1137
+ }
1138
+
1139
+ #/**
1140
+ # <s:function group="Appender" modifier="private">
1141
+ # <entry align="right">
1142
+ # <code>string</code>
1143
+ # </entry>
1144
+ # <entry>
1145
+ # <funcsynopsis>
1146
+ # <funcprototype>
1147
+ # <funcdef><function>_appender_getPatternByIndex</function></funcdef>
1148
+ # <paramdef>integer <parameter>index</parameter></paramdef>
1149
+ # </funcprototype>
1150
+ # </funcsynopsis>
1151
+ # <para>Gets the Pattern of an Appender at the specified array index</para>
1152
+ # <funcsynopsis>
1153
+ # <funcsynopsisinfo>pattern=`_appender_getPatternByIndex 3`</funcsynopsisinfo>
1154
+ # </funcsynopsis>
1155
+ # </entry>
1156
+ # </s:function>
1157
+ #*/
1158
+ _appender_getPatternByIndex()
1159
+ {
1160
+ _log4sh_getArrayElement "$__log4shAppenderPatterns" $1
1161
+ }
1162
+
1163
+ #/**
1164
+ # <s:function group="Appender" modifier="private">
1165
+ # <entry align="right">
1166
+ # <code>string</code>
1167
+ # </entry>
1168
+ # <entry>
1169
+ # <funcsynopsis>
1170
+ # <funcprototype>
1171
+ # <funcdef><function>_appender_parsePattern</function></funcdef>
1172
+ # <paramdef>string <parameter>pattern</parameter></paramdef>
1173
+ # <paramdef>string <parameter>priority</parameter></paramdef>
1174
+ # <paramdef>string <parameter>message</parameter></paramdef>
1175
+ # </funcprototype>
1176
+ # </funcsynopsis>
1177
+ # <para>Generate a logging message given a Pattern, priority, and message.
1178
+ # All dates will be represented as ISO 8601 dates (YYYY-MM-DD
1179
+ # HH:MM:SS).</para>
1180
+ # <para>Note: the '<code>%r</code>' character modifier does not work in the
1181
+ # Solaris <code>/bin/sh</code> shell</para>
1182
+ # <para>Example:
1183
+ # <blockquote>
1184
+ # <funcsynopsis>
1185
+ # <funcsynopsisinfo>_appender_parsePattern '%d %p - %m%n' INFO "message to log"</funcsynopsisinfo>
1186
+ # </funcsynopsis>
1187
+ # </blockquote>
1188
+ # </para>
1189
+ # </entry>
1190
+ # </s:function>
1191
+ #*/
1192
+ _appender_parsePattern()
1193
+ {
1194
+ _pattern=$1
1195
+ _priority=$2
1196
+ _msg=$3
1197
+
1198
+ _date=''
1199
+ _doEval=${__LOG4SH_FALSE}
1200
+
1201
+ # determine if various commands must be run
1202
+ _oldIFS="${IFS}"; IFS='%'; set -- x${_pattern}; IFS="${_oldIFS}"
1203
+ if [ $# -gt 1 ]; then
1204
+ # run the date command??
1205
+ IFS='d'; set -- ${_pattern}x; IFS="${_oldIFS}"
1206
+ [ $# -gt 1 ] && _date=`date '+%Y-%m-%d %H:%M:%S'`
1207
+
1208
+ # run the eval command?
1209
+ IFS='X'; set -- ${_pattern}x; IFS="${_oldIFS}"
1210
+ [ $# -gt 1 ] && _doEval=${__LOG4SH_TRUE}
1211
+ fi
1212
+ unset _oldIFS
1213
+
1214
+ # escape any '\' and '&' chars in the message
1215
+ _msg=`echo "${_msg}" |sed 's/\\\\/\\\\\\\\/g;s/&/\\\\&/g'`
1216
+
1217
+ # deal with any newlines in the message
1218
+ _msg=`echo "${_msg}" |tr '\n' ''`
1219
+
1220
+ # parse the pattern
1221
+ _pattern=`echo "${_pattern}" |sed \
1222
+ -e 's/%c/shell/g' \
1223
+ -e 's/%d{[^}]*}/%d/g' -e "s/%d/${_date}/g" \
1224
+ -e "s/%F/${__log4sh_filename}/g" \
1225
+ -e 's/%L//g' \
1226
+ -e 's/%n//g' \
1227
+ -e "s/%-*[0-9]*p/${_priority}/g" \
1228
+ -e "s/%-*[0-9]*r/${__log4sh_seconds}/g" \
1229
+ -e "s/%t/${__log4sh_threadName}/g" \
1230
+ -e 's/%x//g' \
1231
+ -e 's/%X{/$\{/g' \
1232
+ -e 's/%%m/%%%m/g' -e 's/%%/%/g' \
1233
+ -e "s%m${_msg}" |tr '' '\n'`
1234
+ if [ ${_doEval} -eq ${__LOG4SH_FALSE} ]; then
1235
+ echo "${_pattern}"
1236
+ else
1237
+ eval "echo \"${_pattern}\""
1238
+ fi
1239
+
1240
+ unset _date _doEval _msg _pattern _tag
1241
+ }
1242
+
1243
+ #/**
1244
+ # <s:function group="Appender" modifier="public">
1245
+ # <entry align="right">
1246
+ # <code>string</code>
1247
+ # </entry>
1248
+ # <entry>
1249
+ # <funcsynopsis>
1250
+ # <funcprototype>
1251
+ # <funcdef><function>appender_getType</function></funcdef>
1252
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1253
+ # </funcprototype>
1254
+ # </funcsynopsis>
1255
+ # <para>Gets the Type of an Appender</para>
1256
+ # <funcsynopsis>
1257
+ # <funcsynopsisinfo>type=`appender_getType myAppender`</funcsynopsisinfo>
1258
+ # </funcsynopsis>
1259
+ # </entry>
1260
+ # </s:function>
1261
+ #*/
1262
+ appender_getType()
1263
+ {
1264
+ _index=`_log4sh_findArrayElement "$__log4shAppenders" $1`
1265
+ _log4sh_getArrayElement "$__log4shAppenderTypes" $_index
1266
+ unset _index
1267
+ }
1268
+
1269
+ #/**
1270
+ # <s:function group="Appender" modifier="public">
1271
+ # <entry align="right">
1272
+ # <code>string</code>
1273
+ # </entry>
1274
+ # <entry>
1275
+ # <funcsynopsis>
1276
+ # <funcprototype>
1277
+ # <funcdef><function>appender_getAppenderType</function></funcdef>
1278
+ # <paramdef>integer <parameter>index</parameter></paramdef>
1279
+ # </funcprototype>
1280
+ # </funcsynopsis>
1281
+ # <para><emphasis role="strong">Deprecated as of 1.3.1</emphasis></para>
1282
+ # <para>
1283
+ # Gets the Type of an Appender at the given array index
1284
+ # </para>
1285
+ # <funcsynopsis>
1286
+ # <funcsynopsisinfo>type=`appender_getAppenderType 3`</funcsynopsisinfo>
1287
+ # </funcsynopsis>
1288
+ # </entry>
1289
+ # </s:function>
1290
+ #*/
1291
+ appender_getAppenderType()
1292
+ {
1293
+ _appender_getTypeByIndex "$@"
1294
+ }
1295
+
1296
+ #/**
1297
+ # <s:function group="Appender" modifier="public">
1298
+ # <entry align="right">
1299
+ # <emphasis>void</emphasis>/<code>boolean</code>
1300
+ # </entry>
1301
+ # <entry>
1302
+ # <funcsynopsis>
1303
+ # <funcprototype>
1304
+ # <funcdef><function>appender_setType</function></funcdef>
1305
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1306
+ # <paramdef>string <parameter>type</parameter></paramdef>
1307
+ # </funcprototype>
1308
+ # </funcsynopsis>
1309
+ # <para>Sets the Type of an Appender (e.g. FileAppender)</para>
1310
+ # <funcsynopsis>
1311
+ # <funcsynopsisinfo>appender_setType myAppender FileAppender</funcsynopsisinfo>
1312
+ # </funcsynopsis>
1313
+ # </entry>
1314
+ # </s:function>
1315
+ #*/
1316
+ appender_setType()
1317
+ {
1318
+ ast_appender=$1
1319
+ ast_type=$2
1320
+
1321
+ # XXX need to verify types
1322
+
1323
+ _index=`_log4sh_findArrayElement "${__log4shAppenders}" ${ast_appender}`
1324
+ __log4shAppenderTypes=`_log4sh_setArrayElement \
1325
+ "${__log4shAppenderTypes}" ${_index} "${ast_type}"`
1326
+
1327
+ # resource the appender
1328
+ _appender_cache ${ast_appender}
1329
+
1330
+ unset ast_appender ast_type _index
1331
+ return ${__LOG4SH_TRUE}
1332
+ }
1333
+
1334
+ #/**
1335
+ # <s:function group="Appender" modifier="public">
1336
+ # <entry align="right">
1337
+ # <emphasis>void</emphasis>
1338
+ # </entry>
1339
+ # <entry>
1340
+ # <funcsynopsis>
1341
+ # <funcprototype>
1342
+ # <funcdef><function>appender_setAppenderType</function></funcdef>
1343
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1344
+ # <paramdef>string <parameter>type</parameter></paramdef>
1345
+ # </funcprototype>
1346
+ # </funcsynopsis>
1347
+ # <para><emphasis role="strong">Deprecated as of 1.3.1</emphasis></para>
1348
+ # <para>
1349
+ # Sets the Type of an Appender (e.g. FileAppender)
1350
+ # </para>
1351
+ # <funcsynopsis>
1352
+ # <funcsynopsisinfo>appender_setAppenderType myAppender FileAppender</funcsynopsisinfo>
1353
+ # </funcsynopsis>
1354
+ # </entry>
1355
+ # </s:function>
1356
+ #*/
1357
+ appender_setAppenderType()
1358
+ {
1359
+ appender_setType "$@"
1360
+ }
1361
+
1362
+ #/**
1363
+ # <s:function group="Appender" modifier="private">
1364
+ # <entry align="right">
1365
+ # <code>string</code>
1366
+ # </entry>
1367
+ # <entry>
1368
+ # <funcsynopsis>
1369
+ # <funcprototype>
1370
+ # <funcdef><function>_appender_getTypeByIndex</function></funcdef>
1371
+ # <paramdef>integer <parameter>index</parameter></paramdef>
1372
+ # </funcprototype>
1373
+ # </funcsynopsis>
1374
+ # <para>Gets the Type of an Appender at the given array index</para>
1375
+ # <funcsynopsis>
1376
+ # <funcsynopsisinfo>type=`_appender_getTypeByIndex 3`</funcsynopsisinfo>
1377
+ # </funcsynopsis>
1378
+ # </entry>
1379
+ # </s:function>
1380
+ #*/
1381
+ _appender_getTypeByIndex()
1382
+ {
1383
+ _log4sh_getArrayElement "$__log4shAppenderTypes" $1
1384
+ }
1385
+
1386
+ #/**
1387
+ # <s:function group="Appender" modifier="private">
1388
+ # <entry align="right">
1389
+ # <emphasis>void</emphasis>
1390
+ # </entry>
1391
+ # <entry>
1392
+ # <funcsynopsis>
1393
+ # <funcprototype>
1394
+ # <funcdef><function>_appender_cache</function></funcdef>
1395
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1396
+ # </funcprototype>
1397
+ # </funcsynopsis>
1398
+ # <para>Dynamically creates an appender function in memory that will fully
1399
+ # instantiate itself when it is called.</para>
1400
+ # <funcsynopsis>
1401
+ # <funcsynopsisinfo>_appender_cache myAppender</funcsynopsisinfo>
1402
+ # </funcsynopsis>
1403
+ # </entry>
1404
+ # </s:function>
1405
+ #*/
1406
+ _appender_cache()
1407
+ {
1408
+ _ac__appender=$1
1409
+
1410
+ _ac__inc="${__log4sh_tmpDir}/${_ac__appender}${__LOG4SH_APPENDER_INCLUDE_EXT}"
1411
+
1412
+ cat >"${_ac__inc}" <<EOF
1413
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${_ac__appender}_activateOptions()
1414
+ {
1415
+ [ -n "\${FUNCNAME:-}" ] && \${__LOG4SH_TRACE} "\${FUNCNAME}()\${BASH_LINENO:+'(called from \${BASH_LINENO})'}"
1416
+ _appender_activate ${_ac__appender}
1417
+ }
1418
+
1419
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${_ac__appender}_append() { :; }
1420
+ EOF
1421
+
1422
+ # source the new functions
1423
+ . "${_ac__inc}"
1424
+
1425
+ # call the activateOptions function
1426
+ # XXX will be removed in log4sh-1.5.x
1427
+ appender_activateOptions ${_ac__appender}
1428
+ }
1429
+
1430
+ #/**
1431
+ # <s:function group="Appender" modifier="private">
1432
+ # <entry align="right">
1433
+ # <emphasis>void</emphasis>
1434
+ # </entry>
1435
+ # <entry>
1436
+ # <funcsynopsis>
1437
+ # <funcprototype>
1438
+ # <funcdef><function>_appender_activate</function></funcdef>
1439
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1440
+ # </funcprototype>
1441
+ # </funcsynopsis>
1442
+ # <para>
1443
+ # Dynamically regenerates an appender function in memory that is fully
1444
+ # instantiated for a specific logging task.
1445
+ # </para>
1446
+ # <funcsynopsis>
1447
+ # <funcsynopsisinfo>_appender_activate myAppender</funcsynopsisinfo>
1448
+ # </funcsynopsis>
1449
+ # </entry>
1450
+ # </s:function>
1451
+ #*/
1452
+ _appender_activate()
1453
+ {
1454
+ [ -n "${FUNCNAME:-}" ] && ${__LOG4SH_TRACE} "${FUNCNAME}()${BASH_LINENO:+'(called from ${BASH_LINENO})'}"
1455
+ ${__LOG4SH_TRACE} "_appender_activate($#)"
1456
+ _aa_appender=$1
1457
+ ${__LOG4SH_TRACE} "_aa_appender='${_aa_appender}'"
1458
+
1459
+ _aa_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${_aa_appender}`
1460
+ _aa_inc="${__log4sh_tmpDir}/${_aa_appender}${__LOG4SH_APPENDER_INCLUDE_EXT}"
1461
+
1462
+ ### generate function for inclusion
1463
+ # TODO can we modularize this in the future?
1464
+
1465
+ # send STDOUT to our include file
1466
+ exec 4>&1 >${_aa_inc}
1467
+
1468
+ # header
1469
+ cat <<EOF
1470
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${_aa_appender}_append()
1471
+ {
1472
+ [ -n "\${FUNCNAME:-}" ] && \${__LOG4SH_TRACE} "\${FUNCNAME}()\${BASH_LINENO:+'(called from \${BASH_LINENO})'}"
1473
+ _la_level=\$1
1474
+ _la_message=\$2
1475
+ EOF
1476
+
1477
+ # determine the 'layout'
1478
+ _aa_layout=`_appender_getLayoutByIndex ${_aa_index}`
1479
+ ${__LOG4SH_TRACE} "_aa_layout='${_aa_layout}'"
1480
+ case ${_aa_layout} in
1481
+ ${__LOG4SH_LAYOUT_SIMPLE}|\
1482
+ ${__LOG4SH_LAYOUT_HTML})
1483
+ ${__LOG4SH_DEBUG} 'using simple/html layout'
1484
+ echo " _la_layout=\"\${_la_level} - \${_la_message}\""
1485
+ ;;
1486
+
1487
+ ${__LOG4SH_LAYOUT_PATTERN})
1488
+ ${__LOG4SH_DEBUG} 'using pattern layout'
1489
+ _aa_pattern=`_appender_getPatternByIndex ${_aa_index}`
1490
+ echo " _la_layout=\`_appender_parsePattern '${_aa_pattern}' \${_la_level} \"\${_la_message}\"\`"
1491
+ ;;
1492
+ esac
1493
+
1494
+ # what appender 'type' do we have? TODO check not missing
1495
+ _aa_type=`_appender_getTypeByIndex ${_aa_index}`
1496
+ ${__LOG4SH_TRACE} "_aa_type='${_aa_type}'"
1497
+ case ${_aa_type} in
1498
+ ${__LOG4SH_TYPE_CONSOLE})
1499
+ echo " echo \"\${_la_layout}\""
1500
+ ;;
1501
+
1502
+ ${__LOG4SH_TYPE_FILE}|\
1503
+ ${__LOG4SH_TYPE_ROLLING_FILE}|\
1504
+ ${__LOG4SH_TYPE_DAILY_ROLLING_FILE})
1505
+ _aa_file=`_appender_file_getFileByIndex ${_aa_index}`
1506
+ ${__LOG4SH_TRACE} "_aa_file='${_aa_file}'"
1507
+ if [ "${_aa_file}" = 'STDERR' ]; then
1508
+ echo " echo \"\${_la_layout}\" >&2"
1509
+ elif [ "${_aa_file}" != "${__LOG4SH_NULL}" ]; then
1510
+ # do rotation
1511
+ case ${_aa_type} in
1512
+ ${__LOG4SH_TYPE_ROLLING_FILE})
1513
+ # check whether the max file size has been exceeded
1514
+ _aa_rotIndex=`appender_file_getMaxBackupIndex ${_aa_appender}`
1515
+ _aa_rotSize=`appender_file_getMaxFileSize ${_aa_appender}`
1516
+ cat <<EOF
1517
+ _la_rotSize=${_aa_rotSize}
1518
+ _la_size=\`wc -c '${_aa_file}' |awk '{print \$1}'\`
1519
+ if [ \${_la_size} -ge \${_la_rotSize} ]; then
1520
+ if [ ${_aa_rotIndex} -gt 0 ]; then
1521
+ # rotate the appender file(s)
1522
+ _la_rotIndex=`expr ${_aa_rotIndex} - 1`
1523
+ _la_rotFile="${_aa_file}.\${_la_rotIndex}"
1524
+ [ -f "\${_la_rotFile}" ] && rm -f "\${_la_rotFile}"
1525
+ while [ \${_la_rotIndex} -gt 0 ]; do
1526
+ _la_rotFileLast="\${_la_rotFile}"
1527
+ _la_rotIndex=\`expr \${_la_rotIndex} - 1\`
1528
+ _la_rotFile="${_aa_file}.\${_la_rotIndex}"
1529
+ [ -f "\${_la_rotFile}" ] && mv -f "\${_la_rotFile}" "\${_la_rotFileLast}"
1530
+ done
1531
+ mv -f '${_aa_file}' "\${_la_rotFile}"
1532
+ else
1533
+ # keep no backups; truncate the file
1534
+ cp /dev/null "${_aa_file}"
1535
+ fi
1536
+ unset _la_rotFile _la_rotFileLast _la_rotIndex
1537
+ fi
1538
+ unset _la_rotSize _la_size
1539
+ EOF
1540
+ ;;
1541
+ ${__LOG4SH_TYPE_DAILY_ROLLING_FILE})
1542
+ ;;
1543
+ esac
1544
+ echo " echo \"\${_la_layout}\" >>'${_aa_file}'"
1545
+ else
1546
+ # the file "${__LOG4SH_NULL}" is closed?? Why did we get here, and why
1547
+ # did I care when I wrote this bit of code?
1548
+ :
1549
+ fi
1550
+
1551
+ unset _aa_file
1552
+ ;;
1553
+
1554
+ ${__LOG4SH_TYPE_SMTP})
1555
+ _aa_smtpTo=`appender_smtp_getTo ${_aa_appender}`
1556
+ _aa_smtpSubject=`appender_smtp_getSubject ${_aa_appender}`
1557
+
1558
+ cat <<EOF
1559
+ echo "\${_la_layout}" |\\
1560
+ ${__log4sh_alternative_mail} -s "${_aa_smtpSubject}" ${_aa_smtpTo}
1561
+ EOF
1562
+ ;;
1563
+
1564
+ ${__LOG4SH_TYPE_SYSLOG})
1565
+ cat <<EOF
1566
+ case "\${_la_level}" in
1567
+ ${__LOG4SH_LEVEL_TRACE_STR}) _la_tag='debug' ;; # no 'trace' equivalent
1568
+ ${__LOG4SH_LEVEL_DEBUG_STR}) _la_tag='debug' ;;
1569
+ ${__LOG4SH_LEVEL_INFO_STR}) _la_tag='info' ;;
1570
+ ${__LOG4SH_LEVEL_WARN_STR}) _la_tag='warning' ;; # 'warn' is deprecated
1571
+ ${__LOG4SH_LEVEL_ERROR_STR}) _la_tag='err' ;; # 'error' is deprecated
1572
+ ${__LOG4SH_LEVEL_FATAL_STR}) _la_tag='alert' ;;
1573
+ esac
1574
+ EOF
1575
+
1576
+ _aa_facilityName=`appender_syslog_getFacility ${_aa_appender}`
1577
+ _aa_syslogHost=`appender_syslog_getHost ${_aa_appender}`
1578
+ _aa_hostname=`hostname |sed 's/^\([^.]*\)\..*/\1/'`
1579
+
1580
+ # are we logging to a remote host?
1581
+ if [ -z "${_aa_syslogHost}" ]; then
1582
+ # no -- use logger
1583
+ cat <<EOF
1584
+ ( exec logger -p "${_aa_facilityName}.\${_la_tag}" \
1585
+ -t "${__log4sh_filename}[$$]" "\${_la_layout}" 2>/dev/null )
1586
+ unset _la_tag
1587
+ EOF
1588
+ else
1589
+ # yes -- use netcat
1590
+ if [ -n "${__log4sh_alternative_nc:-}" ]; then
1591
+ case ${_aa_facilityName} in
1592
+ kern) _aa_facilityCode=0 ;; # 0<<3
1593
+ user) _aa_facilityCode=8 ;; # 1<<3
1594
+ mail) _aa_facilityCode=16 ;; # 2<<3
1595
+ daemon) _aa_facilityCode=24 ;; # 3<<3
1596
+ auth|security) _aa_facilityCode=32 ;; # 4<<3
1597
+ syslog) _aa_facilityCode=40 ;; # 5<<3
1598
+ lpr) _aa_facilityCode=48 ;; # 6<<3
1599
+ news) _aa_facilityCode=56 ;; # 7<<3
1600
+ uucp) _aa_facilityCode=64 ;; # 8<<3
1601
+ cron) _aa_facilityCode=72 ;; # 9<<3
1602
+ authpriv) _aa_facilityCode=80 ;; # 10<<3
1603
+ ftp) _aa_facilityCode=88 ;; # 11<<3
1604
+ local0) _aa_facilityCode=128 ;; # 16<<3
1605
+ local1) _aa_facilityCode=136 ;; # 17<<3
1606
+ local2) _aa_facilityCode=144 ;; # 18<<3
1607
+ local3) _aa_facilityCode=152 ;; # 19<<3
1608
+ local4) _aa_facilityCode=160 ;; # 20<<3
1609
+ local5) _aa_facilityCode=168 ;; # 21<<3
1610
+ local6) _aa_facilityCode=176 ;; # 22<<3
1611
+ local7) _aa_facilityCode=184 ;; # 23<<3
1612
+ esac
1613
+
1614
+ cat <<EOF
1615
+ case \${_la_tag} in
1616
+ alert) _la_priority=1 ;;
1617
+ err|error) _la_priority=3 ;;
1618
+ warning|warn) _la_priority=4 ;;
1619
+ info) _la_priority=6 ;;
1620
+ debug) _la_priority=7 ;;
1621
+ esac
1622
+ _la_priority=\`expr ${_aa_facilityCode} + \${_la_priority}\`
1623
+ _la_date=\`date "+%b %d %H:%M:%S"\`
1624
+ _la_hostname='${_aa_hostname}'
1625
+
1626
+ _la_syslogMsg="<\${_la_priority}>\${_la_date} \${_la_hostname} \${_la_layout}"
1627
+
1628
+ # do RFC 3164 cleanups
1629
+ _la_date=\`echo \"\${_la_date}\" |sed 's/ 0\([0-9]\) / \1 /'\`
1630
+ _la_syslogMsg=\`echo "\${_la_syslogMsg}" |cut -b1-1024\`
1631
+
1632
+ ( echo "\${_la_syslogMsg}" |\
1633
+ exec ${__log4sh_alternative_nc} ${__log4sh_alternative_nc_opts} -w 1 -u \
1634
+ ${_aa_syslogHost} 514 )
1635
+ unset _la_tag _la_priority _la_date _la_hostname _la_syslogMsg
1636
+ EOF
1637
+ unset _aa_facilityCode _aa_syslogHost _aa_hostname
1638
+ else
1639
+ # no netcat alternative set; doing nothing
1640
+ :
1641
+ fi
1642
+ fi
1643
+ unset _aa_facilityName
1644
+ ;;
1645
+
1646
+ *) _log4sh_error "unrecognized appender type (${_aa_type})" ;;
1647
+ esac
1648
+
1649
+ # footer
1650
+ cat <<EOF
1651
+ unset _la_level _la_message _la_layout
1652
+ }
1653
+ EOF
1654
+
1655
+ # override the activateOptions function as we don't need it anymore
1656
+ cat <<EOF
1657
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${_aa_appender}_activateOptions() { :; }
1658
+ EOF
1659
+
1660
+ # restore STDOUT
1661
+ exec 1>&4 4>&-
1662
+
1663
+ # source the newly created function
1664
+ ${__LOG4SH_TRACE} 're-sourcing the newly created function'
1665
+ . "${_aa_inc}"
1666
+
1667
+ unset _aa_appender _aa_inc _aa_layout _aa_pattern _aa_type
1668
+ }
1669
+
1670
+ #-----------------------------------------------------------------------------
1671
+ # FileAppender
1672
+ #
1673
+
1674
+ #/**
1675
+ # <s:function group="FileAppender" modifier="private">
1676
+ # <entry align="right">
1677
+ # <code>string</code>
1678
+ # </entry>
1679
+ # <entry>
1680
+ # <funcsynopsis>
1681
+ # <funcprototype>
1682
+ # <funcdef><function>_appender_file_getFileByIndex</function></funcdef>
1683
+ # <paramdef>integer <parameter>index</parameter></paramdef>
1684
+ # </funcprototype>
1685
+ # </funcsynopsis>
1686
+ # <para>Get the filename of a FileAppender at the given array index</para>
1687
+ # <funcsynopsis>
1688
+ # <funcsynopsisinfo>_appender_file_getFileByIndex 3</funcsynopsisinfo>
1689
+ # </funcsynopsis>
1690
+ # </entry>
1691
+ # </s:function>
1692
+ #*/
1693
+ _appender_file_getFileByIndex()
1694
+ {
1695
+ _log4sh_getArrayElement "${__log4shAppender_file_files}" $1
1696
+ }
1697
+
1698
+ #/**
1699
+ # <s:function group="FileAppender" modifier="public">
1700
+ # <entry align="right">
1701
+ # <code>string</code>
1702
+ # </entry>
1703
+ # <entry>
1704
+ # <funcsynopsis>
1705
+ # <funcprototype>
1706
+ # <funcdef><function>appender_file_getFile</function></funcdef>
1707
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1708
+ # </funcprototype>
1709
+ # </funcsynopsis>
1710
+ # <para>Get the filename of a FileAppender</para>
1711
+ # <funcsynopsis>
1712
+ # <funcsynopsisinfo>appender_file_getFile myAppender</funcsynopsisinfo>
1713
+ # </funcsynopsis>
1714
+ # </entry>
1715
+ # </s:function>
1716
+ #*/
1717
+ appender_file_getFile()
1718
+ {
1719
+ _index=`_log4sh_findArrayElement "$__log4shAppenders" $1`
1720
+ _log4sh_getArrayElement "$__log4shAppender_file_files" $_index
1721
+ unset _index
1722
+ }
1723
+
1724
+ #/**
1725
+ # <s:function group="FileAppender" modifier="public">
1726
+ # <entry align="right">
1727
+ # <emphasis>void</emphasis>
1728
+ # </entry>
1729
+ # <entry>
1730
+ # <funcsynopsis>
1731
+ # <funcprototype>
1732
+ # <funcdef><function>appender_file_setFile</function></funcdef>
1733
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1734
+ # <paramdef>string <parameter>filename</parameter></paramdef>
1735
+ # </funcprototype>
1736
+ # </funcsynopsis>
1737
+ # <para>
1738
+ # Set the filename for a FileAppender (e.g. <filename>STDERR</filename> or
1739
+ # <filename>/var/log/log4sh.log</filename>).
1740
+ # </para>
1741
+ # <funcsynopsis>
1742
+ # <funcsynopsisinfo>appender_file_setFile myAppender STDERR</funcsynopsisinfo>
1743
+ # </funcsynopsis>
1744
+ # </entry>
1745
+ # </s:function>
1746
+ #*/
1747
+ appender_file_setFile()
1748
+ {
1749
+ afsf_appender=$1
1750
+ afsf_file=$2
1751
+ ${__LOG4SH_TRACE} "afsf_appender='${afsf_appender}' afsf_file='${afsf_file}'"
1752
+
1753
+ if [ -n "${afsf_appender}" -a -n "${afsf_file}" ]; then
1754
+ # set the file
1755
+ _index=`_log4sh_findArrayElement "${__log4shAppenders}" ${afsf_appender}`
1756
+ __log4shAppender_file_files=`_log4sh_setArrayElement \
1757
+ "${__log4shAppender_file_files}" ${_index} "${afsf_file}"`
1758
+ _return=$?
1759
+
1760
+ # create the file (if it isn't already)
1761
+ if [ ${_return} -eq ${__LOG4SH_TRUE} \
1762
+ -a ! "${afsf_file}" '=' "${__LOG4SH_NULL}" \
1763
+ -a ! "${afsf_file}" '=' 'STDERR' \
1764
+ -a ! -f "${afsf_file}" \
1765
+ ]; then
1766
+ touch "${afsf_file}" 2>/dev/null
1767
+ _result=$?
1768
+ # determine success of touch command
1769
+ if [ ${_result} -eq 1 ]; then
1770
+ _log4sh_error "appender_file_setFile(): could not create file (${afsf_file}); closing appender"
1771
+ appender_setLevel ${afsf_appender} ${__LOG4SH_LEVEL_CLOSED_STR}
1772
+ fi
1773
+ unset _result
1774
+ fi
1775
+ else
1776
+ _log4sh_error 'appender_file_setFile(): missing appender and/or file'
1777
+ _return=${__LOG4SH_FALSE}
1778
+ fi
1779
+
1780
+ # resource the appender
1781
+ _appender_cache ${afsf_appender}
1782
+
1783
+ unset afsf_appender afsf_file _index
1784
+ return ${_return}
1785
+ }
1786
+
1787
+ #/**
1788
+ # <s:function group="FileAppender" modifier="public">
1789
+ # <entry align="right">
1790
+ # <emphasis>void</emphasis>
1791
+ # </entry>
1792
+ # <entry>
1793
+ # <funcsynopsis>
1794
+ # <funcprototype>
1795
+ # <funcdef><function>appender_setAppenderFile</function></funcdef>
1796
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1797
+ # <paramdef>string <parameter>filename</parameter></paramdef>
1798
+ # </funcprototype>
1799
+ # </funcsynopsis>
1800
+ # <para><emphasis role="strong">Deprecated as of 1.3.2</emphasis></para>
1801
+ # <para>
1802
+ # Set the filename for a FileAppender (e.g. "STDERR" or
1803
+ # "/var/log/log4sh.log")
1804
+ # </para>
1805
+ # <funcsynopsis>
1806
+ # <funcsynopsisinfo>appender_setAppenderFile myAppender STDERR</funcsynopsisinfo>
1807
+ # </funcsynopsis>
1808
+ # </entry>
1809
+ # </s:function>
1810
+ #*/
1811
+ appender_setAppenderFile()
1812
+ {
1813
+ appender_file_setFile "$@"
1814
+ }
1815
+
1816
+ #/**
1817
+ # <s:function group="FileAppender" modifier="public">
1818
+ # <entry align="right">
1819
+ # <code>integer</code>/boolean
1820
+ # </entry>
1821
+ # <entry>
1822
+ # <funcsynopsis>
1823
+ # <funcprototype>
1824
+ # <funcdef><function>appender_file_getMaxBackupIndex</function></funcdef>
1825
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1826
+ # </funcprototype>
1827
+ # </funcsynopsis>
1828
+ # <para>
1829
+ # Returns the value of the MaxBackupIndex option.
1830
+ # </para>
1831
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
1832
+ # <funcsynopsis>
1833
+ # <funcsynopsisinfo>appender_file_getMaxBackupIndex myAppender</funcsynopsisinfo>
1834
+ # </funcsynopsis>
1835
+ # </entry>
1836
+ # </s:function>
1837
+ #*/
1838
+ appender_file_getMaxBackupIndex()
1839
+ {
1840
+ if [ $# -ne 1 ]; then
1841
+ _log4sh_error 'appender_file_getMaxBackupIndex(): invalid number of parameters'
1842
+ return ${__LOG4SH_FALSE}
1843
+ fi
1844
+
1845
+ afgmbi_appender=$1
1846
+
1847
+ afgmbi_index=`_log4sh_findArrayElement \
1848
+ "${__log4shAppenders}" ${afgmbi_appender}`
1849
+ # TODO: put check for valid index here
1850
+ _log4sh_getArrayElement \
1851
+ "${__log4shAppender_rollingFile_maxBackupIndexes}" ${afgmbi_index}
1852
+ __log4sh_return=$?
1853
+
1854
+ unset afgmbi_appender afgmbi_index
1855
+ return ${__log4sh_return}
1856
+ }
1857
+
1858
+ #/**
1859
+ # <s:function group="FileAppender" modifier="public">
1860
+ # <entry align="right">
1861
+ # <emphasis>void</emphasis>
1862
+ # </entry>
1863
+ # <entry>
1864
+ # <funcsynopsis>
1865
+ # <funcprototype>
1866
+ # <funcdef><function>appender_file_setMaxBackupIndex</function></funcdef>
1867
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1868
+ # <paramdef>integer <parameter>index</parameter></paramdef>
1869
+ # </funcprototype>
1870
+ # </funcsynopsis>
1871
+ # <para>Set the maximum number of backup files to keep around.</para>
1872
+ # <para>
1873
+ # The <emphasis role="strong">MaxBackupIndex</emphasis> option determines
1874
+ # how many backup files are kept before the oldest is erased. This option
1875
+ # takes a positive integer value. If set to zero, then there will be no
1876
+ # backup files and the log file will be truncated when it reaches
1877
+ # <option>MaxFileSize</option>.
1878
+ # </para>
1879
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
1880
+ # <funcsynopsis>
1881
+ # <funcsynopsisinfo>appender_file_setMaxBackupIndex myAppender 3</funcsynopsisinfo>
1882
+ # </funcsynopsis>
1883
+ # </entry>
1884
+ # </s:function>
1885
+ #*/
1886
+ appender_file_setMaxBackupIndex()
1887
+ {
1888
+ if [ $# -ne 2 ]; then
1889
+ _log4sh_error "appender_file_setMaxBackupIndex(): invalid number of parameters ($#)"
1890
+ return ${__LOG4SH_FALSE}
1891
+ fi
1892
+
1893
+ afsmbi_appender=$1
1894
+ afsmbi_maxIndex=$2
1895
+
1896
+ # TODO: put check for valid input
1897
+
1898
+ afsmbi_index=`_log4sh_findArrayElement \
1899
+ "${__log4shAppenders}" ${afsmbi_appender}`
1900
+ # TODO: put check for valid index here
1901
+ __log4shAppender_rollingFile_maxBackupIndexes=`_log4sh_setArrayElement \
1902
+ "${__log4shAppender_rollingFile_maxBackupIndexes}" ${afsmbi_index} \
1903
+ "${afsmbi_maxIndex}"`
1904
+ __log4sh_return=$?
1905
+
1906
+ # re-source the appender
1907
+ _appender_cache ${afsmbi_appender}
1908
+
1909
+ unset afsmbi_appender afsmbi_maxIndex afsmbi_index
1910
+ return ${__log4sh_return}
1911
+ }
1912
+
1913
+ #/**
1914
+ # <s:function group="FileAppender" modifier="public">
1915
+ # <entry align="right">
1916
+ # <code>integer</code>/boolean
1917
+ # </entry>
1918
+ # <entry>
1919
+ # <funcsynopsis>
1920
+ # <funcprototype>
1921
+ # <funcdef><function>appender_file_getMaxFileSize</function></funcdef>
1922
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1923
+ # </funcprototype>
1924
+ # </funcsynopsis>
1925
+ # <para>
1926
+ # Get the maximum size that the output file is allowed to reach before
1927
+ # being rolled over to backup files.
1928
+ # </para>
1929
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
1930
+ # <funcsynopsis>
1931
+ # <funcsynopsisinfo>maxSize=`appender_file_getMaxBackupSize myAppender`</funcsynopsisinfo>
1932
+ # </funcsynopsis>
1933
+ # </entry>
1934
+ # </s:function>
1935
+ #*/
1936
+ appender_file_getMaxFileSize()
1937
+ {
1938
+ if [ $# -ne 1 ]; then
1939
+ _log4sh_error "appender_file_getMaxFileSize(): invalid number of parameters ($#)"
1940
+ return ${__LOG4SH_FALSE}
1941
+ fi
1942
+
1943
+ afgmfs_appender=$1
1944
+
1945
+ afgmfs_index=`_log4sh_findArrayElement \
1946
+ "${__log4shAppenders}" ${afgmfs_appender}`
1947
+ # TODO: put check for valid index here
1948
+ _log4sh_getArrayElement \
1949
+ "${__log4shAppender_rollingFile_maxFileSizes}" ${afgmfs_index}
1950
+ __log4sh_return=$?
1951
+
1952
+ unset afgmfs_appender afgmfs_index
1953
+ return ${__log4sh_return}
1954
+ }
1955
+
1956
+ #/**
1957
+ # <s:function group="FileAppender" modifier="public">
1958
+ # <entry align="right">
1959
+ # <emphasis>void</emphasis>/boolean
1960
+ # </entry>
1961
+ # <entry>
1962
+ # <funcsynopsis>
1963
+ # <funcprototype>
1964
+ # <funcdef><function>appender_file_setMaxFileSize</function></funcdef>
1965
+ # <paramdef>string <parameter>appender</parameter></paramdef>
1966
+ # <paramdef>string <parameter>size</parameter></paramdef>
1967
+ # </funcprototype>
1968
+ # </funcsynopsis>
1969
+ # <para>
1970
+ # Set the maximum size that the output file is allowed to reach before
1971
+ # being rolled over to backup files.
1972
+ # </para>
1973
+ # <para>
1974
+ # In configuration files, the <option>MaxFileSize</option> option takes an
1975
+ # long integer in the range 0 - 2^40. You can specify the value with the
1976
+ # suffixes "KiB", "MiB" or "GiB" so that the integer is interpreted being
1977
+ # expressed respectively in kilobytes, megabytes or gigabytes. For example,
1978
+ # the value "10KiB" will be interpreted as 10240.
1979
+ # </para>
1980
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
1981
+ # <funcsynopsis>
1982
+ # <funcsynopsisinfo>appender_file_setMaxBackupSize myAppender 10KiB</funcsynopsisinfo>
1983
+ # </funcsynopsis>
1984
+ # </entry>
1985
+ # </s:function>
1986
+ #*/
1987
+ appender_file_setMaxFileSize()
1988
+ {
1989
+ if [ $# -ne 2 ]; then
1990
+ _log4sh_error \
1991
+ "appender_file_setMaxFileSize(): invalid number of parameters ($#)"
1992
+ return ${__LOG4SH_ERROR}
1993
+ fi
1994
+
1995
+ afsmfs_appender=$1
1996
+ afsmfs_size=$2
1997
+ afsmfs_return=${__LOG4SH_TRUE}
1998
+
1999
+ # split the file size into parts
2000
+ afsmfs_value=`expr ${afsmfs_size} : '\([0-9]*\)'`
2001
+ afsmfs_unit=`expr ${afsmfs_size} : '[0-9]* *\([A-Za-z]\{1,3\}\)'`
2002
+
2003
+ # determine multiplier
2004
+ if [ ${__log4sh_wa_strictBehavior} -eq ${__LOG4SH_TRUE} ]; then
2005
+ case "${afsmfs_unit}" in
2006
+ KB) afsmfs_unit='KiB' ;;
2007
+ MB) afsmfs_unit='MiB' ;;
2008
+ GB) afsmfs_unit='GiB' ;;
2009
+ TB) afsmfs_unit='TiB' ;;
2010
+ esac
2011
+ fi
2012
+ case "${afsmfs_unit}" in
2013
+ B) afsmfs_mul=1 ;;
2014
+ KB) afsmfs_mul=1000 ;;
2015
+ KiB) afsmfs_mul=1024 ;;
2016
+ MB) afsmfs_mul=1000000 ;;
2017
+ MiB) afsmfs_mul=1048576 ;;
2018
+ GB) afsmfs_mul=1000000000 ;;
2019
+ GiB) afsmfs_mul=1073741824 ;;
2020
+ TB) afsmfs_mul=1000000000000 ;;
2021
+ TiB) afsmfs_mul=1099511627776 ;;
2022
+ '')
2023
+ _log4sh_warn 'missing file size unit; assuming bytes'
2024
+ afsmfs_mul=1
2025
+ ;;
2026
+ *)
2027
+ _log4sh_error "unrecognized file size unit '${afsmfs_unit}'"
2028
+ afsmfs_return=${__LOG4SH_ERROR}
2029
+ ;;
2030
+ esac
2031
+
2032
+ # calculate maximum file size
2033
+ if [ ${afsmfs_return} -eq ${__LOG4SH_TRUE} ]; then
2034
+ afsmfs_maxFileSize=`(expr ${afsmfs_value} \* ${afsmfs_mul} 2>&1)`
2035
+ if [ $? -gt 0 ]; then
2036
+ _log4sh_error "problem calculating maximum file size: '${afsmfs_maxFileSize}'"
2037
+ afsmfs_return=${__LOG4SH_FALSE}
2038
+ fi
2039
+ fi
2040
+
2041
+ # store the maximum file size
2042
+ if [ ${afsmfs_return} -eq ${__LOG4SH_TRUE} ]; then
2043
+ afsmfs_index=`_log4sh_findArrayElement \
2044
+ "${__log4shAppenders}" ${afsmfs_appender}`
2045
+ # TODO: put check for valid index here
2046
+ __log4shAppender_rollingFile_maxFileSizes=`_log4sh_setArrayElement \
2047
+ "${__log4shAppender_rollingFile_maxFileSizes}" ${afsmfs_index} \
2048
+ "${afsmfs_maxFileSize}"`
2049
+ fi
2050
+
2051
+ # re-source the appender
2052
+ [ ${afsmfs_return} -eq ${__LOG4SH_TRUE} ] \
2053
+ && _appender_cache ${afsmfs_appender}
2054
+
2055
+ __log4sh_return=${afsmfs_return}
2056
+ unset afsmfs_appender afsmfs_size afsmfs_value afsmfs_unit afsmfs_mul \
2057
+ afsmfs_maxFileSize afsmfs_index afsmfs_return
2058
+ return ${__log4sh_return}
2059
+ }
2060
+
2061
+ #-----------------------------------------------------------------------------
2062
+ # SMTPAppender
2063
+ #
2064
+
2065
+ #/**
2066
+ # <s:function group="SMTPAppender" modifier="public">
2067
+ # <entry align="right">
2068
+ # <code>string</code>/boolean
2069
+ # </entry>
2070
+ # <entry>
2071
+ # <funcsynopsis>
2072
+ # <funcprototype>
2073
+ # <funcdef><function>appender_smtp_getTo</function></funcdef>
2074
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2075
+ # </funcprototype>
2076
+ # </funcsynopsis>
2077
+ # <para>Get the to address for the given appender</para>
2078
+ # <funcsynopsis>
2079
+ # <funcsynopsisinfo>email=`appender_smtp_getTo myAppender`</funcsynopsisinfo>
2080
+ # </funcsynopsis>
2081
+ # </entry>
2082
+ # </s:function>
2083
+ #*/
2084
+ appender_smtp_getTo()
2085
+ {
2086
+ if [ $# -ne 1 ]; then
2087
+ _log4sh_error 'appender_smtp_getTo(): invalid number of parameters'
2088
+ return ${__LOG4SH_FALSE}
2089
+ fi
2090
+
2091
+ asgt_appender=$1
2092
+
2093
+ asgt_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asgt_appender}`
2094
+ # TODO: put check for valid index here
2095
+ asgt_to=`_log4sh_getArrayElement \
2096
+ "${__log4shAppender_smtp_tos}" ${asgt_index}`
2097
+ __log4sh_return=$?
2098
+
2099
+ [ "${asgt_to}" = "${__LOG4SH_NULL}" ] && asgt_to=''
2100
+ echo "${asgt_to}"
2101
+
2102
+ unset asgt_appender asgt_index asgt_to
2103
+ return ${__log4sh_return}
2104
+ }
2105
+
2106
+ #/**
2107
+ # <s:function group="SMTPAppender" modifier="public">
2108
+ # <entry align="right">
2109
+ # <emphasis>void</emphasis>/boolean
2110
+ # </entry>
2111
+ # <entry>
2112
+ # <funcsynopsis>
2113
+ # <funcprototype>
2114
+ # <funcdef><function>appender_smtp_setTo</function></funcdef>
2115
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2116
+ # <paramdef>string <parameter>email</parameter></paramdef>
2117
+ # </funcprototype>
2118
+ # </funcsynopsis>
2119
+ # <para>Set the to address for the given appender</para>
2120
+ # <funcsynopsis>
2121
+ # <funcsynopsisinfo>appender_smtp_setTo myAppender user@example.com</funcsynopsisinfo>
2122
+ # </funcsynopsis>
2123
+ # </entry>
2124
+ # </s:function>
2125
+ #*/
2126
+ appender_smtp_setTo()
2127
+ {
2128
+ if [ $# -ne 2 ]; then
2129
+ _log4sh_error 'appender_smtp_setTo(): invalid number of parameters'
2130
+ return ${__LOG4SH_FALSE}
2131
+ fi
2132
+
2133
+ asst_appender=$1
2134
+ asst_email=$2
2135
+
2136
+ asst_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asst_appender}`
2137
+ # TODO: put check for valid index here
2138
+ __log4shAppender_smtp_tos=`_log4sh_setArrayElement \
2139
+ "${__log4shAppender_smtp_tos}" ${asst_index} "${asst_email}"`
2140
+
2141
+ # resource the appender
2142
+ _appender_cache ${asst_appender}
2143
+
2144
+ unset asst_appender asst_email asst_index
2145
+ }
2146
+
2147
+ #/**
2148
+ # <s:function group="SMTPAppender" modifier="public">
2149
+ # <entry align="right">
2150
+ # <emphasis>void</emphasis>
2151
+ # </entry>
2152
+ # <entry>
2153
+ # <funcsynopsis>
2154
+ # <funcprototype>
2155
+ # <funcdef><function>appender_setAppenderRecipient</function></funcdef>
2156
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2157
+ # <paramdef>string <parameter>email</parameter></paramdef>
2158
+ # </funcprototype>
2159
+ # </funcsynopsis>
2160
+ # <para><emphasis role="strong">Deprecated as of 1.3.1</emphasis></para>
2161
+ # <para>
2162
+ # Set the to address for the given appender
2163
+ # </para>
2164
+ # <funcsynopsis>
2165
+ # <funcsynopsisinfo>appender_smtp_setTo myAppender user@example.com</funcsynopsisinfo>
2166
+ # </funcsynopsis>
2167
+ # </entry>
2168
+ # </s:function>
2169
+ #*/
2170
+ appender_setAppenderRecipient()
2171
+ {
2172
+ appender_smtp_setTo "$@"
2173
+ }
2174
+
2175
+ #/**
2176
+ # <s:function group="SMTPAppender" modifier="public">
2177
+ # <entry align="right">
2178
+ # <code>string</code>/boolean
2179
+ # </entry>
2180
+ # <entry>
2181
+ # <funcsynopsis>
2182
+ # <funcprototype>
2183
+ # <funcdef><function>appender_smtp_getSubject</function></funcdef>
2184
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2185
+ # </funcprototype>
2186
+ # </funcsynopsis>
2187
+ # <para>Get the email subject for the given appender</para>
2188
+ # <funcsynopsis>
2189
+ # <funcsynopsisinfo>subject=`appender_smtp_getSubject myAppender`</funcsynopsisinfo>
2190
+ # </funcsynopsis>
2191
+ # </entry>
2192
+ # </s:function>
2193
+ #*/
2194
+ appender_smtp_getSubject()
2195
+ {
2196
+ if [ $# -ne 1 ]; then
2197
+ _log4sh_error 'appender_smtp_getSubject(): invalid number of parameters'
2198
+ return ${__LOG4SH_FALSE}
2199
+ fi
2200
+
2201
+ asgs_appender=$1
2202
+
2203
+ asgs_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asgs_appender}`
2204
+ # TODO: put check for valid index here
2205
+ asgs_subject=`_log4sh_getArrayElement \
2206
+ "${__log4shAppender_smtp_subjects}" ${asgs_index}`
2207
+ __log4sh_return=$?
2208
+
2209
+ [ "${asgs_subject}" = "${__LOG4SH_NULL}" ] && asgs_subject=''
2210
+ echo "${asgs_subject}"
2211
+
2212
+ unset asgs_appender asgs_index asgs_subject
2213
+ return ${__log4sh_return}
2214
+ }
2215
+
2216
+ #/**
2217
+ # <s:function group="SMTPAppender" modifier="public">
2218
+ # <entry align="right">
2219
+ # <emphasis>void</emphasis>/boolean
2220
+ # </entry>
2221
+ # <entry>
2222
+ # <funcsynopsis>
2223
+ # <funcprototype>
2224
+ # <funcdef><function>appender_smtp_setSubject</function></funcdef>
2225
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2226
+ # <paramdef>string <parameter>subject</parameter></paramdef>
2227
+ # </funcprototype>
2228
+ # </funcsynopsis>
2229
+ # <para>Sets the email subject for an SMTP appender</para>
2230
+ # <funcsynopsis>
2231
+ # <funcsynopsisinfo>appender_smtp_setSubject myAppender "This is a test"</funcsynopsisinfo>
2232
+ # </funcsynopsis>
2233
+ # </entry>
2234
+ # </s:function>
2235
+ #*/
2236
+ appender_smtp_setSubject()
2237
+ {
2238
+ if [ $# -ne 2 ]; then
2239
+ _log4sh_error 'appender_smtp_setSubject(): invalid number of parameters'
2240
+ return ${__LOG4SH_FALSE}
2241
+ fi
2242
+
2243
+ asss_appender=$1
2244
+ asss_subject=$2
2245
+
2246
+ # set the Subject
2247
+ asss_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asss_appender}`
2248
+ if [ ${asss_index} -gt 0 ]; then
2249
+ __log4shAppender_smtp_subjects=`_log4sh_setArrayElement \
2250
+ "${__log4shAppender_smtp_subjects}" ${asss_index} "${asss_subject}"`
2251
+ __log4sh_return=${__LOG4SH_TRUE}
2252
+ else
2253
+ _log4sh_error "could not set Subject for appender (${asss_appender})"
2254
+ __log4sh_return=${__LOG4SH_FALSE}
2255
+ fi
2256
+
2257
+ # re-source the appender
2258
+ _appender_cache ${asss_appender}
2259
+
2260
+ unset asss_appender asss_subject asss_index
2261
+ return ${__log4sh_return}
2262
+ }
2263
+
2264
+ #/**
2265
+ # <s:function group="SMTPAppender" modifier="public">
2266
+ # <entry align="right">
2267
+ # <emphasis>void</emphasis>
2268
+ # </entry>
2269
+ # <entry>
2270
+ # <funcsynopsis>
2271
+ # <funcprototype>
2272
+ # <funcdef><function>appender_setAppenderSubject</function></funcdef>
2273
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2274
+ # <paramdef>string <parameter>subject</parameter></paramdef>
2275
+ # </funcprototype>
2276
+ # </funcsynopsis>
2277
+ # <para><emphasis role="strong">Deprecated as of 1.3.1</emphasis></para>
2278
+ # <para>
2279
+ # Sets the email subject for an SMTP appender
2280
+ # </para>
2281
+ # <funcsynopsis>
2282
+ # <funcsynopsisinfo>appender_setAppenderSubject myAppender "This is a test"</funcsynopsisinfo>
2283
+ # </funcsynopsis>
2284
+ # </entry>
2285
+ # </s:function>
2286
+ #*/
2287
+ appender_setAppenderSubject()
2288
+ {
2289
+ appender_smtp_setSubject "$@"
2290
+ }
2291
+
2292
+ #-----------------------------------------------------------------------------
2293
+ # SyslogAppender
2294
+ #
2295
+
2296
+ #/**
2297
+ # <s:function group="SyslogAppender" modifier="private">
2298
+ # <entry align="right">
2299
+ # <code>string</code>
2300
+ # </entry>
2301
+ # <entry>
2302
+ # <funcsynopsis>
2303
+ # <funcprototype>
2304
+ # <funcdef>
2305
+ # <function>_appender_syslog_getFacilityByIndex</function>
2306
+ # </funcdef>
2307
+ # <paramdef>integer <parameter>index</parameter></paramdef>
2308
+ # </funcprototype>
2309
+ # </funcsynopsis>
2310
+ # <para>Get the syslog facility of the specified appender by index</para>
2311
+ # <funcsynopsis>
2312
+ # <funcsynopsisinfo>
2313
+ # facility=`_appender_syslog_getFacilityByIndex 3`
2314
+ # </funcsynopsisinfo>
2315
+ # </funcsynopsis>
2316
+ # </entry>
2317
+ # </s:function>
2318
+ #*/
2319
+ _appender_syslog_getFacilityByIndex()
2320
+ {
2321
+ _log4sh_getArrayElement "$__log4shAppender_syslog_facilities" $1
2322
+ }
2323
+
2324
+ #/**
2325
+ # <s:function group="SyslogAppender" modifier="public">
2326
+ # <entry align="right">
2327
+ # <code>string</code>
2328
+ # </entry>
2329
+ # <entry>
2330
+ # <funcsynopsis>
2331
+ # <funcprototype>
2332
+ # <funcdef><function>appender_getSyslogFacility</function></funcdef>
2333
+ # <paramdef>integer <parameter>index</parameter></paramdef>
2334
+ # </funcprototype>
2335
+ # </funcsynopsis>
2336
+ # <para><emphasis role="strong">Deprecated as of 1.3.1</emphasis></para>
2337
+ # <para>
2338
+ # Get the syslog facility of the specified appender by index
2339
+ # </para>
2340
+ # <funcsynopsis>
2341
+ # <funcsynopsisinfo>facility=`appender_getSyslogFacility 3`</funcsynopsisinfo>
2342
+ # </funcsynopsis>
2343
+ # </entry>
2344
+ # </s:function>
2345
+ #*/
2346
+ appender_getSyslogFacility()
2347
+ {
2348
+ _appender_syslog_getFacilityByIndex "$@"
2349
+ }
2350
+
2351
+ #/**
2352
+ # <s:function group="SyslogAppender" modifier="public">
2353
+ # <entry align="right">
2354
+ # <emphasis>void</emphasis>
2355
+ # </entry>
2356
+ # <entry>
2357
+ # <funcsynopsis>
2358
+ # <funcprototype>
2359
+ # <funcdef><function>appender_syslog_getFacility</function></funcdef>
2360
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2361
+ # </funcprototype>
2362
+ # </funcsynopsis>
2363
+ # <para>
2364
+ # Get the syslog facility for the given appender.
2365
+ # </para>
2366
+ # <funcsynopsis>
2367
+ # <funcsynopsisinfo>facility=`appender_syslog_getFacility myAppender`</funcsynopsisinfo>
2368
+ # </funcsynopsis>
2369
+ # </entry>
2370
+ # </s:function>
2371
+ #*/
2372
+ appender_syslog_getFacility()
2373
+ {
2374
+ if [ $# -ne 1 ]; then
2375
+ _log4sh_error 'appender_syslog_getFacility(): invalid number of parameters'
2376
+ return ${__LOG4SH_FALSE}
2377
+ fi
2378
+
2379
+ asgf_appender=$1
2380
+
2381
+ asgf_index=`_log4sh_findArrayElement "$__log4shAppenders" ${asgf_appender}`
2382
+ _log4sh_getArrayElement "${__log4shAppender_syslog_facilities}" ${asgf_index}
2383
+
2384
+ unset asgf_appender asgf_index
2385
+ }
2386
+
2387
+ #/**
2388
+ # <s:function group="SyslogAppender" modifier="public">
2389
+ # <entry align="right">
2390
+ # <emphasis>void</emphasis>
2391
+ # </entry>
2392
+ # <entry>
2393
+ # <funcsynopsis>
2394
+ # <funcprototype>
2395
+ # <funcdef><function>appender_syslog_setFacility</function></funcdef>
2396
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2397
+ # <paramdef>string <parameter>facility</parameter></paramdef>
2398
+ # </funcprototype>
2399
+ # </funcsynopsis>
2400
+ # <para>Set the syslog facility for the given appender</para>
2401
+ # <funcsynopsis>
2402
+ # <funcsynopsisinfo>appender_syslog_setFacility myAppender local4`</funcsynopsisinfo>
2403
+ # </funcsynopsis>
2404
+ # </entry>
2405
+ # </s:function>
2406
+ #*/
2407
+ appender_syslog_setFacility()
2408
+ {
2409
+ if [ $# -ne 2 ]; then
2410
+ _log4sh_error 'appender_syslog_setFacility(): invalid number of parameters'
2411
+ return ${__LOG4SH_FALSE}
2412
+ fi
2413
+ assf_appender=$1
2414
+ assf_facility=$2
2415
+
2416
+ # check for valid facility
2417
+ echo "${__LOG4SH_TYPE_SYSLOG_FACILITY_NAMES}" |grep " ${assf_facility} " >/dev/null
2418
+ if [ $? -ne 0 ]; then
2419
+ # the facility is not valid
2420
+ _log4sh_error "[${assf_facility}] is an unknown syslog facility. Defaulting to [user]."
2421
+ assf_facility='user'
2422
+ fi
2423
+
2424
+ # set appender facility
2425
+ assf_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${assf_appender}`
2426
+ # TODO: put check for valid index here
2427
+ __log4shAppender_syslog_facilities=`_log4sh_setArrayElement \
2428
+ "${__log4shAppender_syslog_facilities}" ${assf_index} "${assf_facility}"`
2429
+
2430
+ # re-source the appender
2431
+ _appender_cache ${assf_appender}
2432
+
2433
+ unset assf_appender assf_facility assf_index
2434
+ return ${__LOG4SH_TRUE}
2435
+ }
2436
+
2437
+ #/**
2438
+ # <s:function group="SyslogAppender" modifier="public">
2439
+ # <entry align="right">
2440
+ # <emphasis>void</emphasis>
2441
+ # </entry>
2442
+ # <entry>
2443
+ # <funcsynopsis>
2444
+ # <funcprototype>
2445
+ # <funcdef><function>appender_setSyslogFacility</function></funcdef>
2446
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2447
+ # <paramdef>string <parameter>facility</parameter></paramdef>
2448
+ # </funcprototype>
2449
+ # </funcsynopsis>
2450
+ # <para><emphasis role="strong">Deprecated as of 1.3.2</emphasis></para>
2451
+ # <para>
2452
+ # Set the syslog facility for the given appender
2453
+ # </para>
2454
+ # <funcsynopsis>
2455
+ # <funcsynopsisinfo>appender_setSyslogFacility myAppender local4`</funcsynopsisinfo>
2456
+ # </funcsynopsis>
2457
+ # </entry>
2458
+ # </s:function>
2459
+ #*/
2460
+ appender_setSyslogFacility()
2461
+ {
2462
+ appender_syslog_setFacility "$@"
2463
+ }
2464
+
2465
+ #/**
2466
+ # <s:function group="SyslogAppender" modifier="public">
2467
+ # <entry align="right">
2468
+ # <code>string</code>/boolean
2469
+ # </entry>
2470
+ # <entry>
2471
+ # <funcsynopsis>
2472
+ # <funcprototype>
2473
+ # <funcdef><function>appender_syslog_getHost</function></funcdef>
2474
+ # <paramdef>integer <parameter>index</parameter></paramdef>
2475
+ # </funcprototype>
2476
+ # </funcsynopsis>
2477
+ # <para>
2478
+ # Get the syslog host of the specified appender.
2479
+ # </para>
2480
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
2481
+ # <funcsynopsis>
2482
+ # <funcsynopsisinfo>host=`appender_syslog_getHost myAppender`</funcsynopsisinfo>
2483
+ # </funcsynopsis>
2484
+ # </entry>
2485
+ # </s:function>
2486
+ #*/
2487
+ appender_syslog_getHost()
2488
+ {
2489
+ if [ $# -ne 1 ]; then
2490
+ _log4sh_error 'appender_syslog_getHost(): invalid number of parameters'
2491
+ return ${__LOG4SH_FALSE}
2492
+ fi
2493
+
2494
+ asgh_appender=$1
2495
+
2496
+ asgh_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${asgh_appender}`
2497
+ # TODO: put check for valid index here
2498
+ asgh_host=`_log4sh_getArrayElement \
2499
+ "${__log4shAppender_syslog_hosts}" ${asgh_index}`
2500
+ __log4sh_return=$?
2501
+
2502
+ [ "${asgh_host}" = "${__LOG4SH_NULL}" ] && asgh_host=''
2503
+ echo "${asgh_host}"
2504
+
2505
+ unset asgh_appender asgh_index asgh_host
2506
+ return ${__log4sh_return}
2507
+ }
2508
+
2509
+ #/**
2510
+ # <s:function group="SyslogAppender" modifier="public">
2511
+ # <entry align="right">
2512
+ # <emphasis>void</emphasis>/boolean
2513
+ # </entry>
2514
+ # <entry>
2515
+ # <funcsynopsis>
2516
+ # <funcprototype>
2517
+ # <funcdef><function>appender_syslog_setHost</function></funcdef>
2518
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2519
+ # <paramdef>string <parameter>host</parameter></paramdef>
2520
+ # </funcprototype>
2521
+ # </funcsynopsis>
2522
+ # <para>
2523
+ # Set the syslog host for the given appender. Requires that the 'nc'
2524
+ # command alternative has been previously set with the
2525
+ # log4sh_setAlternative() function.
2526
+ # </para>
2527
+ # <para><emphasis role="strong">Since:</emphasis> 1.3.7</para>
2528
+ # <funcsynopsis>
2529
+ # <funcsynopsisinfo>appender_syslog_setHost myAppender localhost</funcsynopsisinfo>
2530
+ # </funcsynopsis>
2531
+ # </entry>
2532
+ # </s:function>
2533
+ #*/
2534
+ #
2535
+ # The BSD syslog Protocol
2536
+ # http://www.ietf.org/rfc/rfc3164.txt
2537
+ #
2538
+ appender_syslog_setHost()
2539
+ {
2540
+ if [ $# -ne 2 ]; then
2541
+ _log4sh_error 'appender_syslog_setHost(): invalid number of parameters'
2542
+ return ${__LOG4SH_FALSE}
2543
+ fi
2544
+
2545
+ assh_appender=$1
2546
+ assh_host=$2
2547
+
2548
+ [ -z "${__log4sh_alternative_nc:-}" ] \
2549
+ && _log4sh_warn 'the nc (netcat) command alternative is required for remote syslog logging. see log4sh_setAlternative().'
2550
+
2551
+ assh_index=`_log4sh_findArrayElement "${__log4shAppenders}" ${assh_appender}`
2552
+ # TODO: put check for valid index here
2553
+ __log4shAppender_syslog_hosts=`_log4sh_setArrayElement \
2554
+ "${__log4shAppender_syslog_hosts}" ${assh_index} "${assh_host}"`
2555
+
2556
+ # re-source the appender
2557
+ _appender_cache ${assh_appender}
2558
+
2559
+ unset assh_appender assh_host assh_index
2560
+ return ${__LOG4SH_TRUE}
2561
+ }
2562
+
2563
+ #=============================================================================
2564
+ # Level
2565
+ #
2566
+
2567
+ #/**
2568
+ # <s:function group="Level" modifier="public">
2569
+ # <entry align="right">
2570
+ # <code>string</code>
2571
+ # </entry>
2572
+ # <entry>
2573
+ # <funcsynopsis>
2574
+ # <funcprototype>
2575
+ # <funcdef><function>logger_level_toLevel</function></funcdef>
2576
+ # <paramdef>integer <parameter>val</parameter></paramdef>
2577
+ # </funcprototype>
2578
+ # </funcsynopsis>
2579
+ # <para>Converts an internally used level integer into its external level
2580
+ # equivalent</para>
2581
+ # <funcsynopsis>
2582
+ # <funcsynopsisinfo>level=`logger_level_toLevel 3`</funcsynopsisinfo>
2583
+ # </funcsynopsis>
2584
+ # </entry>
2585
+ # </s:function>
2586
+ #*/
2587
+ # TODO use arrays instead of case statement ??
2588
+ logger_level_toLevel()
2589
+ {
2590
+ _ltl__val=$1
2591
+
2592
+ _ltl__return=${__LOG4SH_TRUE}
2593
+ _ltl__level=''
2594
+
2595
+ case ${_ltl__val} in
2596
+ ${__LOG4SH_LEVEL_TRACE}) _ltl__level=${__LOG4SH_LEVEL_TRACE_STR} ;;
2597
+ ${__LOG4SH_LEVEL_DEBUG}) _ltl__level=${__LOG4SH_LEVEL_DEBUG_STR} ;;
2598
+ ${__LOG4SH_LEVEL_INFO}) _ltl__level=${__LOG4SH_LEVEL_INFO_STR} ;;
2599
+ ${__LOG4SH_LEVEL_WARN}) _ltl__level=${__LOG4SH_LEVEL_WARN_STR} ;;
2600
+ ${__LOG4SH_LEVEL_ERROR}) _ltl__level=${__LOG4SH_LEVEL_ERROR_STR} ;;
2601
+ ${__LOG4SH_LEVEL_FATAL}) _ltl__level=${__LOG4SH_LEVEL_FATAL_STR} ;;
2602
+ ${__LOG4SH_LEVEL_OFF}) _ltl__level=${__LOG4SH_LEVEL_OFF_STR} ;;
2603
+ ${__LOG4SH_LEVEL_CLOSED}) _ltl__level=${__LOG4SH_LEVEL_CLOSED_STR} ;;
2604
+ *) _ltl__return=${__LOG4SH_FALSE} ;;
2605
+ esac
2606
+
2607
+ echo ${_ltl__level}
2608
+ unset _ltl__val _ltl__level
2609
+ return ${_ltl__return}
2610
+ }
2611
+
2612
+ #/**
2613
+ # <s:function group="Level" modifier="public">
2614
+ # <entry align="right">
2615
+ # <code>integer</code>
2616
+ # </entry>
2617
+ # <entry>
2618
+ # <funcsynopsis>
2619
+ # <funcprototype>
2620
+ # <funcdef><function>logger_level_toInt</function></funcdef>
2621
+ # <paramdef>string <parameter>level</parameter></paramdef>
2622
+ # </funcprototype>
2623
+ # </funcsynopsis>
2624
+ # <para>Converts an externally used level tag into its integer
2625
+ # equivalent</para>
2626
+ # <funcsynopsis>
2627
+ # <funcsynopsisinfo>levelInt=`logger_level_toInt WARN`</funcsynopsisinfo>
2628
+ # </funcsynopsis>
2629
+ # </entry>
2630
+ # </s:function>
2631
+ #*/
2632
+ logger_level_toInt()
2633
+ {
2634
+ _lti__level=$1
2635
+
2636
+ _lti__int=0
2637
+ _lti__return=${__LOG4SH_TRUE}
2638
+
2639
+ case ${_lti__level} in
2640
+ ${__LOG4SH_LEVEL_TRACE_STR}) _lti__int=${__LOG4SH_LEVEL_TRACE} ;;
2641
+ ${__LOG4SH_LEVEL_DEBUG_STR}) _lti__int=${__LOG4SH_LEVEL_DEBUG} ;;
2642
+ ${__LOG4SH_LEVEL_INFO_STR}) _lti__int=${__LOG4SH_LEVEL_INFO} ;;
2643
+ ${__LOG4SH_LEVEL_WARN_STR}) _lti__int=${__LOG4SH_LEVEL_WARN} ;;
2644
+ ${__LOG4SH_LEVEL_ERROR_STR}) _lti__int=${__LOG4SH_LEVEL_ERROR} ;;
2645
+ ${__LOG4SH_LEVEL_FATAL_STR}) _lti__int=${__LOG4SH_LEVEL_FATAL} ;;
2646
+ ${__LOG4SH_LEVEL_OFF_STR}) _lti__int=${__LOG4SH_LEVEL_OFF} ;;
2647
+ ${__LOG4SH_LEVEL_CLOSED_STR}) _lti__int=${__LOG4SH_LEVEL_CLOSED} ;;
2648
+ *) _lti__return=${__LOG4SH_FALSE} ;;
2649
+ esac
2650
+
2651
+ echo ${_lti__int}
2652
+ unset _lti__int _lti__level
2653
+ return ${_lti__return}
2654
+ }
2655
+
2656
+ #=============================================================================
2657
+ # Logger
2658
+ #
2659
+
2660
+ #/**
2661
+ # <s:function group="Logger" modifier="public">
2662
+ # <entry align="right">
2663
+ # <emphasis>void</emphasis>/<code>boolean</code>
2664
+ # </entry>
2665
+ # <entry>
2666
+ # <funcsynopsis>
2667
+ # <funcprototype>
2668
+ # <funcdef><function>logger_addAppender</function></funcdef>
2669
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2670
+ # </funcprototype>
2671
+ # </funcsynopsis>
2672
+ # <para>Add and initialize a new appender</para>
2673
+ # <funcsynopsis>
2674
+ # <funcsynopsisinfo>logger_addAppender $appender</funcsynopsisinfo>
2675
+ # </funcsynopsis>
2676
+ # </entry>
2677
+ # </s:function>
2678
+ #*/
2679
+ logger_addAppender()
2680
+ {
2681
+ laa_appender=$1
2682
+
2683
+ # FAQ should we be using setter functions here?? for performance, no.
2684
+ __log4shAppenders=`_log4sh_pushStack "${__log4shAppenders}" ${laa_appender}`
2685
+ __log4shAppenderCount=`expr ${__log4shAppenderCount} + 1`
2686
+ __log4shAppenderCounts="${__log4shAppenderCounts} ${__log4shAppenderCount}"
2687
+ __log4shAppenderLayouts=`_log4sh_pushStack \
2688
+ "$__log4shAppenderLayouts" "${__LOG4SH_LAYOUT_SIMPLE}"`
2689
+ __log4shAppenderLevels=`_log4sh_pushStack \
2690
+ "${__log4shAppenderLevels}" "${__LOG4SH_NULL}"`
2691
+ __log4shAppenderPatterns=`_log4sh_pushStack \
2692
+ "${__log4shAppenderPatterns}" "${__LOG4SH_PATTERN_DEFAULT}"`
2693
+ __log4shAppenderTypes=`_log4sh_pushStack \
2694
+ "${__log4shAppenderTypes}" ${__LOG4SH_TYPE_CONSOLE}`
2695
+ __log4shAppender_file_files=`_log4sh_pushStack \
2696
+ "${__log4shAppender_file_files}" ${__LOG4SH_NULL}`
2697
+ __log4shAppender_rollingFile_maxBackupIndexes=`_log4sh_pushStack \
2698
+ "${__log4shAppender_rollingFile_maxBackupIndexes}" \
2699
+ ${__LOG4SH_TYPE_ROLLING_FILE_MAX_BACKUP_INDEX}`
2700
+ __log4shAppender_rollingFile_maxFileSizes=`_log4sh_pushStack \
2701
+ "${__log4shAppender_rollingFile_maxFileSizes}" \
2702
+ ${__LOG4SH_TYPE_ROLLING_FILE_MAX_FILE_SIZE}`
2703
+ __log4shAppender_smtp_tos=`_log4sh_pushStack \
2704
+ "${__log4shAppender_smtp_tos}" ${__LOG4SH_NULL}`
2705
+ __log4shAppender_smtp_subjects=`_log4sh_pushStack \
2706
+ "${__log4shAppender_smtp_subjects}" ${__LOG4SH_NULL}`
2707
+ __log4shAppender_syslog_facilities=`_log4sh_pushStack \
2708
+ "${__log4shAppender_syslog_facilities}" ${__LOG4SH_TYPE_SYSLOG_FACILITY}`
2709
+ __log4shAppender_syslog_hosts=`_log4sh_pushStack \
2710
+ "${__log4shAppender_syslog_hosts}" "${__LOG4SH_NULL}"`
2711
+
2712
+ _appender_cache ${laa_appender}
2713
+
2714
+ unset laa_appender
2715
+ return ${__LOG4SH_TRUE}
2716
+ }
2717
+
2718
+ #/**
2719
+ # <s:function group="Logger" modifier="public">
2720
+ # <entry align="right">
2721
+ # <emphasis>void</emphasis>
2722
+ # </entry>
2723
+ # <entry>
2724
+ # <funcsynopsis>
2725
+ # <funcprototype>
2726
+ # <funcdef><function>logger_addAppenderWithPattern</function></funcdef>
2727
+ # <paramdef>string <parameter>appender</parameter></paramdef>
2728
+ # <paramdef>string <parameter>pattern</parameter></paramdef>
2729
+ # </funcprototype>
2730
+ # </funcsynopsis>
2731
+ # <para><emphasis role="strong">Deprecated as of 1.3.6</emphasis></para>
2732
+ # <para>
2733
+ # Add and initialize a new appender with a specific PatternLayout
2734
+ # </para>
2735
+ # <funcsynopsis>
2736
+ # <funcsynopsisinfo>logger_addAppenderWithPattern $appender '%d %p - %m%n'</funcsynopsisinfo>
2737
+ # </funcsynopsis>
2738
+ # </entry>
2739
+ # </s:function>
2740
+ #*/
2741
+ logger_addAppenderWithPattern()
2742
+ {
2743
+ _myAppender=$1
2744
+ _myPattern=$2
2745
+
2746
+ logger_addAppender ${_myAppender}
2747
+ appender_setLayout ${_myAppender} ${__LOG4SH_LAYOUT_PATTERN}
2748
+ appender_setPattern ${_myAppender} "${_myPattern}"
2749
+
2750
+ unset _myAppender _myPattern
2751
+ }
2752
+
2753
+ #/**
2754
+ # <s:function group="Logger" modifier="public">
2755
+ # <entry align="right">
2756
+ # <code>string</code>
2757
+ # </entry>
2758
+ # <entry>
2759
+ # <funcsynopsis>
2760
+ # <funcprototype>
2761
+ # <funcdef><function>logger_getFilename</function></funcdef>
2762
+ # <void />
2763
+ # </funcprototype>
2764
+ # </funcsynopsis>
2765
+ # <para>
2766
+ # Get the filename that would be shown when the '%F' conversion character
2767
+ # is used in a PatternLayout.
2768
+ # </para>
2769
+ # <funcsynopsis>
2770
+ # <funcsynopsisinfo>filename=`logger_getFilename`</funcsynopsisinfo>
2771
+ # </funcsynopsis>
2772
+ # </entry>
2773
+ # </s:function>
2774
+ #*/
2775
+ logger_getFilename()
2776
+ {
2777
+ echo "${__log4sh_filename}"
2778
+ }
2779
+
2780
+ #/**
2781
+ # <s:function group="Logger" modifier="public">
2782
+ # <entry align="right">
2783
+ # <emphasis>void</emphasis>
2784
+ # </entry>
2785
+ # <entry>
2786
+ # <funcsynopsis>
2787
+ # <funcprototype>
2788
+ # <funcdef><function>logger_setFilename</function></funcdef>
2789
+ # <paramdef>string <parameter>filename</parameter></paramdef>
2790
+ # </funcprototype>
2791
+ # </funcsynopsis>
2792
+ # <para>Set the filename to be shown when the '%F' conversion character is
2793
+ # used in a PatternLayout.</para>
2794
+ # <funcsynopsis>
2795
+ # <funcsynopsisinfo>logger_setFilename 'myScript.sh'</funcsynopsisinfo>
2796
+ # </funcsynopsis>
2797
+ # </entry>
2798
+ # </s:function>
2799
+ #*/
2800
+ logger_setFilename()
2801
+ {
2802
+ __log4sh_filename=$1
2803
+ }
2804
+
2805
+ #/**
2806
+ # <s:function group="Logger" modifier="public">
2807
+ # <entry align="right">
2808
+ # <code>string</code>
2809
+ # </entry>
2810
+ # <entry>
2811
+ # <funcsynopsis>
2812
+ # <funcprototype>
2813
+ # <funcdef><function>logger_getLevel</function></funcdef>
2814
+ # <void />
2815
+ # </funcprototype>
2816
+ # </funcsynopsis>
2817
+ # <para>Get the global default logging level (e.g. DEBUG).</para>
2818
+ # <funcsynopsis>
2819
+ # <funcsynopsisinfo>level=`logger_getLevel`</funcsynopsisinfo>
2820
+ # </funcsynopsis>
2821
+ # </entry>
2822
+ # </s:function>
2823
+ #*/
2824
+ logger_getLevel()
2825
+ {
2826
+ logger_level_toLevel ${__log4shLevel}
2827
+ }
2828
+
2829
+ #/**
2830
+ # <s:function group="Logger" modifier="public">
2831
+ # <entry align="right">
2832
+ # <emphasis>void</emphasis>
2833
+ # </entry>
2834
+ # <entry>
2835
+ # <funcsynopsis>
2836
+ # <funcprototype>
2837
+ # <funcdef><function>logger_setLevel</function></funcdef>
2838
+ # <paramdef>string <parameter>level</parameter></paramdef>
2839
+ # </funcprototype>
2840
+ # </funcsynopsis>
2841
+ # <para>Sets the global default logging level (e.g. DEBUG).</para>
2842
+ # <funcsynopsis>
2843
+ # <funcsynopsisinfo>logger_setLevel INFO</funcsynopsisinfo>
2844
+ # </funcsynopsis>
2845
+ # </entry>
2846
+ # </s:function>
2847
+ #*/
2848
+ logger_setLevel()
2849
+ {
2850
+ _l_level=$1
2851
+
2852
+ _l_int=`logger_level_toInt ${_l_level}`
2853
+ if [ $? -eq ${__LOG4SH_TRUE} ]; then
2854
+ __log4shLevel=${_l_int}
2855
+ else
2856
+ _log4sh_error "attempt to set invalid log level '${_l_level}'"
2857
+ fi
2858
+
2859
+ unset _l_int _l_level
2860
+ }
2861
+
2862
+ #/**
2863
+ # <s:function group="Logger" modifier="public">
2864
+ # <entry align="right">
2865
+ # <emphasis>void</emphasis>
2866
+ # </entry>
2867
+ # <entry>
2868
+ # <funcsynopsis>
2869
+ # <funcprototype>
2870
+ # <funcdef><function>log</function></funcdef>
2871
+ # <paramdef>string <parameter>level</parameter></paramdef>
2872
+ # <paramdef>string[] <parameter>message(s)</parameter></paramdef>
2873
+ # </funcprototype>
2874
+ # </funcsynopsis>
2875
+ # <para>The base logging command that logs a message to all defined
2876
+ # appenders</para>
2877
+ # <funcsynopsis>
2878
+ # <funcsynopsisinfo>log DEBUG 'This is a test message'</funcsynopsisinfo>
2879
+ # </funcsynopsis>
2880
+ # </entry>
2881
+ # </s:function>
2882
+ #*/
2883
+ log()
2884
+ {
2885
+ _l_level=$1
2886
+ shift
2887
+ # if no message was passed, read it from STDIN
2888
+ [ $# -ne 0 ] && _l_msg="$@" || _l_msg=`cat`
2889
+
2890
+ __log4sh_return=${__LOG4SH_TRUE}
2891
+ _l_levelInt=`logger_level_toInt ${_l_level}`
2892
+ if [ $? -eq ${__LOG4SH_TRUE} ]; then
2893
+ # update seconds elapsed
2894
+ _log4sh_updateSeconds
2895
+
2896
+ _l_oldIFS=${IFS} IFS=${__LOG4SH_IFS_DEFAULT}
2897
+ for _l_appenderIndex in ${__log4shAppenderCounts}; do
2898
+ ${__LOG4SH_TRACE} "_l_appenderIndex='${_l_appenderIndex}'"
2899
+ # determine appender level
2900
+ _l_appenderLevel=`_appender_getLevelByIndex ${_l_appenderIndex}`
2901
+ if [ "${_l_appenderLevel}" = "${__LOG4SH_NULL}" ]; then
2902
+ # continue if requested is level less than general level
2903
+ [ ! ${__log4shLevel} -le ${_l_levelInt} ] && continue
2904
+ else
2905
+ _l_appenderLevelInt=`logger_level_toInt ${_l_appenderLevel}`
2906
+ # continue if requested level is less than specific appender level
2907
+ ${__LOG4SH_TRACE} "_l_levelInt='${_l_levelInt}' _l_appenderLevelInt='${_l_appenderLevelInt}'"
2908
+ [ ! ${_l_appenderLevelInt} -le ${_l_levelInt} ] && continue
2909
+ fi
2910
+
2911
+ # execute dynamic appender function
2912
+ _l_appenderName=`_log4sh_getArrayElement \
2913
+ "${__log4shAppenders}" ${_l_appenderIndex}`
2914
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${_l_appenderName}_append ${_l_level} "${_l_msg}"
2915
+ done
2916
+ IFS=${_l_oldIFS}
2917
+ else
2918
+ _log4sh_error "invalid logging level requested (${_l_level})"
2919
+ __log4sh_return=${__LOG4SH_ERROR}
2920
+ fi
2921
+
2922
+ unset _l_msg _l_oldIFS _l_level _l_levelInt
2923
+ unset _l_appenderIndex _l_appenderLevel _l_appenderLevelInt _l_appenderName
2924
+ return ${__log4sh_return}
2925
+ }
2926
+
2927
+ #/**
2928
+ # <s:function group="Logger" modifier="public">
2929
+ # <entry align="right">
2930
+ # <emphasis>void</emphasis>
2931
+ # </entry>
2932
+ # <entry>
2933
+ # <funcsynopsis>
2934
+ # <funcprototype>
2935
+ # <funcdef><function>logger_trace</function></funcdef>
2936
+ # <paramdef>string[] <parameter>message</parameter></paramdef>
2937
+ # </funcprototype>
2938
+ # </funcsynopsis>
2939
+ # <para>This is a helper function for logging a message at the TRACE
2940
+ # priority</para>
2941
+ # <funcsynopsis>
2942
+ # <funcsynopsisinfo>logger_trace 'This is a trace message'</funcsynopsisinfo>
2943
+ # </funcsynopsis>
2944
+ # </entry>
2945
+ # </s:function>
2946
+ #*/
2947
+ logger_trace()
2948
+ {
2949
+ log ${__LOG4SH_LEVEL_TRACE_STR} "$@"
2950
+ }
2951
+
2952
+ #/**
2953
+ # <s:function group="Logger" modifier="public">
2954
+ # <entry align="right">
2955
+ # <emphasis>void</emphasis>
2956
+ # </entry>
2957
+ # <entry>
2958
+ # <funcsynopsis>
2959
+ # <funcprototype>
2960
+ # <funcdef><function>logger_debug</function></funcdef>
2961
+ # <paramdef>string[] <parameter>message</parameter></paramdef>
2962
+ # </funcprototype>
2963
+ # </funcsynopsis>
2964
+ # <para>This is a helper function for logging a message at the DEBUG
2965
+ # priority</para>
2966
+ # <funcsynopsis>
2967
+ # <funcsynopsisinfo>logger_debug 'This is a debug message'</funcsynopsisinfo>
2968
+ # </funcsynopsis>
2969
+ # </entry>
2970
+ # </s:function>
2971
+ #*/
2972
+ logger_debug()
2973
+ {
2974
+ log ${__LOG4SH_LEVEL_DEBUG_STR} "$@"
2975
+ }
2976
+
2977
+ #/**
2978
+ # <s:function group="Logger" modifier="public">
2979
+ # <entry align="right">
2980
+ # <emphasis>void</emphasis>
2981
+ # </entry>
2982
+ # <entry>
2983
+ # <funcsynopsis>
2984
+ # <funcprototype>
2985
+ # <funcdef><function>logger_info</function></funcdef>
2986
+ # <paramdef>string[] <parameter>message</parameter></paramdef>
2987
+ # </funcprototype>
2988
+ # </funcsynopsis>
2989
+ # <para>This is a helper function for logging a message at the INFO
2990
+ # priority</para>
2991
+ # <funcsynopsis>
2992
+ # <funcsynopsisinfo>logger_info 'This is a info message'</funcsynopsisinfo>
2993
+ # </funcsynopsis>
2994
+ # </entry>
2995
+ # </s:function>
2996
+ #*/
2997
+ logger_info()
2998
+ {
2999
+ log ${__LOG4SH_LEVEL_INFO_STR} "$@"
3000
+ }
3001
+
3002
+ #/**
3003
+ # <s:function group="Logger" modifier="public">
3004
+ # <entry align="right">
3005
+ # <emphasis>void</emphasis>
3006
+ # </entry>
3007
+ # <entry>
3008
+ # <funcsynopsis>
3009
+ # <funcprototype>
3010
+ # <funcdef><function>logger_warn</function></funcdef>
3011
+ # <paramdef>string[] <parameter>message</parameter></paramdef>
3012
+ # </funcprototype>
3013
+ # </funcsynopsis>
3014
+ # <para>
3015
+ # This is a helper function for logging a message at the WARN priority
3016
+ # </para>
3017
+ # <funcsynopsis>
3018
+ # <funcsynopsisinfo>logger_warn 'This is a warn message'</funcsynopsisinfo>
3019
+ # </funcsynopsis>
3020
+ # </entry>
3021
+ # </s:function>
3022
+ #*/
3023
+ logger_warn()
3024
+ {
3025
+ log ${__LOG4SH_LEVEL_WARN_STR} "$@"
3026
+ }
3027
+
3028
+ #/**
3029
+ # <s:function group="Logger" modifier="public">
3030
+ # <entry align="right">
3031
+ # <emphasis>void</emphasis>
3032
+ # </entry>
3033
+ # <entry>
3034
+ # <funcsynopsis>
3035
+ # <funcprototype>
3036
+ # <funcdef><function>logger_error</function></funcdef>
3037
+ # <paramdef>string[] <parameter>message</parameter></paramdef>
3038
+ # </funcprototype>
3039
+ # </funcsynopsis>
3040
+ # <para>
3041
+ # This is a helper function for logging a message at the ERROR priority
3042
+ # </para>
3043
+ # <funcsynopsis>
3044
+ # <funcsynopsisinfo>logger_error 'This is a error message'</funcsynopsisinfo>
3045
+ # </funcsynopsis>
3046
+ # </entry>
3047
+ # </s:function>
3048
+ #*/
3049
+ logger_error()
3050
+ {
3051
+ log ${__LOG4SH_LEVEL_ERROR_STR} "$@"
3052
+ }
3053
+
3054
+ #/**
3055
+ # <s:function group="Logger" modifier="public">
3056
+ # <entry align="right">
3057
+ # <emphasis>void</emphasis>
3058
+ # </entry>
3059
+ # <entry>
3060
+ # <funcsynopsis>
3061
+ # <funcprototype>
3062
+ # <funcdef><function>logger_fatal</function></funcdef>
3063
+ # <paramdef>string[] <parameter>message</parameter></paramdef>
3064
+ # </funcprototype>
3065
+ # </funcsynopsis>
3066
+ # <para>This is a helper function for logging a message at the FATAL
3067
+ # priority</para>
3068
+ # <funcsynopsis>
3069
+ # <funcsynopsisinfo>logger_fatal 'This is a fatal message'</funcsynopsisinfo>
3070
+ # </funcsynopsis>
3071
+ # </entry>
3072
+ # </s:function>
3073
+ #*/
3074
+ logger_fatal()
3075
+ {
3076
+ log ${__LOG4SH_LEVEL_FATAL_STR} "$@"
3077
+ }
3078
+
3079
+ #==============================================================================
3080
+ # Property
3081
+ #
3082
+
3083
+ #/**
3084
+ # <s:function group="Property" modifier="private">
3085
+ # <entry align="right">
3086
+ # <code>string</code>
3087
+ # </entry>
3088
+ # <entry>
3089
+ # <funcsynopsis>
3090
+ # <funcprototype>
3091
+ # <funcdef><function>_log4sh_getPropPrefix</function></funcdef>
3092
+ # <paramdef>string <parameter>property</parameter></paramdef>
3093
+ # </funcprototype>
3094
+ # </funcsynopsis>
3095
+ # <para>Takes a string (eg. "log4sh.appender.stderr.File") and returns the
3096
+ # prefix of it (everything before the first '.' char). Normally used in
3097
+ # parsing the log4sh configuration file.</para>
3098
+ # <funcsynopsis>
3099
+ # <funcsynopsisinfo>prefix=`_log4sh_getPropPrefix $property"`</funcsynopsisinfo>
3100
+ # </funcsynopsis>
3101
+ # </entry>
3102
+ # </s:function>
3103
+ #*/
3104
+ _log4sh_getPropPrefix()
3105
+ {
3106
+ _oldIFS=${IFS} IFS='.'
3107
+ set -- $1
3108
+ IFS=${_oldIFS} unset _oldIFS
3109
+ echo $1
3110
+ }
3111
+
3112
+ #/**
3113
+ # <s:function group="Property" modifier="private">
3114
+ # <entry align="right">
3115
+ # <code>string</code>
3116
+ # </entry>
3117
+ # <entry>
3118
+ # <funcsynopsis>
3119
+ # <funcprototype>
3120
+ # <funcdef><function>_log4sh_stripPropPrefix</function></funcdef>
3121
+ # <paramdef>string <parameter>property</parameter></paramdef>
3122
+ # </funcprototype>
3123
+ # </funcsynopsis>
3124
+ # <para>Strips the prefix off a property configuration command and returns
3125
+ # the string. E.g. "log4sh.appender.stderr.File" becomes
3126
+ # "appender.stderr.File".</para>
3127
+ # <funcsynopsis>
3128
+ # <funcsynopsisinfo>newProperty=`_log4sh_stripPropPrefix $property`</funcsynopsisinfo>
3129
+ # </funcsynopsis>
3130
+ # </entry>
3131
+ # </s:function>
3132
+ #*/
3133
+ _log4sh_stripPropPrefix()
3134
+ {
3135
+ expr "$1" : '[^.]*\.\(.*\)'
3136
+ }
3137
+
3138
+ #/**
3139
+ # <s:function group="Property" modifier="private">
3140
+ # <entry align="right">
3141
+ # <emphasis>void</emphasis>
3142
+ # </entry>
3143
+ # <entry>
3144
+ # <funcsynopsis>
3145
+ # <funcprototype>
3146
+ # <funcdef><function>_log4sh_propAlternative</function></funcdef>
3147
+ # <paramdef>string <parameter>property</parameter></paramdef>
3148
+ # <paramdef>string <parameter>value</parameter></paramdef>
3149
+ # </funcprototype>
3150
+ # </funcsynopsis>
3151
+ # <para>
3152
+ # Configures log4sh to use an alternative command.
3153
+ # </para>
3154
+ # <funcsynopsis>
3155
+ # <funcsynopsisinfo>_log4sh_propAlternative property value</funcsynopsisinfo>
3156
+ # </funcsynopsis>
3157
+ # </entry>
3158
+ # </s:function>
3159
+ #*/
3160
+ _log4sh_propAlternative()
3161
+ {
3162
+ _lpa_key=$1
3163
+ _lpa_value=$2
3164
+
3165
+ # strip the leading 'alternative.'
3166
+ _lpa_alternative=`_log4sh_stripPropPrefix ${_lpa_key}`
3167
+
3168
+ # set the alternative
3169
+ log4sh_setAlternative ${_lpa_alternative} "${_lpa_value}"
3170
+
3171
+ unset _lpa_key _lpa_value _lpa_alternative
3172
+ }
3173
+
3174
+ #/**
3175
+ # <s:function group="Property" modifier="private">
3176
+ # <entry align="right">
3177
+ # <emphasis>void</emphasis>/boolean
3178
+ # </entry>
3179
+ # <entry>
3180
+ # <funcsynopsis>
3181
+ # <funcprototype>
3182
+ # <funcdef><function>_log4sh_propAppender</function></funcdef>
3183
+ # <paramdef>string <parameter>property</parameter></paramdef>
3184
+ # <paramdef>string <parameter>value</parameter></paramdef>
3185
+ # </funcprototype>
3186
+ # </funcsynopsis>
3187
+ # <para>Configures log4sh using an appender property configuration statement</para>
3188
+ # <funcsynopsis>
3189
+ # <funcsynopsisinfo>_log4sh_propAppender $property $value</funcsynopsisinfo>
3190
+ # </funcsynopsis>
3191
+ # </entry>
3192
+ # </s:function>
3193
+ #*/
3194
+ _log4sh_propAppender()
3195
+ {
3196
+ _lpa_key=$1
3197
+ _lpa_value=$2
3198
+
3199
+ _lpa_appender=''
3200
+ _lpa_rtrn=${__LOG4SH_TRUE}
3201
+
3202
+ # strip the leading 'appender' keyword prefix
3203
+ _lpa_key=`_log4sh_stripPropPrefix ${_lpa_key}`
3204
+
3205
+ # handle appender definitions
3206
+ if [ "${_lpa_key}" '=' "`expr \"${_lpa_key}\" : '\([^.]*\)'`" ]; then
3207
+ _lpa_appender="${_lpa_key}"
3208
+ else
3209
+ _lpa_appender=`_log4sh_getPropPrefix ${_lpa_key}`
3210
+ fi
3211
+
3212
+ # does the appender exist?
3213
+ appender_exists ${_lpa_appender}
3214
+ if [ $? -eq ${__LOG4SH_FALSE} ]; then
3215
+ _log4sh_error "attempt to configure the non-existant appender (${_lpa_appender})"
3216
+ unset _lpa_appender _lpa_key _lpa_value
3217
+ return ${__LOG4SH_ERROR}
3218
+ fi
3219
+
3220
+ # handle the appender type
3221
+ if [ "${_lpa_appender}" = "${_lpa_key}" ]; then
3222
+ case ${_lpa_value} in
3223
+ ${__LOG4SH_TYPE_CONSOLE}|\
3224
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_TYPE_CONSOLE})
3225
+ appender_setType ${_lpa_appender} ${__LOG4SH_TYPE_CONSOLE} ;;
3226
+ ${__LOG4SH_TYPE_FILE}|\
3227
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_TYPE_FILE})
3228
+ appender_setType ${_lpa_appender} ${__LOG4SH_TYPE_FILE} ;;
3229
+ $__LOG4SH_TYPE_DAILY_ROLLING_FILE|\
3230
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_TYPE_DAILY_ROLLING_FILE})
3231
+ appender_setType ${_lpa_appender} ${__LOG4SH_TYPE_DAILY_ROLLING_FILE} ;;
3232
+ ${__LOG4SH_TYPE_ROLLING_FILE}|\
3233
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_TYPE_ROLLING_FILE})
3234
+ appender_setType ${_lpa_appender} ${__LOG4SH_TYPE_ROLLING_FILE} ;;
3235
+ ${__LOG4SH_TYPE_SMTP}|\
3236
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_TYPE_SMTP})
3237
+ appender_setType $_lpa_appender ${__LOG4SH_TYPE_SMTP} ;;
3238
+ ${__LOG4SH_TYPE_SYSLOG}|\
3239
+ ${__LOG4SH_CONFIG_LOG4J_CP}.${__LOG4SH_TYPE_SYSLOG})
3240
+ appender_setType $_lpa_appender ${__LOG4SH_TYPE_SYSLOG} ;;
3241
+ *)
3242
+ _log4sh_error "appender type (${_lpa_value}) unrecognized"
3243
+ false
3244
+ ;;
3245
+ esac
3246
+ [ $? -ne ${__LOG4SH_TRUE} ] && _lpa_rtrn=${__LOG4SH_ERROR}
3247
+ __log4sh_return=${_lpa_rtrn}
3248
+ unset _lpa_appender _lpa_key _lpa_rtrn _lpa_value
3249
+ return ${__log4sh_return}
3250
+ fi
3251
+
3252
+ # handle appender values and methods
3253
+ _lpa_key=`_log4sh_stripPropPrefix ${_lpa_key}`
3254
+ if [ "${_lpa_key}" '=' "`expr \"${_lpa_key}\" : '\([^.]*\)'`" ]; then
3255
+ case ${_lpa_key} in
3256
+ # General
3257
+ Threshold) appender_setLevel ${_lpa_appender} "${_lpa_value}" ;;
3258
+ layout) appender_setLayout ${_lpa_appender} "${_lpa_value}" ;;
3259
+
3260
+ # FileAppender
3261
+ DatePattern) ;; # unsupported
3262
+ File)
3263
+ _lpa_value=`eval echo "${_lpa_value}"`
3264
+ appender_file_setFile ${_lpa_appender} "${_lpa_value}"
3265
+ ;;
3266
+ MaxBackupIndex)
3267
+ appender_file_setMaxBackupIndex ${_lpa_appender} "${_lpa_value}" ;;
3268
+ MaxFileSize)
3269
+ appender_file_setMaxFileSize ${_lpa_appender} "${_lpa_value}" ;;
3270
+
3271
+ # SMTPAppender
3272
+ To) appender_smtp_setTo ${_lpa_appender} "${_lpa_value}" ;;
3273
+ Subject) appender_smtp_setSubject ${_lpa_appender} "${_lpa_value}" ;;
3274
+
3275
+ # SyslogAppender
3276
+ SyslogHost) appender_syslog_setHost ${_lpa_appender} "${_lpa_value}" ;;
3277
+ Facility) appender_syslog_setFacility ${_lpa_appender} "${_lpa_value}" ;;
3278
+
3279
+ # catch unrecognized
3280
+ *)
3281
+ _log4sh_error "appender value/method (${_lpa_key}) unrecognized"
3282
+ false
3283
+ ;;
3284
+ esac
3285
+ [ $? -ne ${__LOG4SH_TRUE} ] && _lpa_rtrn=${__LOG4SH_ERROR}
3286
+ __log4sh_return=${_lpa_rtrn}
3287
+ unset _lpa_appender _lpa_key _lpa_rtrn _lpa_value
3288
+ return ${__log4sh_return}
3289
+ fi
3290
+
3291
+ # handle appender layout values and methods
3292
+ _lpa_key=`_log4sh_stripPropPrefix ${_lpa_key}`
3293
+ case ${_lpa_key} in
3294
+ ConversionPattern) appender_setPattern ${_lpa_appender} "${_lpa_value}" ;;
3295
+ *)
3296
+ _log4sh_error "layout value/method (${_lpa_key}) unrecognized"
3297
+ false
3298
+ ;;
3299
+ esac
3300
+ [ $? -ne ${__LOG4SH_TRUE} ] && _lpa_rtrn=${__LOG4SH_ERROR}
3301
+ __log4sh_return=${_lpa_rtrn}
3302
+ unset _lpa_appender _lpa_key _lpa_rtrn _lpa_value
3303
+ return ${__log4sh_return}
3304
+ }
3305
+
3306
+ #/**
3307
+ # <s:function group="Property" modifier="private">
3308
+ # <entry align="right">
3309
+ # <code>string</code>
3310
+ # </entry>
3311
+ # <entry>
3312
+ # <funcsynopsis>
3313
+ # <funcprototype>
3314
+ # <funcdef><function>_log4sh_propLogger</function></funcdef>
3315
+ # <paramdef>string <parameter>property</parameter></paramdef>
3316
+ # <paramdef>string <parameter>value</parameter></paramdef>
3317
+ # </funcprototype>
3318
+ # </funcsynopsis>
3319
+ # <para>(future) Configures log4sh with a <code>logger</code> configuration
3320
+ # statement. Sample output: "logger: property value".</para>
3321
+ # <funcsynopsis>
3322
+ # <funcsynopsisinfo>result=`_log4sh_propLogger $property $value`</funcsynopsisinfo>
3323
+ # </funcsynopsis>
3324
+ # </entry>
3325
+ # </s:function>
3326
+ #*/
3327
+ _log4sh_propLogger()
3328
+ {
3329
+ _prop=`_log4sh_stripPropPrefix $1`
3330
+ echo "logger: ${_prop} $2"
3331
+ unset _prop
3332
+ }
3333
+
3334
+ #
3335
+ # configure log4sh with a rootLogger configuration statement
3336
+ #
3337
+ # @param _key configuration command
3338
+ # @param _value configuration value
3339
+ #
3340
+ #/**
3341
+ # <s:function group="Property" modifier="private">
3342
+ # <entry align="right">
3343
+ # <emphasis>void</emphasis>
3344
+ # </entry>
3345
+ # <entry>
3346
+ # <funcsynopsis>
3347
+ # <funcprototype>
3348
+ # <funcdef><function>_log4sh_propRootLogger</function></funcdef>
3349
+ # <paramdef>string <parameter>rootLogger</parameter></paramdef>
3350
+ # </funcprototype>
3351
+ # </funcsynopsis>
3352
+ # <para>Configures log4sh with a <code>rootLogger</code> configuration
3353
+ # statement. It expects a comma separated string similar to the following:</para>
3354
+ # <para><code>log4sh.rootLogger=ERROR, stderr, R</code></para>
3355
+ # <para>The first option is the default logging level to set for all
3356
+ # of the following appenders that will be created, and all following options
3357
+ # are the names of appenders to create. The appender names must be
3358
+ # unique.</para>
3359
+ # <funcsynopsis>
3360
+ # <funcsynopsisinfo>_log4sh_propRootLogger $value</funcsynopsisinfo>
3361
+ # </funcsynopsis>
3362
+ # </entry>
3363
+ # </s:function>
3364
+ #*/
3365
+ _log4sh_propRootLogger()
3366
+ {
3367
+ __lprl_rootLogger=`echo "$@" |sed 's/ *, */,/g'`
3368
+ __lprl_count=`echo "${__lprl_rootLogger}" |sed 's/,/ /g' |wc -w`
3369
+ __lprl_index=1
3370
+ while [ ${__lprl_index} -le ${__lprl_count} ]; do
3371
+ __lprl_operand=`echo "${__lprl_rootLogger}" |cut -d, -f${__lprl_index}`
3372
+ if [ ${__lprl_index} -eq 1 ]; then
3373
+ logger_setLevel "${__lprl_operand}"
3374
+ else
3375
+ appender_exists "${__lprl_operand}"
3376
+ if [ $? -eq ${__LOG4SH_FALSE} ]; then
3377
+ logger_addAppender "${__lprl_operand}"
3378
+ else
3379
+ _log4sh_error "attempt to add already existing appender of name (${__lprl_operand})"
3380
+ fi
3381
+ fi
3382
+ __lprl_index=`expr ${__lprl_index} + 1`
3383
+ done
3384
+
3385
+ unset __lprl_count __lprl_index __lprl_operand __lprl_rootLogger
3386
+ }
3387
+
3388
+ #/**
3389
+ # <s:function group="Property" modifier="public">
3390
+ # <entry align="right">
3391
+ # <emphasis>void</emphasis>/boolean
3392
+ # </entry>
3393
+ # <entry>
3394
+ # <funcsynopsis>
3395
+ # <funcprototype>
3396
+ # <funcdef><function>log4sh_doConfigure</function></funcdef>
3397
+ # <paramdef>string <parameter>configFileName</parameter></paramdef>
3398
+ # </funcprototype>
3399
+ # </funcsynopsis>
3400
+ # <para>
3401
+ # Read configuration from a file. <emphasis role="strong">The existing
3402
+ # configuration is not cleared or reset.</emphasis> If you require a
3403
+ # different behavior, then call the <code>log4sh_resetConfiguration</code>
3404
+ # before calling <code>log4sh_doConfigure</code>.
3405
+ # </para>
3406
+ # <funcsynopsis>
3407
+ # <funcsynopsisinfo>log4sh_doConfigure myconfig.properties</funcsynopsisinfo>
3408
+ # </funcsynopsis>
3409
+ # </entry>
3410
+ # </s:function>
3411
+ #*/
3412
+ log4sh_doConfigure()
3413
+ {
3414
+ [ -n "${FUNCNAME:-}" ] \
3415
+ && ${__LOG4SH_TRACE} "${FUNCNAME}()${BASH_LINENO:+'(called from ${BASH_LINENO})'}"
3416
+
3417
+ # prepare the environment for configuration
3418
+ log4sh_resetConfiguration
3419
+
3420
+ ldc_file=$1
3421
+ ldc_rtrn=${__LOG4SH_TRUE}
3422
+
3423
+ # strip the config prefix and dump output to a temporary file
3424
+ ldc_tmpFile="${__log4sh_tmpDir}/properties"
3425
+ ${__LOG4SH_TRACE} "__LOG4SH_CONFIG_PREFIX='${__LOG4SH_CONFIG_PREFIX}'"
3426
+ grep "^${__LOG4SH_CONFIG_PREFIX}\." "${ldc_file}" >"${ldc_tmpFile}"
3427
+
3428
+ # read the file in. using a temporary file and a file descriptor here instead
3429
+ # of piping the file into the 'while read' because the pipe causes a fork
3430
+ # under some shells which makes it impossible to get the variables passed
3431
+ # back to the parent script.
3432
+ exec 3<&0 <"${ldc_tmpFile}"
3433
+ while read ldc_line; do
3434
+ ldc_key=`expr "${ldc_line}" : '\([^= ]*\) *=.*'`
3435
+ ldc_value=`expr "${ldc_line}" : '[^= ]* *= *\(.*\)'`
3436
+
3437
+ # strip the leading 'log4sh.'
3438
+ ldc_key=`_log4sh_stripPropPrefix ${ldc_key}`
3439
+ ldc_keyword=`_log4sh_getPropPrefix ${ldc_key}`
3440
+ case ${ldc_keyword} in
3441
+ alternative) _log4sh_propAlternative ${ldc_key} "${ldc_value}" ;;
3442
+ appender) _log4sh_propAppender ${ldc_key} "${ldc_value}" ;;
3443
+ logger) _log4sh_propLogger ${ldc_key} "${ldc_value}" ;;
3444
+ rootLogger) _log4sh_propRootLogger "${ldc_value}" ;;
3445
+ *)
3446
+ _log4sh_error "unrecognized properties keyword (${ldc_keyword})"
3447
+ false
3448
+ ;;
3449
+ esac
3450
+ [ $? -ne ${__LOG4SH_TRUE} ] && ldc_rtrn=${__LOG4SH_ERROR}
3451
+ done
3452
+ exec 0<&3 3<&-
3453
+
3454
+ # remove the temporary file
3455
+ rm -f "${ldc_tmpFile}"
3456
+
3457
+ # activate all of the appenders
3458
+ for ldc_appender in ${__log4shAppenders}; do
3459
+ ${__LOG4SH_APPENDER_FUNC_PREFIX}${ldc_appender}_activateOptions
3460
+ done
3461
+
3462
+ __log4sh_return=${ldc_rtrn}
3463
+ unset ldc_appender ldc_file ldc_tmpFile ldc_line ldc_key ldc_keyword
3464
+ unset ldc_value ldc_rtrn
3465
+ return ${__log4sh_return}
3466
+ }
3467
+
3468
+ #/**
3469
+ # <s:function group="Property" modifier="public">
3470
+ # <entry align="right">
3471
+ # <emphasis>void</emphasis>
3472
+ # </entry>
3473
+ # <entry>
3474
+ # <funcsynopsis>
3475
+ # <funcprototype>
3476
+ # <funcdef><function>log4sh_readProperties</function></funcdef>
3477
+ # <paramdef>string <parameter>configFileName</parameter></paramdef>
3478
+ # </funcprototype>
3479
+ # </funcsynopsis>
3480
+ # <para><emphasis role="strong">Deprecated as of 1.3.6</emphasis></para>
3481
+ # <para>
3482
+ # See <code>log4sh_doConfigure</code>.
3483
+ # </para>
3484
+ # <funcsynopsis>
3485
+ # <funcsynopsisinfo>log4sh_readProperties myconfig.properties</funcsynopsisinfo>
3486
+ # </funcsynopsis>
3487
+ # </entry>
3488
+ # </s:function>
3489
+ #*/
3490
+ log4sh_readProperties()
3491
+ {
3492
+ log4sh_doConfigure "$@"
3493
+ }
3494
+
3495
+ #/**
3496
+ # <s:function group="Property" modifier="public">
3497
+ # <entry align="right">
3498
+ # <emphasis>void</emphasis>
3499
+ # </entry>
3500
+ # <entry>
3501
+ # <funcsynopsis>
3502
+ # <funcprototype>
3503
+ # <funcdef><function>log4sh_resetConfiguration</function></funcdef>
3504
+ # <void />
3505
+ # </funcprototype>
3506
+ # </funcsynopsis>
3507
+ # <para>
3508
+ # This function completely resets the log4sh configuration to have no
3509
+ # appenders with a global logging level of ERROR.
3510
+ # </para>
3511
+ # <funcsynopsis>
3512
+ # <funcsynopsisinfo>log4sh_resetConfiguration</funcsynopsisinfo>
3513
+ # </funcsynopsis>
3514
+ # </entry>
3515
+ # </s:function>
3516
+ #*/
3517
+ # XXX if a configuration is *repeatedly* established via logger_addAppender and
3518
+ # reset using this command, there is a risk of running out of memory.
3519
+ log4sh_resetConfiguration()
3520
+ {
3521
+ __log4shAppenders=''
3522
+ __log4shAppenderCount=0
3523
+ __log4shAppenderCounts=''
3524
+ __log4shAppenderLayouts=''
3525
+ __log4shAppenderLevels=''
3526
+ __log4shAppenderPatterns=''
3527
+ __log4shAppenderTypes=''
3528
+ __log4shAppender_file_files=''
3529
+ __log4shAppender_rollingFile_maxBackupIndexes=''
3530
+ __log4shAppender_rollingFile_maxFileSizes=''
3531
+ __log4shAppender_smtp_tos=''
3532
+ __log4shAppender_smtp_subjects=''
3533
+ __log4shAppender_syslog_facilities=''
3534
+ __log4shAppender_syslog_hosts=''
3535
+
3536
+ logger_setLevel ERROR
3537
+ }
3538
+
3539
+ #==============================================================================
3540
+ # Thread
3541
+ #
3542
+
3543
+ #/**
3544
+ # <s:function group="Thread" modifier="public">
3545
+ # <entry align="right">
3546
+ # <code>string</code>
3547
+ # </entry>
3548
+ # <entry>
3549
+ # <funcsynopsis>
3550
+ # <funcprototype>
3551
+ # <funcdef><function>logger_getThreadName</function></funcdef>
3552
+ # <void />
3553
+ # </funcprototype>
3554
+ # </funcsynopsis>
3555
+ # <para>Gets the current thread name.</para>
3556
+ # <funcsynopsis>
3557
+ # <funcsynopsisinfo>threadName=`logger_getThreadName`</funcsynopsisinfo>
3558
+ # </funcsynopsis>
3559
+ # </entry>
3560
+ # </s:function>
3561
+ #*/
3562
+ logger_getThreadName()
3563
+ {
3564
+ echo ${__log4sh_threadName}
3565
+ }
3566
+
3567
+ #/**
3568
+ # <s:function group="Thread" modifier="public">
3569
+ # <entry align="right">
3570
+ # <emphasis>void</emphasis>
3571
+ # </entry>
3572
+ # <entry>
3573
+ # <funcsynopsis>
3574
+ # <funcprototype>
3575
+ # <funcdef><function>logger_setThreadName</function></funcdef>
3576
+ # <paramdef>string <parameter>threadName</parameter></paramdef>
3577
+ # </funcprototype>
3578
+ # </funcsynopsis>
3579
+ # <para>
3580
+ # Sets the thread name (e.g. the name of the script). This thread name can
3581
+ # be used with the '%t' conversion character within a
3582
+ # <option>PatternLayout</option>.
3583
+ # </para>
3584
+ # <funcsynopsis>
3585
+ # <funcsynopsisinfo>logger_setThreadName "myThread"</funcsynopsisinfo>
3586
+ # </funcsynopsis>
3587
+ # </entry>
3588
+ # </s:function>
3589
+ #*/
3590
+ logger_setThreadName()
3591
+ {
3592
+ _thread=$1
3593
+
3594
+ _length=`_log4sh_getArrayLength "$__log4sh_threadStack"`
3595
+ __log4sh_threadStack=`_log4sh_setArrayElement "$__log4sh_threadStack" $_length $_thread`
3596
+ __log4sh_threadName=$_thread
3597
+
3598
+ unset _length _thread
3599
+ }
3600
+
3601
+ #/**
3602
+ # <s:function group="Thread" modifier="public">
3603
+ # <entry align="right">
3604
+ # <emphasis>void</emphasis>
3605
+ # </entry>
3606
+ # <entry>
3607
+ # <funcsynopsis>
3608
+ # <funcprototype>
3609
+ # <funcdef><function>logger_pushThreadName</function></funcdef>
3610
+ # <paramdef>string <parameter>threadName</parameter></paramdef>
3611
+ # </funcprototype>
3612
+ # </funcsynopsis>
3613
+ # <para><emphasis role="strong">Deprecated as of 1.3.7</emphasis></para>
3614
+ # <para>
3615
+ # Sets the thread name (eg. the name of the script) and pushes the old on
3616
+ # to a stack for later use. This thread name can be used with the '%t'
3617
+ # conversion character within a <option>PatternLayout</option>.
3618
+ # </para>
3619
+ # <funcsynopsis>
3620
+ # <funcsynopsisinfo>logger_pushThreadName "myThread"</funcsynopsisinfo>
3621
+ # </funcsynopsis>
3622
+ # </entry>
3623
+ # </s:function>
3624
+ #*/
3625
+ logger_pushThreadName()
3626
+ {
3627
+ __log4sh_threadStack=`_log4sh_pushStack "$__log4sh_threadStack" $1`
3628
+ __log4sh_threadName=$1
3629
+ }
3630
+
3631
+ #/**
3632
+ # <s:function group="Thread" modifier="public">
3633
+ # <entry align="right">
3634
+ # <emphasis>void</emphasis>
3635
+ # </entry>
3636
+ # <entry>
3637
+ # <funcsynopsis>
3638
+ # <funcprototype>
3639
+ # <funcdef><function>logger_popThreadName</function></funcdef>
3640
+ # <void />
3641
+ # </funcprototype>
3642
+ # </funcsynopsis>
3643
+ # <para><emphasis role="strong">Deprecated as of 1.3.7</emphasis></para>
3644
+ # <para>
3645
+ # Removes the topmost thread name from the stack. The next thread name on
3646
+ # the stack is then placed in the <varname>__log4sh_threadName</varname>
3647
+ # variable. If the stack is empty, or has only one element left, then a
3648
+ # warning is given that no more thread names can be popped from the stack.
3649
+ # </para>
3650
+ # <funcsynopsis>
3651
+ # <funcsynopsisinfo>logger_popThreadName</funcsynopsisinfo>
3652
+ # </funcsynopsis>
3653
+ # </entry>
3654
+ # </s:function>
3655
+ #*/
3656
+ logger_popThreadName()
3657
+ {
3658
+ _length=`_log4sh_getArrayLength "$__log4sh_threadStack"`
3659
+ if [ $_length -gt 1 ]; then
3660
+ __log4sh_threadStack=`_log4sh_popStack "$__log4sh_threadStack"`
3661
+ __log4sh_threadName=`_log4sh_peekStack "$__log4sh_threadStack"`
3662
+ else
3663
+ echo 'log4sh:WARN no more thread names available on thread name stack.' >&2
3664
+ fi
3665
+ }
3666
+
3667
+ #==============================================================================
3668
+ # Trap
3669
+ #
3670
+
3671
+ #/**
3672
+ # <s:function group="Trap" modifier="public">
3673
+ # <entry align="right">
3674
+ # <emphasis>void</emphasis>
3675
+ # </entry>
3676
+ # <entry>
3677
+ # <funcsynopsis>
3678
+ # <funcprototype>
3679
+ # <funcdef><function>log4sh_cleanup</function></funcdef>
3680
+ # <void />
3681
+ # </funcprototype>
3682
+ # </funcsynopsis>
3683
+ # <para>This is a cleanup function to remove the temporary directory used by
3684
+ # log4sh. It is provided for scripts who want to do log4sh cleanup work
3685
+ # themselves rather than using the automated cleanup of log4sh that is
3686
+ # invoked upon a normal exit of the script.</para>
3687
+ # <funcsynopsis>
3688
+ # <funcsynopsisinfo>log4sh_cleanup</funcsynopsisinfo>
3689
+ # </funcsynopsis>
3690
+ # </entry>
3691
+ # </s:function>
3692
+ #*/
3693
+ log4sh_cleanup()
3694
+ {
3695
+ _log4sh_cleanup 'EXIT'
3696
+ }
3697
+
3698
+ #/**
3699
+ # <s:function group="Trap" modifier="private">
3700
+ # <entry align="right">
3701
+ # <emphasis>void</emphasis>
3702
+ # </entry>
3703
+ # <entry>
3704
+ # <funcsynopsis>
3705
+ # <funcprototype>
3706
+ # <funcdef><function>_log4sh_cleanup</function></funcdef>
3707
+ # <paramdef>string <parameter>signal</parameter></paramdef>
3708
+ # </funcprototype>
3709
+ # </funcsynopsis>
3710
+ # <para>This is a cleanup function to remove the temporary directory used by
3711
+ # log4sh. It should only be called by log4sh itself when it is taking
3712
+ # control of traps.</para>
3713
+ # <para>If there was a previously defined trap for the given signal, log4sh
3714
+ # will attempt to call the original trap handler as well so as not to break
3715
+ # the parent script.</para>
3716
+ # <funcsynopsis>
3717
+ # <funcsynopsisinfo>_log4sh_cleanup EXIT</funcsynopsisinfo>
3718
+ # </funcsynopsis>
3719
+ # </entry>
3720
+ # </s:function>
3721
+ #*/
3722
+ _log4sh_cleanup()
3723
+ {
3724
+ _lc__trap=$1
3725
+ ${__LOG4SH_INFO} "_log4sh_cleanup(): the ${_lc__trap} signal was caught"
3726
+
3727
+ _lc__restoreTrap=${__LOG4SH_FALSE}
3728
+ _lc__oldTrap=''
3729
+
3730
+ # match trap to signal value
3731
+ case "${_lc__trap}" in
3732
+ EXIT) _lc__signal=0 ;;
3733
+ INT) _lc__signal=2 ;;
3734
+ TERM) _lc__signal=15 ;;
3735
+ esac
3736
+
3737
+ # do we possibly need to restore a previous trap?
3738
+ if [ -r "${__log4sh_trapsFile}" -a -s "${__log4sh_trapsFile}" ]; then
3739
+ # yes. figure out what we need to do
3740
+ if [ `grep "^trap -- " "${__log4sh_trapsFile}" >/dev/null; echo $?` -eq 0 ]
3741
+ then
3742
+ # newer trap command
3743
+ ${__LOG4SH_DEBUG} 'newer POSIX trap command'
3744
+ _lc__restoreTrap=${__LOG4SH_TRUE}
3745
+ _lc__oldTrap=`egrep "(${_lc__trap}|${_lc__signal})$" "${__log4sh_trapsFile}" |\
3746
+ sed "s/^trap -- '\(.*\)' [A-Z]*$/\1/"`
3747
+ elif [ `grep "[0-9]*: " "${__log4sh_trapsFile}" >/dev/null; echo $?` -eq 0 ]
3748
+ then
3749
+ # older trap command
3750
+ ${__LOG4SH_DEBUG} 'older style trap command'
3751
+ _lc__restoreTrap=${__LOG4SH_TRUE}
3752
+ _lc__oldTrap=`grep "^${_lc__signal}: " "${__log4sh_trapsFile}" |\
3753
+ sed 's/^[0-9]*: //'`
3754
+ else
3755
+ # unrecognized trap output
3756
+ _log4sh_error 'unable to restore old traps! unrecognized trap command output'
3757
+ fi
3758
+ fi
3759
+
3760
+ # do our work
3761
+ rm -fr "${__log4sh_tmpDir}"
3762
+
3763
+ # execute the old trap
3764
+ if [ ${_lc__restoreTrap} -eq ${__LOG4SH_TRUE} -a -n "${_lc__oldTrap}" ]; then
3765
+ ${__LOG4SH_INFO} 'restoring previous trap of same type'
3766
+ eval "${_lc__oldTrap}"
3767
+ fi
3768
+
3769
+ # exit for all non-EXIT signals
3770
+ if [ "${_lc__trap}" != 'EXIT' ]; then
3771
+ # disable the EXIT trap
3772
+ trap 0
3773
+
3774
+ # add 127 to signal value and exit
3775
+ _lc__signal=`expr ${_lc__signal} + 127`
3776
+ exit ${_lc__signal}
3777
+ fi
3778
+
3779
+ unset _lc__oldTrap _lc__signal _lc__restoreTrap _lc__trap
3780
+ return
3781
+ }
3782
+
3783
+
3784
+ #==============================================================================
3785
+ # main
3786
+ #
3787
+
3788
+ # create a temporary directory
3789
+ __log4sh_tmpDir=`_log4sh_mktempDir`
3790
+
3791
+ # preserve old trap(s)
3792
+ __log4sh_trapsFile="${__log4sh_tmpDir}/traps"
3793
+ trap >"${__log4sh_trapsFile}"
3794
+
3795
+ # configure traps
3796
+ ${__LOG4SH_INFO} 'setting traps'
3797
+ trap '_log4sh_cleanup EXIT' 0
3798
+ trap '_log4sh_cleanup INT' 2
3799
+ trap '_log4sh_cleanup TERM' 15
3800
+
3801
+ # alternative commands
3802
+ log4sh_setAlternative mail "${LOG4SH_ALTERNATIVE_MAIL:-mail}" ${__LOG4SH_TRUE}
3803
+ [ -n "${LOG4SH_ALTERNATIVE_NC:-}" ] \
3804
+ && log4sh_setAlternative nc "${LOG4SH_ALTERNATIVE_NC}"
3805
+
3806
+ # load the properties file
3807
+ ${__LOG4SH_TRACE} "__LOG4SH_CONFIGURATION='${__LOG4SH_CONFIGURATION}'"
3808
+ if [ "${__LOG4SH_CONFIGURATION}" != 'none' -a -r "${__LOG4SH_CONFIGURATION}" ]
3809
+ then
3810
+ ${__LOG4SH_INFO} 'configuring via properties file'
3811
+ log4sh_doConfigure "${__LOG4SH_CONFIGURATION}"
3812
+ else
3813
+ if [ "${__LOG4SH_CONFIGURATION}" != 'none' ]; then
3814
+ _log4sh_warn 'No appenders could be found.'
3815
+ _log4sh_warn 'Please initalize the log4sh system properly.'
3816
+ fi
3817
+ ${__LOG4SH_INFO} 'configuring at runtime'
3818
+
3819
+ # prepare the environment for configuration
3820
+ log4sh_resetConfiguration
3821
+
3822
+ # note: not using the constant variables here (e.g. for ConsoleAppender) so
3823
+ # that those perusing the code can have a working example
3824
+ logger_setLevel ${__LOG4SH_LEVEL_ERROR_STR}
3825
+ logger_addAppender stdout
3826
+ appender_setType stdout ConsoleAppender
3827
+ appender_setLayout stdout PatternLayout
3828
+ appender_setPattern stdout '%-4r [%t] %-5p %c %x - %m%n'
3829
+ fi
3830
+
3831
+ # restore the previous set of shell flags
3832
+ for _log4sh_shellFlag in ${__LOG4SH_SHELL_FLAGS}; do
3833
+ echo ${__log4sh_oldShellFlags} |grep ${_log4sh_shellFlag} >/dev/null \
3834
+ || set +${_log4sh_shellFlag}
3835
+ done
3836
+ unset _log4sh_shellFlag
3837
+
3838
+ #/**
3839
+ # </s:shelldoc>
3840
+ #*/