#!/usr/bin/perl use DBI; my %arguments; if (scalar(@ARGV) == 0) { print "Usage: " . $0 . " minutes=[numberofminutes] [other parameters]\n\n"; print "Additional Parameters:\n"; print " lines=[number]\n"; print " - number of lines to display\n\n"; print " show=[categories]\n"; print " - comma seperated list of categories to show. See below.\n\n"; print " hide=[categories]\n"; print " - comma seperated list of categories to hide. See below.\n\n"; print "Current Categories are as follows...\n"; print " dos - DOS alerts\n"; print " misc - Miscallaneous messages - mostily billing oriented.\n"; print " mm3k - Mr. Radar alerts\n"; print " nagios - Nagios alerts\n"; print "\nExample: $0 minutes=30 lines=25 hide=mm3k,misc\n\n"; exit; } for ($x = 0; $x < scalar(@ARGV); $x++) { if ($ARGV[$x] =~ /(\S+)=(\S+)/s) { $arguments{$1} = $2; } } if (!defined($arguments{'minutes'})) { print "You didn't specify the minutes parameter.\n"; print "Usage: " . $0 . " minutes=[numberofminutes]\n"; exit; } else { $minutes = $arguments{'minutes'}; } if (!defined($arguments{'lines'})) { $LIMIT = ""; } else { $LIMIT = " limit 0," . $arguments{'lines'}; } if (defined($arguments{'show'})) { $SHOWFILTER = " and ("; @shows = split(/,/, $arguments{'show'}); $count = scalar(@shows); for ($x = 0; $x < $count; $x++) { $SHOWFILTER .= " MessageType='" . $shows[$x] . "'"; if ($x != ($count - 1)) { $SHOWFILTER .= " or "; } } $SHOWFILTER .= ") "; } else { $SHOWFILTER = ""; } if (defined($arguments{'hide'})) { $HIDEFILTER = " and ("; @hides = split(/,/, $arguments{'hide'}); $count = scalar(@hides); for ($x = 0; $x < $count; $x++) { $HIDEFILTER .= " MessageType<>'" . $hides[$x] . "'"; if ($x != ($count - 1)) { $HIDEFILTER .= " and "; } } $HIDEFILTER .= ") "; } else { $HIDEFILTER = ""; } $dbserver = "nagios.example.com"; $dbport = "3306"; $dbname = "jabbermessages"; $dbusername = "jabberquery"; $dbpassword = "asdf90asd0fljf2435"; $datasource = "DBI:mysql:$dbname:$dbserver:$dbport;mysql_connect_timeout=3"; if (!($dbh = DBI->connect($datasource, $dbusername, $dbpassword))) { print "There was a problem connecting to the database... exiting.\n"; exit; } while (1) { $sql = "select date_format(NOW(), '%m/%d %H:%i:%s')"; my $sth = $dbh->prepare($sql); $sth->execute; @row = $sth->fetchrow_array(); $sth->finish; $date = $row[0]; $sql = "select date_format(TimeStamp, '%m/%d %H:%i:%s') , Message from Messages where TimeStamp > date_sub(NOW(), interval $minutes MINUTE) $SHOWFILTER $HIDEFILTER order by TimeStamp DESC $LIMIT "; $sth = $dbh->prepare($sql); $sth->execute; #clear the screen print chr(27) . "[2J" . chr(27) . "[0;0H" . chr(27) . "[37;1m"; ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time); if ($Second < 10) {$Second = "0" . $Second;} if ($Minute < 10) {$Minute = "0" . $Minute;} if ($Hour < 10) {$Hour = "0" . $Hour;} print "$date, last $minutes minutes "; if (defined($arguments{'show'})) {print " show=" . $arguments{'show'};} if (defined($arguments{'hide'})) {print " hide=" . $arguments{'hide'};} print "\n=============================================================================\n"; print chr(27) . "[0m"; while (@row = $sth->fetchrow_array()) { $timestamp = $row[0]; $message = $row[1]; #$translate = array("'" => ""); #$message = strtr($message, $translate); $message =~ s/'//g; $color = $reset = ""; if ($message =~ /LW DOS Alarm.*DOS DETECT.*Host Name: (\S+).*Rate: (\S+ \S+ \S+)/s) { $color = chr(27) . "[31;1m"; $reset = chr(27) . "[0m"; $message = "DOS Detected: " . $1 . " - " . $2; } if ($message =~ /LW DOS Alarm.*DOS alert\s+(\S+)\s+http.*/s) { $color = chr(27) . "[31;1m"; $reset = chr(27) . "[0m"; $message = "DOS Detected: " . $1; } if ($message =~ /LW DOS Alarm.*DOS ok.*Host Name: (\S+).*Rate: (\S+ \S+ \S+)/s) { $color = chr(27) . "[32;1m"; $reset = chr(27) . "[0m"; $message = "DOS Subsided: " . $1 . " - " . $2; } #if (preg_match("/DOS Detect: (.+) at (\S+)\.example.com/", $message, $matches)) if ($message =~ /DOS Detect: (.+) at (\S+)\.example.com/) { $message = "DOS Detected: " . $1 . " at " . $2; $color = chr(27) . "[31;1m"; $reset = chr(27) . "[0m"; } #if (preg_match("/DOS ok: (.+) at (\S+)\.example.com/", $message, $matches)) if ($message =~ /DOS ok: (.+) at (\S+)\.example.com/) { $message = "DOS Subsided: " . $1 . " at " . $2; $color = chr(27) . "[32;1m"; $reset = chr(27) . "[0m"; } #if (preg_match("/Host \S+ is DOWN/", $message)) if ($message =~ /Host \S+ is DOWN/) { $color = chr(27) . "[31;1m"; $reset = chr(27) . "[0m"; } #if (preg_match("/\S+ on \S+ \(\S+\) is CRITICAL/", $message)) if ($message =~ /\S+ on \S+ \(\S+\) is CRITICAL/) { $color = chr(27) . "[31m"; $reset = chr(27) . "[0m"; } #if (preg_match("/Host \S+ is UP/", $message)) if ($message =~ /Host \S+ is UP/) { $color = chr(27) . "[32;1m"; $reset = chr(27) . "[0m"; } #if (preg_match("/\S+ on \S+ \(\S+\) is OK/", $message)) if ($message =~ /\S+ on \S+ \(\S+\) is OK/) { $color = chr(27) . "[32m"; $reset = chr(27) . "[0m"; } #if (preg_match("/New (\S+) Order: .*?accnt=(\S+)/", $message, $matches)) if ($message =~ /New (\S*) Order: .*?accnt=(\S+)/) { $color = ""; $reset = ""; $message = "New " . $1 . " order: " . $2; } if ($message =~ /^ALERT:/s) { $color = chr(27) . "[31m"; $reset = chr(27) . "[0m"; } if ($message =~ /^CRITICAL:/s) { $color = chr(27) . "[31;1m"; $reset = chr(27) . "[0m"; } if ($message =~ /CPU Utilization Exceeded\nCPU Utilization for (.*?)\n/s) { $color = chr(27) . "[31;1m"; $reset = chr(27) . "[0m"; $message = "CPU Utilization Threshold Exceeded on $1"; } if ($message =~ /CPU Utilization Okay\nCPU Utilization for (.*?)\n/s) { $color = chr(27) . "[32;1m"; $reset = chr(27) . "[0m"; $message = "CPU Utilization Okay on $1"; } print "$color$timestamp :: $message$reset\n"; } $sth->finish; sleep(10); } $dbh->disconnect();