diff --git a/Changes b/Changes index bf4e3a4..16b2c44 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,6 @@ + + Add connection_time plugin + Add rcpt_regexp plugin (Hanno Hecker) Add notes method to Qpsmtpd::Address objects (Jared Johnson) diff --git a/plugins/connection_time b/plugins/connection_time new file mode 100644 index 0000000..3e6a7d5 --- /dev/null +++ b/plugins/connection_time @@ -0,0 +1,58 @@ + +=head1 NAME + +connection_time - log the duration of a connection + +=head1 DESCRIPTION + +The B plugin records the time of a connection between the +first and the last possible hook in qpsmtpd (I and +I) and writes a C (default, see below) line to +the log. + +=head1 CONFIG + +One optional argument: the name of the log level (e.g. C, +C, ...) the message should be logged with. Defaults to C. + +=cut + +use Time::HiRes qw(gettimeofday tv_interval); +use Qpsmtpd::Constants; + +sub register { + my ($self, $qp, @args) = @_; + die "too many arguments" + if @args > 1; + $self->{_level} = shift @args; + $self->{_level} = 'LOGNOTICE' + unless defined $self->{_level}; + $self->{_level} = Qpsmtpd::Constants::log_level($self->{_level}); + $self->{_level} = LOGNOTICE + unless defined $self->{_level}; +} + +sub hook_pre_connection { + my ($self, @foo) = @_; + $self->{_connection_start} = [gettimeofday]; + return (DECLINED); +} + +sub hook_post_connection { + my ($self, @foo) = @_; + if ($self->{_connection_start}) { + my $remote = $self->connection->remote_ip; + my $elapsed = sprintf( + "%.3f", + tv_interval( + $self->{_connection_start}, + [gettimeofday] + ) + ); + $self->log($self->{_level}, + "Connection time from $remote: $elapsed sec."); + } + return (DECLINED); +} + +# vim: ts=4 sw=4 expandtab syn=perl