]> git.proxmox.com Git - mirror_frr.git/blobdiff - watchfrr/watchfrr_vty.c
isisd: implement the 'rejected-adjacency' notification
[mirror_frr.git] / watchfrr / watchfrr_vty.c
index 819d896afa64e1bfa4691a54737d7d786053f80a..9b844d67f25d0aa427d945c51d4d7a75d52710fb 100644 (file)
@@ -40,11 +40,24 @@ DEFUN(config_write_integrated,
        pid_t child;
        sigset_t oldmask, sigmask;
 
+       const char *e_inprog = "Configuration write already in progress.";
+       const char *e_dmn = "Not all daemons are up, cannot write config.";
+
        if (integrated_write_pid != -1) {
-               vty_outln (vty,"%% configuration write already in progress.");
+               vty_out(vty, "%% %s\n", e_inprog);
                return CMD_WARNING;
        }
 
+       /* check that all daemons are up before clobbering config */
+       if (!check_all_up()) {
+               vty_out(vty, "%% %s\n", e_dmn);
+               /*
+                * vtysh interprets this return value to mean that it should
+                * not try to write the config itself
+                */
+               return CMD_WARNING_CONFIG_FAILED;
+       }
+
        fflush(stdout);
        fflush(stderr);
 
@@ -59,19 +72,23 @@ DEFUN(config_write_integrated,
 
        child = fork();
        if (child == -1) {
-               vty_outln (vty, "%% configuration write fork() failed: %s.",
+               vty_out(vty, "%% configuration write fork() failed: %s.\n",
                        safe_strerror(errno));
                sigprocmask(SIG_SETMASK, &oldmask, NULL);
                return CMD_WARNING;
        }
        if (child != 0) {
-               /* note: the VTY won't write a command return value to vtysh;  the
-                * session temporarily enters an intentional "hang" state.  This is
+               /* note: the VTY won't write a command return value to vtysh;
+                * the
+                * session temporarily enters an intentional "hang" state.  This
+                * is
                 * to make sure latency in vtysh doing the config write (several
-                * seconds is not rare to see) does not interfere with watchfrr's
+                * seconds is not rare to see) does not interfere with
+                * watchfrr's
                 * supervisor job.
                 *
-                * The fd is duplicated here so we don't need to hold a vty pointer
+                * The fd is duplicated here so we don't need to hold a vty
+                * pointer
                 * (which could become invalid in the meantime).
                 */
                integrated_write_pid = child;
@@ -91,15 +108,35 @@ DEFUN(config_write_integrated,
 
        /* unbuffered write; we just messed with stdout... */
        char msg[512];
-       snprintf(msg, sizeof(msg), "error executing %s: %s\n",
-                VTYSH_BIN_PATH, safe_strerror(errno));
+       snprintf(msg, sizeof(msg), "error executing %s: %s\n", VTYSH_BIN_PATH,
+                safe_strerror(errno));
        write(1, msg, strlen(msg));
        exit(1);
 }
 
+DEFUN_NOSH (show_debugging_watchfrr,
+            show_debugging_watchfrr_cmd,
+            "show debugging [watchfrr]",
+            SHOW_STR
+            DEBUG_STR
+            WATCHFRR_STR)
+{
+       return CMD_SUCCESS;
+}
+
+DEFUN (show_watchfrr,
+       show_watchfrr_cmd,
+       "show watchfrr",
+       SHOW_STR
+       WATCHFRR_STR)
+{
+       watchfrr_status(vty);
+       return CMD_SUCCESS;
+}
+
 void integrated_write_sigchld(int status)
 {
-       uint8_t reply[4] = { 0, 0, 0, CMD_WARNING };
+       uint8_t reply[4] = {0, 0, 0, CMD_WARNING};
 
        if (WIFEXITED(status)) {
                zlog_info("configuration write completed with exit code %d",
@@ -130,4 +167,7 @@ void watchfrr_vty_init(void)
 {
        integrated_write_pid = -1;
        install_element(ENABLE_NODE, &config_write_integrated_cmd);
+       install_element(ENABLE_NODE, &show_debugging_watchfrr_cmd);
+       install_element(CONFIG_NODE, &show_debugging_watchfrr_cmd);
+       install_element(VIEW_NODE, &show_watchfrr_cmd);
 }