summaryrefslogtreecommitdiff
path: root/lib/XXV/MODULES/LOGREAD.pm
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2007-08-13 18:41:27 +0000
committerAndreas Brachold <vdr07@deltab.de>2007-08-13 18:41:27 +0000
commitbcbf441e09fb502cf64924ff2530fa144bdf52c5 (patch)
treef377707a2dac078db8cd0c7d7abfe69ac1006d71 /lib/XXV/MODULES/LOGREAD.pm
downloadxxv-bcbf441e09fb502cf64924ff2530fa144bdf52c5.tar.gz
xxv-bcbf441e09fb502cf64924ff2530fa144bdf52c5.tar.bz2
* Move files to trunk
Diffstat (limited to 'lib/XXV/MODULES/LOGREAD.pm')
-rw-r--r--lib/XXV/MODULES/LOGREAD.pm221
1 files changed, 221 insertions, 0 deletions
diff --git a/lib/XXV/MODULES/LOGREAD.pm b/lib/XXV/MODULES/LOGREAD.pm
new file mode 100644
index 0000000..88a0a7c
--- /dev/null
+++ b/lib/XXV/MODULES/LOGREAD.pm
@@ -0,0 +1,221 @@
+package XXV::MODULES::LOGREAD;
+
+use strict;
+
+use Tools;
+use Locale::gettext;
+use XXV::OUTPUT::HTML::PUSH;
+
+$|++;
+
+# This module method must exist for XXV
+# ------------------
+sub module {
+# ------------------
+ my $obj = shift || return error ('No Object!' );
+ my $args = {
+ Name => 'LOGREAD',
+ Prereq => {
+ # 'Perl::Module' => 'Description',
+ },
+ Description => gettext('This module read the xxv log file and show it on console.'),
+ Version => '0.01',
+ Date => '17.09.2005',
+ Author => 'xpix',
+ Level => 'admin',
+ Preferences => {
+ active => {
+ description => gettext('Activate this service'),
+ default => 'y',
+ type => 'confirm',
+ required => gettext('This is required!'),
+ },
+ tail => {
+ description => sprintf(gettext("Path of command '%s'"),'tail'),
+ default => '/usr/bin/tail',
+ type => 'file',
+ required => gettext('This is required!'),
+ },
+ rows => {
+ description => gettext('How much lines to display?'),
+ default => '100',
+ type => 'integer',
+ required => gettext('This is required!'),
+ },
+ syslog => {
+ description => gettext('Path of syslog file?'),
+ default => '/var/log/syslog',
+ type => 'file',
+ required => gettext('This is required!'),
+ },
+ },
+ Commands => {
+ logger => {
+ description => gettext("Display the last log entries"),
+ short => 'lg',
+ callback => sub{ $obj->logger(@_) },
+ },
+ },
+ };
+ return $args;
+}
+
+# ------------------
+sub new {
+# ------------------
+ my($class, %attr) = @_;
+ my $self = {};
+ bless($self, $class);
+
+ # paths
+ $self->{paths} = delete $attr{'-paths'};
+
+ # who am I
+ $self->{MOD} = $self->module;
+
+ # all configvalues to $self without parents (important for ConfigModule)
+ map {
+ $self->{$_} = $attr{'-config'}->{$self->{MOD}->{Name}}->{$_};
+ $self->{$_} = $self->{MOD}->{Preferences}->{$_}->{default} unless($self->{$_});
+ } keys %{$self->{MOD}->{Preferences}};
+
+ # Try to use the Requirments
+ map {
+ eval "use $_";
+ return panic("\nCan not load Module: $_\nPlease install this module on your System:\nperl -MCPAN -e 'install $_'") if($@);
+ } keys %{$self->{MOD}->{Prereq}};
+
+ return $self;
+}
+
+# ------------------
+sub logger {
+# ------------------
+ my $obj = shift || return error ('No Object!' );
+ my $watcher = shift || return error ('No Watcher!');
+ my $console = shift || return error ('No Console');
+ my $logname = shift || 'standard';
+ my $params = shift || {};
+
+ $obj->{logfiles} = {
+ main => {
+ # Path to logfile
+ logfile => $obj->{paths}->{LOGFILE},
+ #24 (14870) [22:29:08 09/22/05] CHANNELS: Read and register Channels ...
+ # Regular expression for every loglines
+ regex => qr/^(\d+)\s+\((\d+)\)\s+\[(\d+\-\d+\-\d+ \d+\:\d+\:\d+)\]\s+(.+?)$/s,
+ # Fields List for describe the rows
+ fields => [qw/Nr Typ Time Message/],
+ # Callback for coloring rows
+ display=> sub{
+ my $typ = $_[0][1];
+ return 'black' if($typ < 200);
+ return 'green' if($typ < 300);
+ return 'blue' if($typ < 400);
+ return 'brown' if($typ < 500);
+ return 'red' if($typ >= 500);
+ },
+ # Maximum letters for truncate in template
+ maxlet=> 50,
+ },
+ syslog => {
+ logfile => $obj->{syslog},
+ #Sep 23 00:35:01 vdr /USR/SBIN/CRON[16971]: (root) CMD (/usr/bin/weatherng.sh)
+ regex => qr/^(.+?)\s+(\d+)\s+(\d+\:\d+\:\d+)\s+(.+?)\s+(.+)/s,
+ fields => [qw/Month MDay Time Prg Message/],
+ display=> sub{
+ my $txt = $_[0][-1];
+ return 'red' if($txt =~ /ERROR/si);
+ return 'blue' if($txt =~ /WARNING/si);
+ return 'green' if($txt =~ /INFO/si);
+ return 'black';
+ },
+ maxlet=> 80,
+ },
+ };
+
+ if( ! ref $obj->{logfiles}->{$logname}) {
+ return $console->err(sprintf("The log with the name %s does not exist! Please use '%s'!", $logname, join("' or '", keys %{$obj->{logfiles}})));
+ }
+
+ my $logfile = $obj->{logfiles}->{$logname}->{logfile};
+ my @out = $obj->tail($logfile);
+
+ return $console->msg(undef, sprintf(gettext("Can't read log file %s!"), $logfile))
+ unless(scalar @out);
+
+ my $output = $obj->parseLogOutput($obj->{logfiles}->{$logname}, \@out);
+
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks)
+ = stat($logfile);
+
+ $console->table($output, {
+ type => $logname,
+ logfile => $logfile,
+ Size => convert($size),
+ LastChanged => scalar localtime($mtime),
+ full => $params->{full},
+ color => $obj->{logfiles}->{$logname}->{display},
+ maxlet => $obj->{logfiles}->{$logname}->{maxlet},
+ });
+ return 1;
+}
+
+# ------------------
+sub tail {
+# ------------------
+ my $obj = shift || return error ('No Object!' );
+ my $logfile = shift || return error ('No Logfile!' );
+ my $rows = shift || $obj->{rows};
+
+ my $cmd = sprintf('%s --lines=%d %s', $obj->{tail}, $rows, $logfile);
+ my @out = (`$cmd`);
+ return @out;
+}
+
+
+# ------------------
+sub parseLogOutput {
+# ------------------
+ my $obj = shift || return error ('No Object!' );
+ my $log = shift || return error ('No Prefs for logfile!' );
+ my $out = shift || return;
+
+ my $regex = $log->{regex};
+ $obj->{logbuf} = undef;
+
+ my $ret = [];
+ foreach my $line (@$out) {
+ if(my @d = $line =~ $regex) {
+ $obj->parseData($ret, \@d) if($d[0]);
+ } else {
+ $obj->parseData($ret, $line);
+ }
+ }
+ my @r = reverse @$ret;
+
+ unshift(@r, $log->{fields});
+ return \@r;
+}
+
+# ------------------
+sub parseData {
+# ------------------
+ my $obj = shift || return error ('No Object!' );
+ my $ret = shift || return error('No Referenced Array');
+ my $data = shift || 0;
+
+
+ if(ref $data eq 'ARRAY') { # Set Data
+ $data->[-1] .= $obj->{logbuf}
+ if($obj->{logbuf});
+ push(@$ret, $data);
+ $obj->{logbuf} = undef;
+ } elsif($data) { # Message (last row, last item) .+ $line
+ $obj->{logbuf} .= $data;
+ }
+ return $ret;
+}
+
+1;