View difference between Paste ID: DCrdRRrw and A8qxdHeF
SHOW: | | - or go back to the newest paste.
1
:: Purpose:         DHCP server Watchdog & Failover script. Read notes below
2
:: Requirements:    1. Domain administrator credentials & "Logon as a batch job" rights
3
::                  2. Proper firewall configuration to allow connection
4
::                  3. Proper permissions on the DHCP backup directory
5-
:: Author:          vocatus on Reddit
5+
:: Author:          vocatus on reddit.com/r/usefulscripts
6-
:: Version:         1.1c + Added quotes around all variables that could contain paths
6+
:: Version:         1.2  + Added functionality to recover the DHCP database BACK to the primary server after a failure. Now when the backup server detects that
7
::                         the primary server has come back online after an outage, it will export its current copy of the DHCP database, upload it back to the 
8
::                         primary server, import it, and spin it back up using the most recent copy. This addresses the issue of new leases being passed out during
9
::                         an outage of the primary server and it not being aware of those leases when it comes back online.
10
::                       + Added "REMOTE_OPERATIING_PATH" variable that lets us specify where the remote server keeps its DHCP working files during operation
11
::                       + Added "UPDATED" variable to note when the script was last updated
12
::                  1.1c + Added quotes around all variables that could contain paths
13
::                       + Added full path to SC.exe to prevent failure in the event %PATH% gets corrupted or mangled (this happened in testing)
14
::                       * Fixed a glitch that could occur when pinging an assumed-down primary server that would incorrectly think it was back up
15
::                       - Removed almost every entry of "2>&1" since it's really not needed
16
::                  1.1b - Changed DATE to CUR_DATE format to be consistent with all other scripts
17
::                  1.1  - Comments improvement
18
::                       / Tuned some parameters (ping count on checking)
19
::                       / Some logging tweaks
20
::                       / Renamed FAILOVER_DELAY to FAILOVER_RECHECK_DELAY for clarity
21
::                  1.0d * Some logging tweaks
22
::                  1.0c * Some logging tweaks
23
::                  1.0 Initial write
24
:: Notes:           I wrote this script after failing to find a satisfactory method of performing
25
::                  watchdog/failover between two Windows Server 2008 R2 DHCP servers.
26
::                 
27
:: Use:             This script has two modes: "Watchdog" and "Failover." 
28
::                  - Watchdog checks the status of the remote DHCP service, logs it, and then grabs the remote DHCP db backup file and imports it.
29
::                  - Failover mode is activated when the script cannot determine the status of the remote DHCP server. The script then activates 
30
::                    the local DHCP server with the latest backup copy it successfully retrieved from the primary server.
31
::                  
32
:: Instructions: 
33
::                  1. Tune the variables in this script to your desired backup location and frequency
34
::                  2. On the primary server: set the DHCP backup interval to your desired backup frequency. The value is in minutes; I recommend 5 minutes.
35
::                     You do this by modifying this registry key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DHCPServer\Parameters\BackupInterval
36
::                  3. On the backup server:  set this script to run as a scheduled task. I recommend every 10 minutes. 
37
:: Notice: 
38
::                 !! Make sure to set it only to run if it isn't already running! If there is a failover you could have 
39
::                    Task Scheduler spawn a new instance of the script every n minutes and end up with hundreds of copies
40
::                    of this script running.
41-
set VERSION=1.1c
41+
42
43
:: Prep
44
SETLOCAL
45
@echo off
46
cls
47
set VERSION=1.2
48
set UPDATED=2013-09-09
49
title [DHCP Server Watchdog v%VERSION%]
50-
set REMOTE_SERVER=my-dhcp-server
50+
51
52-
:: Location of the DHCP backup on the remote primary server
52+
53-
:: Best practice is to leave as default, unless you have a custom backup location.
53+
54
:::::::::::::::
55
56
:: Remote server is the PRIMARY DHCP server we're watching. Use a hostname or IP address.
57-
:: Location of the local backup. I normally copy directly to my backup server's DHCP directory. 
57+
set REMOTE_SERVER=MY-DHCP-SERVER
58
59
:: Location of the automatic DHCP backup file on the primary server. Windows generates this automatically.
60
:: Best practice is to leave this alone, unless you have a custom backup location.
61
:: The script builds the backup line like this: \\%REMOTE_SERVER%\c$\%REMOTE_BACKUP_PATH%
62
set REMOTE_BACKUP_PATH=Windows\system32\dhcp\backup
63
64
:: Location of the operational DHCP database files on the remote (primary) server.
65
:: Best practice is to leave this alone, unless you have a custom location. Changing this will break the 
66
:: function that re-uploads the most current db back to the primary server after a failure. This doesn't 
67
:: ruin the script, but if the backup server passed out any IP's while the primary server was down, the 
68
:: primary server won't know about them when it comes back up.
69
set REMOTE_OPERATING_PATH=Windows\system32\dhcp
70-
set LOG_MAX_SIZE=2097152
70+
71
:: Location of your backup/standby file. I normally copy directly to my backup server's DHCP directory. 
72
:: The script builds the local backup line like this: c:\windows\system32\dhcp\[backup folders]
73
set LOCAL_BACKUP_PATH=%SystemRoot%\system32\dhcp
74
75
:: When a failover is triggered, how many seconds should we wait in between each attempt to contact the primary server again?
76
set FAILOVER_RECHECK_DELAY=15
77
78
:: Log options. Don't put an extension on the log file name. (Important!) The script sets this later on.
79
set LOGPATH=%SystemDrive%\Logs
80
set LOGFILE=%COMPUTERNAME%_DHCP_watchdog
81
82
:: Max log file size allowed (in bytes) before rotation and archive. I recommend setting this to 2 MB (2097152).
83
:: Example: 524288 is half a megabyte (~500KB)
84
set LOG_MAX_SIZE=10485760
85
86
:: \/ Don't touch anything below this line. If you do, you will break something.
87
set CUR_DATE=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%
88
89
90
:::::::::::::::::::::::
91
:: LOG FILE HANDLING :: - This section handles the log file
92
:::::::::::::::::::::::
93
94
:: Make the logfile if it doesn't exist
95
if not exist %LOGPATH% mkdir %LOGPATH%
96
if not exist %LOGPATH%\%LOGFILE%.log goto new_log
97
98
:: Check log size. If it hasn't exceeded our size limit, jump straight to Watchdog mode
99
for %%R in (%LOGPATH%\%LOGFILE%.log) do if %%~zR LSS %LOG_MAX_SIZE% goto newrun
100
101
:: However, if the log was too big, go ahead and rotate it.
102
pushd %LOGPATH%
103
del %LOGFILE%.ancient 2>NUL
104
rename %LOGFILE%.oldest %LOGFILE%.ancient 2>NUL
105
rename %LOGFILE%.older %LOGFILE%.oldest 2>NUL
106
rename %LOGFILE%.old %LOGFILE%.older 2>NUL
107
rename %LOGFILE%.log %LOGFILE%.old 2>NUL
108
popd
109
110
:: And then create the header for the new log file
111
:new_log
112
echo ------------------------------------------------------------------------------------->> %LOGPATH%\%LOGFILE%.log
113
echo  Initializing new DHCP Server Watchdog log on %CUR_DATE% at %TIME%, max log size %LOG_MAX_SIZE% bytes>> %LOGPATH%\%LOGFILE%.log
114
echo ------------------------------------------------------------------------------------->> %LOGPATH%\%LOGFILE%.log
115
echo.>> %LOGPATH%\%LOGFILE%.log
116-
echo %TIME%         Starting Watchdog mode.>> %LOGPATH%\%LOGFILE%.log
116+
117
:: New run section - if we just launched the script, write a header for this run
118
:newrun
119
echo ------------------------------------------------------------------------------------->> %LOGPATH%\%LOGFILE%.log
120
echo  DHCP Server Watchdog v%VERSION%, %CUR_DATE%>> %LOGPATH%\%LOGFILE%.log
121
echo   Running as %USERDOMAIN%\%USERNAME% on %COMPUTERNAME%>> %LOGPATH%\%LOGFILE%.log
122
echo.>> %LOGPATH%\%LOGFILE%.log
123
echo  Job Options>> %LOGPATH%\%LOGFILE%.log
124
echo   Log location:            %LOGPATH%\%LOGFILE%.log>> %LOGPATH%\%LOGFILE%.log
125
echo   Log max size:            %LOG_MAX_SIZE% bytes>> %LOGPATH%\%LOGFILE%.log
126
echo   Watching primary server: %REMOTE_SERVER%>> %LOGPATH%\%LOGFILE%.log
127
echo   Mirroring this DHCP db:  %REMOTE_BACKUP_PATH%>> %LOGPATH%\%LOGFILE%.log
128
echo   Local backup location:   %LOCAL_BACKUP_PATH%>> %LOGPATH%\%LOGFILE%.log
129
echo ------------------------------------------------------------------------------------->> %LOGPATH%\%LOGFILE%.log
130
echo %CUR_DATE% %TIME%         Starting Watchdog mode.>> %LOGPATH%\%LOGFILE%.log
131
echo.
132
echo  DHCP Server Watchdog v%VERSION%
133-
echo %TIME%         Pinging %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
133+
134-
echo %TIME%         Pinging %REMOTE_SERVER%...
134+
135-
ping %REMOTE_SERVER% -n 2 >NUL
135+
136-
if %ERRORLEVEL%==1 echo %TIME% WARNING %REMOTE_SERVER% failed to respond to ping. && echo %TIME% WARNING %REMOTE_SERVER% failed to respond to ping.>> %LOGPATH%\%LOGFILE%.log
136+
137-
if not %ERRORLEVEL%==1 echo %TIME% SUCCESS %REMOTE_SERVER% responded to ping. && echo %TIME% SUCCESS %REMOTE_SERVER% responded to ping.>> %LOGPATH%\%LOGFILE%.log
137+
138
:: WATCHDOG MODE ::
139
:::::::::::::::::::
140-
echo %TIME%         Checking DHCP server status on %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
140+
141-
echo %TIME%         Checking DHCP server status on %REMOTE_SERVER%...
141+
142
:: Ping the server to see if it's up
143
echo.
144
echo   Verifying proper operation of DHCP server on %REMOTE_SERVER%, please wait...
145
echo.
146
echo %CUR_DATE% %TIME%         Pinging %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
147
echo %CUR_DATE% %TIME%         Pinging %REMOTE_SERVER%...
148-
if %ERRORLEVEL%==0 echo %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
148+
ping %REMOTE_SERVER% -n %FAILOVER_RECHECK_DELAY% >NUL
149-
if %ERRORLEVEL%==0 echo %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.
149+
if %ERRORLEVEL%==1 echo %CUR_DATE% %TIME% WARNING %REMOTE_SERVER% failed to respond to ping. && echo %CUR_DATE% %TIME% WARNING %REMOTE_SERVER% failed to respond to ping.>> %LOGPATH%\%LOGFILE%.log
150
if not %ERRORLEVEL%==1 echo %CUR_DATE% %TIME% SUCCESS %REMOTE_SERVER% responded to ping. && echo %CUR_DATE% %TIME% SUCCESS %REMOTE_SERVER% responded to ping.>> %LOGPATH%\%LOGFILE%.log
151
152
:: Check & Log
153-
	echo %TIME% FAILURE The DHCP service is not running on %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
