Mail-SpamAssassin
view release on metacpan or search on metacpan
spamd-apache2/bin/apache-spamd.pl view on Meta::CPAN
defaults => { daemonize => 1, port => 783, },
moreopts => [
qw(httpd_path|httpd-path=s httpd_opt|httpd-opt=s@
httpd_directive|httpd-directive=s@ k:s apxs=s
httpd_conf|httpd-conf=s)
],
}
);
# only standalone spamd implements these options.
# you miss vpopmail? get a real MTA.
for my $option (
qw(round-robin setuid-with-sql setuid-with-ldap socketpath
socketowner socketgroup socketmode paranoid vpopmail)
)
{
die "ERROR: --$option can't be used with apache-spamd\n"
if defined $opt->{$option};
}
#
# XXX: move these options (and sanity checks for them) to M::SA::S::Config?
#
die "ERROR: '$opt->{httpd_path}' does not exist or not executable\n"
if exists $opt->{httpd_path}
and !-f $opt->{httpd_path} || !-x _;
$opt->{httpd_path} ||= 'httpd'; # FIXME: find full path
$opt->{pidfile} ||= '/var/run/apache-spamd.pid' # reasonable default
if -w '/var/run/' && -x _ && !-e '/var/run/apache-spamd.pid';
die "ERROR: --pidfile is mandatory\n" # this seems ugly, but has advantages
unless $opt->{pidfile}; # we won't be able to stop otherwise
$opt->{pidfile} = File::Spec->rel2abs($opt->{pidfile});
if (-d $opt->{pidfile}) {
die "ERROR: can't write pid, '$opt->{pidfile}' directory not writable\n"
unless -x _ && -w _;
$opt->{pidfile} = File::Spec->catfile($opt->{pidfile}, 'apache-spamd.pid');
}
if (exists $opt->{k}) { # XXX: other option name? or not?
die "ERROR: can't use -k with --httpd_conf\n" if exists $opt->{httpd_conf};
## I'm not sure if this toggle idea is a good one...
## useful for development.
$opt->{k} ||= -e $opt->{pidfile} ? 'stop' : 'start';
die "ERROR: -k start|stop|restart|reload|graceful|graceful-stop"
. " or empty for toggle\n"
unless $opt->{k} =~ /^(?:start|stop|restart|reload|graceful(?:-stop)?)$/;
}
$opt->{k} ||= 'start';
if (exists $opt->{httpd_conf}) {
die "ERROR: --httpd_conf must be a regular file\n"
if -e $opt->{httpd_conf} && !-f _;
$opt->{httpd_conf} = File::Spec->rel2abs($opt->{httpd_conf})
unless $opt->{httpd_conf} eq '-';
}
unless ($opt->{username}) {
warn "$0: Running as root, huh? Asking for trouble, aren't we?\n" if $< == 0;
$opt->{username} = getpwuid($>); # weird apache behaviour on 64bit machines if it's missing
warn "$0: setting User to '$opt->{username}', pass --username to override\n"
if $opt->{debug} =~ /\b(?:all|info|spamd|prefork|config)\b/;
}
#
# start processing command line and preparing config / cmd line for Apache
#
my @directives; # -C ... (or write these to a temporary config file)
my @run = ( # arguments to exec()
$opt->{httpd_path},
'-k', $opt->{k},
'-d', Cwd::cwd(), # XXX: smarter... home_dir_for_helpers?
);
if ($opt->{debug} =~ /\ball\b/) {
push @run, qw(-e debug);
push @directives, 'LogLevel debug';
}
push @run, '-X' if !$opt->{daemonize};
push @run, @{ $opt->{httpd_opts} } if exists $opt->{httpd_opts};
push @directives, 'ServerName ' . hostname(),
qq(PidFile "$opt->{pidfile}"),
qq(ErrorLog "$opt->{'log-file'}");
#
# only bother with these when we're not stopping
#
if ($opt->{k} !~ /stop|graceful/) {
my $modlist = join ' ', static_apache_modules($opt->{httpd_path});
push @directives,
'LoadModule perl_module ' . apache_module_path('mod_perl.so')
if $modlist !~ /\bmod.perl\.c\b/i;
# StartServers, MaxClients, etc
my $mpm = lc(
(
$modlist =~ /\b(prefork|worker|mpm_winnt|mpmt_os2
|mpm_netware|beos|event|metuxmpm|peruser)\.c\b/ix
)[0]
);
die "ERROR: unable to figure out which MPM is in use\n" unless $mpm;
push @directives, mpm_specific_config($mpm);
# directives from command line; might require mod_perl.so, so let's
# ignore these unless we're starting -- shouldn't be critical anyway
push @directives, @{ $opt->{httpd_directive} }
if exists $opt->{httpd_directive};
push @directives, "TimeOut $opt->{'timeout-tcp'}" if $opt->{'timeout-tcp'};
# Listen
push @directives, defined $opt->{'listen-ip'}
&& @{ $opt->{'listen-ip'} }
? map({ 'Listen ' . ($_ =~ /:/ ? "[$_]" : $_) . ":$opt->{port}" }
@{ $opt->{'listen-ip'} })
: "Listen $opt->{port}";
( run in 0.486 second using v1.01-cache-2.11-cpan-39bf76dae61 )