#!/usr/bin/perl -T
use strict;
use BerkeleyDB;

use vars qw(%keys %virus %types);

sub p1 {
  my($k,@tot_k) = @_;
  printf("%-20s %6d", $k, $keys{$k});
  for my $tot_k (@tot_k) {
    if ($keys{$tot_k} <= 0) {
      printf(",    --- %%")
    } else {
      printf(", %6.1f %%", 100*$keys{$_}/$keys{$tot_k})
    }
    print " ($tot_k)";
  }
  print "\n";
}

sub p2 {
  my($k,$tot_k) = @_;
  printf("%-20s %6d, %6.1f %% (%s)\n",
         $k, $virus{$k}, 100*$virus{$_}/$keys{$tot_k}, $tot_k);
}

  my($env) = BerkeleyDB::Env->new(
    '-Home'=>'/var/amavis/db', '-Flags'=> DB_INIT_CDB | DB_INIT_MPOOL);
  defined $env or die "BDB no env: $BerkeleyDB::Error $!";
  my($db) = BerkeleyDB::Hash->new(
    '-Filename'=>'snmp.db', '-Flags'=>DB_RDONLY, '-Env'=>$env );
  defined $db or die "BDB no dbS 1: $BerkeleyDB::Error $!";

  my($stat,$key,$val);
  for (;;) {
    %keys = (); %virus = (); %types = ();
    my($cursor) = $db->db_cursor;
    defined $cursor or die "BDB db_cursor error: $BerkeleyDB::Error";
    print "\n";
    while ( ($stat=$cursor->c_get($key,$val,DB_NEXT)) == 0 ) {
      if    ($key =~ /^virus\.byname\.(.*)\z/s) { $virus{$1}   = $val }
      else { $keys{$key} = $val }
    }
    $stat==DB_NOTFOUND  or die "BDB c_get: $BerkeleyDB::Error $!";
    $cursor->c_close==0 or die "BDB c_close error: $BerkeleyDB::Error";
    for (sort keys %keys) {
      if    (/^OpsDecTyp/)    {}  # later
      elsif (/^CacheHitsVirusMsgs$/)  { p1($_,'ContentVirusMsgs') }
      elsif (/^CacheHitsBannedMsgs$/) { p1($_,'ContentBannedMsgs') }
      elsif (/^CacheHitsSpamMsgs$/)   { p1($_,'ContentSpamMsgs') }
      elsif (/^Cache/)        { p1($_,'CacheAttempts') }
      elsif (/^Content/)      { p1($_,'InMsgs') }
      elsif (/^Quar/)         { p1($_,'QuarMsgs') }
      elsif (/^(InMsgs|Ops)/) { p1($_,'InMsgs') }
      elsif (/^Out/)          { p1($_,'OutMsgs') }
      else                    { p1($_,undef) }
    }
    for (sort { $keys{$b} <=> $keys{$a} } grep {/^OpsDecTyp/} keys %keys) {
      p1($_,'InMsgs');
    }
    for (sort { $virus{$b} <=> $virus{$a} } keys %virus) {
      p2($_,'ContentVirusMsgs');
    }
    sleep 1;
  }

END {
  $db->db_close==0 or die "BDB db_close error: $BerkeleyDB::Error $!";
}