153+
echo %CUR_DATE% %TIME%         Checking DHCP server status on %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
154-
	echo %TIME%         Activating failover procedure. Local DHCP server will be initialized using most recent successful backup.>> %LOGPATH%\%LOGFILE%.log
154+
echo %CUR_DATE% %TIME%         Checking DHCP server status on %REMOTE_SERVER%...
155-
	echo %TIME% FAILURE The DHCP service is not running on %REMOTE_SERVER%.
155+
156-
	echo %TIME%         Activating failover procedure. Local DHCP server will be initialized using most recent successful backup.
156+
157
ver > NUL
158
159
:: Use "SC" to check the status of "Dhcpserver" service, find the "RUNNING" state, and act accordingly based on the return code
160
%WINDIR%\System32\sc.exe \\%REMOTE_SERVER% query Dhcpserver | find "RUNNING" >NUL
161
if %ERRORLEVEL%==0 echo %CUR_DATE% %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
162
if %ERRORLEVEL%==0 echo %CUR_DATE% %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.
163
164-
echo %TIME%         Fetching DHCP database backup from %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
164+
165-
echo %TIME%         Fetching DHCP database backup from %REMOTE_SERVER%...
165+
166
	echo %CUR_DATE% %TIME% FAILURE The DHCP service is not running on %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
