From 6bbb6b3f02e19fcc894b67ff61641cede36223e4 Mon Sep 17 00:00:00 2001 From: Stuart Gathman <stuart@gathman.org> Date: Wed, 25 Jul 2007 17:14:59 +0000 Subject: [PATCH] Move milter apps to /usr/lib/pymilter --- bms.py | 5 ++++ milter.rc | 8 +++-- milter.rc7 | 8 +++-- milter.spec | 70 ++++++++++++++++++++++++++++++++----------- spfmilter.py | 2 ++ spfmilter.rc | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ start.sh | 15 ++++++++++ 7 files changed, 172 insertions(+), 21 deletions(-) create mode 100755 spfmilter.rc create mode 100755 start.sh diff --git a/bms.py b/bms.py index df02a92..529d716 100644 --- a/bms.py +++ b/bms.py @@ -1,6 +1,9 @@ #!/usr/bin/env python # A simple milter that has grown quite a bit. # $Log$ +# Revision 1.110 2007/07/02 03:06:10 customdesigned +# Ban ips on bad mailfrom offenses as well as bad rcpts. +# # Revision 1.109 2007/06/23 20:53:05 customdesigned # Ban IPs based on too many invalid recipients in a connection. Requires # configuring check_user. Tighten HELO best_guess policy. @@ -292,6 +295,8 @@ def read_config(list): 'case_sensitive_localpart': 'no' }) cp.read(list) + if cp.has_option('milter','datadir'): + os.chdir(cp.get('milter','datadir')) # milter section tempfile.tempdir = cp.get('milter','tempdir') diff --git a/milter.rc b/milter.rc index aca5845..0840e43 100755 --- a/milter.rc +++ b/milter.rc @@ -8,7 +8,7 @@ # config: /etc/mail/pymilter.cfg # pidfile: /var/run/milter/milter.pid -python="python2.3" +python="python2.4" pidof() { set - "" @@ -32,7 +32,11 @@ start() { # Start daemons. echo -n "Starting $prog: " - daemon --check milter --user mail /var/log/milter/start.sh + if ! test -d /var/run/milter; then + mkdir -p /var/run/milter + chown mail:mail /var/run/milter + fi + daemon --check milter --user mail /var/log/milter/start.sh milter bms RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/milter diff --git a/milter.rc7 b/milter.rc7 index 21931b6..3c5aec1 100755 --- a/milter.rc7 +++ b/milter.rc7 @@ -8,7 +8,7 @@ # config: /etc/mail/pymilter.cfg # pidfile: /var/run/milter/milter.pid -python="python2.3" +python="python2.4" pidof() { set - "" @@ -32,7 +32,11 @@ start() { # Start daemons. echo -n "Starting $prog: " - daemon --check milter --user mail /var/log/milter/start.sh + if ! test -d /var/run/milter; then + mkdir -p /var/run/milter + chown mail:mail /var/run/milter + fi + daemon --check milter --user mail /var/log/milter/start.sh milter bms RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/milter diff --git a/milter.spec b/milter.spec index 36e198e..83078b1 100644 --- a/milter.spec +++ b/milter.spec @@ -23,6 +23,11 @@ %else %define python python %endif +%ifos aix4.1 +%define libdir /var/log/milter +%else +%define libdir /usr/lib/pymilter +%endif Summary: Python interface to sendmail milter API Name: %{name} @@ -55,7 +60,17 @@ Summary: BMS spam and reputation milter Requires: pyspf >= 2.0.4 %description -n milter -An effective spam filtering and reputation tracking mail application. +A complex but effective spam filtering, SPF checking, and reputation tracking +mail application. It uses pydspam if installed for bayesian filtering. + +%package spf +Group: Applications/System +Summary: BMS spam and reputation milter +Requires: pyspf >= 2.0.4 + +%description spf +A simple mail filter to add Received-SPF headers and reject forged mail. +Rejection policy is configured via sendmail access file. %prep %setup @@ -75,7 +90,9 @@ rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/var/log/milter mkdir -p $RPM_BUILD_ROOT/etc/mail mkdir $RPM_BUILD_ROOT/var/log/milter/save -cp bms.py *.txt $RPM_BUILD_ROOT/var/log/milter +mkdir -p $RPM_BUILD_ROOT%{libdir} +cp *.txt $RPM_BUILD_ROOT/var/log/milter +cp bms.py spfmilter.py $RPM_BUILD_ROOT%{libdir} cp milter.cfg $RPM_BUILD_ROOT/etc/mail/pymilter.cfg # logfile rotation @@ -109,7 +126,7 @@ EOF chmod a+x $RPM_BUILD_ROOT/etc/cron.daily/milter %ifos aix4.1 -cat >$RPM_BUILD_ROOT/var/log/milter/start.sh <<'EOF' +cat >$RPM_BUILD_ROOT%{libdir}/start.sh <<'EOF' #!/bin/sh cd /var/log/milter # uncomment to enable sgmlop if installed @@ -117,15 +134,10 @@ cd /var/log/milter exec /usr/local/bin/python bms.py >>milter.log 2>&1 EOF %else -cat >$RPM_BUILD_ROOT/var/log/milter/start.sh <<'EOF' -#!/bin/sh -cd /var/log/milter -exec >>milter.log 2>&1 -%{python} bms.py & -echo $! >/var/run/milter/milter.pid -EOF +cp start.sh $RPM_BUILD_ROOT%{libdir} mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d cp %{sysvinit} $RPM_BUILD_ROOT/etc/rc.d/init.d/milter +cp spfmilter.rc $RPM_BUILD_ROOT/etc/rc.d/init.d/spfmilter ed $RPM_BUILD_ROOT/etc/rc.d/init.d/milter <<'EOF' /^python=/ c @@ -135,7 +147,16 @@ w q EOF %endif -chmod a+x $RPM_BUILD_ROOT/var/log/milter/start.sh +ed $RPM_BUILD_ROOT/etc/rc.d/init.d/spfmilter <<'EOF' +/^python=/ +c +python="%{python}" +. +w +q +EOF +%endif +chmod a+x $RPM_BUILD_ROOT%{libdir}/start.sh mkdir -p $RPM_BUILD_ROOT/var/run/milter mkdir -p $RPM_BUILD_ROOT/usr/share/sendmail-cf/hack @@ -143,21 +164,29 @@ cp -p rhsbl.m4 $RPM_BUILD_ROOT/usr/share/sendmail-cf/hack %ifos aix4.1 %post -mkssys -s milter -p /var/log/milter/start.sh -u 25 -S -n 15 -f 9 -G mail || : +mkssys -s milter -p %{libdir}/start.sh -u 25 -S -n 15 -f 9 -G mail || : %preun if [ $1 = 0 ]; then rmssys -s milter || : fi %else -%post +%post -n milter #echo "pythonsock has moved to /var/run/milter, update /etc/mail/sendmail.cf" /sbin/chkconfig --add milter -%preun +%preun -n milter if [ $1 = 0 ]; then /sbin/chkconfig --del milter fi +%post spf +#echo "pythonsock has moved to /var/run/milter, update /etc/mail/sendmail.cf" +/sbin/chkconfig --add spfmilter + +%preun spf +if [ $1 = 0 ]; then + /sbin/chkconfig --del spfmilter +fi %endif %clean @@ -166,6 +195,7 @@ rm -rf $RPM_BUILD_ROOT %files -f INSTALLED_FILES %defattr(-,root,root) %doc README HOWTO ChangeLog NEWS TODO CREDITS sample.py milter-template.py +%config %{libdir}/start.sh %files -n milter %defattr(-,root,root) @@ -178,10 +208,8 @@ rm -rf $RPM_BUILD_ROOT %defattr(-,mail,mail) %endif %dir /var/log/milter -%dir /var/run/milter %dir /var/log/milter/save -%config /var/log/milter/start.sh -%config /var/log/milter/bms.py +%config %{libdir}/bms.py %config(noreplace) /var/log/milter/strike3.txt %config(noreplace) /var/log/milter/softfail.txt %config(noreplace) /var/log/milter/fail.txt @@ -191,6 +219,12 @@ rm -rf $RPM_BUILD_ROOT %config(noreplace) /etc/mail/pymilter.cfg /usr/share/sendmail-cf/hack/rhsbl.m4 +%files spf +%defattr(-,root,root) +%dir /var/log/milter +%{libdir}/spfmilter.py +%config(noreplace) /etc/mail/spfmilter.cfg + %changelog * Fri Jan 05 2007 Stuart Gathman <stuart@bmsi.com> 0.8.8-1 - move AddrCache, parse_addr, iniplist to Milter package @@ -200,6 +234,8 @@ rm -rf $RPM_BUILD_ROOT - private_relay config option - persist delayed DSN blacklisting - handle gossip server restart without disabling gossip +- split out pymilter and pymilter-spf packages +- move milter apps to /usr/lib/pymilter * Sat Nov 04 2006 Stuart Gathman <stuart@bmsi.com> 0.8.7-1 - More lame bounce heuristics - SPF moved to pyspf RPM diff --git a/spfmilter.py b/spfmilter.py index b97a681..3599d10 100644 --- a/spfmilter.py +++ b/spfmilter.py @@ -25,6 +25,8 @@ def read_config(list): "Return new config object." cp = MilterConfigParser() cp.read(list) + if cp.has_option('milter','datadir'): + os.chdir(cp.get('milter','datadir')) conf = Config() conf.socketname = cp.getdefault('milter','socketname', '/tmp/spfmiltersock') conf.miltername = cp.getdefault('milter','name','pyspffilter') diff --git a/spfmilter.rc b/spfmilter.rc new file mode 100755 index 0000000..e61c3f0 --- /dev/null +++ b/spfmilter.rc @@ -0,0 +1,85 @@ +#!/bin/bash +# +# spfmilter This shell script takes care of starting and stopping spfmilter. +# +# chkconfig: 2345 80 30 +# description: a process that checks SPF for messages sent through sendmail. +# processname: spfmilter +# config: /etc/mail/spfmilter.cfg +# pidfile: /var/run/milter/spfmilter.pid + +python="python2.4" + +pidof() { + set - "" + if set - `ps -e -o pid,cmd | grep "${python} spfmilter.py"` && + [ "$2" != "grep" ]; then + echo $1 + return 0 + fi + return 1 +} + +# Source function library. +. /etc/rc.d/init.d/functions + +[ -x /usr/lib/pymilter/start.sh ] || exit 0 + +RETVAL=0 +prog="spfmilter" + +start() { + # Start daemons. + + echo -n "Starting $prog: " + if ! test -d /var/run/milter; then + mkdir -p /var/run/milter + chown mail:mail /var/run/milter + fi + daemon --check milter --user mail /usr/lib/pymilter/start.sh spfmilter + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/spfmilter + return $RETVAL +} + +stop() { + # Stop daemons. + echo -n "Shutting down $prog: " + killproc milter + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/spfmilter + return $RETVAL +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + stop + start + RETVAL=$? + ;; + condrestart) + if [ -f /var/lock/subsys/spfmilter ]; then + stop + start + RETVAL=$? + fi + ;; + status) + status spfmilter + RETVAL=$? + ;; + *) + echo "Usage: $0 {start|stop|restart|condrestart|status}" + exit 1 +esac + +exit $RETVAL diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..d8de1c4 --- /dev/null +++ b/start.sh @@ -0,0 +1,15 @@ +#!/bin/sh +appname="$1" +script="${2:-${appname}}" +datadir=/var/log/milter +exec >>${datadir}/${appname}.log 2>&1 +if test -s ${datadir}/${script}.py; then + cd %{datadir} # use version in log dir if it exists for debugging +else + cd /usr/lib/pymilter +fi + +cd /var/log/milter +exec >>${appname}.log 2>&1 +python2.4 ${appname}.py & +echo $! >/var/run/milter/${appname}.pid -- GitLab