line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package BGPmon::Log; |
2
|
|
|
|
|
|
|
our $VERSION = '2.0'; |
3
|
|
|
|
|
|
|
|
4
|
1
|
|
|
1
|
|
83069
|
use 5.14.0; |
|
1
|
|
|
|
|
5
|
|
|
1
|
|
|
|
|
132
|
|
5
|
1
|
|
|
1
|
|
6
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
32
|
|
6
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
38
|
|
7
|
1
|
|
|
1
|
|
5
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
66
|
|
8
|
1
|
|
|
1
|
|
7
|
use Sys::Syslog; # for writing to syslog |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
72
|
|
9
|
1
|
|
|
1
|
|
6
|
use POSIX; # for date/time parsing with strftime |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
8
|
|
10
|
1
|
|
|
1
|
|
3121
|
use Sys::Hostname; # to get the hostname |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
206
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
require Exporter; |
13
|
|
|
|
|
|
|
our %EXPORT_TAGS = ( "all" => [ qw(log_init log_close |
14
|
|
|
|
|
|
|
log_emerg log_emergency log_alert |
15
|
|
|
|
|
|
|
log_fatal log_crit log_critical |
16
|
|
|
|
|
|
|
log_err log_error |
17
|
|
|
|
|
|
|
log_warn log_warning log_notice log_info |
18
|
|
|
|
|
|
|
log_debug debug get_error_code |
19
|
|
|
|
|
|
|
get_error_message get_error_msg) ] ); |
20
|
|
|
|
|
|
|
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); |
21
|
|
|
|
|
|
|
our @ISA = qw(Exporter); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
# ----- The Different Logging levels and their matching functions --- |
24
|
1
|
|
|
1
|
|
6
|
use constant LOG_EMERG => 0; # log_emerg |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
75
|
|
25
|
1
|
|
|
1
|
|
4
|
use constant LOG_EMERGENCY => 0; # log_emergency |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
41
|
|
26
|
1
|
|
|
1
|
|
12
|
use constant LOG_ALERT => 1; # log_alert |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
44
|
|
27
|
1
|
|
|
1
|
|
4
|
use constant LOG_FATAL => 2; # log_fatal |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
37
|
|
28
|
1
|
|
|
1
|
|
5
|
use constant LOG_CRIT => 2; # log_crit |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
51
|
|
29
|
1
|
|
|
1
|
|
5
|
use constant LOG_CRITICAL => 2; # log_critical |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
66
|
|
30
|
1
|
|
|
1
|
|
5
|
use constant LOG_ERR => 3; # log_err |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
129
|
|
31
|
1
|
|
|
1
|
|
6
|
use constant LOG_ERROR => 3; # log_error |
|
1
|
|
|
|
|
11
|
|
|
1
|
|
|
|
|
51
|
|
32
|
1
|
|
|
1
|
|
5
|
use constant LOG_WARNING => 4; # log_warning |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
41
|
|
33
|
1
|
|
|
1
|
|
6
|
use constant LOG_WARN => 4; # log_warn |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
46
|
|
34
|
1
|
|
|
1
|
|
5
|
use constant LOG_NOTICE => 5; # log_notice |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
40
|
|
35
|
1
|
|
|
1
|
|
5
|
use constant LOG_INFO => 6; # log_info |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
52
|
|
36
|
1
|
|
|
1
|
|
4
|
use constant LOG_DEBUG => 7; # log_debug |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
130
|
|
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
# ----- The Different Logging facilities --- |
39
|
|
|
|
|
|
|
# we simply repeat the syslog module settings |
40
|
1
|
|
|
1
|
|
16
|
use constant LOG_KERN => Sys::Syslog::LOG_KERN; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
51
|
|
41
|
1
|
|
|
1
|
|
5
|
use constant LOG_USER => Sys::Syslog::LOG_USER; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
54
|
|
42
|
1
|
|
|
1
|
|
5
|
use constant LOG_MAIL => Sys::Syslog::LOG_MAIL; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
46
|
|
43
|
1
|
|
|
1
|
|
5
|
use constant LOG_DAEMON => Sys::Syslog::LOG_DAEMON; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
54
|
|
44
|
1
|
|
|
1
|
|
6
|
use constant LOG_SECURITY => Sys::Syslog::LOG_SECURITY; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
59
|
|
45
|
1
|
|
|
1
|
|
6
|
use constant LOG_SYSLOG => Sys::Syslog::LOG_SYSLOG; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
60
|
|
46
|
1
|
|
|
1
|
|
5
|
use constant LOG_LPR => Sys::Syslog::LOG_LPR; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
47
|
|
47
|
1
|
|
|
1
|
|
6
|
use constant LOG_NEWS => Sys::Syslog::LOG_NEWS; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
55
|
|
48
|
1
|
|
|
1
|
|
5
|
use constant LOG_UUCP => Sys::Syslog::LOG_UUCP; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
130
|
|
49
|
1
|
|
|
1
|
|
5
|
use constant LOG_AUTH => Sys::Syslog::LOG_AUTH; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
54
|
|
50
|
1
|
|
|
1
|
|
5
|
use constant LOG_AUTHPRIV => Sys::Syslog::LOG_AUTHPRIV; |
|
1
|
|
|
|
|
20
|
|
|
1
|
|
|
|
|
44
|
|
51
|
1
|
|
|
1
|
|
5
|
use constant LOG_FTP => Sys::Syslog::LOG_FTP; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
53
|
|
52
|
1
|
|
|
1
|
|
5
|
use constant LOG_NTP => Sys::Syslog::LOG_NTP; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
53
|
|
53
|
1
|
|
|
1
|
|
12
|
use constant LOG_AUDIT => Sys::Syslog::LOG_AUDIT; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
269
|
|
54
|
1
|
|
|
1
|
|
7
|
use constant LOG_CONSOLE => Sys::Syslog::LOG_CONSOLE; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
64
|
|
55
|
1
|
|
|
1
|
|
5
|
use constant LOG_INSTALL => Sys::Syslog::LOG_INSTALL; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
66
|
|
56
|
1
|
|
|
1
|
|
6
|
use constant LOG_LAUNCHD => Sys::Syslog::LOG_LAUNCHD; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
57
|
|
57
|
1
|
|
|
1
|
|
5
|
use constant LOG_LFMT => Sys::Syslog::LOG_LFMT; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
63
|
|
58
|
1
|
|
|
1
|
|
6
|
use constant LOG_NETINFO => Sys::Syslog::LOG_NETINFO; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
50
|
|
59
|
1
|
|
|
1
|
|
5
|
use constant LOG_RAS => Sys::Syslog::LOG_RAS; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
148
|
|
60
|
1
|
|
|
1
|
|
6
|
use constant LOG_REMOTEAUTH => Sys::Syslog::LOG_REMOTEAUTH; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
63
|
|
61
|
1
|
|
|
1
|
|
7
|
use constant LOG_CRON => Sys::Syslog::LOG_CRON; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
49
|
|
62
|
1
|
|
|
1
|
|
6
|
use constant LOG_LOCAL0 => Sys::Syslog::LOG_LOCAL0; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
56
|
|
63
|
1
|
|
|
1
|
|
4
|
use constant LOG_LOCAL1 => Sys::Syslog::LOG_LOCAL1; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
53
|
|
64
|
1
|
|
|
1
|
|
5
|
use constant LOG_LOCAL2 => Sys::Syslog::LOG_LOCAL2; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
63
|
|
65
|
1
|
|
|
1
|
|
6
|
use constant LOG_LOCAL3 => Sys::Syslog::LOG_LOCAL3; |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
52
|
|
66
|
1
|
|
|
1
|
|
5
|
use constant LOG_LOCAL4 => Sys::Syslog::LOG_LOCAL4; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
147
|
|
67
|
1
|
|
|
1
|
|
6
|
use constant LOG_LOCAL5 => Sys::Syslog::LOG_LOCAL5; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
54
|
|
68
|
1
|
|
|
1
|
|
5
|
use constant LOG_LOCAL6 => Sys::Syslog::LOG_LOCAL6; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
57
|
|
69
|
1
|
|
|
1
|
|
5
|
use constant LOG_LOCAL7 => Sys::Syslog::LOG_LOCAL7; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
46
|
|
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
# ----- The default log settings --- |
72
|
1
|
|
|
1
|
|
4
|
use constant DEFAULT_LOG_LEVEL => LOG_WARNING; |
|
1
|
|
|
|
|
8
|
|
|
1
|
|
|
|
|
45
|
|
73
|
1
|
|
|
1
|
|
6
|
use constant DEFAULT_LOG_FACILITY => LOG_LOCAL1; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
43
|
|
74
|
1
|
|
|
1
|
|
11
|
use constant DEFAULT_USE_SYSLOG => 0; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
48
|
|
75
|
1
|
|
|
1
|
|
5
|
use constant DEFAULT_USE_GMT => 1; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
107
|
|
76
|
1
|
|
|
1
|
|
6
|
use constant MAX_STRING_LEN => 256; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
81
|
|
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
# --- constants used to indicate error codes and messages--- |
79
|
1
|
|
|
1
|
|
5
|
use constant NO_ERROR_CODE => 0; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
43
|
|
80
|
1
|
|
|
|
|
47
|
use constant NO_ERROR_MSG => |
81
|
1
|
|
|
1
|
|
4
|
'No Error'; |
|
1
|
|
|
|
|
2
|
|
82
|
1
|
|
|
1
|
|
5
|
use constant NO_FUNCTION_SPECIFIED_CODE => 1; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
51
|
|
83
|
1
|
|
|
|
|
36
|
use constant NO_FUNCTION_SPECIFIED_MSG => |
84
|
1
|
|
|
1
|
|
5
|
'Error reporting function called without specifying the function.'; |
|
1
|
|
|
|
|
1
|
|
85
|
1
|
|
|
1
|
|
4
|
use constant INVALID_FUNCTION_SPECIFIED_CODE => 2; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
46
|
|
86
|
1
|
|
|
|
|
49
|
use constant INVALID_FUNCTION_SPECIFIED_MSG => |
87
|
1
|
|
|
1
|
|
6
|
'Error reporting function called with invalid function name'; |
|
1
|
|
|
|
|
1
|
|
88
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_NO_HOSTNAME_CODE => 3; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
38
|
|
89
|
1
|
|
|
|
|
50
|
use constant LOG_INIT_NO_HOSTNAME_MSG => |
90
|
1
|
|
|
1
|
|
5
|
'Unable to get the hostname'; |
|
1
|
|
|
|
|
72
|
|
91
|
1
|
|
|
1
|
|
4
|
use constant LOG_INIT_PROG_SIZE_CODE => 4; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
51
|
|
92
|
1
|
|
|
|
|
44
|
use constant LOG_INIT_PROG_SIZE_MSG => |
93
|
1
|
|
|
1
|
|
6
|
'Program name exceeds maximum length of '.MAX_STRING_LEN; |
|
1
|
|
|
|
|
1
|
|
94
|
1
|
|
|
1
|
|
4
|
use constant LOG_INIT_PROG_PRINTABLE_CODE => 5; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
50
|
|
95
|
1
|
|
|
|
|
35
|
use constant LOG_INIT_PROG_PRINTABLE_MSG => |
96
|
1
|
|
|
1
|
|
5
|
'Program name contains non-printable characters'; |
|
1
|
|
|
|
|
2
|
|
97
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_LEVEL_NOT_NUM_CODE => 6; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
43
|
|
98
|
1
|
|
|
|
|
36
|
use constant LOG_INIT_LEVEL_NOT_NUM_MSG => |
99
|
1
|
|
|
1
|
|
5
|
'Log level must be a postive integer'; |
|
1
|
|
|
|
|
2
|
|
100
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_LEVEL_RANGE_CODE => 7; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
138
|
|
101
|
1
|
|
|
|
|
57
|
use constant LOG_INIT_LEVEL_RANGE_MSG => |
102
|
1
|
|
|
1
|
|
6
|
'Log level must be between '.LOG_EMERG.' and '.LOG_DEBUG; |
|
1
|
|
|
|
|
1
|
|
103
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_FACILITY_NOT_NUM_CODE => 8; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
38
|
|
104
|
1
|
|
|
|
|
43
|
use constant LOG_INIT_FACILITY_NOT_NUM_MSG => |
105
|
1
|
|
|
1
|
|
5
|
'Log facility must be a postive integer'; |
|
1
|
|
|
|
|
1
|
|
106
|
1
|
|
|
1
|
|
40
|
use constant LOG_INIT_FILE_SIZE_CODE => 9; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
51
|
|
107
|
1
|
|
|
|
|
40
|
use constant LOG_INIT_FILE_SIZE_MSG => |
108
|
1
|
|
|
1
|
|
6
|
'Log file exceeds maximum length of '.MAX_STRING_LEN; |
|
1
|
|
|
|
|
1
|
|
109
|
1
|
|
|
1
|
|
7
|
use constant LOG_INIT_FILE_PRINTABLE_CODE => 10; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
53
|
|
110
|
1
|
|
|
|
|
50
|
use constant LOG_INIT_FILE_PRINTABLE_MSG => |
111
|
1
|
|
|
1
|
|
4
|
'Log file contains non-printable characters'; |
|
1
|
|
|
|
|
2
|
|
112
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_SYSLOG_NOT_NUM_CODE => 11; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
108
|
|
113
|
1
|
|
|
|
|
47
|
use constant LOG_INIT_SYSLOG_NOT_NUM_MSG => |
114
|
1
|
|
|
1
|
|
5
|
'use_syslog must be 0 or 1'; |
|
1
|
|
|
|
|
1
|
|
115
|
1
|
|
|
1
|
|
4
|
use constant LOG_INIT_SYSLOG_RANGE_CODE => 12; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
44
|
|
116
|
1
|
|
|
|
|
48
|
use constant LOG_INIT_SYSLOG_RANGE_MSG => |
117
|
1
|
|
|
1
|
|
5
|
'use_syslog must be 0 or 1'; |
|
1
|
|
|
|
|
2
|
|
118
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_GMT_NOT_NUM_CODE => 13; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
50
|
|
119
|
1
|
|
|
|
|
34
|
use constant LOG_INIT_GMT_NOT_NUM_MSG => |
120
|
1
|
|
|
1
|
|
5
|
'use_syslog must be 0 or 1'; |
|
1
|
|
|
|
|
2
|
|
121
|
1
|
|
|
1
|
|
4
|
use constant LOG_INIT_GMT_RANGE_CODE => 14; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
48
|
|
122
|
1
|
|
|
|
|
36
|
use constant LOG_INIT_GMT_RANGE_MSG => |
123
|
1
|
|
|
1
|
|
5
|
'use_gmt must be 0 or 1'; |
|
1
|
|
|
|
|
1
|
|
124
|
1
|
|
|
1
|
|
4
|
use constant LOG_INIT_GMT_SYSLOG_CODE => 15; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
44
|
|
125
|
1
|
|
|
|
|
139
|
use constant LOG_INIT_GMT_SYSLOG_MSG => |
126
|
1
|
|
|
1
|
|
5
|
'use_gmt not allowed when use_syslog = 1'; |
|
1
|
|
|
|
|
1
|
|
127
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_SYSLOG_AND_FILE_CODE => 16; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
43
|
|
128
|
1
|
|
|
|
|
49
|
use constant LOG_INIT_SYSLOG_AND_FILE_MSG => |
129
|
1
|
|
|
1
|
|
5
|
'Unable to both use_syslog and write to a file'; |
|
1
|
|
|
|
|
2
|
|
130
|
1
|
|
|
1
|
|
5
|
use constant LOG_INIT_SYSLOG_OPEN_CODE => 17; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
47
|
|
131
|
1
|
|
|
|
|
44
|
use constant LOG_INIT_SYSLOG_OPEN_MSG => |
132
|
1
|
|
|
1
|
|
4
|
'Unable to open syslog'; |
|
1
|
|
|
|
|
2
|
|
133
|
1
|
|
|
1
|
|
4
|
use constant LOG_INIT_FILE_OPEN_CODE => 18; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
47
|
|
134
|
1
|
|
|
|
|
39
|
use constant LOG_INIT_FILE_OPEN_MSG => |
135
|
1
|
|
|
1
|
|
5
|
'Unable to open log file'; |
|
1
|
|
|
|
|
1
|
|
136
|
1
|
|
|
1
|
|
5
|
use constant LOG_NOT_INITIALIZED_CODE => 19; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
44
|
|
137
|
1
|
|
|
|
|
36
|
use constant LOG_NOT_INITIALIZED_MSG => |
138
|
1
|
|
|
1
|
|
4
|
'Logging not initialized. Use init_log() prior to calling log_*("msg")'; |
|
1
|
|
|
|
|
2
|
|
139
|
1
|
|
|
1
|
|
76
|
use constant LOG_UNKNOWN_FUNCTION_CODE => 20; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
71
|
|
140
|
1
|
|
|
|
|
46
|
use constant LOG_UNKNOWN_FUNCTION_MSG => |
141
|
1
|
|
|
1
|
|
6
|
'No such log function'; |
|
1
|
|
|
|
|
9
|
|
142
|
1
|
|
|
1
|
|
5
|
use constant LOG_MISSING_MSG_CODE => 21; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
50
|
|
143
|
1
|
|
|
|
|
47
|
use constant LOG_MISSING_MSG_MSG => |
144
|
1
|
|
|
1
|
|
5
|
'Log function called with no log message'; |
|
1
|
|
|
|
|
3
|
|
145
|
1
|
|
|
1
|
|
5
|
use constant LOG_MSG_SIZE_CODE => 22; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
64
|
|
146
|
1
|
|
|
|
|
49
|
use constant LOG_MSG_SIZE_MSG => |
147
|
1
|
|
|
1
|
|
6
|
'Log message exceeds maximum length of '.MAX_STRING_LEN; |
|
1
|
|
|
|
|
2
|
|
148
|
1
|
|
|
1
|
|
5
|
use constant LOG_MSG_PRINTABLE_CODE => 23; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
132
|
|
149
|
1
|
|
|
|
|
48
|
use constant LOG_MSG_PRINTABLE_MSG => |
150
|
1
|
|
|
1
|
|
7
|
'Message contains non-printable characters'; |
|
1
|
|
|
|
|
2
|
|
151
|
1
|
|
|
1
|
|
6
|
use constant LOG_WRITE_FAILED_CODE => 24; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
55
|
|
152
|
1
|
|
|
|
|
3860
|
use constant LOG_WRITE_FAILED_MSG => |
153
|
1
|
|
|
1
|
|
5
|
'Unable to write log messsage'; |
|
1
|
|
|
|
|
2
|
|
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
# --- error code/message --- |
156
|
|
|
|
|
|
|
my %error_code; |
157
|
|
|
|
|
|
|
my %error_msg; |
158
|
|
|
|
|
|
|
# init the error codes for all functions |
159
|
|
|
|
|
|
|
my @function_names = ("log_init", "log_close", |
160
|
|
|
|
|
|
|
"log_emerg", "log_emergency", "log_alert", |
161
|
|
|
|
|
|
|
"log_fatal", "log_crit", "log_critical", "log_err", |
162
|
|
|
|
|
|
|
"log_error", "log_warn", "log_warning", "log_notice", |
163
|
|
|
|
|
|
|
"log_info", "log_debug", "debug"); |
164
|
|
|
|
|
|
|
for my $function_name (@function_names) { |
165
|
|
|
|
|
|
|
$error_code{$function_name} = NO_ERROR_CODE; |
166
|
|
|
|
|
|
|
$error_msg{$function_name} = NO_ERROR_MSG; |
167
|
|
|
|
|
|
|
} |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
# ----- The Different Logging levels and their matching functions --- |
170
|
|
|
|
|
|
|
our %function_level; # maps function names to levels |
171
|
|
|
|
|
|
|
our %function_description; # maps function names to descriptions |
172
|
|
|
|
|
|
|
$function_level{"log_emerg"} = LOG_EMERG; |
173
|
|
|
|
|
|
|
$function_description{"log_emerg"} = "[LOG_EMERG]"; |
174
|
|
|
|
|
|
|
$function_level{"log_emergency"} = LOG_EMERGENCY; |
175
|
|
|
|
|
|
|
$function_description{"log_emergency"} = "[LOG_EMERGENCY]"; |
176
|
|
|
|
|
|
|
$function_level{"log_alert"} = LOG_ALERT; |
177
|
|
|
|
|
|
|
$function_description{"log_alert"} = "[LOG_ALERT]"; |
178
|
|
|
|
|
|
|
$function_level{"log_fatal"} = LOG_FATAL; |
179
|
|
|
|
|
|
|
$function_description{"log_fatal"} = "[LOG_FATAL]"; |
180
|
|
|
|
|
|
|
$function_level{"log_crit"} = LOG_CRIT; |
181
|
|
|
|
|
|
|
$function_description{"log_crit"} = "[LOG_CRIT]"; |
182
|
|
|
|
|
|
|
$function_level{"log_critical"} = LOG_CRITICAL; |
183
|
|
|
|
|
|
|
$function_description{"log_critical"} = "[LOG_CRITICAL]"; |
184
|
|
|
|
|
|
|
$function_level{"log_err"} = LOG_ERR; |
185
|
|
|
|
|
|
|
$function_description{"log_err"} = "[LOG_ERR]"; |
186
|
|
|
|
|
|
|
$function_level{"log_error"} = LOG_ERR; |
187
|
|
|
|
|
|
|
$function_description{"log_error"} = "[LOG_ERROR]"; |
188
|
|
|
|
|
|
|
$function_level{"log_warning"} = LOG_WARNING; |
189
|
|
|
|
|
|
|
$function_description{"log_warning"} = "[LOG_WARNING]"; |
190
|
|
|
|
|
|
|
$function_level{"log_warn"} = LOG_WARN; |
191
|
|
|
|
|
|
|
$function_description{"log_warn"} = "[LOG_WARN]"; |
192
|
|
|
|
|
|
|
$function_level{"log_notice"} = LOG_NOTICE; |
193
|
|
|
|
|
|
|
$function_description{"log_notice"} = "[LOG_NOTICE]"; |
194
|
|
|
|
|
|
|
$function_level{"log_info"} = LOG_INFO; |
195
|
|
|
|
|
|
|
$function_description{"log_info"} = "[LOG_INFO]"; |
196
|
|
|
|
|
|
|
$function_level{"log_debug"} = LOG_INFO; |
197
|
|
|
|
|
|
|
$function_description{"log_debug"} = "[LOG_DEBUG]"; |
198
|
|
|
|
|
|
|
$function_level{"debug"} = LOG_INFO; |
199
|
|
|
|
|
|
|
$function_description{"debug"} = "[DEBUG]"; |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
# --- User configurable log settings -- |
202
|
|
|
|
|
|
|
my $prog_name = $0; |
203
|
|
|
|
|
|
|
my $log_level = DEFAULT_LOG_LEVEL; |
204
|
|
|
|
|
|
|
my $log_facility = DEFAULT_LOG_FACILITY; |
205
|
|
|
|
|
|
|
my $log_file; |
206
|
|
|
|
|
|
|
my $use_syslog = DEFAULT_USE_SYSLOG; |
207
|
|
|
|
|
|
|
my $use_gmt = DEFAULT_USE_GMT; |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
# --- internal state of the log module -- |
210
|
|
|
|
|
|
|
my $pid = $$; |
211
|
|
|
|
|
|
|
my $hostname = "not initialized"; |
212
|
|
|
|
|
|
|
my $log_initialized = 0; |
213
|
|
|
|
|
|
|
my $use_stderr = 0; |
214
|
|
|
|
|
|
|
my $log_fh; |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
=head1 NAME |
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
BGPmon::Log - BGPmon Logging |
219
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
This module implements logging for BGPmon clients. The module can log messages |
221
|
|
|
|
|
|
|
to syslog, STDERR, or a user specified log file. It allows the user to |
222
|
|
|
|
|
|
|
specify a log level and write log messages using different log levels. |
223
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
=cut |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
=head1 SYNOPSIS |
227
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
After initializing the log, the user can log messages at different log levels. |
229
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
use BGPmon::Log qw (debug |
231
|
|
|
|
|
|
|
log_debug |
232
|
|
|
|
|
|
|
log_info |
233
|
|
|
|
|
|
|
log_notice |
234
|
|
|
|
|
|
|
log_warn log_warning |
235
|
|
|
|
|
|
|
log_err log_error |
236
|
|
|
|
|
|
|
log_fatal log_crit log_critical |
237
|
|
|
|
|
|
|
log_alert |
238
|
|
|
|
|
|
|
log_emerg log_emergency |
239
|
|
|
|
|
|
|
); |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
my %log_param = ( prog_name => "my name", |
242
|
|
|
|
|
|
|
log_level => BGPmon::Log::LOG_DEBUG(), |
243
|
|
|
|
|
|
|
log_facility => BGPmon::Log::LOG_LOCAL0(), |
244
|
|
|
|
|
|
|
log_file => "./mylog", |
245
|
|
|
|
|
|
|
use_syslog => 0, |
246
|
|
|
|
|
|
|
use_gmt => 0, |
247
|
|
|
|
|
|
|
); |
248
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
if (BGPmon::Log::log_init(%log_param) ) { |
250
|
|
|
|
|
|
|
my $code = BGPmon::Log::get_error_code("log_init"); |
251
|
|
|
|
|
|
|
my $msg = BGPmon::Log::get_error_message("log_init"); |
252
|
|
|
|
|
|
|
print STDERR "Error initializing log: $code - $msg\n"; |
253
|
|
|
|
|
|
|
exit 1; |
254
|
|
|
|
|
|
|
} |
255
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
debug("Log a message with level BGPmon::Log::LOG_DEBUG"); |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
log_debug("Also log a message with level BGPmon::Log::LOG_DEBUG"); |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
log_info("Log a message, level BGPmon::Log::LOG_INFO"); |
261
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
log_notice("Log a message, level BGPmon::Log::LOG_NOTICE"); |
263
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
log_warn("Log a message, level BGPmon::Log::LOG_WARN"); |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
log_warning("Log a message, level BGPmon::Log::LOG_WARNING"); |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
log_err("Log a message, level BGPmon::Log::LOG_ERR"); |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
log_error("Log a message, level BGPmon::Log::LOG_ERROR"); |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
log_fatal("Log a message, level BGPmon::Log::LOG_FATAL"); |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
log_crit("Log a message, level BGPmon::Log::LOG_CRIT"); |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
log_critical("Log a message, level BGPmon::Log::LOG_CRITICAL"); |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
log_alert("Log a message, level BGPmon::Log::LOG_ALERT"); |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
log_emergency("Log a message, level BGPmon::Log::LOG_EMERGENCY"); |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
log_emerg("Log a message, level BGPmon::Log::LOG_EMERG"); |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
BGPmon::Log::log_close(); |
285
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
=head1 EXPORT |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
log_init |
289
|
|
|
|
|
|
|
log_close |
290
|
|
|
|
|
|
|
log_emerg |
291
|
|
|
|
|
|
|
log_emergency |
292
|
|
|
|
|
|
|
log_alert |
293
|
|
|
|
|
|
|
log_fatal |
294
|
|
|
|
|
|
|
log_crit |
295
|
|
|
|
|
|
|
log_critical |
296
|
|
|
|
|
|
|
log_err |
297
|
|
|
|
|
|
|
log_error |
298
|
|
|
|
|
|
|
log_warn |
299
|
|
|
|
|
|
|
log_warning |
300
|
|
|
|
|
|
|
log_notice |
301
|
|
|
|
|
|
|
log_info |
302
|
|
|
|
|
|
|
log_debug |
303
|
|
|
|
|
|
|
debug |
304
|
|
|
|
|
|
|
get_errror_code |
305
|
|
|
|
|
|
|
get_error_message |
306
|
|
|
|
|
|
|
get_error_msg |
307
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
=head1 SUBROUTINES/METHODS |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
=head2 log_init |
311
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
Initialize the logging facility. This function must be called prior to using |
313
|
|
|
|
|
|
|
any log_* functions. |
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
Input : The log settings |
316
|
|
|
|
|
|
|
1. prog_name - The program name |
317
|
|
|
|
|
|
|
2. log_level - the log level |
318
|
|
|
|
|
|
|
3. log_facility - the log facility |
319
|
|
|
|
|
|
|
4. log_file - the file where log messages will be written |
320
|
|
|
|
|
|
|
5. use_syslog - flag indicating whether to use syslog, 1 = use syslog, |
321
|
|
|
|
|
|
|
5. use_gmt - flag indicating whether to GMT for time or use local time, |
322
|
|
|
|
|
|
|
1 = use GMT, use_gmt can only be set when use_syslog = 0 |
323
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and setserror_message and error_code |
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
If use_syslog=1, all log messages are written to syslog. |
326
|
|
|
|
|
|
|
if the user sets both use_syslog=1 and provides a log_file, the log_file |
327
|
|
|
|
|
|
|
is ignored. |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
If use_syslog != 1, log messages are written to the log_file, if provided |
330
|
|
|
|
|
|
|
if no log file is provided to init, all messages are written to STDERR |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
=cut |
333
|
|
|
|
|
|
|
sub log_init { |
334
|
25
|
|
|
25
|
1
|
11208
|
my %args = @_; |
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
# set function name for error reporting |
337
|
25
|
|
|
|
|
49
|
my $function_name = $function_names[0]; |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
# reset configurable values to their defaults |
340
|
25
|
|
|
|
|
53
|
$prog_name = $0; |
341
|
25
|
|
|
|
|
35
|
$log_level = DEFAULT_LOG_LEVEL; |
342
|
25
|
|
|
|
|
36
|
$log_facility = DEFAULT_LOG_FACILITY; |
343
|
25
|
|
|
|
|
32
|
$use_syslog = DEFAULT_USE_SYSLOG; |
344
|
25
|
|
|
|
|
26
|
$use_gmt = DEFAULT_USE_GMT; |
345
|
|
|
|
|
|
|
# reset the internal log variables |
346
|
25
|
|
|
|
|
28
|
$log_initialized = 0; |
347
|
25
|
|
|
|
|
51
|
$pid = $$; |
348
|
25
|
|
|
|
|
75
|
$hostname = Sys::Hostname::hostname; |
349
|
25
|
50
|
|
|
|
603
|
if (!defined($hostname)) { |
350
|
0
|
|
|
|
|
0
|
$error_code{$function_name} = LOG_INIT_NO_HOSTNAME_CODE; |
351
|
0
|
|
|
|
|
0
|
$error_msg{$function_name} = LOG_INIT_NO_HOSTNAME_MSG; |
352
|
0
|
|
|
|
|
0
|
return 1; |
353
|
|
|
|
|
|
|
} |
354
|
25
|
|
|
|
|
32
|
$log_file = undef; |
355
|
25
|
|
|
|
|
31
|
$use_stderr = 0; |
356
|
25
|
|
|
|
|
132
|
$log_fh = undef; |
357
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
# parse the init arguements and over-ride any defaults |
359
|
25
|
100
|
|
|
|
88
|
if (defined($args{prog_name})) { |
360
|
8
|
100
|
|
|
|
85
|
if ($args{prog_name} =~ /^[[:print:]]*$/) { |
361
|
7
|
100
|
|
|
|
27
|
if (length($args{prog_name}) > MAX_STRING_LEN ) { |
362
|
1
|
|
|
|
|
5
|
$error_code{$function_name} = LOG_INIT_PROG_SIZE_CODE; |
363
|
1
|
|
|
|
|
2
|
$error_msg{$function_name} = LOG_INIT_PROG_SIZE_MSG; |
364
|
1
|
|
|
|
|
5
|
return 1; |
365
|
|
|
|
|
|
|
} |
366
|
6
|
|
|
|
|
14
|
$prog_name = $args{prog_name}; |
367
|
|
|
|
|
|
|
} else { |
368
|
|
|
|
|
|
|
# prog_name contains non-printable characters |
369
|
1
|
|
|
|
|
3
|
$error_code{$function_name} = LOG_INIT_PROG_PRINTABLE_CODE; |
370
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_PROG_PRINTABLE_MSG; |
371
|
1
|
|
|
|
|
5
|
return 1; |
372
|
|
|
|
|
|
|
} |
373
|
|
|
|
|
|
|
} |
374
|
23
|
100
|
|
|
|
55
|
if (defined($args{log_level})) { |
375
|
|
|
|
|
|
|
# make sure it is a number |
376
|
9
|
100
|
|
|
|
47
|
if ($args{log_level} =~ /\D/) { |
377
|
|
|
|
|
|
|
# not a number or out of range |
378
|
2
|
|
|
|
|
5
|
$error_code{$function_name} = LOG_INIT_LEVEL_NOT_NUM_CODE; |
379
|
2
|
|
|
|
|
4
|
$error_msg{$function_name} = LOG_INIT_LEVEL_NOT_NUM_MSG; |
380
|
2
|
|
|
|
|
7
|
return 1; |
381
|
|
|
|
|
|
|
} |
382
|
|
|
|
|
|
|
# make sure it is in range |
383
|
7
|
100
|
66
|
|
|
53
|
if ($args{log_level} < LOG_EMERG || $args{log_level} > LOG_DEBUG) { |
384
|
1
|
|
|
|
|
3
|
$error_code{$function_name} = LOG_INIT_LEVEL_RANGE_CODE; |
385
|
1
|
|
|
|
|
2
|
$error_msg{$function_name} = LOG_INIT_LEVEL_RANGE_MSG; |
386
|
1
|
|
|
|
|
4
|
return 1; |
387
|
|
|
|
|
|
|
} |
388
|
6
|
|
|
|
|
11
|
$log_level = $args{log_level}; |
389
|
|
|
|
|
|
|
} |
390
|
20
|
100
|
|
|
|
44
|
if (defined($args{log_facility})) { |
391
|
|
|
|
|
|
|
# make sure it is a number |
392
|
8
|
100
|
|
|
|
37
|
if ($args{log_facility} =~ /\D/) { |
393
|
|
|
|
|
|
|
# not a number or out of range |
394
|
2
|
|
|
|
|
5
|
$error_code{$function_name} = LOG_INIT_FACILITY_NOT_NUM_CODE; |
395
|
2
|
|
|
|
|
5
|
$error_msg{$function_name} = LOG_INIT_FACILITY_NOT_NUM_MSG; |
396
|
2
|
|
|
|
|
7
|
return 1; |
397
|
|
|
|
|
|
|
} |
398
|
6
|
|
|
|
|
11
|
$log_facility = $args{log_facility}; |
399
|
|
|
|
|
|
|
} |
400
|
18
|
100
|
|
|
|
74
|
if (defined($args{log_file})) { |
401
|
11
|
100
|
|
|
|
207
|
if ($args{log_file} =~ /^[[:print:]]*$/) { |
402
|
10
|
100
|
|
|
|
29
|
if (length($args{log_file}) > MAX_STRING_LEN ) { |
403
|
1
|
|
|
|
|
4
|
$error_code{$function_name} = LOG_INIT_FILE_SIZE_CODE; |
404
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_FILE_SIZE_MSG; |
405
|
1
|
|
|
|
|
5
|
return 1; |
406
|
|
|
|
|
|
|
} |
407
|
9
|
|
|
|
|
23
|
$log_file = $args{log_file}; |
408
|
|
|
|
|
|
|
} else { |
409
|
|
|
|
|
|
|
# prog_name contains non-printable characters |
410
|
1
|
|
|
|
|
4
|
$error_code{$function_name} = LOG_INIT_FILE_PRINTABLE_CODE; |
411
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_FILE_PRINTABLE_MSG; |
412
|
1
|
|
|
|
|
4
|
return 1; |
413
|
|
|
|
|
|
|
} |
414
|
|
|
|
|
|
|
} |
415
|
16
|
100
|
|
|
|
44
|
if (defined($args{use_syslog})) { |
416
|
|
|
|
|
|
|
# make sure it is a number |
417
|
10
|
100
|
|
|
|
45
|
if ($args{use_syslog} =~ /\D/) { |
418
|
|
|
|
|
|
|
# not a number or out of range |
419
|
1
|
|
|
|
|
3
|
$error_code{$function_name} = LOG_INIT_SYSLOG_NOT_NUM_CODE; |
420
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_SYSLOG_NOT_NUM_MSG; |
421
|
1
|
|
|
|
|
5
|
return 1; |
422
|
|
|
|
|
|
|
} |
423
|
|
|
|
|
|
|
# make sure it is in range |
424
|
9
|
100
|
100
|
|
|
49
|
if ($args{use_syslog} != 0 && $args{use_syslog} != 1) { |
425
|
1
|
|
|
|
|
4
|
$error_code{$function_name} = LOG_INIT_SYSLOG_RANGE_CODE; |
426
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_SYSLOG_RANGE_MSG; |
427
|
1
|
|
|
|
|
4
|
return 1; |
428
|
|
|
|
|
|
|
} |
429
|
8
|
|
|
|
|
20
|
$use_syslog = $args{use_syslog}; |
430
|
|
|
|
|
|
|
} |
431
|
14
|
100
|
|
|
|
32
|
if (defined($args{use_gmt})) { |
432
|
|
|
|
|
|
|
# make sure it is a number |
433
|
8
|
100
|
|
|
|
31
|
if ($args{use_gmt} =~ /\D/) { |
434
|
|
|
|
|
|
|
# not a number or out of range |
435
|
1
|
|
|
|
|
3
|
$error_code{$function_name} = LOG_INIT_GMT_NOT_NUM_CODE; |
436
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_GMT_NOT_NUM_MSG; |
437
|
1
|
|
|
|
|
4
|
return 1; |
438
|
|
|
|
|
|
|
} |
439
|
|
|
|
|
|
|
# make sure it is in range |
440
|
7
|
100
|
100
|
|
|
41
|
if ($args{use_gmt} != 0 && $args{use_gmt} != 1) { |
441
|
1
|
|
|
|
|
3
|
$error_code{$function_name} = LOG_INIT_GMT_RANGE_CODE; |
442
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_GMT_RANGE_MSG; |
443
|
1
|
|
|
|
|
11
|
return 1; |
444
|
|
|
|
|
|
|
} |
445
|
6
|
100
|
|
|
|
19
|
if ($use_syslog == 1) { |
446
|
1
|
|
|
|
|
10
|
$error_code{$function_name} = LOG_INIT_GMT_SYSLOG_CODE; |
447
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_GMT_SYSLOG_MSG; |
448
|
1
|
|
|
|
|
4
|
return 1; |
449
|
|
|
|
|
|
|
} |
450
|
5
|
|
|
|
|
22
|
$use_gmt = $args{use_gmt}; |
451
|
|
|
|
|
|
|
} |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
# error if the specified both use_syslog and log to a file |
454
|
11
|
100
|
66
|
|
|
44
|
if (($use_syslog == 1) && (defined($log_file)) ) { |
455
|
2
|
|
|
|
|
7
|
$error_code{$function_name} = LOG_INIT_SYSLOG_AND_FILE_CODE; |
456
|
2
|
|
|
|
|
5
|
$error_msg{$function_name} = LOG_INIT_SYSLOG_AND_FILE_MSG; |
457
|
2
|
|
|
|
|
10
|
return 1; |
458
|
|
|
|
|
|
|
} |
459
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
# open syslog if use_syslog set |
461
|
9
|
50
|
|
|
|
22
|
if ($use_syslog == 1) { |
462
|
0
|
0
|
|
|
|
0
|
if (! Sys::Syslog::openlog($prog_name, "ndelay,pid", $log_facility)) { |
463
|
0
|
|
|
|
|
0
|
$error_code{$function_name} = LOG_INIT_SYSLOG_OPEN_CODE; |
464
|
0
|
|
|
|
|
0
|
$error_msg{$function_name} = LOG_INIT_SYSLOG_OPEN_MSG; |
465
|
0
|
|
|
|
|
0
|
return 1; |
466
|
|
|
|
|
|
|
} |
467
|
0
|
|
|
|
|
0
|
$log_initialized = 1; |
468
|
0
|
|
|
|
|
0
|
$error_code{$function_name} = NO_ERROR_CODE; |
469
|
0
|
|
|
|
|
0
|
$error_msg{$function_name} = NO_ERROR_MSG; |
470
|
0
|
|
|
|
|
0
|
return 0; |
471
|
|
|
|
|
|
|
} |
472
|
|
|
|
|
|
|
|
473
|
|
|
|
|
|
|
# open file if file was provided |
474
|
9
|
100
|
|
|
|
25
|
if (defined($log_file)) { |
475
|
7
|
100
|
|
|
|
613
|
if (! open($log_fh, ">>$log_file") ) { |
476
|
1
|
|
|
|
|
3
|
$error_code{$function_name} = LOG_INIT_FILE_OPEN_CODE; |
477
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_INIT_FILE_OPEN_MSG; |
478
|
1
|
|
|
|
|
4
|
return 1; |
479
|
|
|
|
|
|
|
} |
480
|
6
|
|
|
|
|
14
|
$log_initialized = 1; |
481
|
6
|
|
|
|
|
17
|
$error_code{$function_name} = NO_ERROR_CODE; |
482
|
6
|
|
|
|
|
12
|
$error_msg{$function_name} = NO_ERROR_MSG; |
483
|
6
|
|
|
|
|
29
|
return 0; |
484
|
|
|
|
|
|
|
} |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
# no use_syslog and no log file so write to STDERR |
487
|
2
|
|
|
|
|
5
|
$log_initialized = 1; |
488
|
2
|
|
|
|
|
3
|
$use_stderr = 1; |
489
|
2
|
|
|
|
|
6
|
$log_fh = *STDERR; |
490
|
2
|
|
|
|
|
6
|
$error_code{$function_name} = NO_ERROR_CODE; |
491
|
2
|
|
|
|
|
5
|
$error_msg{$function_name} = NO_ERROR_MSG; |
492
|
2
|
|
|
|
|
6
|
return 0; |
493
|
|
|
|
|
|
|
} |
494
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
=head2 log_close |
496
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
Closes the logfile so no further log messages can be written |
498
|
|
|
|
|
|
|
You must call log_init again to re-enable logging. |
499
|
|
|
|
|
|
|
|
500
|
|
|
|
|
|
|
Typically called at the end of program to cleanly close the log file |
501
|
|
|
|
|
|
|
or cleanly close the connection to syslog. |
502
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
Input: None |
504
|
|
|
|
|
|
|
Output: None |
505
|
|
|
|
|
|
|
=cut |
506
|
|
|
|
|
|
|
sub log_close { |
507
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
# set function name for error reporting |
509
|
9
|
|
|
9
|
1
|
10977
|
my $function_name = $function_names[1]; |
510
|
|
|
|
|
|
|
|
511
|
|
|
|
|
|
|
# if already closed, just return |
512
|
9
|
100
|
|
|
|
39
|
if ($log_initialized) { |
513
|
|
|
|
|
|
|
|
514
|
|
|
|
|
|
|
# set initialized back to 0 |
515
|
8
|
|
|
|
|
17
|
$log_initialized = 0; |
516
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
# close the log |
518
|
8
|
50
|
|
|
|
35
|
if ($use_syslog) { |
|
|
100
|
|
|
|
|
|
519
|
0
|
|
|
|
|
0
|
closelog(); |
520
|
|
|
|
|
|
|
} elsif (!$use_stderr) { |
521
|
6
|
|
|
|
|
126
|
close($log_fh); |
522
|
|
|
|
|
|
|
} |
523
|
|
|
|
|
|
|
} |
524
|
|
|
|
|
|
|
|
525
|
9
|
|
|
|
|
25
|
$error_code{$function_names[7]} = NO_ERROR_CODE; |
526
|
9
|
|
|
|
|
18
|
$error_msg{$function_names[7]} = NO_ERROR_MSG; |
527
|
9
|
|
|
|
|
23
|
return 0; |
528
|
|
|
|
|
|
|
} |
529
|
|
|
|
|
|
|
|
530
|
|
|
|
|
|
|
=head2 log_emerg |
531
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
Logs an emergency message. Log levels LOG_EMERG |
533
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
Input: Message to be printed. |
535
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
536
|
|
|
|
|
|
|
=cut |
537
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
=head2 log_emergency |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
Logs an emergency message. Log levels LOG_EMERGENCY |
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
This function is identical to log_emerg |
544
|
|
|
|
|
|
|
=cut |
545
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
546
|
|
|
|
|
|
|
|
547
|
|
|
|
|
|
|
=head2 log_alert |
548
|
|
|
|
|
|
|
|
549
|
|
|
|
|
|
|
Logs an alert message. Log levels LOG_ALERT |
550
|
|
|
|
|
|
|
|
551
|
|
|
|
|
|
|
Input: Message to be printed. |
552
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
553
|
|
|
|
|
|
|
=cut |
554
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
555
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
=head2 log_fatal |
557
|
|
|
|
|
|
|
Logs a fatal error message. Log levels LOG_CRIT |
558
|
|
|
|
|
|
|
|
559
|
|
|
|
|
|
|
Input: Message to be printed. |
560
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
561
|
|
|
|
|
|
|
=cut |
562
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
563
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
=head2 log_crit |
565
|
|
|
|
|
|
|
Logs a critical error message. Log levels LOG_CRIT |
566
|
|
|
|
|
|
|
|
567
|
|
|
|
|
|
|
This function is identical to log_fatal |
568
|
|
|
|
|
|
|
=cut |
569
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
570
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
=head2 log_critical |
572
|
|
|
|
|
|
|
|
573
|
|
|
|
|
|
|
Logs a critical error message. Log levels LOG_CRIT |
574
|
|
|
|
|
|
|
|
575
|
|
|
|
|
|
|
This function is identical to log_fatal |
576
|
|
|
|
|
|
|
=cut |
577
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
578
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
=head2 log_err |
580
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
Logs an error message. Log level LOG_ERR. |
582
|
|
|
|
|
|
|
Input: Message to be printed. |
583
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
584
|
|
|
|
|
|
|
=cut |
585
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
586
|
|
|
|
|
|
|
|
587
|
|
|
|
|
|
|
=head2 log_error |
588
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
Logs an error message. Log level LOG_ERR. |
590
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
This function is identical to log_fatal |
592
|
|
|
|
|
|
|
=cut |
593
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
=head2 log_warn |
596
|
|
|
|
|
|
|
|
597
|
|
|
|
|
|
|
Logs a warning message. Log level LOG_WARN |
598
|
|
|
|
|
|
|
This function is identical to log_fatal |
599
|
|
|
|
|
|
|
Input: Message to be printed. |
600
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
601
|
|
|
|
|
|
|
=cut |
602
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
603
|
|
|
|
|
|
|
|
604
|
|
|
|
|
|
|
=head2 log_warning |
605
|
|
|
|
|
|
|
|
606
|
|
|
|
|
|
|
Logs a warning message. Log level LOG_WARNING |
607
|
|
|
|
|
|
|
|
608
|
|
|
|
|
|
|
This function is identical to log_warn |
609
|
|
|
|
|
|
|
=cut |
610
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
611
|
|
|
|
|
|
|
|
612
|
|
|
|
|
|
|
=head2 log_notice |
613
|
|
|
|
|
|
|
|
614
|
|
|
|
|
|
|
Logs a notice message. Log level LOG_NOTICE |
615
|
|
|
|
|
|
|
Input: Message to be printed. |
616
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
617
|
|
|
|
|
|
|
=cut |
618
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
619
|
|
|
|
|
|
|
|
620
|
|
|
|
|
|
|
=head2 log_info |
621
|
|
|
|
|
|
|
|
622
|
|
|
|
|
|
|
Logs a informational message. Log level LOG_INFO |
623
|
|
|
|
|
|
|
Input: Message to be printed. |
624
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
625
|
|
|
|
|
|
|
=cut |
626
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
627
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
=head2 log_debug |
629
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
Logs a debug message. Log level LOG_DEBUG |
631
|
|
|
|
|
|
|
Input: Message to be printed. |
632
|
|
|
|
|
|
|
Output: returns 0 on success, 1 on error and sets error_message and error_code |
633
|
|
|
|
|
|
|
=cut |
634
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
635
|
|
|
|
|
|
|
|
636
|
|
|
|
|
|
|
=head2 debug |
637
|
|
|
|
|
|
|
|
638
|
|
|
|
|
|
|
Logs a debug message. Log level LOG_DEBUG |
639
|
|
|
|
|
|
|
|
640
|
|
|
|
|
|
|
This function is identical to log_debug |
641
|
|
|
|
|
|
|
=cut |
642
|
|
|
|
|
|
|
# implemented using AUTOLOADER |
643
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
=head2 get_error_code |
645
|
|
|
|
|
|
|
|
646
|
|
|
|
|
|
|
Get the error code |
647
|
|
|
|
|
|
|
Input : the name of the function whose error code we should report |
648
|
|
|
|
|
|
|
Output: the function's error code |
649
|
|
|
|
|
|
|
or NO_FUNCTION_SPECIFIED if the user did not supply a function |
650
|
|
|
|
|
|
|
or INVALID_FUNCTION_SPECIFIED if the user provided an invalid function |
651
|
|
|
|
|
|
|
=cut |
652
|
|
|
|
|
|
|
sub get_error_code { |
653
|
75
|
|
|
75
|
1
|
1639
|
my $function = shift; |
654
|
|
|
|
|
|
|
|
655
|
|
|
|
|
|
|
# check we got a function name |
656
|
75
|
100
|
|
|
|
158
|
if (!defined($function)) { |
657
|
1
|
|
|
|
|
3
|
return NO_FUNCTION_SPECIFIED_CODE; |
658
|
|
|
|
|
|
|
} |
659
|
|
|
|
|
|
|
|
660
|
|
|
|
|
|
|
# check this is one of our exported function names |
661
|
74
|
100
|
|
|
|
155
|
if (!defined($error_code{$function}) ) { |
662
|
1
|
|
|
|
|
4
|
return INVALID_FUNCTION_SPECIFIED_CODE; |
663
|
|
|
|
|
|
|
} |
664
|
|
|
|
|
|
|
|
665
|
73
|
|
|
|
|
97
|
my $code = $error_code{$function}; |
666
|
73
|
|
|
|
|
244
|
return $code; |
667
|
|
|
|
|
|
|
} |
668
|
|
|
|
|
|
|
|
669
|
|
|
|
|
|
|
=head2 get_error_message |
670
|
|
|
|
|
|
|
|
671
|
|
|
|
|
|
|
Get the error message |
672
|
|
|
|
|
|
|
Input : the name of the function whose error message we should report |
673
|
|
|
|
|
|
|
Output: the function's error message |
674
|
|
|
|
|
|
|
or NO_FUNCTION_SPECIFIED if the user did not supply a function |
675
|
|
|
|
|
|
|
or INVALID_FUNCTION_SPECIFIED if the user provided an invalid function |
676
|
|
|
|
|
|
|
=cut |
677
|
|
|
|
|
|
|
sub get_error_message { |
678
|
78
|
|
|
78
|
1
|
1512
|
my $function = shift; |
679
|
|
|
|
|
|
|
|
680
|
|
|
|
|
|
|
# check we got a function name |
681
|
78
|
100
|
|
|
|
148
|
if (!defined($function)) { |
682
|
2
|
|
|
|
|
8
|
return NO_FUNCTION_SPECIFIED_MSG; |
683
|
|
|
|
|
|
|
} |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
# check this is one of our exported function names |
686
|
76
|
100
|
|
|
|
162
|
if (!defined($error_msg{$function}) ) { |
687
|
2
|
|
|
|
|
7
|
return INVALID_FUNCTION_SPECIFIED_MSG; |
688
|
|
|
|
|
|
|
} |
689
|
|
|
|
|
|
|
|
690
|
74
|
|
|
|
|
107
|
my $msg = $error_msg{$function}; |
691
|
74
|
|
|
|
|
229
|
return $msg; |
692
|
|
|
|
|
|
|
} |
693
|
|
|
|
|
|
|
|
694
|
|
|
|
|
|
|
=head2 get_error_msg |
695
|
|
|
|
|
|
|
|
696
|
|
|
|
|
|
|
Get the error message |
697
|
|
|
|
|
|
|
|
698
|
|
|
|
|
|
|
This function is identical to get_error_message |
699
|
|
|
|
|
|
|
=cut |
700
|
|
|
|
|
|
|
sub get_error_msg { |
701
|
75
|
|
|
75
|
1
|
1781
|
my $msg = shift; |
702
|
75
|
|
|
|
|
338
|
return get_error_message($msg); |
703
|
|
|
|
|
|
|
} |
704
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
### ------------------ These functions are not exported ------------- |
706
|
|
|
|
|
|
|
|
707
|
|
|
|
|
|
|
# this function handles all log_* functions using AUTOLOAD |
708
|
|
|
|
|
|
|
#Input (from AUTOLOADER): the function name that was called |
709
|
|
|
|
|
|
|
#Input (from caller): Message to be printed. |
710
|
|
|
|
|
|
|
#Output: returns 0 on success, 1 on error |
711
|
|
|
|
|
|
|
# and sets error_message and error_code for function_name |
712
|
|
|
|
|
|
|
sub AUTOLOAD { |
713
|
39
|
|
|
39
|
|
28867
|
our $AUTOLOAD; |
714
|
39
|
|
|
|
|
66
|
my $msg = shift; |
715
|
|
|
|
|
|
|
|
716
|
|
|
|
|
|
|
# get the function name |
717
|
39
|
|
|
|
|
58
|
my $sub = $AUTOLOAD; |
718
|
39
|
|
|
|
|
213
|
(my $function_name = $sub) =~ s/.*:://; |
719
|
|
|
|
|
|
|
|
720
|
|
|
|
|
|
|
# check we got a function name |
721
|
39
|
50
|
|
|
|
105
|
if (!defined($function_name)) { |
722
|
|
|
|
|
|
|
# no function name so no error code/msg to set |
723
|
0
|
|
|
|
|
0
|
return 1; |
724
|
|
|
|
|
|
|
} |
725
|
|
|
|
|
|
|
|
726
|
|
|
|
|
|
|
# check that logging was initialized |
727
|
39
|
100
|
|
|
|
79
|
if ($log_initialized == 0) { |
728
|
2
|
|
|
|
|
6
|
$error_code{$function_name} = LOG_NOT_INITIALIZED_CODE; |
729
|
2
|
|
|
|
|
7
|
$error_msg{$function_name} = LOG_NOT_INITIALIZED_MSG; |
730
|
2
|
|
|
|
|
6
|
return 1; |
731
|
|
|
|
|
|
|
} |
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
# check that we have a message |
734
|
37
|
100
|
|
|
|
66
|
if (!defined($msg)) { |
735
|
1
|
|
|
|
|
5
|
$error_code{$function_name} = LOG_MISSING_MSG_CODE; |
736
|
1
|
|
|
|
|
4
|
$error_msg{$function_name} = LOG_MISSING_MSG_MSG; |
737
|
1
|
|
|
|
|
4
|
return 1; |
738
|
|
|
|
|
|
|
} |
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
# check the message is printable and has valid length |
741
|
36
|
100
|
|
|
|
126
|
if ($msg =~ /^[[:print:]]*$/) { |
742
|
35
|
100
|
|
|
|
92
|
if (length($msg) > MAX_STRING_LEN ) { |
743
|
1
|
|
|
|
|
4
|
$error_code{$function_name} = LOG_MSG_SIZE_CODE; |
744
|
1
|
|
|
|
|
4
|
$error_msg{$function_name} = LOG_MSG_SIZE_MSG; |
745
|
1
|
|
|
|
|
4
|
return 1; |
746
|
|
|
|
|
|
|
} |
747
|
|
|
|
|
|
|
} else { |
748
|
|
|
|
|
|
|
# prog_name contains non-printable characters |
749
|
1
|
|
|
|
|
4
|
$error_code{$function_name} = LOG_MSG_PRINTABLE_CODE; |
750
|
1
|
|
|
|
|
3
|
$error_msg{$function_name} = LOG_MSG_PRINTABLE_MSG; |
751
|
1
|
|
|
|
|
3
|
return 1; |
752
|
|
|
|
|
|
|
} |
753
|
|
|
|
|
|
|
|
754
|
|
|
|
|
|
|
# calculate the log_level and description from the function |
755
|
34
|
100
|
66
|
|
|
161
|
if ( (!defined($function_level{$function_name})) || |
756
|
|
|
|
|
|
|
(!defined($function_description{$function_name})) ) { |
757
|
1
|
|
|
|
|
4
|
$error_code{$function_name} = LOG_UNKNOWN_FUNCTION_CODE; |
758
|
1
|
|
|
|
|
4
|
$error_msg{$function_name} = LOG_UNKNOWN_FUNCTION_MSG; |
759
|
1
|
|
|
|
|
4
|
return 1; |
760
|
|
|
|
|
|
|
} |
761
|
|
|
|
|
|
|
|
762
|
|
|
|
|
|
|
# check our log_level |
763
|
33
|
100
|
|
|
|
83
|
if ($function_level{$function_name} > $log_level){ |
764
|
6
|
|
|
|
|
11
|
$error_code{$function_name} = NO_ERROR_CODE; |
765
|
6
|
|
|
|
|
12
|
$error_msg{$function_name} = NO_ERROR_MSG; |
766
|
6
|
|
|
|
|
17
|
return 0; |
767
|
|
|
|
|
|
|
} |
768
|
|
|
|
|
|
|
|
769
|
|
|
|
|
|
|
# if using syslog |
770
|
27
|
50
|
|
|
|
51
|
if ($use_syslog == 1) { |
771
|
0
|
|
|
|
|
0
|
syslog($function_level{$function_name}, $msg); |
772
|
0
|
|
|
|
|
0
|
$error_code{$function_name} = NO_ERROR_CODE; |
773
|
0
|
|
|
|
|
0
|
$error_msg{$function_name} = NO_ERROR_MSG; |
774
|
0
|
|
|
|
|
0
|
return 0; |
775
|
|
|
|
|
|
|
} |
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
# create a timestamp for this message |
778
|
27
|
|
|
|
|
29
|
my $header; |
779
|
27
|
100
|
|
|
|
46
|
if ($use_gmt) { |
780
|
26
|
|
|
|
|
1420
|
$header = strftime ("%Y-%m-%d %H:%M:%S GMT", gmtime()); |
781
|
|
|
|
|
|
|
} else { |
782
|
1
|
|
|
|
|
71
|
$header = strftime ("%Y-%m-%d %H:%M:%S %Z", localtime()); |
783
|
|
|
|
|
|
|
} |
784
|
|
|
|
|
|
|
# add the hostname, program name, and pid |
785
|
27
|
|
|
|
|
87
|
$header = $header." $hostname $prog_name\[$pid\]:"; |
786
|
|
|
|
|
|
|
# add the function description |
787
|
27
|
|
|
|
|
135
|
$header = $header." $function_description{$function_name}"; |
788
|
|
|
|
|
|
|
# combine the header and message |
789
|
27
|
|
|
|
|
55
|
$msg = $header." ".$msg."\n"; |
790
|
|
|
|
|
|
|
# write the message to the file (note log_fh may be STDERR) |
791
|
27
|
|
|
|
|
556
|
my $bytes_written = syswrite($log_fh, $msg); |
792
|
27
|
50
|
33
|
|
|
268
|
if (!defined($bytes_written) || $bytes_written == 0 |
|
|
|
33
|
|
|
|
|
793
|
|
|
|
|
|
|
|| $bytes_written != length($msg) ) { |
794
|
0
|
|
|
|
|
0
|
$error_code{$function_name} = LOG_WRITE_FAILED_CODE; |
795
|
0
|
|
|
|
|
0
|
$error_msg{$function_name} = LOG_WRITE_FAILED_MSG; |
796
|
0
|
|
|
|
|
0
|
return 1; |
797
|
|
|
|
|
|
|
} |
798
|
|
|
|
|
|
|
|
799
|
|
|
|
|
|
|
# set the error code to success and return |
800
|
27
|
|
|
|
|
44
|
$error_code{$function_name} = NO_ERROR_CODE; |
801
|
27
|
|
|
|
|
46
|
$error_msg{$function_name} = NO_ERROR_MSG; |
802
|
27
|
|
|
|
|
69
|
return 0; |
803
|
|
|
|
|
|
|
} |
804
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
=head2 RETURN VALUES AND ERROR CODES |
806
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
All functions return 0 on success and 1 on error. |
808
|
|
|
|
|
|
|
In the event of an error, an error code and error |
809
|
|
|
|
|
|
|
message can be obtained using |
810
|
|
|
|
|
|
|
$code = get_error_code("function_name"); |
811
|
|
|
|
|
|
|
$msg = get_error_msg("function_name"); |
812
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
The following error codes are defined: |
814
|
|
|
|
|
|
|
|
815
|
|
|
|
|
|
|
0 - No Error: |
816
|
|
|
|
|
|
|
'No Error' |
817
|
|
|
|
|
|
|
|
818
|
|
|
|
|
|
|
1 - No Function Specified in get_error_code/get_error_msg |
819
|
|
|
|
|
|
|
'Error reporting function called without specifying the function.' |
820
|
|
|
|
|
|
|
|
821
|
|
|
|
|
|
|
2 - Invalid Funtion in get_error_code/get_error_msg |
822
|
|
|
|
|
|
|
'Error reporting function called with invalid function name' |
823
|
|
|
|
|
|
|
|
824
|
|
|
|
|
|
|
3 - Failed To Obtain Hostname in log_init |
825
|
|
|
|
|
|
|
'Unable to get the hostname' |
826
|
|
|
|
|
|
|
|
827
|
|
|
|
|
|
|
4 - Program Name Exceeds Max Length in log_init |
828
|
|
|
|
|
|
|
'Program name exceeds maximum length of MAX_STRING_LEN' |
829
|
|
|
|
|
|
|
|
830
|
|
|
|
|
|
|
5 - Program Name Contains Non-Printable Characters in log_init |
831
|
|
|
|
|
|
|
'Program name contains non-printable characters' |
832
|
|
|
|
|
|
|
|
833
|
|
|
|
|
|
|
6 - Log Level Is Not A Number in log_init |
834
|
|
|
|
|
|
|
'Log level must be a postive integer' |
835
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
7 - Log Level Is Out of Range in log_init |
837
|
|
|
|
|
|
|
'Log level must be between LOG_EMERG and LOG_DEBUG' |
838
|
|
|
|
|
|
|
|
839
|
|
|
|
|
|
|
8 - Log Facility Is Not A Number in log_init |
840
|
|
|
|
|
|
|
'Log facility must be a postive integer' |
841
|
|
|
|
|
|
|
|
842
|
|
|
|
|
|
|
9 - Log File Name Exceeds Max Length in log_init |
843
|
|
|
|
|
|
|
'Log file exceeds maximum length of MAX_STRING_LEN' |
844
|
|
|
|
|
|
|
|
845
|
|
|
|
|
|
|
10 - Log File Name Contains Non-Printable Characters in log_init |
846
|
|
|
|
|
|
|
'Log file contains non-printable characters' |
847
|
|
|
|
|
|
|
|
848
|
|
|
|
|
|
|
11 - Use_syslog Is Not A Number in log_init |
849
|
|
|
|
|
|
|
'use_syslog must be 0 or 1' |
850
|
|
|
|
|
|
|
|
851
|
|
|
|
|
|
|
12 - Use_syslog Is Not 0 or 1 in log_init |
852
|
|
|
|
|
|
|
'use_syslog must be 0 or 1' |
853
|
|
|
|
|
|
|
|
854
|
|
|
|
|
|
|
13 - Use_gmt Is Not A Number in log_init |
855
|
|
|
|
|
|
|
'use_gmt must be 0 or 1' |
856
|
|
|
|
|
|
|
|
857
|
|
|
|
|
|
|
14 - Use_gmt Is Not 0 or 1 in log_init |
858
|
|
|
|
|
|
|
'use_gmt must be 0 or 1' |
859
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
15 - Use_gmt Set When Use_syslog = 1 in log_init |
861
|
|
|
|
|
|
|
'use_gmt not allowed when use_syslog = 1' |
862
|
|
|
|
|
|
|
|
863
|
|
|
|
|
|
|
16 - Specified Both Syslog and Log File in log_init |
864
|
|
|
|
|
|
|
'Unable to both use_syslog and write to file '; |
865
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
17 - Unable To Open Syslog in log_init |
867
|
|
|
|
|
|
|
'Unable To open syslog'; |
868
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
18 - Unable To Open Log File in log_init |
870
|
|
|
|
|
|
|
'Unable to open log file'; |
871
|
|
|
|
|
|
|
|
872
|
|
|
|
|
|
|
19 - Log Function Called Before Log Initialized |
873
|
|
|
|
|
|
|
'Logging not initialized. Use init_log() prior to calling log_*("msg")'; |
874
|
|
|
|
|
|
|
|
875
|
|
|
|
|
|
|
20 -No Such Log Function Exists |
876
|
|
|
|
|
|
|
'No such log function '; |
877
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
21 - No Message to Log |
879
|
|
|
|
|
|
|
'Log function called with no log message'; |
880
|
|
|
|
|
|
|
|
881
|
|
|
|
|
|
|
22 - Log Message Exceeds Maximum Length |
882
|
|
|
|
|
|
|
'Log message exceeds maximum length of '.MAX_STRING_LEN; |
883
|
|
|
|
|
|
|
|
884
|
|
|
|
|
|
|
23 - Log Message Contains Non-Printable Characters |
885
|
|
|
|
|
|
|
'Message name contains non-printable characters' |
886
|
|
|
|
|
|
|
|
887
|
|
|
|
|
|
|
24 - Failed to Write Log Message |
888
|
|
|
|
|
|
|
'Unable to write log messsage '; |
889
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
=head1 AUTHOR |
891
|
|
|
|
|
|
|
|
892
|
|
|
|
|
|
|
Dan Massey, C<< >> |
893
|
|
|
|
|
|
|
|
894
|
|
|
|
|
|
|
=head1 BUGS |
895
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
Please report any bugs or feature requests to |
897
|
|
|
|
|
|
|
C<< >>. |
898
|
|
|
|
|
|
|
|
899
|
|
|
|
|
|
|
=head1 SUPPORT |
900
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command. |
902
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
perldoc BGPmon::Log |
904
|
|
|
|
|
|
|
=cut |
905
|
|
|
|
|
|
|
|
906
|
|
|
|
|
|
|
=head1 LICENSE AND COPYRIGHT |
907
|
|
|
|
|
|
|
|
908
|
|
|
|
|
|
|
Copyright (c) 2012 Colorado State University |
909
|
|
|
|
|
|
|
|
910
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person |
911
|
|
|
|
|
|
|
obtaining a copy of this software and associated documentation |
912
|
|
|
|
|
|
|
files (the "Software"), to deal in the Software without |
913
|
|
|
|
|
|
|
restriction, including without limitation the rights to use, |
914
|
|
|
|
|
|
|
copy, modify, merge, publish, distribute, sublicense, and/or |
915
|
|
|
|
|
|
|
sell copies of the Software, and to permit persons to whom |
916
|
|
|
|
|
|
|
the Software is furnished to do so, subject to the following |
917
|
|
|
|
|
|
|
conditions: |
918
|
|
|
|
|
|
|
|
919
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be |
920
|
|
|
|
|
|
|
included in all copies or substantial portions of the Software. |
921
|
|
|
|
|
|
|
|
922
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
923
|
|
|
|
|
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
924
|
|
|
|
|
|
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
925
|
|
|
|
|
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
926
|
|
|
|
|
|
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
927
|
|
|
|
|
|
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
928
|
|
|
|
|
|
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
929
|
|
|
|
|
|
|
OTHER DEALINGS IN THE SOFTWARE.\ |
930
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
File: Log.pm |
932
|
|
|
|
|
|
|
|
933
|
|
|
|
|
|
|
Authors: M. Lawrence Weikum, Kaustubh Gadkari, Dan Massey, Cathie Olschanowsky |
934
|
|
|
|
|
|
|
Date: 13 October 2013 |
935
|
|
|
|
|
|
|
=cut |
936
|
|
|
|
|
|
|
1; |