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