bridge: implement json pretty print flag
Make bridge work like other iproute2 commands and accept same json and pretty flags. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
parent
b68b361b4b
commit
01842eb581
|
|
@ -26,5 +26,5 @@ extern int show_stats;
|
||||||
extern int show_details;
|
extern int show_details;
|
||||||
extern int timestamp;
|
extern int timestamp;
|
||||||
extern int compress_vlans;
|
extern int compress_vlans;
|
||||||
extern int json_output;
|
extern int json;
|
||||||
extern struct rtnl_handle rth;
|
extern struct rtnl_handle rth;
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ int oneline;
|
||||||
int show_stats;
|
int show_stats;
|
||||||
int show_details;
|
int show_details;
|
||||||
int compress_vlans;
|
int compress_vlans;
|
||||||
int json_output;
|
int json;
|
||||||
int timestamp;
|
int timestamp;
|
||||||
char *batch_file;
|
char *batch_file;
|
||||||
int force;
|
int force;
|
||||||
|
|
@ -39,7 +39,7 @@ static void usage(void)
|
||||||
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
|
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
|
||||||
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
|
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
|
||||||
" -o[neline] | -t[imestamp] | -n[etns] name |\n"
|
" -o[neline] | -t[imestamp] | -n[etns] name |\n"
|
||||||
" -c[ompressvlans] -j{son} }\n");
|
" -c[ompressvlans] -p[retty] -j{son} }\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,7 +175,9 @@ main(int argc, char **argv)
|
||||||
} else if (matches(opt, "-force") == 0) {
|
} else if (matches(opt, "-force") == 0) {
|
||||||
++force;
|
++force;
|
||||||
} else if (matches(opt, "-json") == 0) {
|
} else if (matches(opt, "-json") == 0) {
|
||||||
++json_output;
|
++json;
|
||||||
|
} else if (matches(opt, "-pretty") == 0) {
|
||||||
|
++pretty;
|
||||||
} else if (matches(opt, "-batch") == 0) {
|
} else if (matches(opt, "-batch") == 0) {
|
||||||
argc--;
|
argc--;
|
||||||
argv++;
|
argv++;
|
||||||
|
|
|
||||||
10
bridge/fdb.c
10
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)
|
if (filter_vlan && filter_vlan != vid)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (jw_global) {
|
if (jw_global)
|
||||||
jsonw_pretty(jw_global, 1);
|
|
||||||
jsonw_start_object(jw_global);
|
jsonw_start_object(jw_global);
|
||||||
}
|
|
||||||
|
|
||||||
if (n->nlmsg_type == RTM_DELNEIGH) {
|
if (n->nlmsg_type == RTM_DELNEIGH) {
|
||||||
if (jw_global)
|
if (jw_global)
|
||||||
|
|
@ -388,14 +386,18 @@ static int fdb_show(int argc, char **argv)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json_output) {
|
if (json) {
|
||||||
jw_global = jsonw_new(stdout);
|
jw_global = jsonw_new(stdout);
|
||||||
if (!jw_global) {
|
if (!jw_global) {
|
||||||
fprintf(stderr, "Error allocation json object\n");
|
fprintf(stderr, "Error allocation json object\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
if (pretty)
|
||||||
|
jsonw_pretty(jw_global, 1);
|
||||||
|
|
||||||
jsonw_start_array(jw_global);
|
jsonw_start_array(jw_global);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtnl_dump_filter(&rth, print_fdb, stdout) < 0) {
|
if (rtnl_dump_filter(&rth, print_fdb, stdout) < 0) {
|
||||||
fprintf(stderr, "Dump terminated\n");
|
fprintf(stderr, "Dump terminated\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
|
||||||
12
bridge/mdb.c
12
bridge/mdb.c
|
|
@ -325,7 +325,7 @@ static int mdb_show(int argc, char **argv)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!json_output) {
|
if (!json) {
|
||||||
/* Normal output */
|
/* Normal output */
|
||||||
if (rtnl_dump_filter(&rth, print_mdb, stdout) < 0) {
|
if (rtnl_dump_filter(&rth, print_mdb, stdout) < 0) {
|
||||||
fprintf(stderr, "Dump terminated\n");
|
fprintf(stderr, "Dump terminated\n");
|
||||||
|
|
@ -333,9 +333,17 @@ static int mdb_show(int argc, char **argv)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Json output */
|
/* Json output */
|
||||||
jw_global = jsonw_new(stdout);
|
jw_global = jsonw_new(stdout);
|
||||||
jsonw_pretty(jw_global, 1);
|
if (!jw_global) {
|
||||||
|
fprintf(stderr, "Error allocation json object\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pretty)
|
||||||
|
jsonw_pretty(jw_global, 1);
|
||||||
|
|
||||||
jsonw_start_object(jw_global);
|
jsonw_start_object(jw_global);
|
||||||
jsonw_name(jw_global, "mdb");
|
jsonw_name(jw_global, "mdb");
|
||||||
jsonw_start_array(jw_global);
|
jsonw_start_array(jw_global);
|
||||||
|
|
|
||||||
|
|
@ -258,7 +258,6 @@ static int filter_vlan_check(__u16 vid, __u16 flags)
|
||||||
static void print_vlan_port(FILE *fp, int ifi_index)
|
static void print_vlan_port(FILE *fp, int ifi_index)
|
||||||
{
|
{
|
||||||
if (jw_global) {
|
if (jw_global) {
|
||||||
jsonw_pretty(jw_global, 1);
|
|
||||||
jsonw_name(jw_global,
|
jsonw_name(jw_global,
|
||||||
ll_index_to_name(ifi_index));
|
ll_index_to_name(ifi_index));
|
||||||
jsonw_start_array(jw_global);
|
jsonw_start_array(jw_global);
|
||||||
|
|
@ -578,17 +577,21 @@ static int vlan_show(int argc, char **argv)
|
||||||
if (!show_stats) {
|
if (!show_stats) {
|
||||||
if (rtnl_wilddump_req_filter(&rth, PF_BRIDGE, RTM_GETLINK,
|
if (rtnl_wilddump_req_filter(&rth, PF_BRIDGE, RTM_GETLINK,
|
||||||
(compress_vlans ?
|
(compress_vlans ?
|
||||||
RTEXT_FILTER_BRVLAN_COMPRESSED :
|
RTEXT_FILTER_BRVLAN_COMPRESSED :
|
||||||
RTEXT_FILTER_BRVLAN)) < 0) {
|
RTEXT_FILTER_BRVLAN)) < 0) {
|
||||||
perror("Cannont send dump request");
|
perror("Cannont send dump request");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (json_output) {
|
|
||||||
|
if (json) {
|
||||||
jw_global = jsonw_new(stdout);
|
jw_global = jsonw_new(stdout);
|
||||||
if (!jw_global) {
|
if (!jw_global) {
|
||||||
fprintf(stderr, "Error allocation json object\n");
|
fprintf(stderr, "Error allocation json object\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
if (pretty)
|
||||||
|
jsonw_pretty(jw_global, 1);
|
||||||
|
|
||||||
jsonw_start_object(jw_global);
|
jsonw_start_object(jw_global);
|
||||||
} else {
|
} else {
|
||||||
if (show_vlan_tunnel_info)
|
if (show_vlan_tunnel_info)
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ bridge \- show / manipulate bridge addresses and devices
|
||||||
\fB\-s\fR[\fItatistics\fR] |
|
\fB\-s\fR[\fItatistics\fR] |
|
||||||
\fB\-n\fR[\fIetns\fR] name |
|
\fB\-n\fR[\fIetns\fR] name |
|
||||||
\fB\-b\fR[\fIatch\fR] filename |
|
\fB\-b\fR[\fIatch\fR] filename |
|
||||||
|
\fB\-p\fR[\fIretty\fR] |
|
||||||
\fB\-j\fR[\fIson\fR] }
|
\fB\-j\fR[\fIson\fR] }
|
||||||
|
|
||||||
.ti -8
|
.ti -8
|
||||||
|
|
@ -171,6 +172,11 @@ return code will be non zero.
|
||||||
.BR "\-json"
|
.BR "\-json"
|
||||||
Display results in JSON format. Currently available for vlan and fdb.
|
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
|
.SH BRIDGE - COMMAND SYNTAX
|
||||||
|
|
||||||
.SS
|
.SS
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue