summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/grammar_sandbox_main.c2
-rw-r--r--lib/libfrr.c7
-rw-r--r--lib/libfrr.h2
-rw-r--r--lib/subdir.am2
-rw-r--r--lib/vty.c34
-rw-r--r--lib/vty.h2
-rw-r--r--tests/helpers/c/main.c2
-rw-r--r--tests/lib/cli/common_cli.c2
-rw-r--r--tests/lib/northbound/test_oper_data.c2
9 files changed, 43 insertions, 12 deletions
diff --git a/lib/grammar_sandbox_main.c b/lib/grammar_sandbox_main.c
index 38494fb00..6d28a667b 100644
--- a/lib/grammar_sandbox_main.c
+++ b/lib/grammar_sandbox_main.c
@@ -56,7 +56,7 @@ int main(int argc, char **argv)
host.name = strdup("test");
host.domainname = strdup("testdomainname");
- vty_init(master);
+ vty_init(master, true);
memory_init();
yang_init();
nb_init(master, NULL, 0);
diff --git a/lib/libfrr.c b/lib/libfrr.c
index 15de96fee..194a1d9bd 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -94,6 +94,7 @@ static void opt_extend(const struct optspec *os)
#define OPTION_LOGLEVEL 1004
#define OPTION_TCLI 1005
#define OPTION_DB_FILE 1006
+#define OPTION_LOGGING 1007
static const struct option lo_always[] = {
{"help", no_argument, NULL, 'h'},
@@ -105,6 +106,7 @@ static const struct option lo_always[] = {
{"log", required_argument, NULL, OPTION_LOG},
{"log-level", required_argument, NULL, OPTION_LOGLEVEL},
{"tcli", no_argument, NULL, OPTION_TCLI},
+ {"command-log-always", no_argument, NULL, OPTION_LOGGING},
{NULL}};
static const struct optspec os_always = {
"hvdM:",
@@ -496,6 +498,9 @@ static int frr_opt(int opt)
case OPTION_LOGLEVEL:
di->early_loglevel = optarg;
break;
+ case OPTION_LOGGING:
+ di->log_always = true;
+ break;
default:
return 1;
}
@@ -648,7 +653,7 @@ struct thread_master *frr_init(void)
else
cmd_init(1);
- vty_init(master);
+ vty_init(master, di->log_always);
memory_init();
log_ref_init();
diff --git a/lib/libfrr.h b/lib/libfrr.h
index 891e2c128..d17495e04 100644
--- a/lib/libfrr.h
+++ b/lib/libfrr.h
@@ -97,6 +97,8 @@ struct frr_daemon_info {
const struct frr_yang_module_info **yang_modules;
size_t n_yang_modules;
+
+ bool log_always;
};
/* execname is the daemon's executable (and pidfile and configfile) name,
diff --git a/lib/subdir.am b/lib/subdir.am
index 4897f5e8e..61dded05f 100644
--- a/lib/subdir.am
+++ b/lib/subdir.am
@@ -131,6 +131,8 @@ lib/nexthop_group_clippy.c: $(CLIPPY_DEPS)
lib/nexthop_group.lo: lib/nexthop_group_clippy.c
lib/northbound_cli_clippy.c: $(CLIPPY_DEPS)
lib/northbound_cli.lo: lib/northbound_cli_clippy.c
+lib/vty_clippy.c: $(CLIPPY_DEPS)
+lib/vty.lo: lib/vty_clippy.c
pkginclude_HEADERS += \
lib/agg_table.h \
diff --git a/lib/vty.c b/lib/vty.c
index 2d97cca35..8273d0e0c 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -46,6 +46,10 @@
#include <arpa/telnet.h>
#include <termios.h>
+#ifndef VTYSH_EXTRACT_PL
+#include "lib/vty_clippy.c"
+#endif
+
DEFINE_MTYPE_STATIC(LIB, VTY, "VTY")
DEFINE_MTYPE_STATIC(LIB, VTY_OUT_BUF, "VTY output buffer")
DEFINE_MTYPE_STATIC(LIB, VTY_HIST, "VTY history")
@@ -92,7 +96,8 @@ static int no_password_check = 0;
/* Integrated configuration file path */
static char integrate_default[] = SYSCONFDIR INTEGRATE_DEFAULT_CONFIG;
-static int do_log_commands = 0;
+static bool do_log_commands;
+static bool do_log_commands_perm;
void vty_frame(struct vty *vty, const char *format, ...)
{
@@ -2975,13 +2980,24 @@ DEFUN_NOSH (show_history,
}
/* vty login. */
-DEFUN (log_commands,
+DEFPY (log_commands,
log_commands_cmd,
- "log commands",
+ "[no] log commands",
+ NO_STR
"Logging control\n"
- "Log all commands (can't be unset without restart)\n")
+ "Log all commands\n")
{
- do_log_commands = 1;
+ if (no) {
+ if (do_log_commands_perm) {
+ vty_out(vty,
+ "Daemon started with permanent logging turned on for commands, ignoring\n");
+ return CMD_WARNING;
+ }
+
+ do_log_commands = false;
+ } else
+ do_log_commands = true;
+
return CMD_SUCCESS;
}
@@ -3101,7 +3117,7 @@ void vty_init_vtysh(void)
}
/* Install vty's own commands like `who' command. */
-void vty_init(struct thread_master *master_thread)
+void vty_init(struct thread_master *master_thread, bool do_command_logging)
{
/* For further configuration read, preserve current directory. */
vty_save_cwd();
@@ -3125,6 +3141,12 @@ void vty_init(struct thread_master *master_thread)
install_element(CONFIG_NODE, &no_service_advanced_vty_cmd);
install_element(CONFIG_NODE, &show_history_cmd);
install_element(CONFIG_NODE, &log_commands_cmd);
+
+ if (do_command_logging) {
+ do_log_commands = true;
+ do_log_commands_perm = true;
+ }
+
install_element(ENABLE_NODE, &terminal_monitor_cmd);
install_element(ENABLE_NODE, &terminal_no_monitor_cmd);
install_element(ENABLE_NODE, &no_terminal_monitor_cmd);
diff --git a/lib/vty.h b/lib/vty.h
index 98d75542f..4847c9f18 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -290,7 +290,7 @@ struct vty_arg {
#endif
/* Prototypes. */
-extern void vty_init(struct thread_master *);
+extern void vty_init(struct thread_master *, bool do_command_logging);
extern void vty_init_vtysh(void);
extern void vty_terminate(void);
extern void vty_reset(void);
diff --git a/tests/helpers/c/main.c b/tests/helpers/c/main.c
index 11db2dabc..b1dcfcf70 100644
--- a/tests/helpers/c/main.c
+++ b/tests/helpers/c/main.c
@@ -153,7 +153,7 @@ int main(int argc, char **argv)
/* Library inits. */
cmd_init(1);
- vty_init(master);
+ vty_init(master, false);
memory_init();
yang_init();
nb_init(master, NULL, 0);
diff --git a/tests/lib/cli/common_cli.c b/tests/lib/cli/common_cli.c
index 393b58874..2071ae08c 100644
--- a/tests/lib/cli/common_cli.c
+++ b/tests/lib/cli/common_cli.c
@@ -82,7 +82,7 @@ int main(int argc, char **argv)
cmd_hostname_set("test");
cmd_domainname_set("test.domain");
- vty_init(master);
+ vty_init(master, false);
memory_init();
yang_init();
nb_init(master, NULL, 0);
diff --git a/tests/lib/northbound/test_oper_data.c b/tests/lib/northbound/test_oper_data.c
index 7cd622854..3180f9f9f 100644
--- a/tests/lib/northbound/test_oper_data.c
+++ b/tests/lib/northbound/test_oper_data.c
@@ -411,7 +411,7 @@ int main(int argc, char **argv)
/* Library inits. */
cmd_init(1);
cmd_hostname_set("test");
- vty_init(master);
+ vty_init(master, false);
memory_init();
yang_init();
nb_init(master, modules, array_size(modules));