Mail-MtPolicyd
view release on metacpan or search on metacpan
lib/Mail/MtPolicyd/Plugin/SaAwlLookup.pm view on Meta::CPAN
package Mail::MtPolicyd::Plugin::SaAwlLookup;
use Moose;
use namespace::autoclean;
our $VERSION = '2.05'; # VERSION
# ABSTRACT: mtpolicyd plugin for querying a spamassassin AWL database for reputation
extends 'Mail::MtPolicyd::Plugin';
use Mail::MtPolicyd::Plugin::Result;
use BerkeleyDB;
use BerkeleyDB::Hash;
use NetAddr::IP;
has 'db_file' => ( is => 'rw', isa => 'Str',
default => '/var/lib/amamvis/.spamassassin/auto-whitelist'
);
has '_awl' => (
is => 'ro', isa => 'HashRef', lazy => 1,
default => sub {
my $self = shift;
my %map;
my $db = tie %map, 'BerkeleyDB::Hash',
-Filename => $self->db_file,
-Flags => DB_RDONLY
or die "Cannot open ".$self->db_file.": $!\n" ;
return(\%map);
},
);
sub truncate_ip_v4 {
my ( $self, $ip ) = @_;
if( $ip =~ m/^(\d+\.\d+).\d+.\d+$/ ) {
return( $1 );
}
return;
}
sub truncate_ip_v6 {
my ( $self, $ip ) = @_;
my $addr = NetAddr::IP->new6( $ip.'/48' );
if( ! defined $addr ) {
return;
}
my $result = $addr->network->full6;
$result =~ s/(:0000)+/::/;
return $result;
}
sub truncate_ip {
my ( $self, $ip ) = @_;
if( $ip =~ /:/) {
return $self->truncate_ip_v6($ip);
}
return $self->truncate_ip_v4($ip);
}
sub query_awl {
my ( $self, $addr, $ip ) = @_;
my $ip_key = $self->truncate_ip( $ip );
if( ! defined $ip_key ) {
return;
}
my $count = $self->_awl->{$addr.'|ip='.$ip_key};
if( ! defined $count ) { return; }
my $total = $self->_awl->{$addr.'|ip='.$ip_key.'|totscore'};
if( ! defined $total ) { return; }
my $score = $total / $count;
return( $count, $score );
}
sub run {
my ( $self, $r ) = @_;
my $addr = $r->attr('sender');
my $ip = $r->attr('client_address');
( run in 0.943 second using v1.01-cache-2.11-cpan-fe3c2283af0 )