167
	echo %CUR_DATE% %TIME%         Activating failover procedure. Local DHCP server will be initialized using most recent successful backup.>> %LOGPATH%\%LOGFILE%.log
168
	echo %CUR_DATE% %TIME% FAILURE The DHCP service is not running on %REMOTE_SERVER%.
169
	echo %CUR_DATE% %TIME%         Activating failover procedure. Local DHCP server will be initialized using most recent successful backup.
170-
	echo %TIME% SUCCESS Backup fetched from %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
170+
171-
	echo %TIME% SUCCESS Backup fetched from %REMOTE_SERVER%.
171+
172-
	echo %TIME%         Rotating database backups...>> %LOGPATH%\%LOGFILE%.log
172+
173-
	echo %TIME%         Rotating database backups...
173+
174
ver > NUL
175
176
:: Fetch
177
echo %CUR_DATE% %TIME%         Fetching DHCP database backup from %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
178
echo %CUR_DATE% %TIME%         Fetching DHCP database backup from %REMOTE_SERVER%...
179
xcopy "\\%REMOTE_SERVER%\c$\%REMOTE_BACKUP_PATH%\*" "%LOCAL_BACKUP_PATH%\backup_new_pending\" /E /Y /Q >NUL
180
181-
	echo %TIME%         Database backups rotated.>> %LOGPATH%\%LOGFILE%.log
