]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
When a server reload fails, print a note in `rndc status`.
authorTony Finch <dot@dotat.at>
Fri, 14 Jun 2019 10:14:00 +0000 (11:14 +0100)
committerEvan Hunt <each@isc.org>
Mon, 24 Jun 2019 18:49:48 +0000 (11:49 -0700)
After a failed reload I noticed two problems:

* There was a missing newline in the output of `rndc status` so it
  finished "reload/reconfig in progressserver is up and running"
* The "reconfig in progress" note should have said "reconfig failed"

bin/named/include/named/server.h
bin/named/include/named/types.h
bin/named/server.c
bin/tests/system/rndc/tests.sh

index 399a14e6beb84720c8d66d73fcc33170971dc396..25d0e4b755edc5cb85a4de1c1fce2862533e879d 100644 (file)
@@ -56,9 +56,9 @@ struct named_server {
        char *                  secrootsfile;   /*%< Secroots file name */
        char *                  bindkeysfile;   /*%< bind.keys file name */
        char *                  recfile;        /*%< Recursive file name */
-       bool            version_set;    /*%< User has set version */
+       bool                    version_set;    /*%< User has set version */
        char *                  version;        /*%< User-specified version */
-       bool            hostname_set;   /*%< User has set hostname */
+       bool                    hostname_set;   /*%< User has set hostname */
        char *                  hostname;       /*%< User-specified hostname */
 
        /* Server data structures. */
@@ -78,9 +78,9 @@ struct named_server {
 
        isc_mutex_t             reload_event_lock;
        isc_event_t *           reload_event;
-       bool                    reload_in_progress;
+       named_reload_t          reload_status;
 
-       bool            flushonshutdown;
+       bool                    flushonshutdown;
 
        named_cachelist_t       cachelist;      /*%< Possibly shared caches */
        isc_stats_t *           zonestats;      /*% Zone management stats */
@@ -98,7 +98,7 @@ struct named_server {
        dns_name_t              *session_keyname;
        unsigned int            session_keyalg;
        uint16_t                session_keybits;
-       bool            interface_auto;
+       bool                    interface_auto;
        unsigned char           secret[32];     /*%< Server Cookie Secret */
        ns_cookiealg_t          cookiealg;
 
index 0701091f9f0da18bbc9cc3ede16c57ed688d3d4c..234724a25c809a6c6f6d9c67b3feb325fa09c93c 100644 (file)
@@ -27,4 +27,13 @@ typedef ISC_LIST(named_dispatch_t)   named_dispatchlist_t;
 typedef struct named_statschannel      named_statschannel_t;
 typedef ISC_LIST(named_statschannel_t) named_statschannellist_t;
 
+/*%
+ * Used for server->reload_status as printed by `rndc status`
+ */
+typedef enum {
+       NAMED_RELOAD_DONE,
+       NAMED_RELOAD_IN_PROGRESS,
+       NAMED_RELOAD_FAILED,
+} named_reload_t;
+
 #endif /* NAMED_TYPES_H */
index 4f3c471b25bd3fa7f1ff57914d279c3e88e7a6d9..b0019af6b89606aa3e27bb382adeed999d8e05ed 100644 (file)
@@ -9397,7 +9397,7 @@ view_loaded(void *arg) {
                              "FIPS mode is %s",
                              FIPS_mode() ? "enabled" : "disabled");
 #endif
-               server->reload_in_progress = false;
+               server->reload_status = NAMED_RELOAD_DONE;
 
                isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
                              NAMED_LOGMODULE_SERVER, ISC_LOG_NOTICE,
@@ -9733,7 +9733,7 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) {
        CHECKFATAL(server->reload_event == NULL ?
                   ISC_R_NOMEMORY : ISC_R_SUCCESS,
                   "allocating reload event");
-       server->reload_in_progress = true;
+       server->reload_status = NAMED_RELOAD_IN_PROGRESS;
 
        /*
         * Setup the server task, which is responsible for coordinating
@@ -10037,6 +10037,7 @@ loadconfig(named_server_t *server) {
                              NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
                              "reloading configuration failed: %s",
                              isc_result_totext(result));
+               server->reload_status = NAMED_RELOAD_FAILED;
        }
 
        return (result);
@@ -10045,20 +10046,21 @@ loadconfig(named_server_t *server) {
 static isc_result_t
 reload(named_server_t *server) {
        isc_result_t result;
-       server->reload_in_progress = true;
+       server->reload_status = NAMED_RELOAD_IN_PROGRESS;
        CHECK(loadconfig(server));
 
        result = load_zones(server, false, false);
-       if (result == ISC_R_SUCCESS)
+       if (result == ISC_R_SUCCESS) {
                isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
                              NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
                              "reloading zones succeeded");
-       else
+       } else {
                isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
                              NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
                              "reloading zones failed: %s",
                              isc_result_totext(result));
-
+               server->reload_status = NAMED_RELOAD_FAILED;
+       }
  cleanup:
        return (result);
 }
@@ -10392,20 +10394,22 @@ named_server_reloadcommand(named_server_t *server, isc_lex_t *lex,
 isc_result_t
 named_server_reconfigcommand(named_server_t *server) {
        isc_result_t result;
-       server->reload_in_progress = true;
+       server->reload_status = NAMED_RELOAD_IN_PROGRESS;
 
        CHECK(loadconfig(server));
 
        result = load_zones(server, false, true);
-       if (result == ISC_R_SUCCESS)
+       if (result == ISC_R_SUCCESS) {
                isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
                              NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
                              "scheduled loading new zones");
-       else
+       } else {
                isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
                              NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
                              "loading new zones failed: %s",
                              isc_result_totext(result));
+               server->reload_status = NAMED_RELOAD_FAILED;
+       }
 cleanup:
        return (result);
 }
@@ -11539,8 +11543,11 @@ named_server_status(named_server_t *server, isc_buffer_t **text) {
                     isc_quota_getmax(&server->sctx->tcpquota));
        CHECK(putstr(text, line));
 
-       if (server->reload_in_progress) {
-               CHECK(putstr(text, "reload/reconfig in progress"));
+       if (server->reload_status != NAMED_RELOAD_DONE) {
+               snprintf(line, sizeof(line), "reload/reconfig %s\n",
+                        server->reload_status == NAMED_RELOAD_FAILED
+                        ? "failed" : "in progress");
+               CHECK(putstr(text, line));
        }
 
        CHECK(putstr(text, "server is up and running"));
index 7cbe2c7338a86251eca0f6af345a23f6c3475bff..3718e143182d247c45a5302924e6ed23d9e82d0e 100644 (file)
@@ -545,6 +545,20 @@ mv ns4/named.conf ns4/named.conf.save
 echo "error error error" >> ns4/named.conf
 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf reconfig > rndc.out.1.test$n 2>&1 && ret=1
 grep "rndc: 'reconfig' failed: unexpected token" rndc.out.1.test$n > /dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo_i "check rndc status reports failure ($n)"
+ret=0
+$RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf status > rndc.out.1.test$n 2>&1 || ret=1
+grep "reload/reconfig failed" rndc.out.1.test$n > /dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo_i "restore working config ($n)"
+ret=0
 mv ns4/named.conf.save ns4/named.conf
 sleep 1
 $RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf reconfig > /dev/null || ret=1
@@ -552,6 +566,14 @@ sleep 1
 if [ $ret != 0 ]; then echo_i "failed"; fi
 status=`expr $status + $ret`
 
+n=`expr $n + 1`
+echo_i "check 'rndc status' 'reload/reconfig failure' is cleared after successful reload/reconfig ($n)"
+ret=0
+$RNDC -s 10.53.0.4 -p ${EXTRAPORT6} -c ns4/key6.conf status > rndc.out.1.test$n 2>&1 || ret=1
+grep "reload/reconfig failed" rndc.out.1.test$n > /dev/null && ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
 n=`expr $n + 1`
 echo_i "test read-only control channel access ($n)"
 ret=0