source: perl/lib/BarnOwl/Logging.pm @ 023f405

Last change on this file since 023f405 was 023f405, checked in by Jason Gross <jgross@mit.edu>, 8 years ago
Moved logging-specific variables to perl But only the ones that could be moved losslessly, i.e., no special validsettings and not enums.
  • Property mode set to 100644
File size: 6.4 KB
Line 
1use strict;
2use warnings;
3
4package BarnOwl::Logging;
5
6=head1 BarnOwl::Logging
7
8=head1 DESCRIPTION
9
10C<BarnOwl::Logging> implements the internals of logging.  All customizations
11to logging should be done in the appropriate subclass of L<BarnOwl::Message>.
12
13=head2 USAGE
14
15Modules wishing to customize how messages are logged should override the
16relevant subroutines in the appropriate subclass of L<BarnOwl::Message>.
17
18Modules wishing to log errors sending outgoing messages should call
19L<BarnOwl::Logging::log_outgoing_error> with the message that failed
20to be sent.
21
22=head2 EXPORTS
23
24None by default.
25
26=cut
27
28use Exporter;
29
30our @EXPORT_OK = qw();
31
32our %EXPORT_TAGS = (all => [@EXPORT_OK]);
33
34use File::Spec;
35
36$BarnOwl::Hooks::newMessage->add("BarnOwl::Logging::log");
37$BarnOwl::Hooks::startup->add("BarnOwl::Logging::_register_variables");
38
39sub _register_variables {
40    BarnOwl::new_variable_bool('logging',
41        {
42            default     => 0,
43            summary     => 'turn personal logging on or off',
44            description => "If this is set to on, personal messages are\n"
45                         . "logged in the directory specified\n"
46                         . "by the 'logpath' variable.  The filename in that\n"
47                         . "directory is derived from the sender of the message."
48        });
49
50    BarnOwl::new_variable_bool('classlogging',
51        {
52            default     => 0,
53            summary     => 'turn class logging on or off',
54            description => "If this is set to on, class messages are\n"
55                         . "logged in the directory specified by the\n"
56                         . "'classpath' variable.  The filename in that\n"
57                         . "directory is derived from the class to which\n"
58                         . "the message was sent."
59        });
60
61    BarnOwl::new_variable_string('logfilter',
62        {
63            default     => '',
64            summary     => 'name of a filter controlling which messages to log',
65            description => "If non empty, any messages matching the given filter will be logged.\n"
66                         . "This is a completely separate mechanism from the other logging\n"
67                         . "variables like logging, classlogging, loglogins, loggingdirection,\n"
68                         . "etc.  If you want this variable to control all logging, make sure\n"
69                         . "all other logging variables are in their default state."
70        });
71
72    BarnOwl::new_variable_bool('loglogins',
73        {
74            default     => 0,
75            summary     => 'enable logging of login notifications',
76            description => "When this is enabled, BarnOwl will log login and logout notifications\n"
77                         . "for AIM, zephyr, or other protocols.  If disabled BarnOwl will not print\n"
78                         . "login or logout notifications."
79        });
80}
81
82=head2 sanitize_filename BASE_PATH FILENAME
83
84Sanitizes C<FILENAME> and concatenates it with C<BASE_PATH>.
85
86In any filename, C<"/"> and any control characters (characters which
87match C<[:cntrl:]> get replaced by underscores.  If the resulting
88filename is empty or equal to C<"."> or C<"..">, it is replaced with
89C<"weird">.
90
91=cut
92
93sub sanitize_filename {
94    my $base_path = BarnOwl::Internal::makepath(shift);
95    my $filename = shift;
96    $filename =~ s/[[:cntrl:]\/]/_/g;
97    if ($filename eq '' || $filename eq '.' || $filename eq '..') {
98        $filename = 'weird';
99    }
100    # The original C code also removed characters less than '!' and
101    # greater than or equal to '~', marked file names beginning with a
102    # non-alphanumeric or non-ASCII character as 'weird', and rejected
103    # filenames longer than 35 characters.
104    return File::Spec->catfile($base_path, $filename);
105}
106
107=head2 get_filenames MESSAGE
108
109Returns a list of filenames in which to log the passed message.
110
111This method calls C<log_filenames> on C<MESSAGE> to determine the list
112of filenames to which C<MESSAGE> gets logged.  All filenames are
113relative to C<MESSAGE->log_base_path>.  If C<MESSAGE->log_to_all_file>
114returns true, then the filename C<"all"> is appended to the list of
115filenames.
116
117Filenames are sanitized by C<sanitize_filename>.
118
119=cut
120
121sub get_filenames {
122    my ($m) = @_;
123    my @filenames = $m->log_filenames;
124    push @filenames, 'all' if $m->log_to_all_file;
125    return map { sanitize_filename($m->log_base_path, $_) } @filenames;
126}
127
128=head2 should_log_message MESSAGE
129
130Determines whether or not the passed message should be logged.
131
132To customize the behavior of this method, override
133L<BarnOwl::Message::should_log>.
134
135=cut
136
137sub should_log_message {
138    my ($m) = @_;
139    # If there's a logfilter and this message matches it, log.
140    # pass quiet=1, because we don't care if the filter doesn't exist
141    return 1 if BarnOwl::message_matches_filter($m, BarnOwl::getvar('logfilter'), 1);
142    # otherwise we do things based on the logging variables
143    # skip login/logout messages if appropriate
144    return 0 if $m->is_loginout && BarnOwl::getvar('loglogins') eq 'off';
145    # check direction
146    return 0 if $m->is_outgoing && BarnOwl::getvar('loggingdirection') eq 'in';
147    return 0 if $m->is_incoming && BarnOwl::getvar('loggingdirection') eq 'out';
148    return $m->should_log;
149}
150
151=head2 log MESSAGE
152
153Call this method to (potentially) log a message.
154
155To customize the behavior of this method for your messages, override
156L<BarnOwl::Message::log>, L<BarnOwl::Message::should_log>,
157L<BarnOwl::Message::log_base_path>, and/or
158L<BarnOwl::Message::log_filenames>.
159
160=cut
161
162sub log {
163    my ($m) = @_;
164    return unless defined $m;
165    return unless BarnOwl::Logging::should_log_message($m);
166    my $log_text = $m->log;
167    foreach my $filename (BarnOwl::Logging::get_filenames($m)) {
168        BarnOwl::Logging::enqueue_text($log_text, $filename);
169    }
170}
171
172=head2 log_outgoing_error MESSAGE
173
174Call this method to (potentially) log an error in sending an
175outgoing message.  Errors get logged to the same file(s) as
176successful messages.
177
178To customize the behavior of this method for your messages, override
179L<BarnOwl::Message::log_outgoing_error>,
180L<BarnOwl::Message::should_log>,
181L<BarnOwl::Message::log_base_path>, and/or
182L<BarnOwl::Message::log_filenames>.
183
184=cut
185
186sub log_outgoing_error {
187    my ($m) = @_;
188    return unless BarnOwl::Logging::should_log_message($m);
189    my $log_text = $m->log_outgoing_error;
190    foreach my $filename (BarnOwl::Logging::get_filenames($m)) {
191        BarnOwl::Logging::enqueue_text($log_text, $filename);
192    }
193}
194
1951;
Note: See TracBrowser for help on using the repository browser.