qpsmtpd/plugins/loadcheck

75 lines
1.4 KiB
Plaintext
Raw Normal View History

#!/usr/bin/perl
=head1 NAME
loadcheck
=head1 DESCRIPTION
Only takes email transactions if the system load is at or below a
specified level.
=head1 CONFIG
max_load
This is the 1 minute system load where we won't take transactions
if our load is higher than this value. (Default: 7)
uptime
The path to the command 'uptime' if different than the default.
(Default: /usr/bin/uptime)
Example:
loadcheck max_load 7 uptime /usr/bin/uptime
=over 4
=head1 AUTHOR
Written by Peter Eisch <peter@boku.net>.
=cut
my $VERSION = 0.01;
sub register {
my ($self, $qp, @args) = @_;
%{$self->{_args}} = @args;
$self->{_args}->{max_load} = 7
if (! defined $self->{_args}->{max_load});
$self->{_args}->{uptime} = '/usr/bin/uptime'
if (! defined $self->{_args}->{uptime});
$self->register_hook("connect", "loadcheck");
}
sub loadcheck {
my ($self, $transaction) = @_;
my $hiload = 0;
my $cmd = $self->{_args}->{uptime};
#10:33AM up 2:06, 1 user, load averages: 6.55, 3.76, 2.48
# 12:29am 2 users, load average: 0.05, 0.05, 0.06
# 12:30am up 5 days, 12:43, 1 user, load average: 0.00, 0.00, 0.00
my $res = `$self->{_args}->{uptime}`;
if ($res =~ /aver\S+: (\d+\.\d+)/) {
$hiload = $1;
}
if ($hiload > $self->{_args}->{max_load}) {
$self->log(LOGERROR, "local load too high: $hiload");
return DENYSOFT;
}
return (DECLINED, "continuing with load: $hiload");
}