summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2017-12-06 15:35:50 -0500
committerThomas Markwalder <tmark@isc.org>2017-12-06 15:35:50 -0500
commit4463ac52129d6e64f524b769778d10e8fc7e3d71 (patch)
tree21208c817bdd46fc5083222061cb3cdfe413eabc
parent21ae396088a3fbe046e3122286d1288eeacce7d3 (diff)
downloadisc-dhcp-v4_3.tar.gz
[v4_3] dhcpd -T now writes leases to temp filev4_3
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 80451d53..5dc84c2e 100644
--- a/RELNOTES
+++ b/RELNOTES
@@ -88,6 +88,14 @@ dhcp-users@lists.isc.org.
to accomodate a change in behavior in BIND9 isc_heap_delete().
[ISC-bugs #46719]
+- 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.3.6b1
- None
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index ff34578e..5bd115b6 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -3022,7 +3022,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 94f1584f..149fedc7 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)
@@ -305,7 +305,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))
@@ -454,7 +454,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))
@@ -530,7 +530,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;
}
}
@@ -702,7 +702,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;
}
}
@@ -748,7 +748,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;
@@ -973,7 +973,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) {
@@ -1028,7 +1028,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);
}
@@ -1048,9 +1048,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)
@@ -1077,22 +1077,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));
@@ -1105,7 +1109,7 @@ void db_startup (testp)
#endif
}
-int new_lease_file ()
+int new_lease_file (int test_mode)
{
char newfname [512];
char backfname [512];
@@ -1194,6 +1198,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 d3b49e35..47c18d3f 100644
--- a/server/dhcpd.8
+++ b/server/dhcpd.8
@@ -269,8 +269,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,