From patchwork Mon Feb 19 03:18:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 874952 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=networkplumber-org.20150623.gappssmtp.com header.i=@networkplumber-org.20150623.gappssmtp.com header.b="n9AqGlcR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zl88l2Zrlz9ryL for ; Mon, 19 Feb 2018 14:18:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752381AbeBSDS2 (ORCPT ); Sun, 18 Feb 2018 22:18:28 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:41788 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752200AbeBSDSZ (ORCPT ); Sun, 18 Feb 2018 22:18:25 -0500 Received: by mail-pf0-f194.google.com with SMTP id 68so1651279pfj.8 for ; Sun, 18 Feb 2018 19:18:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=y8thP0HyS2e2yY9sbCBakVXcj1hjSYHaYGz9U9M7GMo=; b=n9AqGlcRVKO+g/BBUMbmveeSeC7mdQLJn2QjNkxY/mh1lfqOKhl9c2NLCbG7VrYvwP TZ5FXVP40DyeBaJ5gyFNQRK5ALQDY7f+aaY3kvyS77KSv/ZeETIh/mFVL5DfitUdnlHj z0rS7+xKkoGCd4FZIc7hgPE9vPLfTKFB4SRq+yB0SxF+0q8Mo0j8+0nmHSz+SpUTVKVS qwCb5FGc8BVRO3DjF+qJ6xzRIlUI0gzN3PcyyaPuqFxLxbj70Djjg0ZD0hVED/M2Fb0s hdFyytiPb1Jy3vZ0Gbh8m7bDp5DZIH0DjXmUe4zDPhFF9A8kA9nCJbrtnKEQLXeRk6Cy VWLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=y8thP0HyS2e2yY9sbCBakVXcj1hjSYHaYGz9U9M7GMo=; b=IalMUAF5oKFnWIryAT1z7WGt7JwPDvKX72mE9P5IOJMxvwDdvIco2NGssMENRzfOdb GLQmHgxT6R/oZb+O63dyRXnejrU8rObgjjVbrkHI9YrxeKacFChqfH4UflgwFU1ujs5G i5RHFDKau7Nun1WRwBwjyn5sP1Khwaih3AJvQXFQAwU6FC+fHzQ46pGa0MdpPPO+byET /OKqLpebNlb52fJOsn7D8lgVuUugXVcHxIjC3mfdFakDniKrv2RusxPkrJPXV29dJELW ZpMhhAld6jTAux7+NOqEAF01yB5heKOOKXxpxjbHnECShJKdW/qELrkf7hJJQrQNZ/wf dOLw== X-Gm-Message-State: APf1xPAQlLH9ASDKEqZAZj1xe0lOxsHvegON/rd401O0fyD7Z8Y6wg19 +zsynmg3C9ZDMqIuVUcGwf8MY1W2s0w= X-Google-Smtp-Source: AH8x225kzsoBJ3yKIEZUe8TxQ0gnLY9PED+KrSkk2LbG6RvIUZXZ0w2KjwdOM86YZj2qp8NlXrsb1Q== X-Received: by 10.98.223.93 with SMTP id u90mr8277705pfg.13.1519010304479; Sun, 18 Feb 2018 19:18:24 -0800 (PST) Received: from xeon-e3.lan (204-195-71-95.wavecable.com. [204.195.71.95]) by smtp.gmail.com with ESMTPSA id j14sm4112485pfn.113.2018.02.18.19.18.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 18 Feb 2018 19:18:22 -0800 (PST) From: Stephen Hemminger To: netdev@vger.kernel.org Cc: Stephen Hemminger Subject: [PATCH iproute2-next 1/4] bridge: implement json pretty print flag Date: Sun, 18 Feb 2018 19:18:15 -0800 Message-Id: <20180219031818.25797-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180219031818.25797-1-stephen@networkplumber.org> References: <20180219031818.25797-1-stephen@networkplumber.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Make bridge work like other iproute2 commands with standard -j and -p flags. Signed-off-by: Stephen Hemminger --- bridge/br_common.h | 3 ++- bridge/bridge.c | 9 ++++++--- bridge/fdb.c | 10 ++++++---- bridge/mdb.c | 12 ++++++++++-- bridge/vlan.c | 11 +++++++---- man/man8/bridge.8 | 6 ++++++ 6 files changed, 37 insertions(+), 14 deletions(-) diff --git a/bridge/br_common.h b/bridge/br_common.h index f07c7d1c9090..32dc46a2415d 100644 --- a/bridge/br_common.h +++ b/bridge/br_common.h @@ -24,7 +24,8 @@ extern int do_link(int argc, char **argv); extern int preferred_family; extern int show_stats; extern int show_details; +extern int show_pretty; extern int timestamp; extern int compress_vlans; -extern int json_output; +extern int json; extern struct rtnl_handle rth; diff --git a/bridge/bridge.c b/bridge/bridge.c index 48fe1c8b2ef1..3837c3d79290 100644 --- a/bridge/bridge.c +++ b/bridge/bridge.c @@ -22,8 +22,9 @@ int preferred_family = AF_UNSPEC; int oneline; int show_stats; int show_details; +int show_pretty; int compress_vlans; -int json_output; +int json; int timestamp; char *batch_file; int force; @@ -39,7 +40,7 @@ static void usage(void) "where OBJECT := { link | fdb | mdb | vlan | monitor }\n" " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n" " -o[neline] | -t[imestamp] | -n[etns] name |\n" -" -c[ompressvlans] -j{son} }\n"); +" -c[ompressvlans] -p[retty] -j{son} }\n"); exit(-1); } @@ -175,7 +176,9 @@ main(int argc, char **argv) } else if (matches(opt, "-force") == 0) { ++force; } else if (matches(opt, "-json") == 0) { - ++json_output; + ++json; + } else if (matches(opt, "-pretty") == 0) { + ++show_pretty; } else if (matches(opt, "-batch") == 0) { argc--; argv++; diff --git a/bridge/fdb.c b/bridge/fdb.c index 8b133f9c1c8d..82dff5167e86 100644 --- a/bridge/fdb.c +++ b/bridge/fdb.c @@ -132,10 +132,8 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (filter_vlan && filter_vlan != vid) return 0; - if (jw_global) { - jsonw_pretty(jw_global, 1); + if (jw_global) jsonw_start_object(jw_global); - } if (n->nlmsg_type == RTM_DELNEIGH) { if (jw_global) @@ -388,14 +386,18 @@ static int fdb_show(int argc, char **argv) exit(1); } - if (json_output) { + if (json) { jw_global = jsonw_new(stdout); if (!jw_global) { fprintf(stderr, "Error allocation json object\n"); exit(1); } + if (show_pretty) + jsonw_pretty(jw_global, 1); + jsonw_start_array(jw_global); } + if (rtnl_dump_filter(&rth, print_fdb, stdout) < 0) { fprintf(stderr, "Dump terminated\n"); exit(1); diff --git a/bridge/mdb.c b/bridge/mdb.c index 62dc8a0c58c3..0873502e8a24 100644 --- a/bridge/mdb.c +++ b/bridge/mdb.c @@ -325,7 +325,7 @@ static int mdb_show(int argc, char **argv) return -1; } - if (!json_output) { + if (!json) { /* Normal output */ if (rtnl_dump_filter(&rth, print_mdb, stdout) < 0) { fprintf(stderr, "Dump terminated\n"); @@ -333,9 +333,17 @@ static int mdb_show(int argc, char **argv) } return 0; } + /* Json output */ jw_global = jsonw_new(stdout); - jsonw_pretty(jw_global, 1); + if (!jw_global) { + fprintf(stderr, "Error allocation json object\n"); + exit(1); + } + + if (show_pretty) + jsonw_pretty(jw_global, 1); + jsonw_start_object(jw_global); jsonw_name(jw_global, "mdb"); jsonw_start_array(jw_global); diff --git a/bridge/vlan.c b/bridge/vlan.c index f42d7e6ba244..e4eab4c2384f 100644 --- a/bridge/vlan.c +++ b/bridge/vlan.c @@ -258,7 +258,6 @@ static int filter_vlan_check(__u16 vid, __u16 flags) static void print_vlan_port(FILE *fp, int ifi_index) { if (jw_global) { - jsonw_pretty(jw_global, 1); jsonw_name(jw_global, ll_index_to_name(ifi_index)); jsonw_start_array(jw_global); @@ -578,17 +577,21 @@ static int vlan_show(int argc, char **argv) if (!show_stats) { if (rtnl_wilddump_req_filter(&rth, PF_BRIDGE, RTM_GETLINK, (compress_vlans ? - RTEXT_FILTER_BRVLAN_COMPRESSED : - RTEXT_FILTER_BRVLAN)) < 0) { + RTEXT_FILTER_BRVLAN_COMPRESSED : + RTEXT_FILTER_BRVLAN)) < 0) { perror("Cannont send dump request"); exit(1); } - if (json_output) { + + if (json) { jw_global = jsonw_new(stdout); if (!jw_global) { fprintf(stderr, "Error allocation json object\n"); exit(1); } + if (show_pretty) + jsonw_pretty(jw_global, 1); + jsonw_start_object(jw_global); } else { if (show_vlan_tunnel_info) diff --git a/man/man8/bridge.8 b/man/man8/bridge.8 index d6baa819020a..490ef58da16c 100644 --- a/man/man8/bridge.8 +++ b/man/man8/bridge.8 @@ -22,6 +22,7 @@ bridge \- show / manipulate bridge addresses and devices \fB\-s\fR[\fItatistics\fR] | \fB\-n\fR[\fIetns\fR] name | \fB\-b\fR[\fIatch\fR] filename | +\fB\-p\fR[\fIretty\fR] | \fB\-j\fR[\fIson\fR] } .ti -8 @@ -171,6 +172,11 @@ return code will be non zero. .BR "\-json" Display results in JSON format. Currently available for vlan and fdb. +.TP +.BR "\-pretty" +When combined with -j generate a pretty JSON output. + + .SH BRIDGE - COMMAND SYNTAX .SS