Hi all, first thanks to everbody for the valuable input, it helped me a lot to improve this init script. Please take a look at the third version of my patch and comment on it.
Thanks and a nice day Harald
--- /etc/init.d/amavisd-milter 2010-05-12 23:01:42.000000000 +0200 +++ /etc/init.d/amavisd-milter 2011-01-24 15:57:08.000000000 +0100 @@ -21,57 +21,103 @@ # Description: milter daemon for sendmail/postfix and amavisd-new ### END INIT INFO +# Define LSB functions. +. /lib/lsb/init-functions + PATH=/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/amavisd-milter NAME=amavisd-milter DESC="amavisd-milter Daemon" USER=amavis -PIDFILE=/var/run/amavis/$NAME.pid +PIDFILE=/var/run/amavis/"$NAME".pid OPTIONS="" # Exit if the package is not installed -[ -x $DAEMON ] || exit 0 +[ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present -[ -r /etc/default/$NAME ] && . /etc/default/$NAME +[ -r /etc/default/"$NAME" ] && . /etc/default/"$NAME" -[ $PIDFILE != "/var/run/amavis/$NAME.pid" ] && OPTIONS="$OPTIONS -p $PIDFILE" -[ $MILTERSOCKET ] && OPTIONS="$OPTIONS -s $MILTERSOCKET" -[ $AMAVISSOCKET ] && OPTIONS="$OPTIONS -S $AMAVISSOCKET" -[ $WORKINGDIR ] && OPTIONS="$OPTIONS -w $WORKINGDIR" -[ $EXTRAPARAMS ] && OPTIONS="$OPTIONS $EXTRAPARAMS" - -[ $PIDFILE ] && ([ -d $(dirname $PIDFILE) ] || mkdir $(dirname $PIDFILE) && chown $USER:$(id $USER -g -n) $(dirname $PIDFILE)) -[ $MILTERSOCKET ] && ([ -d $(dirname $MILTERSOCKET) ] || mkdir $(dirname $MILTERSOCKET) && chown $USER $(dirname $MILTERSOCKET)) +if [ -n "$PIDFILE" ]; then + if [ "$PIDFILE" != "/var/run/amavis/$NAME.pid" ]; then + OPTIONS="$OPTIONS -p $PIDFILE" + fi + if [ ! -e "$(dirname "$PIDFILE")" ]; then + mkdir "$(dirname "$PIDFILE")" + fi + chown "$USER":"$(id "$USER" -g -n)" "$(dirname "$PIDFILE")" +else + log_failure_msg "Error: PIDFILE variable must be defined for correct functionality" + exit 1 +fi + +if [ -n "$MILTERSOCKET" ]; then + OPTIONS="$OPTIONS -s $MILTERSOCKET" + if [ "$(echo $MILTERSOCKET | grep ^inet)" ]; then + MILTERSOCKETTYPE=tcp + else + MILTERSOCKETTYPE=pipe + if [ ! -e "$(dirname "$MILTERSOCKET")" ]; then + mkdir "$(dirname "$MILTERSOCKET")" + fi + chown "$USER" "$(dirname "$MILTERSOCKET")" + fi +fi + +[ -n "$AMAVISSOCKET" ] && OPTIONS="$OPTIONS -S $AMAVISSOCKET" +[ -n "$WORKINGDIR" ] && OPTIONS="$OPTIONS -w $WORKINGDIR" +[ -n "$EXTRAPARAMS" ] && OPTIONS="$OPTIONS $EXTRAPARAMS" START="--start --quiet --chuid $USER --pidfile $PIDFILE --startas $DAEMON --name $NAME -- $OPTIONS" STOP="--stop --quiet --retry 10 --pidfile $PIDFILE --startas $DAEMON --name $NAME" -# Define LSB functions. -. /lib/lsb/init-functions - case "$1" in start) log_daemon_msg "Starting $DESC:" "$NAME" - start-stop-daemon $START + start-stop-daemon $START + case "$?" in - 0) log_end_msg 0 - [ $MILTERSOCKET ] && [ $MILTERSOCKETOWNER ] && chown $MILTERSOCKETOWNER $MILTERSOCKET - [ $MILTERSOCKET ] && [ $MILTERSOCKETMODE ] && chmod $MILTERSOCKETMODE $MILTERSOCKET ;; - 1) log_progress_msg "already started" - log_end_msg 0 ;; - *) log_end_msg $? ;; + 0) + log_end_msg 0 + if [ "$MILTERSOCKETTYPE" = "pipe" ]; then + if [ "$MILTERSOCKETOWNER" ]; then + chown "$MILTERSOCKETOWNER" "$MILTERSOCKET" + fi + if [ "$MILTERSOCKETMODE" ]; then + chmod "$MILTERSOCKETMODE" "$MILTERSOCKET" + fi + fi + ;; + + 1) + log_progress_msg "already started" + log_end_msg 0 + ;; + + *) + log_end_msg $? + ;; + esac ;; stop) log_daemon_msg "Stopping $DESC:" "$NAME" start-stop-daemon $STOP + case "$?" in - 0) log_end_msg 0 ;; - 1) log_progress_msg "already stopped" - log_end_msg 0 ;; - *) log_end_msg $? ;; + 0) + log_end_msg 0 + ;; + + 1) + log_progress_msg "already stopped" + log_end_msg 0 + ;; + + *) log_end_msg $? + ;; + esac ;;