Quagga processes should not die if they read an unrecognized line in

their config file

Ticket: CM-6738
Reviewed By: Donald and Dinesh
Testing Done:

<DETAILED DESCRIPTION (REPLACE)>
This commit is contained in:
Daniel Walton 2015-07-27 20:30:22 -07:00
parent d6db5772f4
commit 5689fe5fef
6 changed files with 52 additions and 44 deletions

View File

@ -2761,11 +2761,12 @@ cmd_execute_command_strict (vector vline, struct vty *vty,
return cmd_execute_command_real(vline, FILTER_STRICT, vty, cmd); return cmd_execute_command_real(vline, FILTER_STRICT, vty, cmd);
} }
/* Configration make from file. */ /* Configuration make from file. */
int int
config_from_file (struct vty *vty, FILE *fp) config_from_file (struct vty *vty, FILE *fp)
{ {
int ret; int ret, error_ret=0;
int saved_node;
vector vline; vector vline;
while (fgets (vty->buf, VTY_BUFSIZ, fp)) while (fgets (vty->buf, VTY_BUFSIZ, fp))
@ -2778,24 +2779,42 @@ config_from_file (struct vty *vty, FILE *fp)
/* Execute configuration command : this is strict match */ /* Execute configuration command : this is strict match */
ret = cmd_execute_command_strict (vline, vty, NULL); ret = cmd_execute_command_strict (vline, vty, NULL);
/* Try again with setting node to CONFIG_NODE */ // Climb the tree and try the command again at each node
while (ret != CMD_SUCCESS && ret != CMD_WARNING if (ret != CMD_SUCCESS && ret != CMD_WARNING &&
&& ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE) ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE) {
{
saved_node = vty->node;
while (ret != CMD_SUCCESS && ret != CMD_WARNING &&
ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE) {
vty->node = node_parent(vty->node); vty->node = node_parent(vty->node);
ret = cmd_execute_command_strict (vline, vty, NULL); ret = cmd_execute_command_strict (vline, vty, NULL);
} }
cmd_free_strvec (vline); // If climbing the tree did not work then ignore the command and
// stay at the same node
if (ret != CMD_SUCCESS && ret != CMD_WARNING &&
ret != CMD_ERR_NOTHING_TODO) {
vty->node = saved_node;
if (ret != CMD_SUCCESS && ret != CMD_WARNING if (!error_ret) {
&& ret != CMD_ERR_NOTHING_TODO) memcpy(vty->error_buf, vty->buf, VTY_BUFSIZ);
return ret; error_ret = ret;
} }
}
}
cmd_free_strvec (vline);
}
if (error_ret) {
return error_ret;
}
return CMD_SUCCESS; return CMD_SUCCESS;
} }
/* Configration from terminal */ /* Configuration from terminal */
DEFUN (config_terminal, DEFUN (config_terminal,
config_terminal_cmd, config_terminal_cmd,
"configure terminal", "configure terminal",

View File

@ -322,6 +322,7 @@ vty_new ()
new->obuf = buffer_new(0); /* Use default buffer size. */ new->obuf = buffer_new(0); /* Use default buffer size. */
new->buf = XCALLOC (MTYPE_VTY, VTY_BUFSIZ); new->buf = XCALLOC (MTYPE_VTY, VTY_BUFSIZ);
new->error_buf = XCALLOC (MTYPE_VTY, VTY_BUFSIZ);
new->max = VTY_BUFSIZ; new->max = VTY_BUFSIZ;
return new; return new;
@ -478,6 +479,7 @@ vty_ensure (struct vty *vty, int length)
{ {
vty->max *= 2; vty->max *= 2;
vty->buf = XREALLOC (MTYPE_VTY, vty->buf, vty->max); vty->buf = XREALLOC (MTYPE_VTY, vty->buf, vty->max);
vty->error_buf = XREALLOC (MTYPE_VTY, vty->error_buf, vty->max);
} }
} }
@ -2195,6 +2197,9 @@ vty_close (struct vty *vty)
if (vty->buf) if (vty->buf)
XFREE (MTYPE_VTY, vty->buf); XFREE (MTYPE_VTY, vty->buf);
if (vty->error_buf)
XFREE (MTYPE_VTY, vty->error_buf);
/* Check configure. */ /* Check configure. */
vty_config_unlock (vty); vty_config_unlock (vty);
@ -2243,16 +2248,14 @@ vty_read_file (FILE *confp)
switch (ret) switch (ret)
{ {
case CMD_ERR_AMBIGUOUS: case CMD_ERR_AMBIGUOUS:
fprintf (stderr, "Ambiguous command.\n"); fprintf (stderr, "\nAmbiguous command.");
break; break;
case CMD_ERR_NO_MATCH: case CMD_ERR_NO_MATCH:
fprintf (stderr, "There is no such command.\n"); fprintf (stderr, "\nThere is no such command.");
break; break;
} }
fprintf (stderr, "Error occured during reading below line.\n%s\n", fprintf (stderr, "\nError occured during reading below line.\n%s\n",
vty->buf); vty->error_buf);
vty_close (vty);
exit (1);
} }
vty_close (vty); vty_close (vty);