181+
182-
	echo %TIME%         Database backups rotated.
182+
183
	echo %CUR_DATE% %TIME% SUCCESS Backup fetched from %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
184
	echo %CUR_DATE% %TIME% SUCCESS Backup fetched from %REMOTE_SERVER%.
185
	echo %CUR_DATE% %TIME%         Rotating database backups...>> %LOGPATH%\%LOGFILE%.log
186
	echo %CUR_DATE% %TIME%         Rotating database backups...
187-
	echo %TIME% WARNING There was an error copying the backup from %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
187+
188-
	echo %TIME%         You may want to look into this since we were able to check the DHCPserver service status but the file copy failed.>> %LOGPATH%\%LOGFILE%.log
188+
189-
	echo %TIME%         Skipping new database import due to copy failure.>> %LOGPATH%\%LOGFILE%.log
189+
190-
	echo %TIME%         Job complete with errors.>> %LOGPATH%\%LOGFILE%.log
190+
191-
	echo %TIME% WARNING There was an error copying the backup from %REMOTE_SERVER%.
191+
192-
	echo %TIME%         You may want to look into this since we were able to check the DHCPserver service status but the file copy failed.
192+
193-
	echo %TIME%         Skipping new database import due to copy failure.
193+
194-
	echo %TIME%         Job complete with errors.
194+
	echo %CUR_DATE% %TIME%         Database backups rotated.>> %LOGPATH%\%LOGFILE%.log
195
	echo %CUR_DATE% %TIME%         Database backups rotated.
196
	)
197
198-
echo %TIME%         Starting local DHCP server to import new database...>> %LOGPATH%\%LOGFILE%.log
198+
199-
echo %TIME%         Starting local DHCP server to import new database...
199+
200
	echo %CUR_DATE% %TIME% WARNING There was an error copying the backup from %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
201-
echo %TIME%         Local DHCP server running. Performing import...>> %LOGPATH%\%LOGFILE%.log
201+
	echo %CUR_DATE% %TIME%         You may want to look into this since we were able to check the DHCPserver service status but the file copy failed.>> %LOGPATH%\%LOGFILE%.log
202-
echo %TIME%         Local DHCP server running. Performing import...
202+
	echo %CUR_DATE% %TIME%         Skipping new database import due to copy failure.>> %LOGPATH%\%LOGFILE%.log
203
	echo %CUR_DATE% %TIME%         Job complete with errors.>> %LOGPATH%\%LOGFILE%.log
204-
echo %TIME%         Import complete.>> %LOGPATH%\%LOGFILE%.log
204+
	echo %CUR_DATE% %TIME% WARNING There was an error copying the backup from %REMOTE_SERVER%.
205-
echo %TIME%         Import complete.
205+
	echo %CUR_DATE% %TIME%         You may want to look into this since we were able to check the DHCPserver service status but the file copy failed.
206-
echo %TIME%         Stopping local DHCP server...>> %LOGPATH%\%LOGFILE%.log
206+
	echo %CUR_DATE% %TIME%         Skipping new database import due to copy failure.
