Fixup qpsmtpd-prefork, et al, to correctly load Constants.

Make child process pretty name optional for qpsmtpd-prefork.
Ignore rather than crash for uninstalled plugins.

git-svn-id: https://svn.perl.org/qpsmtpd/branches/0.3x@675 958fd67b-6ff1-0310-b445-bb7760255be9
This commit is contained in:
John Peacock 2006-11-22 16:30:37 +00:00
parent ecb24ef131
commit b7f468404b
5 changed files with 34 additions and 7 deletions

View File

@ -1,4 +1,10 @@
0.3x 0.3x
Instead of failing with cryptic message, ignore lines in config/plugins
for uninstalled plugins. (John Peacock)
Patch to prefork code to make it run (Leonardo Helman). Add --pretty
option to qpsmtpd-prefork to change $0 for child processes (John Peacock).
Add support for multiple plugin directories, whose paths are given by the Add support for multiple plugin directories, whose paths are given by the
'plugin_dirs' configuration. (Devin Carraway, Nick Leverton) 'plugin_dirs' configuration. (Devin Carraway, Nick Leverton)

View File

@ -122,8 +122,8 @@ sub config {
sub config_dir { sub config_dir {
my ($self, $config) = @_; my ($self, $config) = @_;
my $configdir = ($ENV{QMAIL} || '/var/qmail') . '/control'; my $configdir = ($ENV{QMAIL} || '/var/qmail') . '/control';
my ($name) = ($0 =~ m!(.*?)/([^/]+)$!); my ($path) = ($ENV{PROCESS} ? $ENV{PROCESS} : $0) =~ m!(.*?)/([^/]+)$!;
$configdir = "$name/config" if (-e "$name/config/$config"); $configdir = "$path/config" if (-e "$path/config/$config");
if (exists $ENV{QPSMTPD_CONFIG}) { if (exists $ENV{QPSMTPD_CONFIG}) {
$ENV{QPSMTPD_CONFIG} =~ /^(.*)$/; # detaint $ENV{QPSMTPD_CONFIG} =~ /^(.*)$/; # detaint
$configdir = $1 if -e "$1/$config"; $configdir = $1 if -e "$1/$config";
@ -136,8 +136,8 @@ sub plugin_dirs {
my @plugin_dirs = $self->config('plugin_dirs'); my @plugin_dirs = $self->config('plugin_dirs');
unless (@plugin_dirs) { unless (@plugin_dirs) {
my ($name) = ($0 =~ m!(.*?)/([^/]+)$!); my ($path) = ($ENV{PROCESS} ? $ENV{PROCESS} : $0) =~ m!(.*?)/([^/]+)$!;
@plugin_dirs = ( "$name/plugins" ); @plugin_dirs = ( "$path/plugins" );
} }
return @plugin_dirs; return @plugin_dirs;
} }
@ -263,7 +263,8 @@ sub load_plugins {
my @loaded; my @loaded;
for my $plugin_line (@plugins) { for my $plugin_line (@plugins) {
push @loaded, $self->_load_plugin($plugin_line, $self->plugin_dirs); my $this_plugin = $self->_load_plugin($plugin_line, $self->plugin_dirs);
push @loaded, $this_plugin if $this_plugin;
} }
return @loaded; return @loaded;
@ -319,6 +320,10 @@ sub _load_plugin {
unless $plugin_line =~ /logging/; unless $plugin_line =~ /logging/;
last PLUGIN_DIR; last PLUGIN_DIR;
} }
else {
$self->log(LOGDEBUG, "Failed to load plugin - $plugin - ignoring");
return 0;
}
} }
} }
} }

View File

