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