diff options
Diffstat (limited to 'vtysh/vtysh_config.c')
| -rw-r--r-- | vtysh/vtysh_config.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c index 2949faa427..c207e4d427 100644 --- a/vtysh/vtysh_config.c +++ b/vtysh/vtysh_config.c @@ -315,11 +315,20 @@ void vtysh_config_parse_line(void *arg, const char *line) } else if (!strncmp(line, " ip mroute", strlen(" ip mroute"))) { config_add_line_uniq_end(config->line, line); + } else if ((strncmp(line, " rpki", strlen(" rpki")) == + 0) && + config->index == VRF_NODE) { + config_add_line(config->line, line); + config->index = RPKI_VRF_NODE; } else if (config->index == RMAP_NODE || config->index == INTERFACE_NODE || config->index == VTY_NODE) config_add_line_uniq(config->line, line); - else if (config->index == NH_GROUP_NODE) { + else if (config->index == RPKI_VRF_NODE && + strncmp(line, " exit", strlen(" exit")) == 0) { + config_add_line(config->line, line); + config->index = VRF_NODE; + } else if (config->index == NH_GROUP_NODE) { if (strncmp(line, " resilient", strlen(" resilient")) == 0) config_add_line_head(config->line, @@ -455,6 +464,12 @@ void vtysh_config_parse_line(void *arg, const char *line) else if (strncmp(line, "debug resolver", strlen("debug resolver")) == 0) config = config_get(RESOLVER_DEBUG_NODE, line); + else if (strncmp(line, "debug mgmt client frontend", + strlen("debug mgmt client frontend")) == 0) + config = config_get(MGMT_FE_DEBUG_NODE, line); + else if (strncmp(line, "debug mgmt client backend", + strlen("debug mgmt client backend")) == 0) + config = config_get(MGMT_BE_DEBUG_NODE, line); else if (strncmp(line, "debug", strlen("debug")) == 0) config = config_get(DEBUG_NODE, line); else if (strncmp(line, "password", strlen("password")) == 0 @@ -484,8 +499,7 @@ void vtysh_config_parse_line(void *arg, const char *line) config = config_get(RPKI_NODE, line); else { if (strncmp(line, "log", strlen("log")) == 0 || - strncmp(line, "hostname", strlen("hostname")) == - 0 || + strncmp(line, "hostname", strlen("hostname")) == 0 || strncmp(line, "domainname", strlen("domainname")) == 0 || strncmp(line, "allow-reserved-ranges", @@ -497,12 +511,9 @@ void vtysh_config_parse_line(void *arg, const char *line) strlen("no ip prefix-list")) == 0 || strncmp(line, "no ipv6 prefix-list", strlen("no ipv6 prefix-list")) == 0 || - strncmp(line, "service ", strlen("service ")) == - 0 || - strncmp(line, "no service cputime-stats", - strlen("no service cputime-stats")) == 0 || - strncmp(line, "service cputime-warning", - strlen("service cputime-warning")) == 0) + strncmp(line, "service ", strlen("service ")) == 0 || + strncmp(line, "no service ", + strlen("no service ")) == 0) config_add_line_uniq(config_top, line); else config_add_line(config_top, line); @@ -548,9 +559,7 @@ static void configvec_dump(vector vec, bool nested) * are not under the VRF node. */ if (config->index == INTERFACE_NODE - && (listcount(config->line) == 1) - && (line = listnode_head(config->line)) - && strmatch(line, "exit")) { + && list_isempty(config->line)) { config_del(config); continue; } @@ -607,7 +616,13 @@ static int vtysh_read_file(FILE *confp, bool dry_run) vty->node = CONFIG_NODE; vtysh_execute_no_pager("enable"); - vtysh_execute_no_pager("configure terminal"); + /* + * When reading the config, we need to wait until the lock is acquired. + * If we ignore the failure and continue without the lock, the config + * will be fully ignored. + */ + while (vtysh_execute_no_pager("conf term file-lock") == CMD_WARNING_CONFIG_FAILED) + usleep(100000); if (!dry_run) vtysh_execute_no_pager("XFRR_start_configuration"); |
