#!/usr/bin/perl -w
use strict;
use warnings;
my ($awc_show,$awc_delete);
sub resolv($)
{ #IP-HOST
my $h1 = shift;
my $iaddr = inet_aton($h1);
my @h2=gethostbyaddr($iaddr,2);
if (defined($h2[0]))
{
return($h2[0]);
}
else
{
return("unknown");
}
}
sub r_resolv($)
{ #HOST-IP
my $name = shift;
return inet_ntoa(inet_aton($name)) or die "Cant resolv $name!\n";
}
if (@ARGV != 2 and @ARGV != 4)
{
print("Usage: pg_manage [options]
[options]
-s show hosts with:
-s N N mails received;
-s spamdomain.com spamdomain.com and subdomains hosts entrys both;
-d delete hosts with:
-d N N mails received;
-d spamdomain.com spamdomain.com host entry only;
-d *spamdomain.com spamdomain.com and subdomains hosts entrys both;
\n");
exit(1);
}
else
{
if ($ARGV[0] eq "-s")
{
$awc_show=lc($ARGV[1]);
}
elsif ($ARGV[0] eq "-d")
{
$awc_delete=lc($ARGV[1]);
}
if (@ARGV == 4)
{
if ($ARGV[2] eq "-s")
{
$awc_show=lc($ARGV[3]);
}
elsif ($ARGV[2] eq "-d")
{
$awc_delete=lc($ARGV[3]);
}
}
}
use BerkeleyDB;
use Socket;
tie(my %h, "BerkeleyDB::Btree",
-Filename => "/var/db/postgrey/postgrey_clients.db",
# -Filename => "/tmp/postgrey_clients2.db",
-Flags => DB_CREATE,
)
or die "ERROR: can't create database $ARGV[0]: $!\n";
while (my ($key, $value) = each %h)
{
my ($c,$l) = split(/,/,$value);
if (defined($awc_show))
{
if ($awc_show!~m|[^0-9]| and $awc_show <= $c)
{
my $host = resolv($key);
print("$host\[$key\]\t\t$c\n");
}
elsif ($awc_show=~m|[^0-9]|)
{
my $host=resolv($key);
if ($host=~m|$awc_show|)
{
print("$host\[$key\]\t\t$c\n");
}
}
}
if (defined($awc_delete))
{
if ($awc_delete=~m|^\*[0-9a-z].+| and $awc_delete!~m|\*\.| and $awc_delete!~m|\.\*|)
{
$awc_delete=reverse($awc_delete);
my $tail=chop($awc_delete);
$awc_delete=reverse($awc_delete);
my $tmp1=resolv($key);
if ($tmp1=~m|$awc_delete|)
{
delete $h{$key};
print("deleting $tmp1\n");
}
$awc_delete=reverse($awc_delete);
$awc_delete.=$tail;
$awc_delete=reverse($awc_delete);
}
elsif ($awc_delete=~m|^[0-9]+$|)
{
if ($c >= $awc_delete)
{
print("deleting $key with $c mails, min is $awc_delete\n");
delete $h{$key};
}
}
elsif ($awc_delete=~m|^[0-9a-z]| and $awc_delete!~m|\*\.| and $awc_delete!~m|\.\*|)
{
my $tmp1=r_resolv($awc_delete);
if ($tmp1 eq $key)
{
delete $h{$key};
print("deleting $tmp1\n");
}
}
else {die "Invalid -d option\n"}
}
}
untie %h;
exit(0);