Package: clamav-milter
Version: 0.96.3+dfsg-2~volatile1

We have recently experienced the case that clamav-milter was 'running' but the 
socket file was missing. This caused our mail
system (postfix) to reject mail with a temporary error.

Monitoring the service by checking the return code from 
'/etc/init.d/clamav-milter status' did not catch this situation.

I have updated the 'status' check to include a check for the sockets existence 
and an alternate error code (LSB correct, I
believe). See attached patch.

The patch also fixes the call to 'status_of_proc' with the variable $BASENAME 
in place of $NAME (which does not exist).
It also moves the 'local' copy of the function 'status_of_proc' below the 
sourcing of '/lib/lsb/init-functions' so that this
version of the function gets called. Before, this local copy of the function 
was just unused code in the init script. This local
copy of the LSB function now checks the existence of the clamav-milter socket 
as defined in '$SOCKET_PATH'.

Regards

Chris
--- /etc/init.d/clamav-milter	2010-09-23 13:42:48.000000000 +0200
+++ /tmp/clamav-milter	2010-10-21 10:21:00.892392574 +0200
@@ -23,35 +23,6 @@
 
 [ -x "$DAEMON" ] || exit 0
 
-status_of_proc () {
-    local pidfile daemon name status
-
-    pidfile=
-    OPTIND=1
-    while getopts p: opt ; do
-        case "$opt" in
-            p)  pidfile="$OPTARG";;
-        esac
-    done
-    shift $(($OPTIND - 1))
-
-    if [ -n "$pidfile" ]; then
-        pidfile="-p $pidfile"
-    fi
-    daemon="$1"
-    name="$2"
-
-    status="0"
-    pidofproc $pidfile $daemon >/dev/null || status="$?"
-    if [ "$status" = 0 ]; then
-        log_success_msg "$name is running"
-        return 0
-    else
-        log_failure_msg "$name is not running"
-        return $status
-    fi
-}
-
 to_lower()
 {
   word="$1"
@@ -276,6 +247,38 @@
   SOCKET="$MilterSocket"
 fi
 
+status_of_proc () {
+    local pidfile daemon name status
+
+    pidfile=
+    OPTIND=1
+    while getopts p: opt ; do
+        case "$opt" in
+            p)  pidfile="$OPTARG";;
+        esac
+    done
+    shift $(($OPTIND - 1))
+
+    if [ -n "$pidfile" ]; then
+        pidfile="-p $pidfile"
+    fi
+    daemon="$1"
+    name="$2"
+
+    status="0"
+    pidofproc $pidfile $daemon >/dev/null || status="$?"
+    if ( [ "$status" = 0 ] && [ -S $SOCKET_PATH ] ); then
+        log_success_msg "$name is running"
+        return 0
+    elif ( [ "$status" = 0 ] && [ ! -S $SOCKET_PATH ] ); then
+        log_failure_msg "$name socket missing"
+        return 4
+    else
+        log_failure_msg "$name is not running"
+        return $status
+    fi
+}
+
 wait_for_socket()
 {
   local socket; socket="$1"
@@ -431,7 +434,7 @@
   $0 start
   ;;
   status)
-  status_of_proc "$DAEMON" "$NAME"
+  status_of_proc "$DAEMON" "$BASENAME"
   exit $?
   ;;
   *)

Reply via email to