[doc] Update INSTALL file once more.
[libvscmgmt.git] / contrib / dhcp_auto_restart
1 #!/bin/sh
2 #
3 # dhcp_auto_restart: 
4 #
5 # Copyright (C) 2009 Maximilian Wilhelm <max@rfc2324.org>
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
20 #
21
22 ################################################################################
23 #                                Configuration                                 #
24 ################################################################################
25
26 # Timeout in seconds in which the inotifywait call should die and be respawned
27 TIMEOUT=180
28
29 # Path to the DHCPd config file which should be monitored and used for the
30 # DHCP server
31 GENERATED_CONFIG_FILE="/srv/vsc/dhcpd.conf.gen"
32 DHCPD_CONFIG_FILE="/srv/vsc/dhcpd.conf"
33
34
35
36 ################################################################################
37 #                                  Let's to                                    #
38 ################################################################################
39
40 # Check for root privileges
41 if [ `id -u` != 0 ]; then
42         echo "Error: Has to be run as root!" >&2
43         exit 1
44 fi
45
46 # Check tools
47 for tool in basename logger inotifywait dhcpd3; do
48         if ! command -v $tool >/dev/null 2>/dev/null; then
49                 echo "Error: Programm \"$tool\" not found on your system." >&2
50                 exit 1
51         fi
52 done
53
54 MY_NAME="`basename $0`"
55
56 logger -t "${MY_NAME}" "Starting up."
57
58 # Check config files
59 if [ ! -f "${GENERATED_CONFIG_FILE}" ]; then
60         echo "Error: GENERATED_CONFIG_FILE \"${GENERATED_CONFIG_FILE}\" does not exist or is not a file." >&2
61         exit 1
62 fi
63
64 #
65 # First shot server restart function
66 function try_restart () {
67         # FIXME
68         config_file_temp="${GENERATED_CONFIG_FILE}.$$"
69         # Get a copy of the newly generated config file to make sure the config
70         # we are fiddling around with is not being changed in between
71         cat "${GENERATED_CONFIG_FILE}" > "${config_file_temp}"
72
73         # If there already is a config file for the server, diff it against
74         # the new one and if there are no changes, there is nothing to do
75         # for us (which is highly unlikely.)
76         if test -f "${DHCPD_CONFIG_FILE}" &&
77            diff -q "${DHCPD_CONFIG_FILE}" "${config_file_temp}" > /dev/null; then
78                 return
79         fi
80
81         # Check if this config file is valid
82         if ! dhcpd3 -q -t -cf "${config_file_temp}"; then
83                 logger -t "${MY_NAME}" "Got invalid config file. Staying cool"
84                 return
85         fi
86
87         # Copy preserving file attributes
88         cat "${config_file_temp}" > "${DHCPD_CONFIG_FILE}"
89
90         error=`/etc/init.d/dhcp3-server restart`
91         if [ $? != 0 ]; then
92                 logger -t "${MY_NAME}" "Restart of DHCP server failed: ${error}"
93         fi
94 }
95
96 while true; do
97         error=`inotifywait -q -q -e close_write --timeout ${TIMEOUT} "${GENERATED_CONFIG_FILE}"`
98         exit_status="$?"
99         case "${exit_status}" in
100                 # File may have been modified
101                 0)
102                         try_restart
103                         ;;
104
105                 # Timed out
106                 2)
107                         logger -t "${MY_NAME}" "Nothing happened... Staying cool."
108                         ;;
109
110                 *)
111                         logger -t "${MY_NAME}" "Something bad happened: ${error}"
112                         logger -t "${MY_NAME}" "Exiting."
113                         exit 1
114                         ;;
115         esac
116 done
117
118