diff --git a/conf/conf.c b/conf/conf.c index 439aa41d..d6b3e8e8 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -444,6 +444,24 @@ config_undo(void) return CONF_PROGRESS; } +int +config_status(void) +{ + if (shutting_down) + return CONF_SHUTDOWN; + + if (configuring) + return future_cftype ? CONF_QUEUED : CONF_PROGRESS; + + return CONF_DONE; +} + +btime +config_timer_status(void) +{ + return tm_active(config_timer) ? tm_remains(config_timer) : -1; +} + extern void cmd_reconfig_undo_notify(void); static void diff --git a/conf/conf.h b/conf/conf.h index 354a4da8..51dcb989 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -69,6 +69,8 @@ void config_free(struct config *); int config_commit(struct config *, int type, uint timeout); int config_confirm(void); int config_undo(void); +int config_status(void); +btime config_timer_status(void); void config_init(void); void cf_error(const char *msg, ...) NORET; void config_add_obstacle(struct config *); diff --git a/sysdep/unix/config.Y b/sysdep/unix/config.Y index e7ecd735..2895a69e 100644 --- a/sysdep/unix/config.Y +++ b/sysdep/unix/config.Y @@ -18,7 +18,7 @@ static struct log_config *this_log; CF_DECLS CF_KEYWORDS(LOG, SYSLOG, ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG, STDERR, SOFT) -CF_KEYWORDS(NAME, CONFIRM, UNDO, CHECK, TIMEOUT, DEBUG, LATENCY, LIMIT, WATCHDOG, WARNING) +CF_KEYWORDS(NAME, CONFIRM, UNDO, CHECK, TIMEOUT, DEBUG, LATENCY, LIMIT, WATCHDOG, WARNING, STATUS) %type log_mask log_mask_list log_cat cfg_timeout %type cfg_name @@ -124,6 +124,9 @@ CF_CLI(CONFIGURE CONFIRM,,, [[Confirm last configuration change - deactivate und CF_CLI(CONFIGURE UNDO,,, [[Undo last configuration change]]) { cmd_reconfig_undo(); } ; +CF_CLI(CONFIGURE STATUS,,, [[Show configuration status]]) +{ cmd_reconfig_status(); } ; + CF_CLI(CONFIGURE CHECK, cfg_name, [\"\"], [[Parse configuration and check its validity]]) { cmd_check_config($3); } ; diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index 921115b1..c381b44f 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -339,6 +339,28 @@ cmd_reconfig_undo(void) cmd_reconfig_msg(r); } +void +cmd_reconfig_status(void) +{ + int s = config_status(); + btime t = config_timer_status(); + + switch (s) + { + case CONF_DONE: cli_msg(-3, "Daemon is up and running"); break; + case CONF_PROGRESS: cli_msg(-4, "Reconfiguration in progress"); break; + case CONF_QUEUED: cli_msg(-5, "Reconfiguration in progress, next one enqueued"); break; + case CONF_SHUTDOWN: cli_msg(-6, "Shutdown in progress"); break; + default: break; + } + + if (t >= 0) + cli_msg(-22, "Configuration unconfirmed, undo in %t s", t); + + cli_msg(0, ""); +} + + /* * Command-Line Interface */ diff --git a/sysdep/unix/unix.h b/sysdep/unix/unix.h index 0e1e98c0..d5ce8ff9 100644 --- a/sysdep/unix/unix.h +++ b/sysdep/unix/unix.h @@ -26,6 +26,7 @@ void cmd_check_config(char *name); void cmd_reconfig(char *name, int type, uint timeout); void cmd_reconfig_confirm(void); void cmd_reconfig_undo(void); +void cmd_reconfig_status(void); void cmd_shutdown(void); #define UNIX_DEFAULT_CONFIGURE_TIMEOUT 300