4ed19e1ef3b2ce152075bb62a5050091a040a0db
[monit-cn.git] / update-monit.d
1 #!/bin/sh
2
3 MONIT_DIR=/etc/monit.d
4 TEMPLATES_DIR=/usr/share/monit-cn
5
6 check_service() {
7     RET=0
8
9     filename="$1"
10     if [ ! -r "$filename" ]; then
11         RET=1
12         return 1
13     fi
14
15     script='BEGIN { RS = "[ \t\n]+" }
16                { line[NR] = $0 "" }
17          END { for (j in line)
18                 if (line[j] == "pidfile")
19                     print line[j + 1] }'
20     pidfiles=$(awk "$script" < "$filename" | sed -e 's/"//g')
21     check_pidfile $pidfiles
22     return $RET
23 }
24
25 check_pidfile() {
26     RET=0
27
28     while [ -n "$1" ]; do
29         if [ -r "$1" ]; then
30             check_pid $(cat "$1")
31             if [ $RET -eq 1 ]; then
32                 return 1
33             fi
34         else
35             RET=1
36             return 1
37         fi
38         shift
39     done
40
41     return 0
42 }
43
44 check_pid() {
45     RET=0
46
47     while [ -n "$1" ]; do
48         if ! kill -0 "$1" >/dev/null 2>&1; then
49             RET=1
50             return 1
51         fi
52         shift
53     done
54
55     return 0
56 }
57
58 #####################################################################
59
60 changed=0
61 if [ ! -d "$MONIT_DIR" ]; then
62     mkdir -p "$MONIT_DIR"
63 fi
64
65 for i in $(find "$MONIT_DIR" -name '*.conf'); do
66     check_service $i
67     if [ ! $RET -eq 0 ]; then
68         serviceconf=$(basename $i)
69         echo "CN: Disabled $serviceconf"
70         mv -f $i $i.disabled
71         changed=1
72     fi
73 done
74
75 for i in $(find "$TEMPLATES_DIR" -name '*.conf'); do
76     serviceconf=$(basename $i)
77     if [ -r "$MONIT_DIR"/$serviceconf.disabled ]; then
78         check_service "$MONIT_DIR"/$serviceconf.disabled
79         if [ $RET -eq 0 ]; then
80             if [ ! -r "$MONIT_DIR"/$serviceconf ]; then
81                 echo "CN: Enabled $serviceconf (previously disabled)"
82                 mv "$MONIT_DIR"/$serviceconf.disabled \
83                     "$MONIT_DIR"/$serviceconf
84                 changed=1
85             fi
86         fi
87     else
88         check_service $i
89         if [ $RET -eq 0 ]; then
90             if [ ! -r "$MONIT_DIR"/$serviceconf ]; then
91                 echo "CN: Enabled $serviceconf (new service)"
92                 cp -a $i "$MONIT_DIR"
93                 changed=1
94             fi
95         fi
96     fi
97 done
98
99 if [ $changed -eq 1 ]; then
100     echo "CN: Stopping/restarting monit service"
101     pkill -9 -f /usr/sbin/monit || true
102 else
103     echo "CN: No new services detected, sorry"
104 fi
105
106 exit 0