207-
echo %TIME%         Stopping local DHCP server...
207+
	echo %CUR_DATE% %TIME%         Job complete with errors.
208-
	net stop Dhcpserver
208+
209-
echo %TIME%         Local DHCP server stopped.>> %LOGPATH%\%LOGFILE%.log
209+
210-
echo %TIME%         Local DHCP server stopped.
210+
211-
echo %TIME% SUCCESS Job complete, DHCP database backed up and ready for use. Exiting.>> %LOGPATH%\%LOGFILE%.log
211+
echo %CUR_DATE% %TIME%         Starting local DHCP server to import new database...>> %LOGPATH%\%LOGFILE%.log
212-
echo %TIME% SUCCESS Job complete, DHCP database backed up and ready for use. Exiting.
212+
echo %CUR_DATE% %TIME%         Starting local DHCP server to import new database...
213
	net start Dhcpserver
214
echo %CUR_DATE% %TIME%         Local DHCP server running. Performing import...>> %LOGPATH%\%LOGFILE%.log
215
echo %CUR_DATE% %TIME%         Local DHCP server running. Performing import...
216
	netsh dhcp server restore "%LOCAL_BACKUP_PATH%\backup"
217
echo %CUR_DATE% %TIME%         Import complete.>> %LOGPATH%\%LOGFILE%.log
218
echo %CUR_DATE% %TIME%         Import complete.
219
echo %CUR_DATE% %TIME%         Stopping local DHCP server...>> %LOGPATH%\%LOGFILE%.log
220
echo %CUR_DATE% %TIME%         Stopping local DHCP server...
221
	sc stop Dhcpserver
222-
echo %TIME% WARNING Failover activated.>> %LOGPATH%\%LOGFILE%.log
222+
echo %CUR_DATE% %TIME%         Local DHCP server stopped.>> %LOGPATH%\%LOGFILE%.log
223-
echo %TIME%         Starting local DHCP server using most recent successful backup...>> %LOGPATH%\%LOGFILE%.log
223+
echo %CUR_DATE% %TIME%         Local DHCP server stopped.
224
echo %CUR_DATE% %TIME% SUCCESS Job complete, DHCP database backed up and ready for use. Exiting.>> %LOGPATH%\%LOGFILE%.log
225-
echo %TIME% WARNING Could not contact primary DHCP server "%REMOTE_SERVER%." Failover activated.
225+
echo %CUR_DATE% %TIME% SUCCESS Job complete, DHCP database backed up and ready for use. Exiting.
226-
echo %TIME%         Starting local DHCP server using most recent successful backup...
226+
227
228
229-
echo %TIME%         Local DHCP server started.>> %LOGPATH%\%LOGFILE%.log
229+
230-
echo %TIME%         Entering monitoring loop. Checking if %REMOTE_SERVER% is back up every %FAILOVER_RECHECK_DELAY% seconds...>> %LOGPATH%\%LOGFILE%.log
230+
231-
echo %TIME%         Local DHCP server started.
231+
232-
echo %TIME%         Entering monitoring loop. Checking if %REMOTE_SERVER% is back up every %FAILOVER_RECHECK_DELAY% seconds...
232+
233
:failover
234
:: Log this AND display to console
235
echo %CUR_DATE% %TIME% WARNING Failover activated.>> %LOGPATH%\%LOGFILE%.log
236
echo %CUR_DATE% %TIME%         Starting local DHCP server using most recent successful backup...>> %LOGPATH%\%LOGFILE%.log
237-
ping %REMOTE_SERVER% -n 3 >NUL
237+
238
echo %CUR_DATE% %TIME% WARNING Could not contact primary DHCP server %REMOTE_SERVER%. Failover activated.
239
echo %CUR_DATE% %TIME%         Starting local DHCP server using most recent successful backup...
240-
	echo %TIME% FAILURE No ping response from %REMOTE_SERVER%. Waiting %FAILOVER_RECHECK_DELAY% seconds to check again.>> %LOGPATH%\%LOGFILE%.log
240+
241-
	echo %TIME% FAILURE No ping response from %REMOTE_SERVER%. Waiting %FAILOVER_RECHECK_DELAY% seconds to check again.
