summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2019-01-08 21:33:49 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-07-29 17:18:18 +0000
commit1f9128d69fa2741368b72a6e0ab4ef25fd29a636 (patch)
treefbdf035783d2f23c5329e20d3d29d7cc9dc6cfdd
parent2816a8799d62d375efbb5f89d9ef6939432bdf46 (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.c12
-rw-r--r--lib/ferr.h1
-rw-r--r--lib/libfrr.c1
-rw-r--r--vtysh/vtysh.c28
-rw-r--r--vtysh/vtysh_main.c5
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) {