diff --git a/html/pages/device/apps/mailscanner.inc.php b/html/pages/device/apps/mailscanner.inc.php new file mode 100644 index 000000000..b2644aedd --- /dev/null +++ b/html/pages/device/apps/mailscanner.inc.php @@ -0,0 +1,22 @@ + 'MailScanner Statistics'); + +foreach ($graphs as $key => $text) +{ + $graph_type = $key; + $graph_array['height'] = "100"; + $graph_array['width'] = "215"; + $graph_array['to'] = $now; + $graph_array['id'] = $app['app_id']; + $graph_array['type'] = "application_".$key; + + echo('

'.$text.'

'); + echo(""); + include("includes/print-quadgraphs.inc.php"); + echo(""); +} + +?> \ No newline at end of file diff --git a/includes/polling/applications/mailscanner.inc.php b/includes/polling/applications/mailscanner.inc.php new file mode 100644 index 000000000..b1f2eb54a --- /dev/null +++ b/includes/polling/applications/mailscanner.inc.php @@ -0,0 +1,41 @@ + diff --git a/includes/polling/applications/ntp-client.inc.php b/includes/polling/applications/ntp-client.inc.php index 92c7ff097..c31467f7c 100644 --- a/includes/polling/applications/ntp-client.inc.php +++ b/includes/polling/applications/ntp-client.inc.php @@ -15,11 +15,11 @@ list ($offset, $frequency, $jitter, $noise, $stability) = explode("\n", $ntpclie if (!is_file($rrd_filename)) { rrdtool_create($rrd_filename, "--step 300 \ - DS:offset:GAUGE:600:-100:125000000000 \ - DS:frequency:GAUGE:600:-100:125000000000 \ - DS:jitter:GAUGE:600:-100:125000000000 \ - DS:noise:GAUGE:600:-100:125000000000 \ - DS:stability:GAUGE:600:-100:125000000000 \ + DS:offset:GAUGE:600:-1000:1000 \ + DS:frequency:GAUGE:600:-1000:1000 \ + DS:jitter:GAUGE:600:-1000:1000 \ + DS:noise:GAUGE:600:-1000:1000 \ + DS:stability:GAUGE:600:-1000:1000 \ RRA:AVERAGE:0.5:1:600 \ RRA:AVERAGE:0.5:6:700 \ RRA:AVERAGE:0.5:24:775 \ diff --git a/includes/polling/applications/ntpd-server.inc.php b/includes/polling/applications/ntpd-server.inc.php index f64fd038e..cc4cfc636 100644 --- a/includes/polling/applications/ntpd-server.inc.php +++ b/includes/polling/applications/ntpd-server.inc.php @@ -15,16 +15,16 @@ list ($stratum, $offset, $frequency, $jitter, $noise, $stability, $uptime, $buff if (!is_file($rrd_filename)) { rrdtool_create($rrd_filename, "--step 300 \ - DS:stratum:GAUGE:600:-100:125000000000 \ - DS:offset:GAUGE:600:-100:125000000000 \ - DS:frequency:GAUGE:600:-100:125000000000 \ - DS:jitter:GAUGE:600:-100:125000000000 \ - DS:noise:GAUGE:600:-100:125000000000 \ - DS:stability:GAUGE:600:-100:125000000000 \ + DS:stratum:GAUGE:600:-1000:1000 \ + DS:offset:GAUGE:600:-1000:1000 \ + DS:frequency:GAUGE:600:-1000:1000 \ + DS:jitter:GAUGE:600:-1000:1000 \ + DS:noise:GAUGE:600:-1000:1000 \ + DS:stability:GAUGE:600:-1000:1000 \ DS:uptime:GAUGE:600:0:125000000000 \ - DS:buffer_recv:GAUGE:600:0:125000000000 \ - DS:buffer_free:GAUGE:600:0:125000000000 \ - DS:buffer_used:GAUGE:600:0:125000000000 \ + DS:buffer_recv:GAUGE:600:0:100000 \ + DS:buffer_free:GAUGE:600:0:100000 \ + DS:buffer_used:GAUGE:600:0:100000 \ DS:packets_drop:DERIVE:600:0:125000000000 \ DS:packets_ignore:DERIVE:600:0:125000000000 \ DS:packets_recv:DERIVE:600:0:125000000000 \ diff --git a/scripts/mailscanner.php b/scripts/mailscanner.php new file mode 100644 index 000000000..35a9f4828 --- /dev/null +++ b/scripts/mailscanner.php @@ -0,0 +1,60 @@ +#!/usr/bin/env php + + ## + ######################################################################################## + + + #### START SETTINGS #### + + $mailstats = "/opt/observium/scripts/watchmaillog/watchmaillog_counters"; + + #### END SETTINGS #### + + + ## + ## DO NOT EDIT BENETH THIS LINE + ## + ######################################################################################## + + function doSNMPv2($vars) { + $stats = array(); + if (file_exists($vars)) { + $data = file($vars); + foreach ($data as $item=>$value) { + if (!empty($value)) { + $temp = explode(':', trim($value)); + if (isset($temp[1])) { + $stats[$temp[0]] = $temp[1]; + } + } + } + } + $var['mess_recv'] = (isset($stats['mess_recv']) ? $stats['mess_recv'] : "U"); + $var['mess_rejected'] = (isset($stats['mess_rejected']) ? $stats['mess_rejected'] : "U"); + $var['mess_relay'] = (isset($stats['mess_relay']) ? $stats['mess_relay'] : "U"); + $var['mess_sent'] = (isset($stats['mess_sent']) ? $stats['mess_sent'] : "U"); + $var['mess_waiting'] = (isset($stats['mess_waiting']) ? $stats['mess_waiting'] : "U"); + $var['spam'] = (isset($stats['spam']) ? $stats['spam'] : "U"); + $var['virus'] = (isset($stats['virus']) ? $stats['virus'] : "U"); + foreach ($var as $item=>$count) { + echo $count."\n"; + } + } + + doSNMPv2($mailstats); + $fp = fopen($mailstats, 'w'); + fwrite($fp, "mess_recv:0\n"); diff --git a/scripts/shoutcast.php b/scripts/shoutcast.php index e6217227a..7af76b16d 100644 --- a/scripts/shoutcast.php +++ b/scripts/shoutcast.php @@ -13,7 +13,7 @@ ## Add the following to your snmpd.conf file: ## extend shoutcast /opt/observium/scripts/shoutcast.php ## - ## Version 1.0 By: + ## Version 1.1 By: ## All In One - Dennis de Houx ## ######################################################################################## @@ -36,6 +36,8 @@ if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD']) || isset($_SERVER['REMOTE_ADDR'])) { die('This script is only meant to run at the command line.'); } + + $cmd = (isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ""); function get_data($host, $port) { $fp = @fsockopen($host, $port, &$errno, &$errstr, 5); @@ -108,7 +110,7 @@ } } - if ($_SERVER['argv'][1] == "makeCache") { + if ($cmd == "makeCache") { $servers = get_list($config); $data = doSNMPv2($servers); makeCacheFile($data, $cache); diff --git a/scripts/watchmaillog/watchmaillog.pl b/scripts/watchmaillog/watchmaillog.pl new file mode 100644 index 000000000..1ff32c070 --- /dev/null +++ b/scripts/watchmaillog/watchmaillog.pl @@ -0,0 +1,187 @@ +#!/usr/bin/perl +# +# Daemon used to watch the maillog messages for certain messages and trigger events when +# certain messages occur +# +# By Jason Warnes +# +# Change Log +# ~~~~~~~~~~ +# 2006-08-22: Initial release +# 2006-09-05: Fixed signal handling +# Added /var/run/watchmaillog.pid file for logrotate usage +# 2006-09-07: Added proper signal handling (Thanks pvenezia!) +# Added SpamAssassin spamd checking support for SPAM (Thanks raiten!) +# 2006-09-18: Added new item mess_waiting, which is the number of messages MailScanner +# detects when a new batch is started. +# 2006-11-02: Changed the way SPAM messages were detected so the script works +# on servers configured for less verbose logging. (Thanks sdetroch!) +# 2006-11-08: Added new item mess_rejected, which is the number of rejected +# messages by Sendmail. +# 2007-02-06: Fixed close statement at end of main program. (Thanks Avenger!) +# Fixed warning messages about uninitialized $line used in pattern +# matching (Thanks Avenger!) +# 2007-05-04: Properly closed the maillog file on SIGHUP received. (Thansks thomasch!) + + +$debug=0; # 1=Debug messages are displayed, 0=No debug messages are displayed +$daemon=1; # 1=Daemonize the program, 0=Run interactive +$syslog=1; # 1=Log stuff to syslog, 0=No logging to syslog +$self="/opt/observium/scripts/watchmaillog/watchmaillog.sh"; # Location of this script +$counterfile="/opt/observium/scripts/watchmaillog/watchmaillog_counters"; # Location to store the counter file +$resetfile="/opt/observium/scripts/watchmaillog/watchmaillog_reset"; # Location of the reset counter flag file +$pidfile="/var/run/watchmaillog.pid"; # Location of the running process ID file (used in logrotate) + +use Sys::Syslog; +use POSIX; +use Time::HiRes qw( gettimeofday tv_interval ); + + $|=1; + +my $sigset = POSIX::SigSet->new(); +my $hupaction = POSIX::SigAction->new('hup_signal_handler', + $sigset, + &POSIX::SA_NODEFER); +my $osigaction = POSIX::SigAction->new('signal_handler', + $sigset, + &POSIX::SA_NODEFER); +POSIX::sigaction(&POSIX::SIGHUP, $hupaction); +POSIX::sigaction(&POSIX::SIGINT, $osigaction); +POSIX::sigaction(&POSIX::SIGTERM, $osigaction); + + +if($daemon){ + $pid=fork; + if($pid) { + open(PID,">".$pidfile) or die "Cannot open PID file: $!."; + print PID ("$pid\n"); # Write the PID out to the PID file for logrotate + close(PID); + } + exit if $pid; + die "Couldn't fork : $!" unless defined($pid); + setsid() or die "Can't start a new session: $!"; + $time_to_die=0; +} + +sub signal_handler { + $time_to_die=1; +} + +sub hup_signal_handler { + if($debug){print "got SIGHUP\n";} + close(MAILLOG); + exec($self) or die "Couldn't restart: $!\n"; +} + +if($syslog){openlog("watchmaillog","pid","daemon");} +if($syslog){syslog("notice","Starting.");} +if($debug){print("watchmaillog is starting.\n");} + +# Main part of the program +open(MAILLOG, "tail -n 0 -f /var/log/maillog|") or die "Cannot open maillog: $!."; +my $line=""; +while(!$time_to_die && ( $line = )){ +# $line=; + # Look for received messages where the sender is not from our domain(s) + if(($line=~/from\=/) && ($line!~/\@domain1.com|\@domain2.com/)){ + $item="mess_recv"; + &readcounterfile; + $counter{$item}++; + if($debug){print("Found an inbound message, incrementing the message recieve counter to $counter{$item}.\n");} + &writecounterfile; + } + # Look for messages sent to our domain(s), indicates an inbound message relayed to an internal server + if(($line=~/stat\=Sent/) && ($line=~/\@domain1.com|\@domain2.com/)){ + $item="mess_relay"; + &readcounterfile; + $counter{$item}++; + if($debug){print("Found an clean inbound message, incrementing the clean message recieve counter to $counter{$item}.\n");} + &writecounterfile; + } + # Look for sent messages to NOT our email domain(s), indicates an outbound message + if(($line=~/stat\=Sent/) && ($line!~/\@domain1.comd|\@domain2.com/)){ + $item="mess_sent"; + &readcounterfile; + $counter{$item}++; + if($debug){print("Found an outbound message, incrementing the message sent counter to $counter{$item}.\n");} + &writecounterfile; + } + # Look for rejected messages + if((($line=~/ruleset/) && ($line=~/reject\=/)) || ($line =~/rejecting/)){ + $item="mess_rejected"; + &readcounterfile; + $counter{$item}++; + if($debug){print("Found a rejected message, incrementing the message rejected counter to $counter{$item}.\n");} + &writecounterfile; + } + # Look for MailScanner spam scanning batch results + if($line=~/Spam\ Checks\:\ Found/){ + $item="spam"; + $spam_count_pos = index($line,"Spam\ Checks\:\ Found"); + $spam_count_pos2 = index($line, "\ spam\ messages"); + $spam_count = substr($line,($spam_count_pos+19),($spam_count_pos2-($spam_count_pos+19))); + &readcounterfile; + $counter{$item}=$counter{$item}+$spam_count; + if($debug){print("Found $spam_count SPAM in the MailScanner batch, incrementing the spam counter to $counter{$item}.\n");} + &writecounterfile; + } + # Look for MainScanner virus scanning batch results + if($line=~/Virus\ Scanning\:\ Found/){ + $item="virus"; + $virus_count_pos = index($line,"Virus\ Scanning\:\ Found"); + $virus_count_pos2 = index($line, "\ viruses"); + $virus_count = substr($line,($virus_count_pos+22),($virus_count_pos2-($virus_count_pos+22))); + &readcounterfile; + $counter{$item}=$counter{$item}+$virus_count; + if($debug){print("Found $virus_count viruses in the MailScanner batch, incrementing the virus counter to $counter{$item}.\n");} + &writecounterfile; + } + # Look for MailScanner waiting messages + if($line=~/New\ Batch\:\ Found/){ + $item="mess_waiting"; + $mess_waiting_pos = index($line,"New\ Batch\:\ Found"); + $mess_waiting_pos2 = index($line,"\ messages\ waiting"); + $mess_waiting = substr($line,($mess_waiting_pos+17),($mess_waiting_pos2-($mess_waiting_pos+17))); + &readcounterfile; + $counter{$item}=$mess_waiting; + if($debug){print("Mailscanner found $mess_waiting messages waiting, setting the mess_waiting counter to $counter{$item}.\n");} + &writecounterfile; + } +} +close(MAILLOG); +if($debug){print("watchmaillog is ending.\n");} +if($syslog){syslog("notice","Ending.");} +unlink($pidfile); + +# Subroutine to read the contents of the counter file +sub readcounterfile { + # Read the counter values from the file + if($debug){print("Reading contents of counter file.\n");} + open(COUNTER,$counterfile); + while($line=){ + @line=split(/\:/,$line); + chop($line[1]); # Drop the trailing LF off the value + # Check for reset counter flag file + if(-e $resetfile."_".$line[0]){ + if($debug){print("Reset counter flag file found for counter $line[0], resetting counter value to 0.\n");} + $counter{$line[0]}=0; + unlink($resetfile."_".$line[0]); + } else { + $counter{$line[0]}=$line[1]; + } + if($debug){print("Counter $line[0] = $counter{$line[0]}.\n");} + } + close(COUNTER); +} + +# Subrouting to write the contents of the counter file +sub writecounterfile { + if($debug){print("Writing counter values to counter file.\n");} + open(COUNTER,">".$counterfile); + # Write each counter item out to the counter file + foreach $item (sort keys(%counter)) { + print COUNTER ($item."\:".$counter{$item}."\n"); + } + close(COUNTER); + chmod(0666,$counterfile); +} diff --git a/scripts/watchmaillog/watchmaillog_counters b/scripts/watchmaillog/watchmaillog_counters new file mode 100644 index 000000000..59accd9c6 --- /dev/null +++ b/scripts/watchmaillog/watchmaillog_counters @@ -0,0 +1,7 @@ +mess_recv:0 +mess_rejected:0 +mess_relay:0 +mess_sent:0 +mess_waiting:0 +spam:0 +virus:0