241+
242
echo %CUR_DATE% %TIME%         Local DHCP server started.>> %LOGPATH%\%LOGFILE%.log
243
echo %CUR_DATE% %TIME%         Entering monitoring loop. Checking if %REMOTE_SERVER% is back up every %FAILOVER_RECHECK_DELAY% seconds...>> %LOGPATH%\%LOGFILE%.log
244
echo %CUR_DATE% %TIME%         Local DHCP server started.
245
echo %CUR_DATE% %TIME%         Entering monitoring loop. Checking if %REMOTE_SERVER% is back up every %FAILOVER_RECHECK_DELAY% seconds...
246
247
248
:failover_loop
249
:: First we ping the server
250-
	echo %TIME% NOTICE %REMOTE_SERVER% is responding to pings.>> %LOGPATH%\%LOGFILE%.log
250+
ping %REMOTE_SERVER% -n 5 >NUL
251-
	echo %TIME% NOTICE %REMOTE_SERVER% is responding to pings.
251+
252-
	echo %TIME%        Checking DHCP server status on %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
252+
253-
	echo %TIME%        Checking DHCP server status on %REMOTE_SERVER%...
253+
	echo %CUR_DATE% %TIME% FAILURE No ping response from %REMOTE_SERVER%. Waiting %FAILOVER_RECHECK_DELAY% seconds to check again.>> %LOGPATH%\%LOGFILE%.log
254
	echo %CUR_DATE% %TIME% FAILURE No ping response from %REMOTE_SERVER%. Waiting %FAILOVER_RECHECK_DELAY% seconds to check again.
255
	ping localhost -n %FAILOVER_RECHECK_DELAY% >NUL
256
	goto failover_loop
257
	)
258
259-
				echo %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
259+
260-
				echo %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.
260+
261-
				echo %TIME%         The primary DHCP server %REMOTE_SERVER% is back up. Stopping local DHCP service...>> %LOGPATH%\%LOGFILE%.log
261+
262-
				echo %TIME%         The primary DHCP server %REMOTE_SERVER% is back up. Stopping local DHCP service...
262+
263-
				net stop Dhcpserver
263+
	echo %CUR_DATE% %TIME% NOTICE  %REMOTE_SERVER% is responding to pings.>> %LOGPATH%\%LOGFILE%.log
264-
				echo %TIME%         Recovery complete. Exiting.>> %LOGPATH%\%LOGFILE%.log
264+
	echo %CUR_DATE% %TIME% NOTICE  %REMOTE_SERVER% is responding to pings.
265-
				echo %TIME%         Recovery complete. Exiting.
265+
	echo %CUR_DATE% %TIME%         Checking DHCP server status on %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
266
	echo %CUR_DATE% %TIME%         Checking DHCP server status on %REMOTE_SERVER%...
267
	
268
	:: This section checks to see if the Dhcpserver service is back up and acts accordingly
269
	%WINDIR%\System32\sc.exe \\%REMOTE_SERVER% query Dhcpserver | find "RUNNING" >NUL
270
		:: The exclamation points around ERRORLEVEL here prevent it from incorrectly being expanded using the external ERRORLEVEL results from the first IF statement