@ -1,5 +1,6 @@
package Qpsmtpd::SMTP::Prefork; package Qpsmtpd::SMTP::Prefork;
use Qpsmtpd::SMTP; use Qpsmtpd::SMTP;
use Qpsmtpd::Constants;
@ISA = qw(Qpsmtpd::SMTP); @ISA = qw(Qpsmtpd::SMTP);
sub dispatch { sub dispatch {

View File

@ -1,6 +1,7 @@
package Qpsmtpd::TcpServer::Prefork; package Qpsmtpd::TcpServer::Prefork;
use Qpsmtpd::TcpServer; use Qpsmtpd::TcpServer;
use Qpsmtpd::SMTP::Prefork; use Qpsmtpd::SMTP::Prefork;
use Qpsmtpd::Constants;
@ISA = qw(Qpsmtpd::SMTP::Prefork Qpsmtpd::TcpServer); @ISA = qw(Qpsmtpd::SMTP::Prefork Qpsmtpd::TcpServer);
@ -12,7 +13,7 @@ sub start_connection {
#reset info #reset info
$self->{_connection} = Qpsmtpd::Connection->new(); #reset connection $self->{_connection} = Qpsmtpd::Connection->new(); #reset connection
$self->{_transaction} = Qpsmtpd::Transaction->new(); #reset transaction $self->{_transaction} = Qpsmtpd::Transaction->new(); #reset transaction
$self->SUPER::start_connection(); $self->SUPER::start_connection(@_);
} }
sub read_input { sub read_input {
@ -53,4 +54,12 @@ sub respond {
return 1; return 1;
} }
sub disconnect {
my $self = shift;
$self->log(LOGDEBUG,"click, disconnecting");
$self->SUPER::disconnect(@_);
$self->run_hooks("post-connection");
die "disconnect_tcpserver";
}
1; 1;

View File

@ -59,6 +59,7 @@ my $d_start = 0;
my $quiet = 0; my $quiet = 0;
my $status = 0; my $status = 0;
my $signal = ''; my $signal = '';
my $pretty = 0;
my $user; my $user;
# help text # help text
@ -73,6 +74,7 @@ Usage: qpsmtpd-prefork [ options ]
--max-from-ip int : Limit number of connections from single IP (default: $maxconnip, 0 to disable) --max-from-ip int : Limit number of connections from single IP (default: $maxconnip, 0 to disable)
--children int : Max number of children that can be spawned (default: $max_children) --children int : Max number of children that can be spawned (default: $max_children)
--idle-children int : Number of idle children to spawn (default: $idle_children, 0 to disable) --idle-children int : Number of idle children to spawn (default: $idle_children, 0 to disable)
--pretty-child : Change child process name (default: 0)
--user username : User the daemon should run as --user username : User the daemon should run as
--pid-file path : Path to pid file --pid-file path : Path to pid file
--renice-parent int : Subtract value from parent process nice level (default: $re_nice) --renice-parent int : Subtract value from parent process nice level (default: $re_nice)
@ -91,6 +93,7 @@ GetOptions(
'max-from-ip=i' => \$maxconnip, 'max-from-ip=i' => \$maxconnip,
'children=i' => \$max_children, 'children=i' => \$max_children,
'idle-children=i' => \$idle_children, 'idle-children=i' => \$idle_children,
'pretty-child' => \$pretty,
'user=s' => \$user, 'user=s' => \$user,
'renice-parent=i' => \$re_nice, 'renice-parent=i' => \$re_nice,
'help' => \&usage, 'help' => \&usage,
@ -338,7 +341,10 @@ sub new_child {
# continue to accept connections until "old age" is reached # continue to accept connections until "old age" is reached
for (my $i = 0 ; $i < $child_lifetime ; $i++) { for (my $i = 0 ; $i < $child_lifetime ; $i++) {
# accept a connection # accept a connection
#$0 = 'qpsmtpd child'; # set pretty child name in process listing if ( $pretty ) {
$ENV{PROCESS} = $0 if not defined $ENV{PROCESS}; # 1st time only
$0 = 'qpsmtpd child'; # set pretty child name in process listing
}
my ($client, $iinfo) = $d->accept() my ($client, $iinfo) = $d->accept()
or die or die
"failed to create new object - $!"; # wait here until client connects "failed to create new object - $!"; # wait here until client connects