diff --git a/.gitignore b/.gitignore index c834bec..4ddc58c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,15 @@ /config/ /pm_to_blib /blib/ -Makefile + +# only ignore top-level Makefile; we need the one in packaging/rpm! +/Makefile Makefile.[a-z]* +# ignore file produced by rpm build process +/packaging/rpm/qpsmtpd.spec +packaging/rpm/build/ + *~ *.bak diff --git a/packaging/rpm/Makefile b/packaging/rpm/Makefile new file mode 100644 index 0000000..da8b75a --- /dev/null +++ b/packaging/rpm/Makefile @@ -0,0 +1,152 @@ +# -- generic Makefile for building RPM-based packages out of source +# code control systems (git, cvs, svn) + +SCM_TYPE := git +SCM_PATH := ../../ +#CVSROOT := $(shell cat 2>/dev/null src/CVS/Root) +#SVN_PATH := $(shell svn info ${SCM_PATH} 2>/dev/null | awk '/^URL:/{print $$2}') +#SVN_REV := $(shell svn info ${SVN_PATH} 2>/dev/null | awk '/^Last Changed Rev:/{print $$4}') + +PACKAGE := $(shell cat PACKAGE) +VERSION := $(shell cat VERSION) +RELEASE := $(shell cat RELEASE) +BASE_VER := ${VERSION}-${RELEASE} +CURRENT_PACKAGE := $(PACKAGE)-$(BASE_VER) +TARBALL := $(CURRENT_PACKAGE).tar + +DIRNAME := $(shell echo $${PWD}) +DIRBASE := $(shell basename $${PWD}) + + +.SUFFIXES: +.PHONY: clean mrclean distclean prepclean all default +.PHONY: rpm rpmdist buildrpm buildrpmdist +.PHONY: buildtarball buildtargz +.PHONY: builddir distdir prepbuildtarball +.PHONY: cvs-export git-export svn-export test-export +.PHONY: cvs-clean git-clean svn-clean test-clean +.PHONY: update + +default: rpmdist + +# -- the "rpmdist" target will build out of the SCM, but will +# use the user's default build settings (which in many cases +# is exposed as an RPM repository) +# +#rpmdist: buildrpmdist distclean +rpmdist: buildrpmdist + +buildrpmdist: buildtargz + @rpmbuild \ + --define "_package ${PACKAGE}" \ + --define "_version ${VERSION}" \ + --define "_release ${RELEASE}" \ + -ta ./build/$(TARBALL).gz + +# -- the "rpm" target will build out of the SCM, but will leave +# the resulting package in the relative ./build/ directory +# +rpm: buildrpm $(SCM_TYPE)-clean + +buildrpm: buildtargz + @echo ${PACKAGE} ${VERSION} ${RELEASE} + @rpmbuild \ + --define "_rpmdir ./build/" \ + --define "_sourcedir ./build/" \ + --define "_srcrpmdir ./build/" \ + --define "_package ${PACKAGE}" \ + --define "_version ${VERSION}" \ + --define "_release ${RELEASE}" \ + -ta ./build/$(TARBALL).gz + +buildtarball: prepbuildtarball + @tar \ + --create \ + --directory ./build/ \ + --file ./build/$(TARBALL) \ + ${CURRENT_PACKAGE} + +buildtargz: buildtarball + @gzip -c < ./build/$(TARBALL) > ./build/$(TARBALL).gz + +prepbuildtarball: $(SCM_TYPE)-export + ${MAKE} update \ + && cp ${PACKAGE}.spec ./build/${CURRENT_PACKAGE} \ + && cp files/* ./build/ + +test-clean: + @cd .. \ + && rm "$(CURRENT_PACKAGE)" + +test-export: builddir + @cd .. \ + && ln -snvf $(DIRBASE) $(CURRENT_PACKAGE) \ + && tar \ + --create \ + --dereference \ + --to-stdout \ + --exclude "*.git*" \ + --exclude "*.svn*" \ + --exclude "*/CVS/*" \ + --exclude "$(CURRENT_PACKAGE)/build/*" \ + $(CURRENT_PACKAGE) \ + | tar \ + --extract \ + --directory $(CURRENT_PACKAGE)/build/ \ + --file - + +git-export: builddir prepclean + (cd $(SCM_PATH) ; git archive --format=tar --prefix=$(CURRENT_PACKAGE)/ HEAD) \ + | tar \ + --extract \ + --directory ./build/ \ + --file - + +git-clean: + @: + +cvs-export: builddir prepclean + @cd ./build/ \ + && echo CURRENT_PACKAGE: ${CURRENT_PACKAGE} \ + && echo CVSROOT: ${CVSROOT} \ + && CVSROOT=${CVSROOT} cvs export -r HEAD -d$(CURRENT_PACKAGE) ${PACKAGE} + +cvs-clean: + @: + +svn-export: builddir prepclean + @cd ./build/ \ + && svn export $(SVN_PATH) $(CURRENT_PACKAGE) + +svn-clean: + @: + +builddir: + @mkdir -p ./build + +distdir: + @mkdir -p ./dist + +prepclean: + @rm -rf ./build/$(CURRENT_PACKAGE)* + +clean: + @rm -rf ./build/* ./dist/* 2>/dev/null || : + +mrclean: clean + +distclean: clean $(SCM_TYPE)-clean + @rmdir ./build/ ./dist/ 2>/dev/null || : + +# -- recursive Makefile calls (during build phase) +# +update: $(PACKAGE).spec VERSION RELEASE + +$(PACKAGE).spec: VERSION RELEASE $(PACKAGE).spec.in + @sed \ + -e "s|@PACKAGE@|$(PACKAGE)|" \ + -e "s|@VERSION@|$(VERSION)|" \ + -e "s|@RELEASE@|$(RELEASE)|" \ + < $(PACKAGE).spec.in > $@ + +# -- end of Makefile diff --git a/packaging/rpm/PACKAGE b/packaging/rpm/PACKAGE new file mode 100644 index 0000000..9df0b30 --- /dev/null +++ b/packaging/rpm/PACKAGE @@ -0,0 +1 @@ +qpsmtpd diff --git a/packaging/rpm/RELEASE b/packaging/rpm/RELEASE new file mode 100644 index 0000000..49d5957 --- /dev/null +++ b/packaging/rpm/RELEASE @@ -0,0 +1 @@ +0.1 diff --git a/packaging/rpm/VERSION b/packaging/rpm/VERSION new file mode 100644 index 0000000..e6e9cf4 --- /dev/null +++ b/packaging/rpm/VERSION @@ -0,0 +1 @@ +0.82 diff --git a/packaging/rpm/files/README.selinux b/packaging/rpm/files/README.selinux new file mode 100644 index 0000000..39c015f --- /dev/null +++ b/packaging/rpm/files/README.selinux @@ -0,0 +1,10 @@ +If you run qpsmtpd-apache on a box with SELinux enabled, you'll need to +allow apache to listen to your SMTP port, typically port 25. + +The following command allows apache to listen on port 25: + + semanage port -m -t http_port_t -p tcp 25 + +Use the -d option to remove this permission: + + semanage port -d -t http_port_t -p tcp 25 diff --git a/packaging/rpm/files/in.qpsmtpd b/packaging/rpm/files/in.qpsmtpd new file mode 100755 index 0000000..8d45af0 --- /dev/null +++ b/packaging/rpm/files/in.qpsmtpd @@ -0,0 +1,3 @@ +#!/bin/sh +export QPSMTPD_CONFIG=/etc/qpsmtpd +exec /usr/bin/qpsmtpd 2> /dev/null diff --git a/packaging/rpm/files/qpsmtpd-forkserver.rc b/packaging/rpm/files/qpsmtpd-forkserver.rc new file mode 100755 index 0000000..14775e4 --- /dev/null +++ b/packaging/rpm/files/qpsmtpd-forkserver.rc @@ -0,0 +1,122 @@ +#! /bin/bash +# +# qpsmtpd-forkserver Start/Stop the qpsmtpd forking server +# +# chkconfig: 2345 90 60 +# description: qpsmtpd is a flexible smtpd daemon written in Perl. \ +# Apart from the core SMTP features, all functionality is \ +# implemented in small "extension plugins" using the easy \ +# to use object oriented plugin API. +# processname: qpsmtpd-forkserver +# config: /etc/qpsmtpd +# pidfile: /var/run/qpsmtpd-forkserver.pid + + +# Source function library. +. /etc/init.d/functions +. /etc/sysconfig/qpsmtpd-forkserver + +RETVAL=0 + +# See how we were called. + +prog="qpsmtpd-forkserver" + +start() { + # cleanup environment a bit. + unset PERL_UNICODE + unset LANG + unset LC_TIME + unset LC_ALL + unset BASH_ENV + unset ENV + unset CDPATH + unset IFS + + echo -n $"Starting $prog: " + trap "" 1 + daemon $prog --detach $QPSMTPD_OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog + return $RETVAL +} + +stop() { + echo -n $"Stopping $prog: " + killproc $prog + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog + return $RETVAL +} + +# functions status() uses pidof, which doesn't work with (?) scripts +qpstatus() { + local base=${1##*/} + local pid + + # Test syntax. + if [ "$#" = 0 ] ; then + echo $"Usage: status {program}" + return 1 + fi + + # Use "/var/run/*.pid" file for pid + if [ -f /var/run/${base}.pid ] ; then + read pid < /var/run/${base}.pid + if [ -n "$pid" ]; then + /bin/ps -p $pid >/dev/null + if [ $? -eq 0 ]; then + echo $"${base} (pid $pid) is running..." + return 0 + else + echo $"${base} dead but pid file exists" + return 1 + fi + fi + fi + # See if /var/lock/subsys/${base} exists + if [ -f /var/lock/subsys/${base} ]; then + echo $"${base} dead but subsys locked" + return 2 + fi + echo $"${base} is stopped" + return 3 +} + +restart() { + stop + start +} + +reload() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + reload) + reload + ;; + status) + qpstatus qpsmtpd-forkserver + ;; + condrestart) + [ -f /var/lock/subsys/$prog ] && restart || : + ;; + *) + echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}" + exit 1 +esac + +exit $? diff --git a/packaging/rpm/files/qpsmtpd-forkserver.sysconfig b/packaging/rpm/files/qpsmtpd-forkserver.sysconfig new file mode 100644 index 0000000..d7a7f7c --- /dev/null +++ b/packaging/rpm/files/qpsmtpd-forkserver.sysconfig @@ -0,0 +1,3 @@ +QPSMTPD_OPTIONS="-p 25 -l 127.0.0.1 --pid-file /var/run/qpsmtpd-forkserver.pid" +export QPSMTPD_CONFIG=/etc/qpsmtpd +export HOME=~smtpd diff --git a/packaging/rpm/files/qpsmtpd-plugin-file_connection b/packaging/rpm/files/qpsmtpd-plugin-file_connection new file mode 100644 index 0000000..1321049 --- /dev/null +++ b/packaging/rpm/files/qpsmtpd-plugin-file_connection @@ -0,0 +1,184 @@ +#!/usr/bin/perl +# $Id: file 478 2005-07-19 07:40:16Z aqua $ + +=head1 NAME + +file_connection - Simple per session log-to-file logging for qpsmtpd + +=head1 DESCRIPTION + +The 'file_connection' logging plugin for qpsmtpd records qpsmtpd log messages into a +file (or a named pipe, if you prefer.) + +The file is reopened for each connection. To facilitate automatic +logfile switching the filename can contain strftime conversion +specifiers, which are expanded immediately before opening the file. This +ensures that a single connection is never split across logfiles. + +The list of supported conversion specifiers depends on the strftime +implementation of your C library. See strftime(3) for details. +Additionally, %i exands to a (hopefully) unique session-id. + + +=head1 CONFIGURATION + +To enable the logging plugin, add a line of this form to the qpsmtpd plugins +configuration file: + +=over + +logging/file_connection [loglevel I] I + +For example: + +logging/file_connection loglevel LOGINFO /var/log/qpsmtpd/%Y-%m-%d + +=back + +Multiple instances of the plugin can be configured by appending :I for any +integer(s) I, to log to multiple files simultaneously, e.g. to log critical +errors and normally verbose logs elsewhere. + +The following optional configuration setting can be supplied: + +=over + +=item loglevel I + +The internal log level below which messages will be logged. The I +given should be chosen from this list. Priorities count downward (for example, +if LOGWARN were selected, LOGERROR, LOGCRIT and LOGEMERG messages would be +logged as well): + +=over + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=back + +=back + + +The chosen I should be writable by the user running qpsmtpd; it will be +created it did not already exist, and appended to otherwise. + +=head1 AUTHOR + +Peter J. Holzer , based on a plugin by +Devin Carraway + +=head1 LICENSE + +Copyright (c) 2005, Devin Carraway. + +This plugin is licensed under the same terms as the qpsmtpd package itself. +Please see the LICENSE file included with qpsmtpd for details. + +=cut + +use strict; +use warnings; + +use IO::File; +#use Sys::Hostname; +use POSIX qw(strftime); + +sub register { + my ($self, $qp, @args) = @_; + my %args; + + $self->{_loglevel} = LOGWARN; + + while (1) { + last if !@args; + if (lc $args[0] eq 'loglevel') { + shift @args; + my $ll = shift @args; + if (!defined $ll) { + warn "Malformed arguments to logging/file_connection plugin"; + return; + } + if ($ll =~ /^(\d+)$/) { + $self->{_loglevel} = $1; + } + elsif ($ll =~ /^(LOG\w+)$/) { + $self->{_loglevel} = log_level($1); + defined $self->{_loglevel} or $self->{_loglevel} = LOGWARN; + } + } + else { last } + } + + unless (@args && $args[0]) { + warn "Malformed arguments to syslog plugin"; + return; + } + + $self->{_logfile} = join(' ', @args); + $self->{_log_session_id_prefix} = sprintf("%08x%04x", time(), $$); + $self->{_log_session_id_counter} = 0; + + $self->register_hook('logging', 'write_log'); + $self->register_hook('pre-connection', 'open_log'); + $self->open_log($qp); +} + +sub open_log { + my ($self, $qp) = @_; + my $output = $self->{_logfile}; + $self->{_log_session_id} = + $self->{_log_session_id_prefix} . "." . + ++$self->{_log_session_id_counter}; + + $output =~ s/%i/$self->{_log_session_id}/; + $output = strftime($output, localtime); + #print STDERR "open_log: output=$output, uid=$>\n"; + if ($output =~ /^\s*\|(.*)/) { + unless ($self->{_f} = new IO::File "|$1") { + warn "Error opening log output to command $1: $!"; + return; + } + } elsif ($output =~ /^(.*)/) { # detaint + unless ($self->{_f} = new IO::File ">>$1") { + warn "Error opening log output to path $1: $!"; + return; + } + } + $self->{_f}->autoflush(1); + + return DECLINED; +} + +sub write_log { + my ($self, $txn, $trace, $hook, $plugin, @log) = @_; + + return DECLINED if $trace > $self->{_loglevel}; + return DECLINED if defined $plugin and $plugin eq $self->plugin_name; + $self->open_log unless($self->{_f}); + + my $f = $self->{_f}; + print STDERR "no open file\n" unless (defined $f); + print $f join(" ", + strftime("%Y-%m-%dT%H:%M:%S%z", localtime), $self->{_log_session_id}, + (defined $plugin ? " $plugin plugin:" : + defined $hook ? " running plugin ($hook):" : ""), + @log), "\n"; + return DECLINED; +} + +# vi: tabstop=4 shiftwidth=4 expandtab: + diff --git a/packaging/rpm/files/qpsmtpd-xinetd b/packaging/rpm/files/qpsmtpd-xinetd new file mode 100644 index 0000000..31ad54c --- /dev/null +++ b/packaging/rpm/files/qpsmtpd-xinetd @@ -0,0 +1,19 @@ +# default: on +# description: The telnet server serves telnet sessions; it uses \ +# unencrypted username/password pairs for authentication. +service smtp +{ + flags = REUSE + socket_type = stream + wait = no + user = smtpd + groups = yes + server = /usr/sbin/in.qpsmtpd + log_on_failure += USERID + disable = yes + rlimit_as = 128M + instances = 40 + per_source = 10 + cps = 50 10 +} + diff --git a/packaging/rpm/files/qpsmtpd.conf b/packaging/rpm/files/qpsmtpd.conf new file mode 100644 index 0000000..b46ead7 --- /dev/null +++ b/packaging/rpm/files/qpsmtpd.conf @@ -0,0 +1,16 @@ +Listen 0.0.0.0:25 smtp +AcceptFilter smtp none +## "smtp" and the AcceptFilter are required for Linux, FreeBSD +## with apache >= 2.1.5, for others it doesn't hurt. See also +## http://httpd.apache.org/docs/2.2/mod/core.html#acceptfilter +## and http://httpd.apache.org/docs/2.2/mod/mpm_common.html#listen + + + use Apache::Qpsmtpd; + $ENV{QPSMTPD_CONFIG} = "/etc/qpsmtpd"; + + + + PerlModule Apache::Qpsmtpd + PerlProcessConnectionHandler Apache::Qpsmtpd + diff --git a/packaging/rpm/qpsmtpd.spec.in b/packaging/rpm/qpsmtpd.spec.in new file mode 100644 index 0000000..f591ed6 --- /dev/null +++ b/packaging/rpm/qpsmtpd.spec.in @@ -0,0 +1,335 @@ +Name: %{_package} +Version: %{_version} +Release: %{_release} + +Summary: qpsmtpd + qpsmtpd-apache + qpsmtpd-async +License: MIT +Group: System Environment/Daemons +URL: http://smtpd.develooper.com/ +BuildRoot: %{_builddir}/%{name}-%{version}-%{release}-root +BuildRequires: perl >= 0:5.00503 +BuildArchitectures: noarch +Requires: perl(Mail::Header), perl(Net::DNS) perl(Net::IP) perl(IPC::Shareable) +Requires(pre): coreutils, shadow-utils, perl + +Source0: %{name}-%{version}-%{release}.tar.gz +Source1: qpsmtpd-forkserver.rc +Source2: qpsmtpd-forkserver.sysconfig +Source3: qpsmtpd-plugin-file_connection +Source4: qpsmtpd-xinetd +Source5: in.qpsmtpd +Source6: qpsmtpd.conf +Source7: README.selinux + +%description +qpsmtpd is a flexible smtpd daemon written in Perl. Apart from the core +SMTP features, all functionality is implemented in small "extension +plugins" using the easy to use object oriented plugin API. + +qpsmtpd was originally written as a drop-in qmail-smtpd replacement, but +now it also includes a smtp forward and a postfix "backend". + +%package apache +Requires: perl(mod_perl2) +Summary: mod_perl-2 connection handler for qpsmtpd +Group: System Environment/Daemons + +%package async +Summary: qpsmtpd using async I/O in a single process +Group: System Environment/Daemons + +%description apache + +This module implements a mod_perl/apache 2.0 connection handler +that turns Apache into an SMTP server using Qpsmtpd. + +%description async +This package contains the Qpsmtpd::PollServer module, which allows +qpsmtd to handle many connections in a single process and the +qpsmpd-async which uses it. + +%prep +%setup -q -n %{name}-%{version}-%{release} + +%build +CFLAGS="$RPM_OPT_FLAGS" perl Makefile.PL INSTALLSITELIB=%{_prefix}/lib/perl5/site_perl +make + +%clean +rm -rf $RPM_BUILD_ROOT +%install + +rm -rf $RPM_BUILD_ROOT +eval `perl '-V:installarchlib'` +mkdir -p $RPM_BUILD_ROOT/$installarchlib +if grep -q DESTDIR Makefile +then + make DESTDIR=$RPM_BUILD_ROOT + find blib/lib -name '*.pm.*' -exec rm -f {} \; + make DESTDIR=$RPM_BUILD_ROOT install + +else + make PREFIX=$RPM_BUILD_ROOT/usr + find blib/lib -name '*.pm.*' -exec rm -f {} \; + make PREFIX=$RPM_BUILD_ROOT/usr install +fi +mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name} +rm -f ${RPM_BUILD_ROOT}%{_datadir}/%{name}/plugins/*.* +cp -r plugins ${RPM_BUILD_ROOT}%{_datadir}/%{name}/plugins +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name} +rm -f ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/*.* +cp -r config.sample/* ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/ +echo %{_datadir}/%{name}/plugins > ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/plugin_dirs +echo %{_localstatedir}/spool/qpsmtpd > ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/spool_dir +echo logging/file_connection loglevel LOGINFO %{_localstatedir}/log/qpsmtpd/%Y-%m-%d > ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/logging +mkdir -p ${RPM_BUILD_ROOT}%{_initrddir} +cp %{SOURCE1} ${RPM_BUILD_ROOT}%{_initrddir}/qpsmtpd-forkserver +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig +cp %{SOURCE2} ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/qpsmtpd-forkserver +cp %{SOURCE3} ${RPM_BUILD_ROOT}%{_datadir}/%{name}/plugins/logging/file_connection +mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/spool/qpsmtpd +mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/qpsmtpd +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/xinetd.d +cp %{SOURCE4} ${RPM_BUILD_ROOT}%{_sysconfdir}/xinetd.d/smtp +mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} +cp %{SOURCE5} ${RPM_BUILD_ROOT}%{_sbindir}/in.smtp +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/httpd/conf.d +cp %{SOURCE6} ${RPM_BUILD_ROOT}%{_sysconfdir}/httpd/conf.d +mkdir -p $RPM_BUILD_ROOT%{_docdir}/%{name}-apache-%{version} +cp %{SOURCE7} $RPM_BUILD_ROOT%{_docdir}/%{name}-apache-%{version} + +[ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress + +find ${RPM_BUILD_ROOT}%{_prefix} \( -name perllocal.pod -o -name .packlist \) -exec rm {} \; +find ${RPM_BUILD_ROOT}%{_prefix} -type f -print | \ + sed "s@^$RPM_BUILD_ROOT@@g" | \ + grep -v [Aa]sync | \ + grep -v packaging | \ + grep -v README.selinux | \ + grep -v /Apache | \ + grep -v /Danga | \ + grep -v Qpsmtpd/ConfigServer.pm | \ + grep -v Qpsmtpd/PollServer.pm > %{name}-%{version}-%{release}-filelist +if [ "$(cat %{name}-%{version}-%{release}-filelist)X" = "X" ] ; then + echo "ERROR: EMPTY FILE LIST" + exit -1 +fi + +%files -f %{name}-%{version}-%{release}-filelist +%defattr(-,root,root) +%doc CREDITS Changes LICENSE README README.plugins STATUS +%{_initrddir}/qpsmtpd-forkserver +%config(noreplace) %{_sysconfdir}/qpsmtpd/* +%config(noreplace) %{_sysconfdir}/xinetd.d/smtp +%config(noreplace) %{_sysconfdir}/sysconfig/qpsmtpd-forkserver +%attr(2750,qpsmtpd,clamav) %dir %{_localstatedir}/spool/qpsmtpd +%attr(0750,smtpd,smtpd) %dir %{_localstatedir}/log/qpsmtpd + +%files apache +%defattr(-,root,root) +%{_prefix}/lib/perl5/site_perl/Apache/Qpsmtpd.pm +%{_mandir}/man3/Apache::Qpsmtpd.3pm.gz +%config(noreplace) %{_sysconfdir}/httpd/conf.d/* +%doc %{_docdir}/%{name}-apache-%{version}/README.selinux + +%files async +%defattr(-,root,root) +%{_bindir}/qpsmtpd-async +%{_prefix}/lib/perl5/site_perl/Danga/Client.pm +%{_prefix}/lib/perl5/site_perl/Danga/TimeoutSocket.pm +%{_prefix}/lib/perl5/site_perl/Qpsmtpd/ConfigServer.pm +%{_prefix}/lib/perl5/site_perl/Qpsmtpd/Plugin/Async/DNSBLBase.pm +%{_prefix}/lib/perl5/site_perl/Qpsmtpd/PollServer.pm +%{_mandir}/man1/qpsmtpd-async.1.gz +%{_datadir}/%{name}/plugins/async/* + +%pre +if ! id smtpd >/dev/null 2>&1 +then + # need to create smtpd user. + if perl -e 'exit ! defined(getgrnam("postdrop"))' + then + # if postfix is installed, we will probably use + # queue/postfix, which will need this: + supp="-G postdrop" + fi + useradd -r -m $supp smtpd +fi + +%changelog +* Sun Jul 12 2009 0.82-0.1 +- Update to latest release +- don't add qpsmtpd to start-up by default +- add apache config file to qpsmtpd-apache package +- remove all patches +- use rpm macros for dirs +- use a filelist for main package instead of a long list of files + +* Tue Jul 15 2008 0.43-0.7 +- Removed SelectServer.pm from .spec file + +* Tue Mar 18 2008 0.43-0.6 +- moved config files back to /etc/qpsmtpd following some changes + to the qpsmtpd src + +* Tue Mar 18 2008 0.43-0.5 +- moved config files to /etc/qpsmtpd/config + +* Tue Mar 18 2008 0.43-0.4 +- Moved qpsmtpd-async to /usr/bin +- Added qpsmtpd-async man page to async package +- Added async smtproute plugin to async package + +* Wed Mar 12 2008 0.43-0.3 +- Makefile.PL now updated in svn, so remove hack + +* Wed Mar 12 2008 0.43-0.2 +- Added qpsmtpd-prefork to qpsmtpd RPM, inc. hack to work round + deficiency in Makefile.PL + +* Mon Mar 10 2008 0.43-0.1 +- Updated to work with Makefile to build from svn + +* Wed Sep 12 2007 0.40-2.0 +- Updated to build trunk-r790 + +* Tue Jun 12 2007 0.40-1.0 +- updated to 0.40 - no code change. + +* Thu Jun 07 2007 0.40-0.2 +- unset environment variables which are normally tainted in perl. +- updated to 0.40rc1 +- added dependency on Net::IP (needed by some plugins) + +* Sat May 05 2007 0.33-0.5 +- moved environment cleanup into start() function, otherwise + LANG just gets reinitialized. + +* Sat May 05 2007 0.33-0.4 +- split qpsmtpd-async into a separate package to avoid dependency + on ParaDNS. + +* Sat May 05 2007 0.33-0.3 +- also unset LANG, LC_ALL and LC_TIME in startup script to prevent + locale specific Received headers (bug reported by Dominik Meyer) + +* Sun Feb 25 2007 0.33-0.2 +- 0.3x branch has been merged back to trunk. + Got current snapshot (r715) from trunk. + +* Sun Feb 25 2007 0.33-0.1 +- Start forkserver via "daemon" (Gavin Carr) +- Fixed 'service qpsmtpd-forkserver status' (Gavin Carr) +- Changed policy for config files to noreplace (Gavin Carr) + +* Sun Nov 05 2006 0.33-0.0 +- Upgraded to current snapshot from 0.3x branch (which should become + 0.33 soon-ish) +- included xinetd-support again. + +* Sat Mar 18 2006 0.32-2 +- fix dnsbl to check whether answer fits query. +- randomize Net::DNS ids for qpsmtpd-forkserver child processes. + +* Wed Mar 08 2006 0.32-1 +- New upstream 0.32 +- rc-file unsets PERL_UNICODE (bug #38397) + +* Sat Jan 28 2006 0.31.1-3 +- Use ${SOURCE*} macros to refer to source files +- Avoid invoking rpm and other cleanup in pre section +- Invoke chkconfig in post. +- (Thanks to Josko Plazonic for the reporting these problems and + suggesting fixes) + +* Tue Nov 30 2005 0.31.1-2 +- Revision 170 of plugins/loggin/file_connection: + Return DECLINED from open_log. + Open log in write_log if it isn't already open. + +* Tue Nov 29 2005 0.31.1-1 +- Commented out queue plugins from sample config +- Added dependencies +- Create smtpd user if it doesn't exist +- Added /var/log/qpsmtpd and /var/spool/qpsmtpd + +* Sat Nov 26 2005 +- Added file_connection plugin +- Startup file for qpsmtpd-forkserver now uses --detach and assumes that + a suitable logging module is configured (file_connection by default) + +* Wed Nov 23 2005 +- Forkserver drops privileges before loading plugins now. + +* Sun Nov 20 2005 +- New upstream 0.31.1 + +* Mon Nov 14 2005 0.31-8 +- New upstream 0.31rc3. +- pre-connection patch slightly simplified since upstream fixed one of + the bugs. + +* Tue Aug 23 2005 +- forced INSTALLSITELIB=/usr/lib/perl5/site_perl as suggested by + Charlie Brady. + +* Sat Aug 20 2005 0.31-7 +- RC2 from upstream. +- Removed patches which aren't applied from spec file. + +* Fri Jul 22 2005 0.31-6 +- New upstream snapshot from 0.31 branch: svn revision 509. + +* Sun Jul 17 2005 0.31-5 +- include only /etc/init.d/qpsmtpd-forkserver, not /etc/init.d + it conflicts with old initscripts packages. + +* Sun Jul 17 2005 0.31-4 +- removed tabs from forkserver + +* Sun Jul 17 2005 0.31-3 +- added startup script for forkserver +- changed BuildArchitectures to noarch. + +* Sat Jul 16 2005 0.31-2 +- pre-connection hook is now actually called, not just defined. + +* Fri Jul 15 2005 0.31-1 +- merged with 0.31. Most of my patches are now in the official release. +- merged Gavin's per-user-config patch with my dirs patch, since the + latter needs a way to turn off logging. +- added /etc/qpsmtpd/plugin_dir to package. + +* Mon Jun 13 2005 0.29-6 +- fixed removal of patch backup files +- fixed option --pid-file + +* Sun Jun 12 2005 +- avoid installing patch backup files +- split Apache::Qpsmtpd into separate package to avoid dependency hell. +- fixed URL +- changed group to Daemons. +- Fixed installation for newer versions of ExtUtils::MakeMaker + +* Wed Jun 1 2005 0.29-5 +- Really don't reap children in signal handler. + +* Tue May 31 2005 0.29-4 +- Return 421 for DENYSOFT_DISCONNECT +- Don't reap children in signal handler. + +* Thu May 19 2005 0.29-3 +- removed code to accept paths without <>. + +* Thu May 19 2005 0.29-2 +- added QPSMTPD_CONFIG env variable and plugin_dir config. +- added supplemental groups and support for pid file +- added shared_connect hook +- changed log level for SMTP dialog from DEBUG to INFO + +* Thu Apr 21 2005 hjp@hjp.at +- added plugins, /etc and docs. + +* Mon Apr 18 2005 hjp@hjp.at +- Specfile autogenerated +