Release version 6.0.2.
[carnet-upgrade.git] / files / etc / init.d / amavisd-cn.restore
1 #!/bin/sh
2
3 # amavisd-cn    /etc/init.d/ initscript wrapper for CARNetized amavisd-new
4 #
5 # Start and stop Amavis, ClamAV and Postfix/Sendmail
6
7 ### BEGIN INIT INFO
8 # Provides:          amavisd-cn
9 # Required-Start:    $local_fs $remote_fs $syslog $named $network $time
10 # Required-Stop:     $local_fs $remote_fs $syslog $named $network
11 # Should-Start:
12 # Should-Stop:
13 # Default-Start:     2 3 4 5
14 # Default-Stop:      0 1 6
15 # Short-Description: start and stop Amavis, ClamAV and Postfix/Sendmail
16 # Description:       wrapper for starting/stopping MTA and related services
17 ### END INIT INFO
18
19 set -e
20
21 # options for daemons:
22 # name  init.d/script           user    ps name for pgrep -f    pidfile, relative to /var/run   num-fds last-fd-name
23 options='
24 clamd   clamav-daemon           clamav  /usr/sbin/clamd         clamav/clamd.pid                5       clamav.log
25 amavis  amavis.amavisd-new      amavis  amavisd \\(master\\)    amavis/amavisd.pid              5       socket
26 '
27 # note: pgrep -f takes a regexp, and this is shell expanded once, hence \\
28
29 start () {
30   local daemon IFSOLD name script user psname pidfile num fdname
31   daemon="$1"
32   IFSOLD="$IFS"
33   IFS=" " # tab
34   read name script user psname pidfile num fdname <<-EOPTS
35         $(echo "$options" | sed 's/             */      /g' | grep ^$daemon)
36         EOPTS
37   IFS="$IFSOLD"
38   /etc/init.d/$script start
39   wait_for_fds "$daemon"
40 }
41
42 stop () {
43   local daemon IFSOLD name script user psname pidfile num fdname
44   daemon="$1"
45   n=10
46   IFSOLD="$IFS"
47   IFS=" " # tab
48   read name script user psname pidfile num fdname <<-EOPTS
49         $(echo "$options" | sed 's/             */      /g' | grep ^$daemon)
50         EOPTS
51   IFS="$IFSOLD"
52   /etc/init.d/$script stop
53   pkill -u $user -f "$psname" > /dev/null || true
54   while pgrep -u $user -f "$psname" > /dev/null && [ "$n" -gt 0 ]
55   do
56     sleep 1
57     n=$(($n-1))
58   done
59   pkill -9 -u $user -f "$psname" > /dev/null || true
60   #pkill -9 -u $user -x "$daemon"
61   if pgrep -u $user -f "$psname" > /dev/null; then  # still there?
62     return 1
63   fi
64 }
65
66 wait_for_fds () {
67   # wait until process shows some I/O readiness :)
68   local name IFSOLD num sleep maxtry script user psname pidfile fdname
69   name="$1"
70   [ -z "$name" ] && return 1
71   IFSOLD="$IFS"
72   IFS=" " # tab
73   read name script user psname pidfile num fdname <<-EOPTS
74         $(echo "$options" | sed 's/             */      /g' | grep ^$name)
75         EOPTS
76   IFS="$IFSOLD"
77   num=${num:-4}
78   sleep=${sleep:-1}
79   maxtry=${maxtry:-90}
80   if [ -n "$pidfile" ]; then
81     pidfile=/var/run/$pidfile
82     findpid="[ -f $pidfile ] && cat $pidfile || true"
83   else
84     findpid="pgrep -u $user -f \"$psname\" -P 1 | head -1"
85   fi
86
87   # loop the loop the loop
88   try=1
89   while /bin/true
90   do
91     sleep $sleep                           # 1st, give it a chance to run
92     pid=`eval $findpid`                    # 2nd: find it
93     if [ ! -z "$pid" ]; then
94             count=`ls -1 /proc/$pid/fd 2>/dev/null| wc -l`    # 3rd: count all it's worth
95             [ "$count" -ge "$num" ] && ls -l /proc/$pid/fd | grep -q $fdname \
96                                     && return      # success -- release
97     fi
98     try=$(($try+1))
99     [ "0$try" -ge "0$maxtry" ] && return 1 # no luck this time
100   done
101 }
102
103 # if we're called as amavisd-cn or amavis with start argument,
104 # act like one; otherwise, pass the call down
105 case "$(basename $0)" in
106   amavisd-cn)
107         arg="i$1"
108         ;;
109   amavis)
110         if [ "$1" = start ]; then
111                 arg="i$1"
112         else
113                 arg="$1"
114         fi
115         ;;
116   *)
117         arg="$1"
118         ;;
119 esac
120
121 # If there's no diversion, play possum
122 [ -x /etc/init.d/amavis.amavisd-new ] || exit 0
123
124 mta=postfix
125
126 case "$arg" in
127   start|stop|restart|reload|force-reload|debug)
128         /etc/init.d/amavis.amavisd-new "$arg"
129         ;;
130
131   istart)
132         start clamd
133         start amavis
134     if [ -x "/etc/init.d/$mta" ]; then
135             if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
136                     invoke-rc.d $mta start
137             else
138                     /etc/init.d/$mta start
139             fi
140     fi
141         ;;
142
143   istop)
144     if [ -x "/etc/init.d/$mta" ]; then
145             if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
146                     invoke-rc.d $mta stop
147             else
148                     /etc/init.d/$mta stop
149             fi
150     fi
151         stop amavis
152         stop clamd
153         ;;
154
155   irestart|ireload|iforce-reload)
156         $0 stop
157         sleep 2
158         $0 start
159         ;;
160
161   *)
162         echo "Usage: $0 {start|stop|restart|reload|force-reload}" >&2
163         exit 1
164         ;;
165 esac
166
167 exit 0