271
		if !ERRORLEVEL!==0 (
272-
echo %TIME% FAILURE %REMOTE_SERVER% is responding to pings, but DHCP isn't responding (yet?). Will try again in %FAILOVER_RECHECK_DELAY% seconds.>> %LOGPATH%\%LOGFILE%.log
272+
				echo %CUR_DATE% %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.>> %LOGPATH%\%LOGFILE%.log
273-
echo %TIME% FAILURE %REMOTE_SERVER% is responding to pings, but DHCP isn't responding (yet?). Will try again in %FAILOVER_RECHECK_DELAY% seconds.
273+
				echo %CUR_DATE% %TIME% SUCCESS The DHCP service is running on %REMOTE_SERVER%.
274
				echo %CUR_DATE% %TIME%         Primary DHCP server %REMOTE_SERVER% is back up. Beginning recovery procedures...>> %LOGPATH%\%LOGFILE%.log
275
				echo %CUR_DATE% %TIME%         Primary DHCP server %REMOTE_SERVER% is back up. Beginning recovery procedures...
276
				
277
				:: Back up the database that we've been running temporarily while the primary server was down
278
				echo %CUR_DATE% %TIME%         Exporting the current DHCP database...>> %LOGPATH%\%LOGFILE%.log
279
				echo %CUR_DATE% %TIME%         Exporting the current DHCP database...
280
				netsh dhcp server backup %TEMP%\DHCP-RECOVERY
281
				
282
				:: Stop our local server since we're done performing DHCP server duties
283
				echo %CUR_DATE% %TIME%         Stopping local DHCP server...>> %LOGPATH%\%LOGFILE%.log
284
				echo %CUR_DATE% %TIME%         Stopping local DHCP server...
285
				sc stop Dhcpserver
286
				
287
				:: Send the database back to the primary server
288
				echo %CUR_DATE% %TIME%         Uploading current DHCP database to %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
289
				echo %CUR_DATE% %TIME%         Uploading current DHCP database to %REMOTE_SERVER%...
290
				xcopy "%TEMP%\DHCP-RECOVERY\*" "\\%REMOTE_SERVER%\c$\%REMOTE_OPERATING_PATH%\DHCP-RECOVERY\" /S /Y /Q 2>NUL
291
292
				:: Import the current database on the primary server
293
				echo %CUR_DATE% %TIME%         Importing current DHCP database on %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
294
				echo %CUR_DATE% %TIME%         Importing current DHCP database on %REMOTE_SERVER%...
295
				netsh dhcp server \\%REMOTE_SERVER% restore "\\%REMOTE_SERVER%\c$\%REMOTE_OPERATING_PATH%\DHCP-RECOVERY"
296
				:: force a delay to let it stop
297
				ping -n 4 localhost >NUL
298
				
299
				:: Spin the primary server back up. For some reason we have to run the command twice for it to actually start. Don't ask.
300
				echo %CUR_DATE% %TIME%         Restarting DHCP server on %REMOTE_SERVER%...>> %LOGPATH%\%LOGFILE%.log
301
				echo %CUR_DATE% %TIME%         Restarting DHCP server on %REMOTE_SERVER%...
302
				sc \\%REMOTE_SERVER% stop Dhcpserver
303
				ping localhost -n 8 >NUL
304
				sc \\%REMOTE_SERVER% start Dhcpserver
305
				ping localhost -n 5 >NUL
306
				sc \\%REMOTE_SERVER% query Dhcpserver
307
				ping localhost -n 8 >NUL
308
				sc \\%REMOTE_SERVER% start Dhcpserver
309
				
310
				REM :: Check to make sure it's working
311
				REM echo %CUR_DATE% %TIME%         Verifying functionality on primary server...>> %LOGPATH%\%LOGFILE%.log
312
				REM echo %CUR_DATE% %TIME%         Verifying functionality on primary server...
313
				REM sc \\%REMOTE_SERVER% query Dhcpserver | find "RUNNING"
314
				REM if not %ERRORLEVEL%==0 echo %CUR_DATE% %TIME% FAILURE DHCP server on %REMOTE_SERVER% is not running. You should investigate this manually.>> %LOGPATH%\%LOGFILE%.log
315
				REM if %ERRORLEVEL%==0 echo %CUR_DATE% %TIME% SUCCESS DHCP server on %REMOTE_SERVER% is up and running. Recovery complete.>> %LOGPATH%\%LOGFILE%.log
316
317
				:: Clean up
318
				rmdir /S /Q %TEMP%\DHCP-RECOVERY
319
				
320
				:: Done.
321
				echo %CUR_DATE% %TIME%         Exiting.>> %LOGPATH%\%LOGFILE%.log
322
				echo %CUR_DATE% %TIME%         Exiting.
323
				goto EOF
324
				)
325
	)
326
ENDLOCAL
327
328
:: If the host responds to pings but the DHCP service isn't running, this executes
329
echo %CUR_DATE% %TIME% FAILURE %REMOTE_SERVER% is responding to pings, but DHCP isn't responding (yet?). Will try again in %FAILOVER_RECHECK_DELAY% seconds.>> %LOGPATH%\%LOGFILE%.log
330
echo %CUR_DATE% %TIME% FAILURE %REMOTE_SERVER% is responding to pings, but DHCP isn't responding (yet?). Will try again in %FAILOVER_RECHECK_DELAY% seconds.
331
ver >NUL
332
goto failover_loop
333
334
ENDLOCAL
335
echo.>> %LOGPATH%\%LOGFILE%.log
336
:EOF