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);
}
/* Configration make from file. */
/* Configuration make from file. */
int
config_from_file (struct vty *vty, FILE *fp)
{
int ret;
int ret, error_ret=0;
int saved_node;
vector vline;
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 */
ret = cmd_execute_command_strict (vline, vty, NULL);
/* Try again with setting node to CONFIG_NODE */
while (ret != CMD_SUCCESS && ret != CMD_WARNING
&& ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE)
{
vty->node = node_parent(vty->node);
ret = cmd_execute_command_strict (vline, vty, NULL);
}
// Climb the tree and try the command again at each node
if (ret != CMD_SUCCESS && ret != CMD_WARNING &&
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);
ret = cmd_execute_command_strict (vline, vty, NULL);
}
// 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 (!error_ret) {
memcpy(vty->error_buf, vty->buf, VTY_BUFSIZ);
error_ret = ret;
}
}
}
cmd_free_strvec (vline);
if (ret != CMD_SUCCESS && ret != CMD_WARNING
&& ret != CMD_ERR_NOTHING_TODO)
return ret;
}
if (error_ret) {
return error_ret;
}
return CMD_SUCCESS;
}
/* Configration from terminal */
/* Configuration from terminal */
DEFUN (config_terminal,
config_terminal_cmd,
"configure terminal",

View File

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

View File

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

View File

@ -662,7 +662,7 @@ vtysh_mark_file (const char *filename)
}
/* Configration make from file. */
int
void
vtysh_config_from_file (struct vty *vty, FILE *fp)
{
int ret;
@ -707,14 +707,15 @@ vtysh_config_from_file (struct vty *vty, FILE *fp)
else
{
save_node = vty->node;
vtysh_execute ("end");
vtysh_execute ("configure terminal");
vty->node = CONFIG_NODE;
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) &&
(ret != CMD_SUCCESS_DAEMON) &&
(ret != CMD_WARNING))
vty->node = save_node;
vty->node = save_node;
}
}
@ -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. */

View File

@ -50,7 +50,7 @@ char *vtysh_prompt (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);

View File

@ -368,7 +368,6 @@ vtysh_config_dump (FILE *fp)
static void
vtysh_read_file (FILE *confp)
{
int ret;
struct vty *vty;
vty = vty_new ();
@ -380,28 +379,12 @@ vtysh_read_file (FILE *confp)
vtysh_execute_no_pager ("configure terminal");
/* 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 ("disable");
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. */