r21: - fixups
[monit-cn.git] / update-monit.d
1 #!/bin/sh
2 #
3 # Copyright (C) 2007  Dinko Korunic, CARNet, Grupa za izradu paketa
4 #
5 # This program is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by the
7 # Free Software Foundation; either version 2 of the License, or (at your
8 # option) any later version.
9
10 MONIT_DIR=/etc/monit.d
11 TEMPLATES_DIR=/usr/share/monit-cn
12
13
14 check_service() {
15     RET=0
16     filename="$1"
17
18     if [ ! -r "$filename" ]; then
19         RET=1
20         return 1
21     fi
22
23     scriptpid='BEGIN { RS = "[ \t\n]+" }
24                { line[NR] = $0 "" }
25          END { for (j in line)
26                 if (line[j] == "pidfile")
27                     print line[j + 1] }'
28     pidfiles=$(awk "$scriptpid" < "$filename" | sed -e 's/"//g')
29     check_pidfile $pidfiles
30
31     if [ $RET -eq 1 ]; then
32         return 1
33     fi
34
35     scriptinit='BEGIN { RS = "[ \t\n]+" }
36                { line[NR] = $0 "" }
37          END { for (j in line)
38                 if (((line[j] == "start") || (line[j] == "stop")) && (line[j + 1] == "program") && (line[j + 2] == "="))
39                     print line[j + 3] }'
40     initscripts=$(awk "$scriptinit" < "$filename" | sed -e 's/"//g')
41     check_initscript $initscripts
42
43     return $RET
44 }
45
46 check_pidfile() {
47     RET=0
48
49     while [ -n "$1" ]; do
50         if [ -r "$1" ]; then
51             check_pid $(cat "$1")
52             if [ $RET -eq 1 ]; then
53                 return 1
54             fi
55         else
56             RET=1
57             return 1
58         fi
59         shift
60     done
61
62     return 0
63 }
64
65 check_initscript() {
66     RET=0
67
68     while [ -n "$1" ]; do
69         if [ ! -x "$1" ]; then
70             RET=1
71             return 1
72         fi
73         shift
74     done
75
76     return 0
77 }
78
79 check_pid() {
80     RET=0
81
82     while [ -n "$1" ]; do
83         if ! kill -0 "$1" >/dev/null 2>&1; then
84             RET=1
85             return 1
86         fi
87         shift
88     done
89
90     return 0
91 }
92
93 check_template() {
94     RET=0
95     filename="$1"
96     serviceconf=$(basename $i)
97
98     if [ ! -r "$1" ]; then
99         RET=1
100         return 1
101     fi
102
103     if [ ! -r "${TEMPLATES_DIR}/${serviceconf}" ]; then
104         RET=0
105         return 0
106     fi
107
108     if ! grep -q "^#.*monit-cn template" "$filename"; then
109         RET=0
110         return 0
111     fi
112
113     if ! cmp -s "$filename" "${TEMPLATES_DIR}/${serviceconf}"; then
114         RET=1
115         return 1
116     fi
117
118     return $RET
119 }
120
121
122 #####################################################################
123
124 changed=0
125 if [ ! -d "$MONIT_DIR" ]; then
126     mkdir -p "$MONIT_DIR"
127 fi
128
129 for i in $(find "$MONIT_DIR" -name '*.conf'); do
130     check_template $i
131     if [ ! $RET -eq 0 ]; then
132         serviceconf=$(basename $i)
133         echo "CN: Restored default $serviceconf template"
134         cp -a "${TEMPLATES_DIR}/${serviceconf}" "$MONIT_DIR"
135         changed=1
136     fi
137 done
138
139 for i in $(find "$MONIT_DIR" -name '*.conf'); do
140     check_service $i
141     if [ ! $RET -eq 0 ]; then
142         serviceconf=$(basename $i)
143         echo "CN: Disabled $serviceconf"
144         mv -f $i $i.disabled
145         changed=1
146     fi
147 done
148
149 for i in $(find "$TEMPLATES_DIR" -name '*.conf'); do
150     serviceconf=$(basename $i)
151     if [ -r "${MONIT_DIR}/${serviceconf}.disabled" ]; then
152         check_service "${MONIT_DIR}/${serviceconf}.disabled"
153         if [ $RET -eq 0 ]; then
154             if [ ! -r "${MONIT_DIR}/${serviceconf}" ]; then
155                 echo "CN: Enabled $serviceconf (previously disabled)"
156                 mv "${MONIT_DIR}/${serviceconf}.disabled" \
157                     "${MONIT_DIR}/${serviceconf}"
158                 changed=1
159             fi
160         fi
161     else
162         check_service $i
163         if [ $RET -eq 0 ]; then
164             if [ ! -r "${MONIT_DIR}/${serviceconf}" ]; then
165                 echo "CN: Enabled $serviceconf (new service)"
166                 cp -a $i "${MONIT_DIR}"
167                 changed=1
168             fi
169         fi
170     fi
171 done
172
173 if [ $changed -eq 1 ]; then
174     echo "CN: Stopping/restarting monit service"
175     pkill -9 -f /usr/sbin/monit || true
176 else
177     echo "CN: No new services detected, sorry"
178 fi
179
180 exit 0
181
182 # vi:ft=sh