From 9f3b05d7b093a520d8bad3951ad7359ef4ecda13 Mon Sep 17 00:00:00 2001 From: "Ralf S. Engelschall" Date: Sat, 30 Dec 2006 16:14:55 +0000 Subject: [PATCH] add support for running the amavis-milter daemon --- amavisd/amavisd.patch | 121 ++++++++++++++++++++++++++++++++++++++++-- amavisd/amavisd.spec | 7 ++- amavisd/rc.amavisd | 44 +++++++++++---- 3 files changed, 156 insertions(+), 16 deletions(-) diff --git a/amavisd/amavisd.patch b/amavisd/amavisd.patch index acd97c15d5..b991fd8854 100644 --- a/amavisd/amavisd.patch +++ b/amavisd/amavisd.patch @@ -1,6 +1,6 @@ Index: amavisd.conf ---- amavisd.conf.orig 2006-09-30 11:29:20 +0200 -+++ amavisd.conf 2006-09-30 17:36:20 +0200 +--- amavisd.conf.orig 2006-11-20 18:35:32 +0100 ++++ amavisd.conf 2006-12-30 17:09:37 +0100 @@ -317,16 +317,16 @@ # ### http://www.csupomona.edu/~henson/www/projects/SAVI-Perl/ # ['Sophos SAVI', \&sophos_savi ], @@ -29,8 +29,8 @@ Index: amavisd.conf # ### http://www.clamav.net/ and CPAN (memory-hungry! clamd is preferred) # ['Mail::ClamAV', \&ask_clamav, "*", [0], [1], qr/^INFECTED: (.+)/], Index: amavislogsumm ---- amavislogsumm.orig 2006-04-04 08:33:40 +0200 -+++ amavislogsumm 2006-04-04 08:33:40 +0200 +--- amavislogsumm.orig 2006-12-30 17:09:37 +0100 ++++ amavislogsumm 2006-12-30 17:09:37 +0100 @@ -309,7 +309,7 @@ if ($spamCount > 0) { printf "\tSPAM : %5.2f\n", ($spamHitSum / $spamCount); @@ -40,3 +40,116 @@ Index: amavislogsumm printf "\tHAM : %5.2f\n", ($noneSpamHitSum / ($timeLineCount - $spamCount - $unscoredMail)); print "\n"; } +Index: helper-progs/Makefile.in +--- helper-progs/Makefile.in.orig 2004-04-11 01:51:52 +0200 ++++ helper-progs/Makefile.in 2006-12-30 17:09:37 +0100 +@@ -2,7 +2,8 @@ + # Makefile.in for amavisd-new helper-progs + + # Needed for autoconf to behave properly... +-AMAVISUSER=@AMAVISUSER@ ++AMAVIS_USER=dummy ++AMAVIS_GROUP=dummy + prefix=@prefix@ + exec_prefix=@exec_prefix@ + sbindir=@sbindir@ +@@ -11,7 +12,7 @@ + MINCLUDE=@MINCLUDE@ + # TODO : use some VERSION variable DEFS= -DVERSION=\"@VERSION@ and in the 2 .c helper programs + # additional flags +-DEFS=-D_POSIX_PTHREAD_SEMANTICS ++DEFS=-D_POSIX_PTHREAD_SEMANTICS -DAMAVIS_USER=\"$(AMAVIS_USER)\" -DMILTER_SOCKET_GROUP=\"$(AMAVIS_GROUP)\" + + all: amavis-milter amavis + +Index: helper-progs/amavis-milter.c +--- helper-progs/amavis-milter.c.orig 2004-07-02 16:44:26 +0200 ++++ helper-progs/amavis-milter.c 2006-12-30 17:11:24 +0100 +@@ -928,13 +928,14 @@ + int + main(int argc, char *argv[]) + { +-/* struct passwd *userinfo; *amavis uid* */ ++ struct passwd *userinfo; + int c, i; + char *p, *milter_socket = NULL, *milter_socket_group = NULL; + /* const char *args = "dg:p:vx"; */ +- const char *args = ":hdg:p:Dvx"; /* some mix of old and new options!!! */ ++ const char *args = ":hdg:p:DvxP:"; /* some mix of old and new options!!! */ + + pid_t pid; ++ char *pidfile = NULL; + int devnull; + + #if !defined(HAVE_MKDTEMP) && !defined(HAVE_MKTEMP) +@@ -969,6 +970,9 @@ + } + milter_socket = strdup(optarg); + break; ++ case 'P': ++ pidfile = strdup(optarg); ++ break; + case 'v': + verbosity++; + break; +@@ -998,23 +1002,20 @@ + uname(&amavis_uts); + + /* check user and group */ +-/* if (!(userinfo = getpwnam(AMAVIS_USER))) { +- * perror("getpwnam"); +- * exit(EXIT_FAILURE); +- * } +- * amavis_gid = userinfo->pw_gid; +- * if (!milter_socket_group) { +- * milter_socket_group = strdup(MILTER_SOCKET_GROUP); +- * if (!milter_socket_group) { +- * perror("strdup"); +- * exit(EXIT_FAILURE); +- * } +- * } +- * if (group_member(milter_socket_group) < 0) { +- * fprintf(stderr, "%s not member of %s group\n", AMAVIS_USER, milter_socket_group); +- * exit(EXIT_FAILURE); +- * } +- */ ++ if (!(userinfo = getpwnam(AMAVIS_USER))) { ++ perror("getpwnam"); ++ exit(EXIT_FAILURE); ++ } ++ amavis_gid = userinfo->pw_gid; ++ if (!milter_socket_group) { ++ milter_socket_group = strdup(MILTER_SOCKET_GROUP); ++ if (!milter_socket_group) { ++ perror("strdup"); ++ exit(EXIT_FAILURE); ++ } ++ } ++ group_member(milter_socket_group); ++ + if (!milter_socket) { + fprintf(stderr, "%s: no milter socket specified (missing option -p)\n\n", argv[0]); + usage(); +@@ -1115,11 +1116,22 @@ + } + } + ++ if (pidfile != NULL) { ++ FILE *fp; ++ if ((fp = fopen(pidfile, "w")) == NULL) { ++ amavis_syslog(DBG_FATAL, "Unable to write PID to file \"%s\": %s", pidfile, strerror(errno)); ++ exit(EXIT_FAILURE); ++ } ++ fprintf(fp, "%ld", (long)getpid()); ++ fclose(fp); ++ } ++ + /* change process group id */ + if (miltergroup && (setgid(miltergroup->gr_gid)) < 0) { + amavis_syslog(DBG_FATAL, "setgid(%d): %s", miltergroup->gr_gid, strerror(errno)); + exit(EX_UNAVAILABLE); + } ++ setuid(userinfo->pw_uid); + + /* smfi_settimeout(1800); */ /* defaults to 7210 seconds */ + diff --git a/amavisd/amavisd.spec b/amavisd/amavisd.spec index ed5c78b959..aed1cf4ec1 100644 --- a/amavisd/amavisd.spec +++ b/amavisd/amavisd.spec @@ -130,7 +130,9 @@ AutoReqProv: no --with-user="%{l_rusr}" \ --with-milterinc="%{l_prefix}/include/milter" \ --with-milterlib="%{l_prefix}/lib" - %{l_make} %{l_mflags} + %{l_make} %{l_mflags} \ + AMAVIS_USER="%{l_rusr}" \ + AMAVIS_GROUP="%{l_mgrp}" ) || exit $? %endif @@ -176,7 +178,7 @@ AutoReqProv: no %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT %{l_files_std} \ '%config %{l_prefix}/etc/amavisd/amavisd.conf' \ '%doc %{l_prefix}/share/amavisd/*' \ - '%attr(0750,%{l_rusr},%{l_rgrp}) %{l_prefix}/var/amavisd' \ + '%attr(0750,%{l_rusr},%{l_mgrp}) %{l_prefix}/var/amavisd' \ '%attr(0750,%{l_rusr},%{l_rgrp}) %{l_prefix}/var/amavisd/*' %files -f files @@ -202,6 +204,7 @@ AutoReqProv: no # before erase, stop service and remove log files [ $1 -eq 0 ] || exit 0 %{l_rc} amavisd stop 2>/dev/null + rm -f $RPM_INSTALL_PREFIX/var/amavisd/.spamassassin >/dev/null 2>&1 || true rm -f $RPM_INSTALL_PREFIX/var/amavisd/*.log* >/dev/null 2>&1 || true rm -f $RPM_INSTALL_PREFIX/var/amavisd/*.sum* >/dev/null 2>&1 || true exit 0 diff --git a/amavisd/rc.amavisd b/amavisd/rc.amavisd index 76acb76dc8..ad5ecf9278 100644 --- a/amavisd/rc.amavisd +++ b/amavisd/rc.amavisd @@ -5,6 +5,7 @@ %config amavisd_enable="$openpkg_rc_def" + amavisd_daemons="amavisd amavis-milter" amavisd_log_prolog="true" amavisd_log_epilog="true" amavisd_log_numfiles="10" @@ -13,10 +14,19 @@ amavisd_sum_flags="" %common - amavisd_pidfile="@l_prefix@/var/amavisd/amavisd.pid" amavisd_cfgfile="@l_prefix@/etc/amavisd/amavisd.conf" + amavisd_pidfile_amavisd="@l_prefix@/var/amavisd/amavisd.pid" + amavisd_pidfile_amavis_milter="@l_prefix@/var/amavisd/amavis-milter.pid" + amavisd_socket_amavis_milter="@l_prefix@/var/amavisd/amavis-milter.socket" amavisd_signal () { - [ -f $amavisd_pidfile ] && kill -$1 `cat $amavisd_pidfile` + [ -f $amavisd_pidfile_amavisd ] \ + && kill -$1 `cat $amavisd_pidfile_amavisd` + local rc_amavisd_amavisd=$? + [ -f $amavisd_pidfile_amavis_milter ] \ + && kill -$1 `cat $amavisd_pidfile_amavis_milter` + local rc_amavisd_amavis_milter=$? + [ $rc_amavisd_amavisd -eq 0 \ + -o $rc_amavisd_amavis_milter -eq 0 ] } %status -u @l_rusr@ -o @@ -28,28 +38,42 @@ echo "amavisd_usable=\"$amavisd_usable\"" echo "amavisd_active=\"$amavisd_active\"" -%start -u @l_rusr@ +%start -u @l_susr@ rcService amavisd enable yes || exit 0 rcService amavisd active yes && exit 0 - @l_prefix@/sbin/amavisd -c $amavisd_cfgfile + for daemon in $amavisd_daemons; do + if [ ".$daemon" = ".amavisd" ]; then + @l_prefix@/sbin/amavisd -c $amavisd_cfgfile + elif [ ".$daemon" = ".amavis-milter" -a -x @l_prefix@/sbin/amavis-milter ]; then + rm -f $amavisd_socket_amavis_milter + ( umask 002 + @l_prefix@/sbin/amavis-milter \ + -p local:$amavisd_socket_amavis_milter \ + -P $amavisd_pidfile_amavis_milter + ) || exit $? + fi + done -%stop -u @l_rusr@ +%stop -u @l_susr@ rcService amavisd enable yes || exit 0 rcService amavisd active no && exit 0 @l_prefix@/sbin/amavisd -c $amavisd_cfgfile stop + amavisd_signal TERM + sleep 1 + rm -f $amavisd_socket_amavis_milter -%restart -u @l_rusr@ +%restart -u @l_susr@ rcService amavisd enable yes || exit 0 rcService amavisd active no && exit 0 rc amavisd stop - sleep 4 + sleep 2 rc amavisd start -%daily -u @l_rusr@ +%daily -u @l_susr@ rcService amavisd enable yes || exit 0 shtool rotate -f \ -n ${amavisd_log_numfiles} -s 0 \ - -z ${amavisd_log_complevel} -m 640 \ + -z ${amavisd_log_complevel} -m 640 -o @l_rusr@ -g @l_rgrp@ \ @l_prefix@/var/amavisd/amavisd.sum logfiles="@l_prefix@/var/amavisd/amavisd.log" if [ -f "@l_prefix@/var/amavisd/amavisd.log.0" ]; then @@ -60,7 +84,7 @@ >@l_prefix@/var/amavisd/amavisd.sum 2>/dev/null shtool rotate -f \ -n ${amavisd_log_numfiles} -s ${amavisd_log_minsize} -d \ - -z ${amavisd_log_complevel} -m 640 \ + -z ${amavisd_log_complevel} -m 640 -o @l_rusr@ -g @l_rgrp@ \ -P "${amavisd_log_prolog}" \ -E "${amavisd_log_epilog}; rc amavisd restart" \ @l_prefix@/var/amavisd/amavisd.log