App-Milter-Limit
view release on metacpan or search on metacpan
lib/App/Milter/Limit.pm view on Meta::CPAN
$$conf{facility} ||= 'mail';
Sys::Syslog::openlog($$conf{identity}, $$conf{options}, $$conf{facility});
info("syslog initialized");
$SIG{__WARN__} = sub {
Sys::Syslog::syslog('warning', "warning: ".join('', @_));
};
$SIG{__DIE__} = sub {
Sys::Syslog::syslog('crit', "fatal: ".join('',@_));
die @_;
};
}
# initialize the configured state dir.
# default: /var/run/milter-limit
sub _init_statedir {
my $self = shift;
my $conf = $self->config->global;
App::Milter::Limit::Util::make_path($$conf{state_dir});
}
sub _init_driver {
my ($self, $driver) = @_;
my $driver_class = "App::Milter::Limit::Plugin::$driver";
eval "require $driver_class";
if ($@) {
die "failed to load $driver_class: $@\n";
}
debug("loaded driver $driver");
$self->driver($driver_class->instance);
}
sub register {
my $self = shift;
my $milter = $self->milter;
my $conf = $self->config->global;
if ($$conf{connection}) {
$milter->setconn($$conf{connection});
}
else {
# figure out the connection from sendmail
my $path = $milter->auto_getconn($$conf{name});
$milter->setconn($path)
or croak "auto_setconn failed";
# get the socket's file name without local: or unix:
$path = substr($path,index($path, ':')+1);
# make sure the permissions are correct
chown $$conf{user}, $$conf{group}, $path
or die "chown($path): $!";
}
my %callbacks = (
envfrom => \&_envfrom_callback
);
$milter->register($$conf{name}, \%callbacks, SMFI_CURR_ACTS);
debug("registered as $$conf{name}");
}
# drop user/group privs.
sub _drop_privileges {
my $self = shift;
my $conf = $self->config->global;
if (defined $$conf{group}) {
($(,$)) = ($$conf{group}, $$conf{group});
}
if (defined $$conf{user}) {
($<,$>) = ($$conf{user}, $$conf{user});
}
}
sub main {
my $self = shift;
$self->_drop_privileges;
my $milter = $self->milter;
my $conf = $self->config->global;
my %dispatch_args = (
max_children => $$conf{max_children} || 5,
max_requests_per_child => $$conf{max_requests_per_child} || 100
);
my $driver = $self->driver;
# add child_init hook if necessary
if ($driver->can('child_init')) {
debug("child_init hook registered");
$dispatch_args{child_init} = sub { $driver->child_init };
}
# add child_exit hook if necessary
if ($driver->can('child_exit')) {
debug("child_exit hook registered");
$dispatch_args{child_exit} = sub { $driver->child_exit };
}
my $dispatcher = Sendmail::PMilter::prefork_dispatcher(%dispatch_args);
$milter->set_dispatcher($dispatcher);
info("starting");
( run in 0.440 second using v1.01-cache-2.11-cpan-71847e10f99 )