mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 23:53:28 +00:00
watchfrr, vtysh: do not write config during crash
If a daemon is restarting, crashed, or otherwise in the process of reconnecting to watchfrr and a user issues "write memory" or "write file" the resulting config will not include the configuration of that daemon. This is problematic because this output will overwrite the previous config, potentially causing unintentional loss of configuration stored only in the config file based upon timing. This patch remedies that by making watchfrr check that all daemons are up before attempting a configuration write, and updating vtysh so that its failsafe respects this condition as well. Note that this issue only manifests when using integrated config. Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
parent
18febdb05a
commit
470bc61919
@ -2477,7 +2477,12 @@ DEFUN (vtysh_write_memory,
|
||||
"do write integrated",
|
||||
outputfile);
|
||||
|
||||
if (ret != CMD_SUCCESS) {
|
||||
/*
|
||||
* If watchfrr returns CMD_WARNING_CONFIG_FAILED this means
|
||||
* that it could not write the config, but additionally
|
||||
* indicates that we should not try either
|
||||
*/
|
||||
if (ret != CMD_SUCCESS && ret != CMD_WARNING_CONFIG_FAILED) {
|
||||
printf("\nWarning: attempting direct configuration write without "
|
||||
"watchfrr.\nFile permissions and ownership may be "
|
||||
"incorrect, or write may fail.\n\n");
|
||||
|
@ -899,6 +899,16 @@ static int wakeup_send_echo(struct thread *t_wakeup)
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool check_all_up(void)
|
||||
{
|
||||
struct daemon *dmn;
|
||||
|
||||
for (dmn = gs.daemons; dmn; dmn = dmn->next)
|
||||
if (dmn->state != DAEMON_UP)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void sigint(void)
|
||||
{
|
||||
zlog_notice("Terminating on signal");
|
||||
|
@ -25,5 +25,12 @@ extern void watchfrr_vty_init(void);
|
||||
|
||||
extern pid_t integrated_write_pid;
|
||||
extern void integrated_write_sigchld(int status);
|
||||
/*
|
||||
* Check if all daemons we are monitoring are in the DAEMON_UP state.
|
||||
*
|
||||
* Returns:
|
||||
* True if they are all DAEMON_UP, false otherwise.
|
||||
*/
|
||||
extern bool check_all_up(void);
|
||||
|
||||
#endif /* FRR_WATCHFRR_H */
|
||||
|
@ -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_out(vty, "%% configuration write already in progress.\n");
|
||||
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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user