diff options
author | Thomas Markwalder <tmark@isc.org> | 2019-06-20 10:16:49 -0400 |
---|---|---|
committer | Thomas Markwalder <tmark@isc.org> | 2019-06-20 10:16:49 -0400 |
commit | 3a4476be4e24c6b1a61515542b40364d22dd82f8 (patch) | |
tree | 6e7ab840318e51571c85750881b92205d82028f5 | |
parent | d033337751e994a6a1bbfb64ade6460e69fed420 (diff) | |
download | isc-dhcp-3a4476be4e24c6b1a61515542b40364d22dd82f8.tar.gz |
[v4_1_esv] dhcpd -T now writes leases to temp file
Merges in rt22267.
-rw-r--r-- | RELNOTES | 8 | ||||
-rw-r--r-- | includes/dhcpd.h | 2 | ||||
-rw-r--r-- | server/db.c | 58 | ||||
-rw-r--r-- | server/dhcpd.8 | 7 |
4 files changed, 49 insertions, 26 deletions
@@ -84,6 +84,14 @@ dhcp-users@lists.isc.org. in the lease file causing issues with DDNS and so forth. [ISC-bugs #43786] +- When given the -T command line argument, in addition to reading the + current lease file, the server will write the leases to a temporary + lease file. This can help detect issues in server configuration that + only surface when leases are written to the file. The current lease + file will not be modified and the temporary lease file is removed upon + completion of the test. + [ISC-Bugs #22267] + Changes since 4.1-ESV-R15b1 - None diff --git a/includes/dhcpd.h b/includes/dhcpd.h index 802a5090..d05dc759 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -2629,7 +2629,7 @@ void commit_leases_timeout (void *); int commit_leases (void); int commit_leases_timed (void); void db_startup (int); -int new_lease_file (void); +int new_lease_file (int test_mode); int group_writer (struct group_object *); int write_ia(const struct ia_xx *); diff --git a/server/db.c b/server/db.c index e85274ad..28576073 100644 --- a/server/db.c +++ b/server/db.c @@ -106,7 +106,7 @@ int write_lease (lease) /* If the lease file is corrupt, don't try to write any more leases until we've written a good lease file. */ if (lease_file_is_corrupt) - if (!new_lease_file ()) + if (!new_lease_file (0)) return 0; if (counting) @@ -289,7 +289,7 @@ int write_host (host) /* If the lease file is corrupt, don't try to write any more leases until we've written a good lease file. */ if (lease_file_is_corrupt) - if (!new_lease_file ()) + if (!new_lease_file (0)) return 0; if (!db_printable((unsigned char *)host->name)) @@ -438,7 +438,7 @@ int write_group (group) /* If the lease file is corrupt, don't try to write any more leases until we've written a good lease file. */ if (lease_file_is_corrupt) - if (!new_lease_file ()) + if (!new_lease_file (0)) return 0; if (!db_printable((unsigned char *)group->name)) @@ -514,7 +514,7 @@ write_ia(const struct ia_xx *ia) { * leases until we've written a good lease file. */ if (lease_file_is_corrupt) { - if (!new_lease_file()) { + if (!new_lease_file(0)) { return 0; } } @@ -663,7 +663,7 @@ write_server_duid(void) { * leases until we've written a good lease file. */ if (lease_file_is_corrupt) { - if (!new_lease_file()) { + if (!new_lease_file(0)) { return 0; } } @@ -708,7 +708,7 @@ int write_failover_state (dhcp_failover_state_t *state) const char *tval; if (lease_file_is_corrupt) - if (!new_lease_file ()) + if (!new_lease_file (0)) return 0; errno = 0; @@ -933,7 +933,7 @@ int write_billing_class (class) int errors = 0; if (lease_file_is_corrupt) - if (!new_lease_file ()) + if (!new_lease_file (0)) return 0; if (!class -> superclass) { @@ -987,7 +987,7 @@ int commit_leases () if (count && cur_time - write_time > LEASE_REWRITE_PERIOD) { count = 0; write_time = cur_time; - new_lease_file (); + new_lease_file (0); } return 1; } @@ -1007,9 +1007,9 @@ int commit_leases_timed() return (1); } -void db_startup (testp) - int testp; +void db_startup (int test_mode) { + const char *current_db_path; isc_result_t status; #if defined (TRACING) @@ -1036,22 +1036,26 @@ void db_startup (testp) append it, so we create one immediately (maybe this isn't the best solution... */ if (trace_playback ()) { - new_lease_file (); + new_lease_file (0); } #endif - if (!testp) { - db_file = fopen (path_dhcpd_db, "a"); - if (!db_file) - log_fatal ("Can't open %s for append.", path_dhcpd_db); - expire_all_pools (); + /* expire_all_pools will cause writes to the "current" lease file. + * Therefore, in test mode we need to point db_file to a disposable + * file to protect the original lease file. */ + current_db_path = (test_mode ? "/dev/null" : path_dhcpd_db); + db_file = fopen (current_db_path, "a"); + if (!db_file) { + log_fatal ("Can't open %s for append.", current_db_path); + } + + expire_all_pools (); #if defined (TRACING) - if (trace_playback ()) - write_time = cur_time; - else + if (trace_playback ()) + write_time = cur_time; + else #endif - time(&write_time); - new_lease_file (); - } + time(&write_time); + new_lease_file (test_mode); #if defined(REPORT_HASH_PERFORMANCE) log_info("Host HW hash: %s", host_hash_report(host_hw_addr_hash)); @@ -1064,7 +1068,7 @@ void db_startup (testp) #endif } -int new_lease_file () +int new_lease_file (int test_mode) { char newfname [512]; char backfname [512]; @@ -1154,6 +1158,14 @@ int new_lease_file () if (!write_leases ()) goto fail; + if (test_mode) { + log_debug("Lease file test successful," + " removing temp lease file: %s", + newfname); + (void)unlink (newfname); + return (1); + } + #if defined (TRACING) if (!trace_playback ()) { #endif diff --git a/server/dhcpd.8 b/server/dhcpd.8 index aa4e8127..cf897f12 100644 --- a/server/dhcpd.8 +++ b/server/dhcpd.8 @@ -258,8 +258,11 @@ automatically before installing it. .BI \-T Test the lease file. The server tests the lease file for correct syntax, but will not attempt to perform any network -operations. This can be used to test a new lease file -automatically before installing it. +operations. In addition to reading the lease file it will also +write the leases to a temporary lease file. The current lease +file will not be modified and the temporary lease file will be +removed upon completion of the test. This can be used to test a +new lease file automatically before installing it. .TP .BI \-user \ user Setuid to user after completing privileged operations, |