File Coverage

blib/lib/XAS/Logmon/Input/Tail.pm
Criterion Covered Total %
statement 9 49 18.3
branch 2 8 25.0
condition 0 3 0.0
subroutine 3 7 42.8
pod 1 1 100.0
total 15 68 22.0


line stmt bran cond sub pod time code
1             package XAS::Logmon::Input::Tail;
2              
3             our $VERSION = '0.01';
4              
5             my $mixin;
6              
7             BEGIN {
8 1     1   2 $mixin = 'XAS::Logmon::Input::Tail::Default';
9 1 50       5 $mixin = 'XAS::Logmon::Input::Tail::Linux' if ($^O eq 'linux');
10 1 50       22 $mixin = 'XAS::Logmon::Input::Tail::Win32' if ($^O eq 'MSWin32');
11             }
12              
13 1     1   4 use Fcntl ':seek';
  1         1  
  1         143  
14              
15             use XAS::Class
16 1         20 debug => 0,
17             version => $VERSION,
18             base => 'XAS::Base',
19             mixin => $mixin,
20             utils => 'dotid trim',
21             accessors => 'notifier statefile',
22             filesystem => 'File',
23             vars => {
24             PARAMS => {
25             -filename => { isa => 'Badger::Filesystem::File' },
26             }
27             }
28 1     1   3 ;
  1         1  
29              
30             #use Data::Dumper;
31              
32             # ----------------------------------------------------------------------
33             # Public Methods
34             # ----------------------------------------------------------------------
35              
36             # ----------------------------------------------------------------------
37             # Private Methods
38             # ----------------------------------------------------------------------
39              
40             sub _do_tail {
41 0     0     my $self = shift;
42              
43 0           my $pos = $self->_file_position();
44 0           $self->log->debug("_do_tail - pos = $pos");
45              
46 0           my $fh = $self->filename->open('r');
47 0           $fh->seek($pos, SEEK_SET);
48              
49 0           while (my $line = $fh->getline()) {
50              
51 0           push(@{$self->{'buffer'}}, trim($line));
  0            
52              
53             }
54              
55 0           $pos = $fh->tell();
56 0           $self->_write_state($pos);
57              
58 0           $fh->close();
59              
60 0           $self->log->debug("_do_tail - pos = $pos");
61              
62             }
63              
64             sub _file_position {
65 0     0     my ($self) = @_;
66              
67 0           my $state;
68             my @lines;
69 0           my $pos = 0;
70 0           my @stat = $self->filename->stat;
71              
72 0 0         if ($self->statefile->exists) {
73              
74 0           @lines = $self->statefile->read;
75 0           foreach my $line (@lines) {
76              
77 0           my ($key, $value) = split('\s*=\s*', $line);
78 0           chop $value;
79 0           $state->{$key} = $value;
80              
81             }
82              
83 0 0 0       if (($stat[0] eq $state->{'device'}) and
84             ($stat[1] eq $state->{'inode'})) {
85              
86 0           $pos = $state->{'position'};
87              
88             }
89              
90             } else {
91              
92 0           $self->_write_state($pos);
93              
94             }
95              
96 0           return $pos;
97              
98             }
99              
100             sub _write_state {
101 0     0     my $self = shift;
102 0           my $pos = shift;
103              
104 0           my @stat = $self->filename->stat;
105 0           my $fh = $self->statefile->open('w');
106              
107 0           $fh->printf("inode = %s\n", $stat[1]);
108 0           $fh->printf("device = %s\n", $stat[0]);
109 0           $fh->printf("position = %s\n", $pos);
110              
111 0           $fh->close;
112              
113             }
114              
115             sub init {
116 0     0 1   my $class = shift;
117              
118 0           my $self = $class->SUPER::init(@_);
119              
120 0           $self->{'buffer'} = [];
121 0           $self->{'statefile'} = File($self->filename->volume, $self->filename->directory, '.' . $self->filename->basename . '.logmon');
122              
123 0           $self->init_notifier();
124              
125 0           return $self;
126              
127             }
128              
129             1;
130              
131             __END__