diff options
author | Quentin Young <qlyoung@cumulusnetworks.com> | 2018-06-20 20:51:04 +0200 |
---|---|---|
committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2018-08-14 22:02:05 +0200 |
commit | ed8841d3fb5af79fae6786d93ebbbff681d4d6bf (patch) | |
tree | 97027f642364bef76f533ad9ec200b520bcf1399 /lib/ferr.c | |
parent | babeld: fix erroneous lib init (diff) | |
download | frr-ed8841d3fb5af79fae6786d93ebbbff681d4d6bf.tar.xz frr-ed8841d3fb5af79fae6786d93ebbbff681d4d6bf.zip |
lib: add 'show error all json'
* Add 'all' option
* Add 'json' option
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'lib/ferr.c')
-rw-r--r-- | lib/ferr.c | 79 |
1 files changed, 66 insertions, 13 deletions
diff --git a/lib/ferr.c b/lib/ferr.c index 6625749c3..d09c41fae 100644 --- a/lib/ferr.c +++ b/lib/ferr.c @@ -19,6 +19,7 @@ #include <string.h> #include <pthread.h> #include <signal.h> +#include <inttypes.h> #include "ferr.h" #include "vty.h" @@ -26,6 +27,8 @@ #include "memory.h" #include "hash.h" #include "command.h" +#include "json.h" +#include "linklist.h" DEFINE_MTYPE_STATIC(LIB, ERRINFO, "error information") @@ -101,31 +104,81 @@ struct ferr_ref *ferr_ref_get(uint32_t code) return ref; } -void ferr_ref_display(struct vty *vty, uint32_t code) +void ferr_ref_display(struct vty *vty, uint32_t code, bool json) { - struct ferr_ref *ref = ferr_ref_get(code); + struct ferr_ref *ref; + struct json_object *top, *obj; + struct list *errlist; + struct listnode *ln; + + if (json) + top = json_object_new_object(); + + pthread_mutex_lock(&refs_mtx); + { + errlist = code ? list_new() : hash_to_list(refs); + } + pthread_mutex_unlock(&refs_mtx); + + if (code) { + ref = ferr_ref_get(code); + if (!ref) { + vty_out(vty, "Code %"PRIu32" - Unknown\n", code); + return; + } + listnode_add(errlist, ref); + } + + for (ALL_LIST_ELEMENTS_RO(errlist, ln, ref)) { + if (json) { + char key[11]; + snprintf(key, sizeof(key), "%"PRIu32, ref->code); + obj = json_object_new_object(); + json_object_string_add(obj, "title", ref->title); + json_object_string_add(obj, "description", + ref->description); + json_object_string_add(obj, "suggestion", + ref->suggestion); + json_object_object_add(top, key, obj); + } else { + char pbuf[256]; + char ubuf[256]; + snprintf(pbuf, sizeof(pbuf), "\nError %"PRIu32" - %s", + code, ref->title); + memset(ubuf, '=', strlen(pbuf)); + ubuf[sizeof(ubuf) - 1] = '\0'; + + vty_out(vty, "%s\n%s\n", pbuf, ubuf); + vty_out(vty, "Description:\n%s\n\nRecommendation:\n%s\n", + ref->description, ref->suggestion); + } + } - if (!ref) { - vty_out(vty, "Code %d - Unknown\n", code); - return; + if (json) { + const char *str = json_object_to_json_string_ext( + top, JSON_C_TO_STRING_PRETTY); + vty_out(vty, "%s\n", str); + json_object_free(top); } - vty_out(vty, "Error Code %d - %s\n", code, ref->title); - vty_out(vty, "--------------------------------------\n"); - vty_out(vty, "\nDescription:\n%s\n\nRecommendation:\n%s\n\n", - ref->description, ref->suggestion); + list_delete_and_null(&errlist); } DEFUN_NOSH(show_error_code, show_error_code_cmd, - "show error (0-4294967296)", + "show error <(1-4294967296)|all> [json]", SHOW_STR "Information on errors\n" - "Error code to get info about\n") + "Error code to get info about\n" + "Information on all errors\n" + JSON_STR) { - uint32_t arg = strtoul(argv[2]->arg, NULL, 10); + bool json = strmatch(argv[argc-1]->text, "json"); + uint32_t arg = 0; + if (!strmatch(argv[2]->text, "all")) + arg = strtoul(argv[2]->arg, NULL, 10); - ferr_ref_display(vty, arg); + ferr_ref_display(vty, arg, json); return CMD_SUCCESS; } |