diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-01-08 21:33:49 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-07-29 17:18:18 +0000 |
| commit | 1f9128d69fa2741368b72a6e0ab4ef25fd29a636 (patch) | |
| tree | fbdf035783d2f23c5329e20d3d29d7cc9dc6cfdd | |
| parent | 2816a8799d62d375efbb5f89d9ef6939432bdf46 (diff) | |
vtysh: only show error codes once
When using `show error` commands, show errors shared between multiple
daemons only once.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
| -rw-r--r-- | lib/ferr.c | 12 | ||||
| -rw-r--r-- | lib/ferr.h | 1 | ||||
| -rw-r--r-- | lib/libfrr.c | 1 | ||||
| -rw-r--r-- | vtysh/vtysh.c | 28 | ||||
| -rw-r--r-- | vtysh/vtysh_main.c | 5 |
5 files changed, 34 insertions, 13 deletions
diff --git a/lib/ferr.c b/lib/ferr.c index 65c0cf886d..8afc926c41 100644 --- a/lib/ferr.c +++ b/lib/ferr.c @@ -126,10 +126,8 @@ void log_ref_display(struct vty *vty, uint32_t code, bool json) if (code) { ref = log_ref_get(code); - if (!ref) { - vty_out(vty, "Code %"PRIu32" - Unknown\n", code); + if (!ref) return; - } listnode_add(errlist, ref); } @@ -197,8 +195,6 @@ void log_ref_init(void) "Error Reference Texts"); } pthread_mutex_unlock(&refs_mtx); - - install_element(VIEW_NODE, &show_error_code_cmd); } void log_ref_fini(void) @@ -212,6 +208,12 @@ void log_ref_fini(void) pthread_mutex_unlock(&refs_mtx); } +void log_ref_vty_init(void) +{ + install_element(VIEW_NODE, &show_error_code_cmd); +} + + const struct ferr *ferr_get_last(ferr_r errval) { struct ferr *last_error = pthread_getspecific(errkey); diff --git a/lib/ferr.h b/lib/ferr.h index 93d0ced538..a89b595e87 100644 --- a/lib/ferr.h +++ b/lib/ferr.h @@ -158,6 +158,7 @@ void log_ref_display(struct vty *vty, uint32_t code, bool json); */ void log_ref_init(void); void log_ref_fini(void); +void log_ref_vty_init(void); /* get error details. * diff --git a/lib/libfrr.c b/lib/libfrr.c index 3294a61295..0fc321d6e0 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -681,6 +681,7 @@ struct thread_master *frr_init(void) log_filter_cmd_init(); log_ref_init(); + log_ref_vty_init(); lib_error_init(); yang_init(); diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index 7a07dab121..5e7f3f1f49 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -46,6 +46,7 @@ #include "command_graph.h" #include "frrstr.h" #include "json.h" +#include "ferr.h" DEFINE_MTYPE_STATIC(MVTYSH, VTYSH_CMD, "Vtysh cmd copy") @@ -2394,17 +2395,28 @@ DEFUN (vtysh_show_error_code, "Information on all errors\n" JSON_STR) { - char *fcmd = argv_concat(argv, argc, 0); - char cmd[256]; - int rv; + uint32_t arg = 0; - snprintf(cmd, sizeof(cmd), "do %s", fcmd); + if (!strmatch(argv[2]->text, "all")) + arg = strtoul(argv[2]->arg, NULL, 10); - /* FIXME: Needs to determine which daemon to send to via code ranges */ - rv = show_per_daemon(cmd, ""); + /* If it's not a shared code, send it to all the daemons */ + if (arg < LIB_FERR_START || arg > LIB_FERR_END) { + char *fcmd = argv_concat(argv, argc, 0); + char cmd[256]; + snprintf(cmd, sizeof(cmd), "do %s", fcmd); + show_per_daemon(cmd, ""); + XFREE(MTYPE_TMP, fcmd); + /* Otherwise, print it ourselves to avoid duplication */ + } else { + bool json = strmatch(argv[argc - 1]->text, "json"); + if (!strmatch(argv[2]->text, "all")) + arg = strtoul(argv[2]->arg, NULL, 10); + + log_ref_display(vty, arg, json); + } - XFREE(MTYPE_TMP, fcmd); - return rv; + return CMD_SUCCESS; } /* Memory */ diff --git a/vtysh/vtysh_main.c b/vtysh/vtysh_main.c index 9667460189..d536263db0 100644 --- a/vtysh/vtysh_main.c +++ b/vtysh/vtysh_main.c @@ -47,6 +47,8 @@ #include "linklist.h" #include "memory_vty.h" #include "libfrr.h" +#include "ferr.h" +#include "lib_errors.h" #include "vtysh/vtysh.h" #include "vtysh/vtysh_user.h" @@ -461,6 +463,9 @@ int main(int argc, char **argv, char **env) vtysh_read_config(vtysh_config); suid_off(); } + /* Error code library system */ + log_ref_init(); + lib_error_init(); if (markfile) { if (!inputfile) { |
