blob: 5d43f1dc7c293612b3cf408139326fdca501338a [file] [log] [blame]
From 7479e9e720909a2d2360f684e85821195301dce2 Mon Sep 17 00:00:00 2001
From: Tomas Pecka <peckato1@users.noreply.github.com>
Date: Wed, 6 Oct 2021 10:11:31 +0200
Subject: [PATCH 9/9] networkctl: JSON output in networkctl lldp
`networkctl lldp` now outputs also in JSON format when `--json=*`
argument passed. The LLDP neighbors are listed in per interface lists.
---
src/network/networkctl.c | 123 ++++++++++++++++++++++++++-------------
1 file changed, 82 insertions(+), 41 deletions(-)
diff --git a/src/network/networkctl.c b/src/network/networkctl.c
index 89abaf26da..124ee8f0c7 100644
--- a/src/network/networkctl.c
+++ b/src/network/networkctl.c
@@ -2510,6 +2510,7 @@ typedef struct LLDPUserdata {
char *link_name;
Table *table;
+ JsonVariant **json_list;
} LLDPUserdata;
static int lldp_neighbours_varlink_reply(Varlink *link, JsonVariant *parameters, const char *error_id, VarlinkReplyFlags flags, void *userdata) {
@@ -2556,6 +2557,26 @@ static int lldp_neighbours_varlink_reply(Varlink *link, JsonVariant *parameters,
if (udata->capabilities_all)
*(udata->capabilities_all) |= entry.capabilities;
+ if (udata->json_list) {
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+
+ capabilities = lldp_capabilities_to_string(entry.capabilities, false);
+
+ r = json_build(&v, JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("neighbor", JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_CONDITION(entry.chassis_id, "chassisId", JSON_BUILD_STRING(entry.chassis_id)),
+ JSON_BUILD_PAIR_CONDITION(entry.port_id, "portId", JSON_BUILD_STRING(entry.port_id)),
+ JSON_BUILD_PAIR_CONDITION(entry.system_name, "systemName", JSON_BUILD_STRING(entry.system_name)),
+ JSON_BUILD_PAIR_CONDITION(entry.port_description, "portDescription", JSON_BUILD_STRING(entry.port_description)),
+ JSON_BUILD_PAIR_CONDITION(entry.capabilities, "enabledCapabilities", JSON_BUILD_STRING(capabilities))))));
+ if (r < 0)
+ return r;
+
+ r = json_variant_append_array(udata->json_list, v);
+ if (r < 0)
+ return r;
+ }
+
return 0;
}
@@ -2568,10 +2589,10 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
_cleanup_(link_info_array_freep) LinkInfo *links = NULL;
_cleanup_(table_unrefp) Table *table = NULL;
+ _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
int neighbors_count = 0;
uint16_t capabilities_all = 0;
LLDPUserdata udata = {};
- TableCell *cell;
r = varlink_connect_address(&link, address);
if (r < 0)
@@ -2592,50 +2613,58 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
if (c < 0)
return c;
- (void) pager_open(arg_pager_flags);
+ if (arg_json_format_flags == JSON_FORMAT_OFF) {
+ TableCell *cell;
- table = table_new("link",
- "chassis id",
- "system name",
- "caps",
- "port id",
- "port description");
- if (!table)
- return log_oom();
+ (void) pager_open(arg_pager_flags);
- if (arg_full)
- table_set_width(table, 0);
+ table = table_new("link",
+ "chassis id",
+ "system name",
+ "caps",
+ "port id",
+ "port description");
+ if (!table)
+ return log_oom();
- table_set_header(table, arg_legend);
+ if (arg_full)
+ table_set_width(table, 0);
- assert_se(cell = table_get_cell(table, 0, 0));
- table_set_minimum_width(table, cell, 16);
- table_set_maximum_width(table, cell, 16);
+ table_set_header(table, arg_legend);
- assert_se(cell = table_get_cell(table, 0, 1));
- table_set_minimum_width(table, cell, 17);
- table_set_maximum_width(table, cell, 17);
+ assert_se(cell = table_get_cell(table, 0, 0));
+ table_set_minimum_width(table, cell, 16);
+ table_set_maximum_width(table, cell, 16);
- assert_se(cell = table_get_cell(table, 0, 2));
- table_set_minimum_width(table, cell, 16);
- table_set_maximum_width(table, cell, 16);
+ assert_se(cell = table_get_cell(table, 0, 1));
+ table_set_minimum_width(table, cell, 17);
+ table_set_maximum_width(table, cell, 17);
- assert_se(cell = table_get_cell(table, 0, 3));
- table_set_minimum_width(table, cell, 11);
- table_set_maximum_width(table, cell, 11);
+ assert_se(cell = table_get_cell(table, 0, 2));
+ table_set_minimum_width(table, cell, 16);
+ table_set_maximum_width(table, cell, 16);
- assert_se(cell = table_get_cell(table, 0, 4));
- table_set_minimum_width(table, cell, 17);
- table_set_maximum_width(table, cell, 17);
+ assert_se(cell = table_get_cell(table, 0, 3));
+ table_set_minimum_width(table, cell, 11);
+ table_set_maximum_width(table, cell, 11);
- assert_se(cell = table_get_cell(table, 0, 5));
- table_set_minimum_width(table, cell, 16);
- table_set_maximum_width(table, cell, 16);
+ assert_se(cell = table_get_cell(table, 0, 4));
+ table_set_minimum_width(table, cell, 17);
+ table_set_maximum_width(table, cell, 17);
- if (table_set_empty_string(table, "n/a") < 0)
- return log_oom();
+ assert_se(cell = table_get_cell(table, 0, 5));
+ table_set_minimum_width(table, cell, 16);
+ table_set_maximum_width(table, cell, 16);
+
+ if (table_set_empty_string(table, "n/a") < 0)
+ return log_oom();
- udata.table = table;
+ udata.table = table;
+ } else {
+ r = json_build(&v, JSON_BUILD_EMPTY_OBJECT);
+ if (r < 0)
+ return r;
+ }
udata.neighbors_count = &neighbors_count;
udata.capabilities_all = &capabilities_all;
@@ -2643,10 +2672,14 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
varlink_set_userdata(link, &udata);
for (int i = 0; i < c; i++) {
- _cleanup_(json_variant_unrefp) JsonVariant *cparams = NULL;
+ _cleanup_(json_variant_unrefp) JsonVariant *cparams = NULL, *neighbors = NULL;
udata.link_name = links[i].name;
+ if (arg_json_format_flags != JSON_FORMAT_OFF) {
+ udata.json_list = &neighbors;
+ }
+
r = json_build(&cparams, JSON_BUILD_OBJECT(
JSON_BUILD_PAIR("ifindex", JSON_BUILD_UNSIGNED(links[i].ifindex))));
if (r < 0)
@@ -2659,15 +2692,23 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) {
r = varlink_observe_complete(link);
if (r < 0)
return r;
+
+ if (!json_variant_is_blank_array(neighbors)) {
+ json_variant_set_field(&v, links[i].name, neighbors);
+ }
}
- r = table_print(table, NULL);
- if (r < 0)
- return table_log_print_error(r);
+ if (arg_json_format_flags == JSON_FORMAT_OFF) {
+ r = table_print(table, NULL);
+ if (r < 0)
+ return table_log_print_error(r);
- if (arg_legend) {
- lldp_capabilities_legend(capabilities_all);
- printf("\n%i neighbors listed.\n", neighbors_count);
+ if (arg_legend) {
+ lldp_capabilities_legend(capabilities_all);
+ printf("\n%i neighbors listed.\n", neighbors_count);
+ }
+ } else {
+ json_variant_dump(v, arg_json_format_flags, NULL, NULL);
}
return 0;
--
2.33.0