Template update.
[carnet-upgrade.git] / files / etc / init.d / amavisd-cn.expect
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 '
11 # note: pgrep -f takes a regexp, and this is shell expanded once, hence \\
12
13 start () {
14   local daemon IFSOLD name script user psname pidfile num fdname
15   daemon="$1"
16   IFSOLD="$IFS"
17   IFS=" " # tab
18   read name script user psname pidfile num fdname <<-EOPTS
19         $(echo "$options" | sed 's/             */      /g' | grep ^$daemon)
20         EOPTS
21   IFS="$IFSOLD"
22   /etc/init.d/$script start
23   wait_for_fds "$daemon"
24 }
25
26 stop () {
27   local daemon IFSOLD name script user psname pidfile num fdname
28   daemon="$1"
29   n=10
30   IFSOLD="$IFS"
31   IFS=" " # tab
32   read name script user psname pidfile num fdname <<-EOPTS
33         $(echo "$options" | sed 's/             */      /g' | grep ^$daemon)
34         EOPTS
35   IFS="$IFSOLD"
36   /etc/init.d/$script stop
37   pkill -u $user -f "$psname" > /dev/null || true
38   while pgrep -u $user -f "$psname" > /dev/null && [ "$n" -gt 0 ]
39   do
40     sleep 1
41     n=$(($n-1))
42   done
43   pkill -9 -u $user -f "$psname" > /dev/null || true
44   #pkill -9 -u $user -x "$daemon"
45   if pgrep -u $user -f "$psname" > /dev/null; then  # still there?
46     return 1
47   fi
48 }
49
50 wait_for_fds () {
51   # wait until process shows some I/O readiness :)
52   local name IFSOLD num sleep maxtry script user psname pidfile fdname
53   name="$1"
54   [ -z "$name" ] && return 1
55   IFSOLD="$IFS"
56   IFS=" " # tab
57   read name script user psname pidfile num fdname <<-EOPTS
58         $(echo "$options" | sed 's/             */      /g' | grep ^$name)
59         EOPTS
60   IFS="$IFSOLD"
61   num=${num:-4}
62   sleep=${sleep:-1}
63   maxtry=${maxtry:-90}
64   if [ -n "$pidfile" ]; then
65     pidfile=/var/run/$pidfile
66     findpid="[ -f $pidfile ] && cat $pidfile || true"
67   else
68     findpid="pgrep -u $user -f \"$psname\" -P 1 | head -1"
69   fi
70
71   # loop the loop the loop
72   try=1
73   while /bin/true
74   do
75     sleep $sleep                           # 1st, give it a chance to run
76     pid=`eval $findpid`                    # 2nd: find it
77     if [ ! -z "$pid" ]; then
78             count=`ls -1 /proc/$pid/fd 2>/dev/null| wc -l`    # 3rd: count all it's worth
79             [ "$count" -ge "$num" ] && ls -l /proc/$pid/fd | grep -q $fdname \
80                                     && return      # success -- release
81     fi
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 mta=postfix
109
110 case "$arg" in
111   start|stop|restart|reload|force-reload|debug)
112         /etc/init.d/amavis.amavisd-new "$arg"
113         ;;
114
115   istart)
116         start clamd
117         start amavis
118         /etc/init.d/$mta start
119         ;;
120
121   istop)
122         /etc/init.d/$mta stop
123         stop amavis
124         stop clamd
125         ;;
126
127   irestart|ireload|iforce-reload)
128         $0 stop
129         sleep 2
130         $0 start
131         ;;
132
133   *)
134         echo "Usage: $0 {start|stop|restart|reload|force-reload}" >&2
135         exit 1
136         ;;
137 esac
138
139 exit 0