View File

@ -49,6 +49,9 @@ struct vty
/* Command input buffer */ /* Command input buffer */
char *buf; char *buf;
/* Command input error buffer */
char *error_buf;
/* Command cursor point */ /* Command cursor point */
int cp; int cp;

View File

@ -662,7 +662,7 @@ vtysh_mark_file (const char *filename)
} }
/* Configration make from file. */ /* Configration make from file. */
int void
vtysh_config_from_file (struct vty *vty, FILE *fp) vtysh_config_from_file (struct vty *vty, FILE *fp)
{ {
int ret; int ret;
@ -707,10 +707,11 @@ vtysh_config_from_file (struct vty *vty, FILE *fp)
else else
{ {
save_node = vty->node; save_node = vty->node;
vtysh_execute ("end");
vtysh_execute ("configure terminal");
vty->node = CONFIG_NODE; vty->node = CONFIG_NODE;
ret = cmd_execute_command_strict (vline, vty, &cmd); ret = cmd_execute_command_strict (vline, vty, &cmd);
// If the command did not work at CONFIG_NODE either then ignore
// the command and go back to our previous node.
if ((ret != CMD_SUCCESS) && if ((ret != CMD_SUCCESS) &&
(ret != CMD_SUCCESS_DAEMON) && (ret != CMD_SUCCESS_DAEMON) &&
(ret != CMD_WARNING)) (ret != CMD_WARNING))
@ -758,7 +759,6 @@ vtysh_config_from_file (struct vty *vty, FILE *fp)
} }
} }
} }
return CMD_SUCCESS;
} }
/* We don't care about the point of the cursor when '?' is typed. */ /* We don't care about the point of the cursor when '?' is typed. */

View File

@ -50,7 +50,7 @@ char *vtysh_prompt (void);
void vtysh_config_write (void); void vtysh_config_write (void);
int vtysh_config_from_file (struct vty *, FILE *); void vtysh_config_from_file (struct vty *, FILE *);
int vtysh_mark_file(const char *filename); int vtysh_mark_file(const char *filename);

View File

@ -368,7 +368,6 @@ vtysh_config_dump (FILE *fp)
static void static void
vtysh_read_file (FILE *confp) vtysh_read_file (FILE *confp)
{ {
int ret;
struct vty *vty; struct vty *vty;
vty = vty_new (); vty = vty_new ();
@ -380,28 +379,12 @@ vtysh_read_file (FILE *confp)
vtysh_execute_no_pager ("configure terminal"); vtysh_execute_no_pager ("configure terminal");
/* Execute configuration file. */ /* Execute configuration file. */
ret = vtysh_config_from_file (vty, confp); vtysh_config_from_file (vty, confp);
vtysh_execute_no_pager ("end"); vtysh_execute_no_pager ("end");
vtysh_execute_no_pager ("disable"); vtysh_execute_no_pager ("disable");
vty_close (vty); vty_close (vty);
if (ret != CMD_SUCCESS)
{
switch (ret)
{
case CMD_ERR_AMBIGUOUS:
fprintf (stderr, "Ambiguous command.\n");
break;
case CMD_ERR_NO_MATCH:
fprintf (stderr, "There is no such command.\n");
break;
}
fprintf (stderr, "Error occured during reading below line.\n%s\n",
vty->buf);
exit (1);
}
} }
/* Read up configuration file from config_default_dir. */ /* Read up configuration file from config_default_dir. */