r10: - remove changelog carnet..
[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 check_service() {
14     RET=0
15
16     filename="$1"
17     if [ ! -r "$filename" ]; then
18         RET=1
19         return 1
20     fi
21
22     scriptpid='BEGIN { RS = "[ \t\n]+" }
23                { line[NR] = $0 "" }
24          END { for (j in line)
25                 if (line[j] == "pidfile")
26                     print line[j + 1] }'
27     pidfiles=$(awk "$scriptpid" < "$filename" | sed -e 's/"//g')
28     check_pidfile $pidfiles
29
30     if [ $RET -eq 1 ]; then
31         return 1
32     fi
33
34     scriptinit='BEGIN { RS = "[ \t\n]+" }
35                { line[NR] = $0 "" }
36          END { for (j in line)
37                 if (((line[j] == "start") || (line[j] == "stop")) && (line[j + 1] == "program"))
38                     print line[j + 3] }'
39     initscripts=$(awk "$scriptinit" < "$filename" | sed -e 's/"//g')
40     check_initscript $initscripts
41
42     return $RET
43 }
44
45 check_pidfile() {
46     RET=0
47
48     while [ -n "$1" ]; do
49         if [ -r "$1" ]; then
50             check_pid $(cat "$1")
51             if [ $RET -eq 1 ]; then
52                 return 1
53             fi
54         else
55             RET=1
56             return 1
57         fi
58         shift
59     done
60
61     return 0
62 }
63
64 check_initscript() {
65     RET=0
66
67     while [ -n "$1" ]; do
68         if [ ! -x "$1" ]; then
69             RET=1
70             return 1
71         fi
72         shift
73     done
74
75     return 0
76 }
77
78 check_pid() {
79     RET=0
80
81     while [ -n "$1" ]; do
82         if ! kill -0 "$1" >/dev/null 2>&1; then
83             RET=1
84             return 1
85         fi
86         shift
87     done
88
89     return 0
90 }
91
92 #####################################################################
93
94 changed=0
95 if [ ! -d "$MONIT_DIR" ]; then
96     mkdir -p "$MONIT_DIR"
97 fi
98
99 for i in $(find "$MONIT_DIR" -name '*.conf'); do
100     check_service $i
101     if [ ! $RET -eq 0 ]; then
102         serviceconf=$(basename $i)
103         echo "CN: Disabled $serviceconf"
104         mv -f $i $i.disabled
105         changed=1
106     fi
107 done
108
109 for i in $(find "$TEMPLATES_DIR" -name '*.conf'); do
110     serviceconf=$(basename $i)
111     if [ -r "$MONIT_DIR"/$serviceconf.disabled ]; then
112         check_service "$MONIT_DIR"/$serviceconf.disabled
113         if [ $RET -eq 0 ]; then
114             if [ ! -r "$MONIT_DIR"/$serviceconf ]; then
115                 echo "CN: Enabled $serviceconf (previously disabled)"
116                 mv "$MONIT_DIR"/$serviceconf.disabled \
117                     "$MONIT_DIR"/$serviceconf
118                 changed=1
119             fi
120         fi
121     else
122         check_service $i
123         if [ $RET -eq 0 ]; then
124             if [ ! -r "$MONIT_DIR"/$serviceconf ]; then
125                 echo "CN: Enabled $serviceconf (new service)"
126                 cp -a $i "$MONIT_DIR"
127                 changed=1
128             fi
129         fi
130     fi
131 done
132
133 if [ $changed -eq 1 ]; then
134     echo "CN: Stopping/restarting monit service"
135     pkill -9 -f /usr/sbin/monit || true
136 else
137     echo "CN: No new services detected, sorry"
138 fi
139
140 exit 0