#!/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.2.1";

my $request = {
    "Virus"      => "$base_oid.1.0",
    "Suspicious" => "$base_oid.2.0",
    "Adware"     => "$base_oid.3.0",
    "Dialers"    => "$base_oid.4.0",
    "Joke"       => "$base_oid.5.0",
    "Riskware"   => "$base_oid.6.0",
    "Hacktool"   => "$base_oid.7.0"
};

if (defined $ARGV[0] and $ARGV[0] eq "snmpconf")
{
    for my $oid (values %$request){
        print "require $oid [0-9]+\n";
    }
    exit 0;
}

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.";
}

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

    print "graph_title drweb-se: malware detection speed\n";
    print "graph_info This graph shows the averages speeds of malware detection by Virus-Finding Engine\n";
    print "graph_args --base 1000\n";
    print "graph_vlabel detected malware per / \${graph_period}\n";
    print "graph_category antivirus\n";

    print "graph_total Total\n";

    print "Virus.info Detected known viruses\n";
    print "Virus.label viruses\n";
    print "Virus.type DERIVE\n";
    print "Virus.min 0\n";
    print "Virus.draw AREA\n";
    print "Virus.colour FF0000\n";

    print "Adware.info Detected adware\n";
    print "Adware.label adware\n";
    print "Adware.type DERIVE\n";
    print "Adware.min 0\n";
    print "Adware.draw STACK\n";
    print "Adware.colour FF2B00\n";

    print "Dialers.info Detected dialers\n";
    print "Dialers.label dialers\n";
    print "Dialers.type DERIVE\n";
    print "Dialers.min 0\n";
    print "Dialers.draw STACK\n";
    print "Dialers.colour FF5500\n";

    print "Joke.info Detected joke programs\n";
    print "Joke.label jokes\n";
    print "Joke.type DERIVE\n";
    print "Joke.min 0\n";
    print "Joke.draw STACK\n";
    print "Joke.colour FF8000\n";

    print "Riskware.info Detected riskware\n";
    print "Riskware.label riskware\n";
    print "Riskware.type DERIVE\n";
    print "Riskware.min 0\n";
    print "Riskware.draw STACK\n";
    print "Riskware.colour FFAA00\n";

    print "Hacktool.info Detected hacktools\n";
    print "Hacktool.label hacktools\n";
    print "Hacktool.type DERIVE\n";
    print "Hacktool.min 0\n";
    print "Hacktool.draw STACK\n";
    print "Hacktool.colour FFD500\n";

    print "Suspicious.info Detected suspicious objects\n";
    print "Suspicious.label suspicious\n";
    print "Suspicious.type DERIVE\n";
    print "Suspicious.min 0\n";
    print "Suspicious.draw STACK\n";
    print "Suspicious.colour FFFF00\n";

    exit 0;
}

my $response = snmp_get_request(values %$request);

for my $name (keys %$request){
    my $value = $response->{ $request->{ $name } };
    if (!(defined $value && $value =~ /[0-9]+/)){
        $value = 'U';
    }
    print "$name.value $value\n";
}
