mirror of
https://git.proxmox.com/git/proxmox-spamassassin
synced 2025-04-28 15:29:05 +00:00
297 lines
8.1 KiB
Bash
Executable File
297 lines
8.1 KiB
Bash
Executable File
#! /bin/bash
|
|
# Author: Malte S. Stretz <spamassassin-contrib (at) msquadrat.de>
|
|
# Skeleton: Kurt Garloff <feedback (at) suse.de>
|
|
#
|
|
# init.d/spamd
|
|
#
|
|
# and symbolic its link
|
|
#
|
|
# /usr/local/sbin/rcspamd
|
|
#
|
|
# System startup script for the SpamAssassin daemon spamd.
|
|
#
|
|
# Install: 1. Put this script into your /etc/init.d directory.
|
|
# 2. Create a symlink in /usr/local/sbin with
|
|
# `ln -s /etc/init.d/spamd /usr/local/sbin/rcspamd`
|
|
# 3. Tell the system about the existence of this script with
|
|
# `insserv /etc/init.d/spamd`
|
|
# 4. Add the following line to your /etc/rc.config file to have
|
|
# the spamd process spawned on every boot:
|
|
# START_SPAMD=yes
|
|
# 5. You can configure spamd with two more options in rc.config:
|
|
# SPAMD_OPTS="..." add these options to the spamd command line
|
|
# (read `man spamd`).
|
|
# SPAMD_NICE=<prio> Set the scheduling priority to <prio>; keeps
|
|
# spamd from soaking up your system resources.
|
|
# "yes" is equivalent to "5".
|
|
#
|
|
# Warning: The SuSE Boot Concept has changed with SuSE 8.0. More information
|
|
# is available at <http://sdb.suse.de/en/sdb/html/mmj_network80.html>
|
|
#
|
|
# Note: The SuSE {start,kill,check}proc utils can't handle perl scripts
|
|
# which change there $0 -- like spamd. So I implemented my own
|
|
# routines which rely on the existence of the pid file.
|
|
#
|
|
### BEGIN INIT INFO
|
|
# Provides: spamd
|
|
# Required-Start: $remote_fs $syslog $network
|
|
# Required-Stop: $remote_fs $syslog $network
|
|
# Default-Start: 3 5
|
|
# Default-Stop: 0 1 2 6
|
|
# Description: spamd is a daemon process which uses SpamAssassin to check email messages for SPAM. It is normally called by spamc from an MDA.
|
|
### END INIT INFO
|
|
|
|
# Source SuSE config
|
|
if ! grep /etc/SuSE-release -e '^VERSION *= *[67]' &>/dev/null; then
|
|
echo -e "\n\n\t\033[1;31mSorry, this script just works with SuSE up to 7.x\033[m\017\t\n\n" >&2
|
|
exit 5
|
|
fi
|
|
. /etc/rc.config || exit 5
|
|
|
|
# Determine the base and follow a runlevel link name.
|
|
base=${0##*/}
|
|
link=${base#*[SK][0-9][0-9]}
|
|
|
|
# Force execution if not called by a runlevel directory.
|
|
test $link = $base && START_SPAMD=yes
|
|
test "$START_SPAMD" = yes || exit 0
|
|
|
|
# Find the spamd binary
|
|
for p in local/sbin local/bin sbin bin; do
|
|
SPAMD_BIN=/usr/$p/spamd
|
|
test -x $SPAMD_BIN && break
|
|
done
|
|
test -x $SPAMD_BIN || exit 5
|
|
|
|
# This is where the pid file is put
|
|
test -z "$SPAMD_PID" && SPAMD_PID=/var/run/spamd.pid
|
|
|
|
# Some options
|
|
test "$SPAMD_NICE" == "yes" && SPAMD_NICE=5
|
|
test -n "$SPAMD_NICE" && SPAMD_NICE="nice -n $SPAMD_NICE"
|
|
|
|
# Shell functions sourced from /etc/rc.status:
|
|
# rc_check check and set local and overall rc status
|
|
# rc_status check and set local and overall rc status
|
|
# rc_status -v ditto but be verbose in local rc status
|
|
# rc_status -v -r ditto and clear the local rc status
|
|
# rc_failed set local and overall rc status to failed
|
|
# rc_failed <num> set local and overall rc status to <num><num>
|
|
# rc_reset clear local rc status (overall remains)
|
|
# rc_exit exit appropriate to overall rc status
|
|
. /etc/rc.status
|
|
|
|
# First reset status of this service
|
|
rc_reset
|
|
|
|
# Return values acc. to LSB for all commands but status:
|
|
# 0 - success
|
|
# 1 - generic or unspecified error
|
|
# 2 - invalid or excess argument(s)
|
|
# 3 - unimplemented feature (e.g. "reload")
|
|
# 4 - insufficient privilege
|
|
# 5 - program is not installed
|
|
# 6 - program is not configured
|
|
# 7 - program is not running
|
|
#
|
|
# Note that starting an already running service, stopping
|
|
# or restarting a not-running service as well as the restart
|
|
# with force-reload (in case signalling is not supported) are
|
|
# considered a success.
|
|
|
|
function my_getpid()
|
|
# reads the pid from $SPAMD_PID and prints the pid if there's still
|
|
# a process running with that pid.
|
|
# returns:
|
|
# 0 spamd running at the printed pid
|
|
# 1 some unspecified error occurred
|
|
# 4 couldn't access a file
|
|
# 10 found a pid but no process running there
|
|
# 11 found a pid but it wasn't spamd running there
|
|
{
|
|
# does the pid file exist and is it readable?
|
|
test -f $SPAMD_PID \
|
|
-a -r $SPAMD_PID || return 4
|
|
|
|
# get the pid owning the pid file
|
|
pid=`cat $SPAMD_PID 2>/dev/null`
|
|
test -n "$pid" || return 1
|
|
|
|
# ok, found a pid, print it
|
|
echo $pid
|
|
|
|
# is there any process running at that pid?
|
|
test -f /proc/$pid/cmdline \
|
|
-a -r /proc/$pid/cmdline || return 10
|
|
|
|
# is that a spamd or what?
|
|
cmd=`cat /proc/$pid/cmdline 2>/dev/null | grep -aF $SPAMD_BIN`
|
|
test -n "$cmd" || return 11
|
|
|
|
return 0
|
|
}
|
|
|
|
function my_startproc()
|
|
# returns:
|
|
# LSB compliant values, cf. man startproc
|
|
{
|
|
# does the pid file already exist?
|
|
if [ -e $SPAMD_PID ]; then
|
|
# get the pid or return
|
|
pid=`my_getpid`
|
|
err=$?
|
|
|
|
# no stale pid file?
|
|
test $err -lt 10 && return $err
|
|
|
|
# must be a stale pid file then, remove it
|
|
rm -f $SPAMD_PID
|
|
test -e $SPAMD_PID && return 4
|
|
fi
|
|
|
|
test -x $1 || return 5
|
|
|
|
# now call spamd
|
|
$SPAMD_NICE $*
|
|
return $?
|
|
}
|
|
|
|
function my_killproc()
|
|
# parameters:
|
|
# $1 may hold a signal from kill -l; -TERM is the default
|
|
#
|
|
# returns:
|
|
# LSB compliant values, cf. man killproc
|
|
{
|
|
# if pid file doesn't exist, spamd isn't running
|
|
test -e $SPAMD_PID || return 7
|
|
|
|
# try to find the pid
|
|
pid=`my_getpid`
|
|
err=$?
|
|
|
|
# wasn't spamd running or did any other error occur?
|
|
test $err -ge 10 && return 7
|
|
test $err -ne 0 && return $err
|
|
|
|
if [ -n "$1" ]; then
|
|
sig=$1
|
|
else
|
|
sig=-TERM
|
|
fi
|
|
|
|
# send the signal
|
|
kill $sig $pid 2>/dev/null || return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
function my_checkproc()
|
|
# returns:
|
|
# LSB compliant values, cf. man checkproc
|
|
{
|
|
test -e $SPAMD_PID || return 3
|
|
|
|
my_getpid >/dev/null
|
|
err=$?
|
|
|
|
test $err -eq 0 && return 0
|
|
test $err -ge 10 && return 1
|
|
return 102
|
|
}
|
|
|
|
|
|
|
|
case "$1" in
|
|
start)
|
|
echo -n "Starting spamd"
|
|
## Start daemon with my_startproc. If this fails
|
|
## the echo return value is set appropriate.
|
|
|
|
# NOTE: startproc return 0, even if service is
|
|
# already running to match LSB spec.
|
|
my_startproc $SPAMD_BIN -d -r $SPAMD_PID $SPAMD_OPTS
|
|
|
|
# Remember status and be verbose
|
|
rc_status -v
|
|
;;
|
|
stop)
|
|
echo -n "Shutting down spamd"
|
|
## Stop daemon with my_killproc and if this fails
|
|
## set echo the echo return value.
|
|
|
|
my_killproc -TERM
|
|
|
|
# Remember status and be verbose
|
|
rc_status -v
|
|
;;
|
|
try-restart)
|
|
## Stop the service and if this succeeds (i.e. the
|
|
## service was running before), start it again.
|
|
## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
|
|
$0 status >/dev/null && $0 restart
|
|
|
|
# Remember status and be quiet
|
|
rc_status
|
|
;;
|
|
restart)
|
|
## Stop the service and regardless of whether it was
|
|
## running or not, start it again.
|
|
$0 stop
|
|
sleep 1
|
|
$0 start
|
|
|
|
# Remember status and be quiet
|
|
rc_status
|
|
;;
|
|
force-reload)
|
|
## Signal the daemon to reload its config. Most daemons
|
|
## do this on signal 1 (SIGHUP).
|
|
## If it does not support it, restart.
|
|
|
|
$0 reload
|
|
|
|
rc_status
|
|
;;
|
|
reload)
|
|
## Like force-reload, but if daemon does not support
|
|
## signalling, do nothing (!)
|
|
|
|
# If it supports signalling:
|
|
echo -n "Reload service spamd"
|
|
my_killproc -HUP
|
|
rc_status -v
|
|
|
|
## Otherwise if it does not support reload:
|
|
#rc_failed 3
|
|
#rc_status -v
|
|
;;
|
|
status)
|
|
echo -n "Checking for spamd: "
|
|
## Check status with my_checkproc, if process is running
|
|
## checkproc will return with exit status 0.
|
|
|
|
# Status has a slightly different for the status command:
|
|
# 0 - service running
|
|
# 1 - service dead, but /var/run/ pid file exists
|
|
# 2 - service dead, but /var/lock/ lock file exists
|
|
# 3 - service not running
|
|
|
|
# NOTE: checkproc returns LSB compliant status values.
|
|
my_checkproc
|
|
rc_status -v
|
|
;;
|
|
probe)
|
|
## Optional: Probe for the necessity of a reload,
|
|
## give out the argument which is required for a reload.
|
|
|
|
test /etc/mail/spamassassin/local.cf -nt $SPAMD_PID && echo force-reload
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
rc_exit
|
|
|