]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[v4_1_esv] dhcpd -T now writes leases to temp file
authorThomas Markwalder <tmark@isc.org>
Thu, 20 Jun 2019 14:16:49 +0000 (10:16 -0400)
committerThomas Markwalder <tmark@isc.org>
Thu, 20 Jun 2019 14:16:49 +0000 (10:16 -0400)
    Merges in rt22267.

RELNOTES
includes/dhcpd.h
server/db.c
server/dhcpd.8

index 904566043e0d3c07201e75ee520dd741aec711a4..9fd6c005e1a68b6e5da5a54e9070b73dbd802928 100644 (file)
--- 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
index 802a50909889804bedd1180b541993fae420df90..d05dc7598d6a2fef69ccf21215531c5a96057ffc 100644 (file)
@@ -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 *);
 
index e85274ade7018297b530ef4bd8b2d423ccda3ade..28576073105367d5988f61e8f286e3134aba2205 100644 (file)
@@ -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
index aa4e8127230ab32ddf166fc0b4c813df587c2318..cf897f12c83c14e424dd27f0c2010c593fbba8d2 100644 (file)
@@ -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,