######################################################## # Please file all bug reports, patches, and feature # requests under: # https://sourceforge.net/p/logwatch/_list/tickets # Help requests and discusion can be filed under: # https://sourceforge.net/p/logwatch/discussion/ ######################################################## ########################################################################## # VDR script for Logwatch # # Copyright (c) 2012 Reiner Buehl ## Covered under the included MIT/X-Consortium License: ## http://www.opensource.org/licenses/mit-license.php ## All modifications and contributions by other persons to ## this script are assumed to have been donated to the ## Logwatch project and thus assume the above copyright ## and licensing terms. If you want to make contributions ## under your own copyright or a different license this ## must be explicitly stated in the contribution an the ## Logwatch project reserves the right to not accept such ## contributions. If you have made significant ## contributions to this script and want to claim ## copyright please contact logwatch-devel@lists.sourceforge.net. ######################################################### use strict; use Logwatch ':ip'; my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0; my $IgnoreUnmatched = $ENV{'vdr_ignore_unmatched'} || 0; my $TSContinuityErrors = 0; my $PESPacketShortened = 0; my %FrontendTimeout = (); my $TransferBufferOverflow = 0; my @UnknownPicTypeError = (); my %ChannelNameChange = (); my %TimerSet = (); my %RecordingDeleted = (); my @OtherList; while (defined(my $ThisLine = )) { next if ($ThisLine eq ''); if ( # filter out svdrp connect messages ($ThisLine =~ /connect from .*, port .* - accepted/) or ($ThisLine =~ /closing SVDRP connection/) # filter out EPGSearch and Text2Skin messages or ($ThisLine =~ /EPGSearch:/) or ($ThisLine =~ /Text2Skin:/) # filter out pid, ca and caid changes or ($ThisLine =~ /changing pids of channel/) or ($ThisLine =~ /changing ca descriptors of channel/) or ($ThisLine =~ /changing caids of channel .* from .* to .*/) or ($ThisLine =~ /changing portal name of channel .* from .* to .*/) # filter out event status messages or ($ThisLine =~ /channel [0-9]+ \(.+\) event.*status [0-9]+/) # filter out directory scanner thread messages or ($ThisLine =~ /video directory scanner thread started/) or ($ThisLine =~ /video directory scanner thread ended/) # filter out delete recordings thread messages or ($ThisLine =~ /remove deleted recordings thread started/) or ($ThisLine =~ /remove deleted recordings thread ended/) # filter out file name truncate messages or ($ThisLine =~ /timer file name too long for VFAT file system/) or ($ThisLine =~ /timer file name truncated to/) or ($ThisLine =~ /timer .* modified/) # filter out timer status change messages or ($ThisLine =~ /timer .* added/) or ($ThisLine =~ /timer .* start/) or ($ThisLine =~ /timer .* stop/) or ($ThisLine =~ /deleting timer/) or ($ThisLine =~ /cleaning up schedules data/) # filter out additional timer start messages or ($ThisLine =~ /vdr: \[[0-9]+\] Title:/) or ($ThisLine =~ /vdr: \[[0-9]+\] executing .*vdr-recordingaction before/) or ($ThisLine =~ /vdr: \[[0-9]+\] executing .*vdr-recordingaction after/) or ($ThisLine =~ /vdr: \[[0-9]+\] record /) or ($ThisLine =~ /vdr: \[[0-9]+\] recording to /) or ($ThisLine =~ /vdr: \[[0-9]+\] creating directory /) or ($ThisLine =~ /vdr: \[[0-9]+\] recording thread started /) or ($ThisLine =~ /vdr: \[[0-9]+\] recording thread ended /) or ($ThisLine =~ /vdr: \[[0-9]+\] transfer thread started /) or ($ThisLine =~ /vdr: \[[0-9]+\] transfer thread ended /) or ($ThisLine =~ /vdr: \[[0-9]+\] file writer thread started /) or ($ThisLine =~ /vdr: \[[0-9]+\] file writer thread ended /) or ($ThisLine =~ /vdr: \[[0-9]+\] receiver on device [0-9]+ thread started /) or ($ThisLine =~ /vdr: \[[0-9]+\] receiver on device [0-9]+ thread ended /) or ($ThisLine =~ /vdr: \[[0-9]+\] TS buffer on device [0-9]+ thread started /) or ($ThisLine =~ /vdr: \[[0-9]+\] TS buffer on device [0-9]+ thread ended /) # filter out other messages or ($ThisLine =~ /vdr: \[[0-9]+\] switching device [0-9]+ to channel [0-9]+/) or ($ThisLine =~ /vdr: \[[0-9]+\] buffer stats: [0-9]+ \([0-9]+%\) used/) or ($ThisLine =~ /timer ([0-9]+) \(.*\) set to no event/) or ($ThisLine =~ /timer ([0-9]+) \(.*\) entered VPS margin/) or ($ThisLine =~ /switching to channel [0-9]+/) or ($ThisLine =~ /setting audio track to [0-9]+/) or ($ThisLine =~ /retuning due to modification of channel [0-9]+/) ) { # ignore the above strings } elsif ($ThisLine =~ /TS continuity error/) { $TSContinuityErrors++; } elsif ($ThisLine =~ /PES packet shortened/) { $PESPacketShortened++; } elsif ( my ($Frontend,$Channel) = ($ThisLine =~ /frontend ([0-9]+) timed out while tuning to channel ([0-9]+)/) ) { push @{$FrontendTimeout{$Frontend}}, $Channel; } elsif ($ThisLine =~ /clearing transfer buffer to avoid overflows/) { $TransferBufferOverflow++; } elsif ($ThisLine =~ /buffer usage: [0-9]+%/) { # ignore the above string } elsif ( my ($PicType) = ($ThisLine =~ /ERROR: unknown picture type '([0-9]+)'/) ) { push @UnknownPicTypeError,$PicType; } elsif ( my ($Channel, $From, $To) = ($ThisLine =~ /changing name of channel ([0-9]+) from '(.+)' to '(.+)'/) ) { $ChannelNameChange{$Channel} = "'$From' to '$To'"; } elsif ( my ($TimerNumber, $TimerEvent) = ($ThisLine =~ /timer ([0-9]+) \(.*\) set to event (.*)$/) ) { $TimerSet{$TimerEvent} = "$TimerNumber"; } elsif ( my ($RecordingName) = ($ThisLine =~ /removing recording (.*)$/) ) { $RecordingDeleted{$RecordingName} = "1"; } else { # Report any unmatched entries... push @OtherList,$ThisLine; } } if ($TSContinuityErrors > 0) { print "\n$TSContinuityErrors TS continuity error(s)\n"; } if ($PESPacketShortened > 0) { print "\n$PESPacketShortened PES packets shortened\n"; } if (keys %FrontendTimeout) { print "\n"; foreach my $Frontend (sort keys %FrontendTimeout) { my %counts = (); for (@{$FrontendTimeout{$Frontend}}) { $counts{$_}++; } my $result = ""; foreach my $keys (keys %counts) { $result .= "$keys ($counts{$keys} times), "; } $result =~ s/, $//; print "Frontend $Frontend timed out when changing to channels: $result\n"; } } if ($TransferBufferOverflow > 0) { print "\n$TransferBufferOverflow transfer buffer overflows\n"; } if ($#UnknownPicTypeError > 0) { print "\nUnknown picture type errors for picture types: "; my %counts = (); for (@UnknownPicTypeError) { $counts{$_}++; } my $result = ""; foreach my $keys (keys %counts) { $result .= "$keys ($counts{$keys} times), "; } $result =~ s/, $//; print "$result\n"; } if (keys %ChannelNameChange) { if($Detail >= 10) { print "\n"; foreach my $Channel (sort keys %ChannelNameChange) { print "Name of channel $Channel changed from ", $ChannelNameChange{$Channel}, "\n"; } } elsif ($Detail >= 5) { my $number = keys %ChannelNameChange; print "\n$number channel name changes\n"; } } if (keys %TimerSet) { if($Detail >= 15) { print "\n"; foreach my $Timer (sort keys %TimerSet) { print "Timer set to event $Timer\n"; } } elsif ($Detail >= 10) { my $number = keys %TimerSet; print "\n$number timers set\n"; } } if (keys %RecordingDeleted) { if($Detail >= 15) { print "\n"; foreach my $Recording (sort keys %RecordingDeleted) { print "DEleted recording $Recording\n"; } } elsif ($Detail >= 10) { my $number = keys %RecordingDeleted; print "\n$number recordings deleted\n"; } } if (($#OtherList >= 0) and (not $IgnoreUnmatched)) { print "\n**Unmatched Entries**\n"; print @OtherList; } exit(0); # vi: shiftwidth=3 tabstop=3 syntax=perl et