summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2019-06-20 10:16:49 -0400
committerThomas Markwalder <tmark@isc.org>2019-06-20 10:16:49 -0400
commit3a4476be4e24c6b1a61515542b40364d22dd82f8 (patch)
tree6e7ab840318e51571c85750881b92205d82028f5
parentd033337751e994a6a1bbfb64ade6460e69fed420 (diff)
downloadisc-dhcp-3a4476be4e24c6b1a61515542b40364d22dd82f8.tar.gz
[v4_1_esv] dhcpd -T now writes leases to temp file
Merges in rt22267.
-rw-r--r--RELNOTES8
-rw-r--r--includes/dhcpd.h2
-rw-r--r--server/db.c58
-rw-r--r--server/dhcpd.87
4 files changed, 49 insertions, 26 deletions
diff --git a/RELNOTES b/RELNOTES
index 90456604..9fd6c005 100644
--- a/RELNOTES
+++ b/RELNOTES
@@ -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,