File Coverage

blib/lib/Device/Modem/Log/File.pm
Criterion Covered Total %
statement 12 53 22.6
branch 0 14 0.0
condition 0 12 0.0
subroutine 4 11 36.3
pod 0 7 0.0
total 16 97 16.4


line stmt bran cond sub pod time code
1             # Device::Modem::Log::File - Text files logging plugin for Device::Modem class
2             #
3             # Copyright (C) 2002-2004 Cosimo Streppone, cosimo@cpan.org
4             #
5             # This program is free software; you can redistribute it and/or
6             # modify it under the same terms as Perl itself.
7             #
8             # Additionally, this is ALPHA software, still needs extensive
9             # testing and support for generic AT commads, so use it at your own risk,
10             # and without ANY warranty! Have fun.
11             #
12             # $Id$
13             #
14             package Device::Modem::Log::File;
15             our $VERSION = '2.11';
16             $VERSION = eval $VERSION;
17              
18 1     1   993 use strict;
  1         2  
  1         34  
19 1     1   7 use File::Path ();
  1         15  
  1         26  
20 1     1   8 use File::Basename ();
  1         2  
  1         20  
21 1     1   4 use IO::Handle;
  1         2  
  1         735  
22              
23             # Define log levels like syslog service
24             our %levels = ( debug => 7, info => 6, notice => 5, warning => 4, err => 3, error => 3, crit => 2, alert => 1, emerg => 0 );
25              
26             sub new {
27 0     0 0   my( $class, $package, $filename ) = @_;
28              
29             # Get a decent default if no file available
30 0   0       $filename ||= default_filename();
31              
32 0           my %obj = (
33             file => $filename,
34             loglevel => 'info'
35             );
36              
37 0           my $self = bless \%obj, 'Device::Modem::Log::File';
38              
39             # Open file at the start and save reference
40 0           my $LOGFILE = new IO::Handle;
41 0 0         if( open( $LOGFILE, '>>'.$self->{'file'} ) ) {
42              
43 0           $self->{'fh'} = $LOGFILE;
44              
45             # Unbuffer writes to logfile
46 0           my $oldfh = select $self->{'fh'};
47 0           $| = 1;
48 0           select $oldfh;
49              
50             } else {
51 0           warn('Could not open '.$self->{'file'}.' to start logging');
52             }
53              
54 0           return $self;
55             }
56              
57             # Provide a suitable filename default
58             sub default_filename () {
59 0     0 0   my $dir = '/tmp';
60              
61             # If this is windows, use the temp/tmp dirs
62 0 0 0       if (exists $ENV{'TEMP'} || exists $ENV{'TMP'}) {
63 0   0       $dir = $ENV{'TEMP'} || $ENV{'TMP'};
64             }
65              
66 0           return "$dir/modem.log";
67             }
68              
69             sub filename {
70 0     0 0   my $self = shift();
71 0   0       $self->{'file'} ||= $self->default_filename();
72              
73 0 0         if( ! -d File::Basename::dirname($self->{'file'}) ) {
74 0           File::Path::mkpath( File::Basename::dirname($self->{'file'}), 0, 0755 );
75             }
76              
77 0           return $self->{'file'};
78             }
79              
80              
81             sub loglevel {
82 0     0 0   my($self, $newlevel) = @_;
83              
84 0 0         if( defined $newlevel ) {
85 0           $newlevel = lc $newlevel;
86 0 0         if( ! exists $levels{$newlevel} ) {
87 0           $newlevel = 'warning';
88             }
89 0           $self->{'loglevel'} = $newlevel;
90             } else {
91 0           return $self->{'loglevel'};
92             }
93             }
94              
95             sub write($$) {
96              
97 0     0 0   my($self, $level, @msg) = @_;
98              
99             # If log level mask allows it, log given message
100             #warn('message level='.$level.' ('.$levels{$level}.') loglevel='.$self->{loglevel}.' ('.$levels{$self->{loglevel}}.')');
101 0 0         if( $levels{$level} <= $levels{$self->{'loglevel'}} ) {
102              
103 0 0         if( my $fh = $self->fh() ) {
104 0           map { tr/\r\n/^M/s } @msg;
  0            
105 0           print $fh join("\t", scalar localtime, $0, $level, @msg), "\n";
106             } else {
107 0           warn('cannot log '.$level.' '.join("\t",@msg).' to file: '.$! );
108             }
109              
110             }
111              
112             }
113              
114             sub fh {
115 0     0 0   my $self = shift;
116 0           return $self->{'fh'};
117             }
118              
119             # Closes log file opened in new()
120             sub close {
121 0     0 0   my $self = shift;
122 0           my $fh = $self->{'fh'};
123 0           close $fh;
124 0           undef $self->{'fh'};
125             }
126              
127             1;
128              
129              
130              
131             __END__