#!/usr/bin/perl -w
# -*- perl -*-
#

#%# family=snmpauto
#%# capabilities=snmpconf

use strict;

use Munin::Plugin;
use Munin::Plugin::SNMP;

my $debug = $Munin::Plugin::SNMP::DEBUG;

sub print_debug{
    print("# Debug: @_\n");
}

sub snmp_get_request{
    if ($debug){ for my $oid (@_){ print_debug("request: <$oid>"); }}

    my $session = Munin::Plugin::SNMP->session();
    my $response = $session->get_request(-varbindlist => \@_);

    if (!defined $response){
        print("# Error: " . $session->error() . "\n");
        return {};
    }

    while($debug && (my ($oid, $value) = each %$response)){
        print_debug("response: <$oid> = <$value>");
    }

    return $response;
}

my $base_oid = "1.3.6.1.4.1.29690.2.3.1.42.4";

sub ifaceItems{
    my $iface=$_[0];
    return {".$base_oid.$iface.1.0" => "Passed",
            ".$base_oid.$iface.2.0" => "Repacked",
            ".$base_oid.$iface.3.0" => "Rejected",
            ".$base_oid.$iface.4.0" => "Failed",
            ".$base_oid.$iface.5.0" => "QueueSize"};
}

my $native = ifaceItems(1);
my $milter = ifaceItems(2);
my $spamc  = ifaceItems(3);
my $rspamc = ifaceItems(4);

if (defined $ARGV[0] and $ARGV[0] eq "snmpconf")
{
    for my $oid (keys %$native, keys %$milter, keys %$spamc, keys %$rspamc){
        print "require $oid [0-9]+\n";
    }
    exit 0;
}

need_multigraph();

my ($host, $port, $version, $tail) = Munin::Plugin::SNMP->config_session();

print_debug("host=<$host:$port>, version=<$version>") if $debug;

if (!defined($host))
{
    die "# Error: Cannot understand what I'm supposed to monitor.";
}

sub print_graph{
    my ($graph, $iface) = @_;

    print "multigraph drweb_maild_processing_queue$graph\n";
    print "graph_title drweb-maild: queue size ($iface interface)\n";
    print "graph_info This graph shows the number of emails in the processing queue\n";
    print "graph_args --base 1000 -l 0\n";
    print "graph_vlabel emails\n";
    print "graph_category antivirus\n";

    print "QueueSize.info Number of emails in the processing queue\n";
    print "QueueSize.label emails in queue\n";
    print "QueueSize.type GAUGE\n";
    print "QueueSize.min 0\n";
    print "QueueSize.draw AREA\n";
    print "QueueSize.colour ED7600\n";

    print "multigraph drweb_maild_processing_speed$graph\n";
    print "graph_title drweb-maild: processing speed ($iface interface)\n";
    print "graph_info This graph shows the speed of emails processing\n";
    print "graph_args --base 1000 -l 0\n";
    print "graph_vlabel emails per / \${graph_period}\n";
    print "graph_category antivirus\n";

    print "Received.info Number of the recieved emails\n";
    print "Received.label recieved\n";
    print "Received.type DERIVE\n";
    print "Received.min 0\n";
    print "Received.draw AREA\n";
    print "Received.colour C0C0C0\n";

    print "Passed.info Number of the passed clean emails\n";
    print "Passed.label passed\n";
    print "Passed.type DERIVE\n";
    print "Passed.min 0\n";
    print "Passed.draw AREA\n";
    print "Passed.colour 00FF00\n";

    print "Repacked.info Number of the repacked emails\n";
    print "Repacked.label repacked\n";
    print "Repacked.type DERIVE\n";
    print "Repacked.min 0\n";
    print "Repacked.draw STACK\n";
    print "Repacked.colour FFF200\n";

    print "Rejected.info Number of the rejected emails\n";
    print "Rejected.label rejected\n";
    print "Rejected.type DERIVE\n";
    print "Rejected.min 0\n";
    print "Rejected.draw STACK\n";
    print "Rejected.colour 0000FF\n";

    print "Failed.info Number of the fail processed emails\n";
    print "Failed.label failed\n";
    print "Failed.type DERIVE\n";
    print "Failed.min 0\n";
    print "Failed.draw STACK\n";
    print "Failed.colour FF0000\n";
}

if ($ARGV[0] and $ARGV[0] eq "config")
{
    print "host_name $host\n" unless $host eq 'localhost';

    print_graph("", "total");

    for my $iface ("native", "milter", "spamc", "rspamc"){
        print_graph(".$iface", $iface);
    }

    exit 0;
}

my $response = snmp_get_request(keys %$native, keys %$milter, keys %$spamc, keys %$rspamc);

sub extract_values{
    my $totals = {};
    for my $hash (@_){
        while(my ($oid, $name) = each %$hash){
            my $total = $totals->{$name};
            my $value = $response->{$oid};
            if (defined $value && $value =~ /[0-9]+/){
                $total = ($total || 0) + $value;
            }
            $totals->{$name} = $total;
        }
    }
    return $totals;
}

sub print_value{
    my ($name, $value) = @_;
    print "$name.value " . (defined $value ? $value : 'U') . "\n";
}

sub printValues{
    my ($graph_name, $name_value_hash) = @_;
    my $queue_size = delete $name_value_hash->{"QueueSize"};
    print "multigraph drweb_maild_processing_queue$graph_name\n";
    print_value("QueueSize", $queue_size);

    print "multigraph drweb_maild_processing_speed$graph_name\n";

    my $received = $queue_size;
    while(my ($name, $value) = each %$name_value_hash){
        print_value($name, $value);
        $received = ($received || 0) + $value if defined $value;
    }

    print_value("Received", $received);
}

printValues(""       , extract_values($native, $milter, $spamc, $rspamc));
printValues(".native", extract_values($native));
printValues(".milter", extract_values($milter));
printValues(".spamc" , extract_values($spamc));
printValues(".rspamc", extract_values($rspamc));
