mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-25 18:00:25 +00:00
Merge pull request #15750 from piotrsuchy/json_show_ip_prefix_list_fix
vtysh, lib: fix 'show ip[v6] prefix-list ... json' JSON display by moving it to vtysh to fix formatting issue
This commit is contained in:
commit
5738263065
30
lib/plist.c
30
lib/plist.c
@ -1073,17 +1073,13 @@ static int vty_show_prefix_list(struct vty *vty, afi_t afi, const char *name,
|
||||
struct prefix_master *master;
|
||||
int64_t seqnum = 0;
|
||||
json_object *json = NULL;
|
||||
json_object *json_proto = NULL;
|
||||
|
||||
master = prefix_master_get(afi, 0);
|
||||
if (master == NULL)
|
||||
return CMD_WARNING;
|
||||
|
||||
if (uj) {
|
||||
if (uj)
|
||||
json = json_object_new_object();
|
||||
json_proto = json_object_new_object();
|
||||
json_object_object_add(json, frr_protoname, json_proto);
|
||||
}
|
||||
|
||||
if (seq)
|
||||
seqnum = (int64_t)atol(seq);
|
||||
@ -1096,8 +1092,8 @@ static int vty_show_prefix_list(struct vty *vty, afi_t afi, const char *name,
|
||||
"%% Can't find specified prefix-list\n");
|
||||
return CMD_WARNING;
|
||||
}
|
||||
vty_show_prefix_entry(vty, json_proto, afi, plist, master,
|
||||
dtype, seqnum);
|
||||
vty_show_prefix_entry(vty, json, afi, plist, master, dtype,
|
||||
seqnum);
|
||||
} else {
|
||||
if (dtype == detail_display || dtype == summary_display) {
|
||||
if (master->recent && !uj)
|
||||
@ -1107,8 +1103,8 @@ static int vty_show_prefix_list(struct vty *vty, afi_t afi, const char *name,
|
||||
}
|
||||
|
||||
frr_each (plist, &master->str, plist)
|
||||
vty_show_prefix_entry(vty, json_proto, afi, plist,
|
||||
master, dtype, seqnum);
|
||||
vty_show_prefix_entry(vty, json, afi, plist, master,
|
||||
dtype, seqnum);
|
||||
}
|
||||
|
||||
return vty_json(vty, json);
|
||||
@ -1227,7 +1223,7 @@ static int vty_clear_prefix_list(struct vty *vty, afi_t afi, const char *name,
|
||||
|
||||
#include "lib/plist_clippy.c"
|
||||
|
||||
DEFPY (show_ip_prefix_list,
|
||||
DEFPY_NOSH (show_ip_prefix_list,
|
||||
show_ip_prefix_list_cmd,
|
||||
"show ip prefix-list [PREFIXLIST4_NAME$name [seq$dseq (1-4294967295)$arg]] [json$uj]",
|
||||
SHOW_STR
|
||||
@ -1239,6 +1235,7 @@ DEFPY (show_ip_prefix_list,
|
||||
JSON_STR)
|
||||
{
|
||||
enum display_type dtype = normal_display;
|
||||
|
||||
if (dseq)
|
||||
dtype = sequential_display;
|
||||
|
||||
@ -1258,6 +1255,7 @@ DEFPY (show_ip_prefix_list_prefix,
|
||||
"First matched prefix\n")
|
||||
{
|
||||
enum display_type dtype = normal_display;
|
||||
|
||||
if (dl)
|
||||
dtype = longer_display;
|
||||
else if (dfm)
|
||||
@ -1267,7 +1265,7 @@ DEFPY (show_ip_prefix_list_prefix,
|
||||
dtype);
|
||||
}
|
||||
|
||||
DEFPY (show_ip_prefix_list_summary,
|
||||
DEFPY_NOSH (show_ip_prefix_list_summary,
|
||||
show_ip_prefix_list_summary_cmd,
|
||||
"show ip prefix-list summary [PREFIXLIST4_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
@ -1281,7 +1279,7 @@ DEFPY (show_ip_prefix_list_summary,
|
||||
summary_display, !!uj);
|
||||
}
|
||||
|
||||
DEFPY (show_ip_prefix_list_detail,
|
||||
DEFPY_NOSH (show_ip_prefix_list_detail,
|
||||
show_ip_prefix_list_detail_cmd,
|
||||
"show ip prefix-list detail [PREFIXLIST4_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
@ -1307,7 +1305,7 @@ DEFPY (clear_ip_prefix_list,
|
||||
return vty_clear_prefix_list(vty, AFI_IP, name, prefix_str);
|
||||
}
|
||||
|
||||
DEFPY (show_ipv6_prefix_list,
|
||||
DEFPY_NOSH(show_ipv6_prefix_list,
|
||||
show_ipv6_prefix_list_cmd,
|
||||
"show ipv6 prefix-list [PREFIXLIST6_NAME$name [seq$dseq (1-4294967295)$arg]] [json$uj]",
|
||||
SHOW_STR
|
||||
@ -1319,6 +1317,7 @@ DEFPY (show_ipv6_prefix_list,
|
||||
JSON_STR)
|
||||
{
|
||||
enum display_type dtype = normal_display;
|
||||
|
||||
if (dseq)
|
||||
dtype = sequential_display;
|
||||
|
||||
@ -1338,6 +1337,7 @@ DEFPY (show_ipv6_prefix_list_prefix,
|
||||
"First matched prefix\n")
|
||||
{
|
||||
enum display_type dtype = normal_display;
|
||||
|
||||
if (dl)
|
||||
dtype = longer_display;
|
||||
else if (dfm)
|
||||
@ -1347,7 +1347,7 @@ DEFPY (show_ipv6_prefix_list_prefix,
|
||||
prefix_str, dtype);
|
||||
}
|
||||
|
||||
DEFPY (show_ipv6_prefix_list_summary,
|
||||
DEFPY_NOSH (show_ipv6_prefix_list_summary,
|
||||
show_ipv6_prefix_list_summary_cmd,
|
||||
"show ipv6 prefix-list summary [PREFIXLIST6_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
@ -1361,7 +1361,7 @@ DEFPY (show_ipv6_prefix_list_summary,
|
||||
summary_display, !!uj);
|
||||
}
|
||||
|
||||
DEFPY (show_ipv6_prefix_list_detail,
|
||||
DEFPY_NOSH (show_ipv6_prefix_list_detail,
|
||||
show_ipv6_prefix_list_detail_cmd,
|
||||
"show ipv6 prefix-list detail [PREFIXLIST6_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
|
163
vtysh/vtysh.c
163
vtysh/vtysh.c
@ -3474,6 +3474,161 @@ DEFPY (show_route_map,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
static void show_prefix_list_send(afi_t afi, const char *prefix_list,
|
||||
const char *seq, enum display_type dtype,
|
||||
bool json)
|
||||
{
|
||||
unsigned int i;
|
||||
bool first = true;
|
||||
char command_line[128];
|
||||
|
||||
if (afi == AFI_IP)
|
||||
snprintf(command_line, sizeof(command_line),
|
||||
"do show ip prefix-list ");
|
||||
else if (afi == AFI_IP6)
|
||||
snprintf(command_line, sizeof(command_line),
|
||||
"do show ipv6 prefix-list ");
|
||||
if (dtype == detail_display)
|
||||
strlcat(command_line, "detail ", sizeof(command_line));
|
||||
else if (dtype == summary_display)
|
||||
strlcat(command_line, "summary ", sizeof(command_line));
|
||||
if (prefix_list)
|
||||
strlcat(command_line, prefix_list, sizeof(command_line));
|
||||
if (dtype == sequential_display) {
|
||||
strlcat(command_line, " seq ", sizeof(command_line));
|
||||
strlcat(command_line, seq, sizeof(command_line));
|
||||
}
|
||||
if (json)
|
||||
strlcat(command_line, " json", sizeof(command_line));
|
||||
|
||||
if (json)
|
||||
vty_out(vty, "{");
|
||||
|
||||
for (i = 0; i < array_size(vtysh_client); i++) {
|
||||
const struct vtysh_client *client = &vtysh_client[i];
|
||||
bool is_connected = true;
|
||||
|
||||
if (!CHECK_FLAG(client->flag, VTYSH_PREFIX_LIST_SHOW))
|
||||
continue;
|
||||
|
||||
for (; client; client = client->next)
|
||||
if (client->fd < 0)
|
||||
is_connected = false;
|
||||
|
||||
if (!is_connected)
|
||||
continue;
|
||||
|
||||
if (json && !first)
|
||||
vty_out(vty, ",");
|
||||
else
|
||||
first = false;
|
||||
|
||||
if (json)
|
||||
vty_out(vty, "\"%s\":", vtysh_client[i].name);
|
||||
|
||||
vtysh_client_execute_name(vtysh_client[i].name, command_line);
|
||||
}
|
||||
|
||||
if (json)
|
||||
vty_out(vty, "}\n");
|
||||
}
|
||||
|
||||
DEFPY (show_ip_prefix_list,
|
||||
show_ip_prefix_list_cmd,
|
||||
"show ip prefix-list [PREFIXLIST4_NAME$name [seq$dseq (1-4294967295)$arg]] [json$uj]",
|
||||
SHOW_STR
|
||||
IP_STR
|
||||
PREFIX_LIST_STR
|
||||
"Name of a prefix list\n"
|
||||
"sequence number of an entry\n"
|
||||
"Sequence number\n"
|
||||
JSON_STR)
|
||||
{
|
||||
enum display_type dtype = normal_display;
|
||||
|
||||
if (dseq)
|
||||
dtype = sequential_display;
|
||||
|
||||
show_prefix_list_send(AFI_IP, name, arg_str, dtype, !!uj);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (show_ip_prefix_list_summary,
|
||||
show_ip_prefix_list_summary_cmd,
|
||||
"show ip prefix-list summary [PREFIXLIST4_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
IP_STR
|
||||
PREFIX_LIST_STR
|
||||
"Summary of prefix lists\n"
|
||||
"Name of a prefix list\n"
|
||||
JSON_STR)
|
||||
{
|
||||
show_prefix_list_send(AFI_IP, name, NULL, summary_display, !!uj);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (show_ip_prefix_list_detail,
|
||||
show_ip_prefix_list_detail_cmd,
|
||||
"show ip prefix-list detail [PREFIXLIST4_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
IP_STR
|
||||
PREFIX_LIST_STR
|
||||
"Detail of prefix lists\n"
|
||||
"Name of a prefix list\n"
|
||||
JSON_STR)
|
||||
{
|
||||
show_prefix_list_send(AFI_IP, name, NULL, detail_display, !!uj);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (show_ipv6_prefix_list,
|
||||
show_ipv6_prefix_list_cmd,
|
||||
"show ipv6 prefix-list [PREFIXLIST6_NAME$name [seq$dseq (1-4294967295)$arg]] [json$uj]",
|
||||
SHOW_STR
|
||||
IPV6_STR
|
||||
PREFIX_LIST_STR
|
||||
"Name of a prefix list\n"
|
||||
"sequence number of an entry\n"
|
||||
"Sequence number\n"
|
||||
JSON_STR)
|
||||
{
|
||||
enum display_type dtype = normal_display;
|
||||
|
||||
if (dseq)
|
||||
dtype = sequential_display;
|
||||
|
||||
show_prefix_list_send(AFI_IP6, name, arg_str, dtype, !!uj);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (show_ipv6_prefix_list_summary,
|
||||
show_ipv6_prefix_list_summary_cmd,
|
||||
"show ipv6 prefix-list summary [PREFIXLIST6_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
IPV6_STR
|
||||
PREFIX_LIST_STR
|
||||
"Summary of prefix lists\n"
|
||||
"Name of a prefix list\n"
|
||||
JSON_STR)
|
||||
{
|
||||
show_prefix_list_send(AFI_IP6, name, NULL, summary_display, !!uj);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (show_ipv6_prefix_list_detail,
|
||||
show_ipv6_prefix_list_detail_cmd,
|
||||
"show ipv6 prefix-list detail [PREFIXLIST6_NAME$name] [json$uj]",
|
||||
SHOW_STR
|
||||
IPV6_STR
|
||||
PREFIX_LIST_STR
|
||||
"Detail of prefix lists\n"
|
||||
"Name of a prefix list\n"
|
||||
JSON_STR)
|
||||
{
|
||||
show_prefix_list_send(AFI_IP6, name, NULL, detail_display, !!uj);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (vtysh_integrated_config,
|
||||
vtysh_integrated_config_cmd,
|
||||
"service integrated-vtysh-config",
|
||||
@ -3498,8 +3653,8 @@ DEFUN (no_vtysh_integrated_config,
|
||||
static void backup_config_file(const char *fbackup)
|
||||
{
|
||||
char *integrate_sav = NULL;
|
||||
|
||||
size_t integrate_sav_sz = strlen(fbackup) + strlen(CONF_BACKUP_EXT) + 1;
|
||||
|
||||
integrate_sav = malloc(integrate_sav_sz);
|
||||
strlcpy(integrate_sav, fbackup, integrate_sav_sz);
|
||||
strlcat(integrate_sav, CONF_BACKUP_EXT, integrate_sav_sz);
|
||||
@ -5074,6 +5229,12 @@ void vtysh_init_vty(void)
|
||||
install_element(ENABLE_NODE, &vtysh_copy_to_running_cmd);
|
||||
|
||||
install_element(ENABLE_NODE, &show_route_map_cmd);
|
||||
install_element(ENABLE_NODE, &show_ip_prefix_list_cmd);
|
||||
install_element(ENABLE_NODE, &show_ip_prefix_list_summary_cmd);
|
||||
install_element(ENABLE_NODE, &show_ip_prefix_list_detail_cmd);
|
||||
install_element(ENABLE_NODE, &show_ipv6_prefix_list_cmd);
|
||||
install_element(ENABLE_NODE, &show_ipv6_prefix_list_summary_cmd);
|
||||
install_element(ENABLE_NODE, &show_ipv6_prefix_list_detail_cmd);
|
||||
|
||||
/* "write terminal" command. */
|
||||
install_element(ENABLE_NODE, &vtysh_write_terminal_cmd);
|
||||
|
@ -68,6 +68,10 @@ extern struct event_loop *master;
|
||||
VTYSH_ZEBRA | VTYSH_RIPD | VTYSH_RIPNGD | VTYSH_OSPFD | VTYSH_OSPF6D | \
|
||||
VTYSH_BGPD | VTYSH_ISISD | VTYSH_PIMD | VTYSH_EIGRPD | \
|
||||
VTYSH_FABRICD
|
||||
#define VTYSH_PREFIX_LIST_SHOW \
|
||||
VTYSH_ZEBRA | VTYSH_RIPD | VTYSH_RIPNGD | VTYSH_OSPFD | VTYSH_OSPF6D | \
|
||||
VTYSH_BGPD | VTYSH_ISISD | VTYSH_PIMD | VTYSH_EIGRPD | \
|
||||
VTYSH_FABRICD
|
||||
#define VTYSH_INTERFACE_SUBSET \
|
||||
VTYSH_OSPFD | VTYSH_OSPF6D | \
|
||||
VTYSH_ISISD | VTYSH_PIMD | VTYSH_PIM6D | VTYSH_NHRPD | \
|
||||
@ -90,7 +94,17 @@ enum vtysh_write_integrated {
|
||||
WRITE_INTEGRATED_YES
|
||||
};
|
||||
|
||||
enum display_type {
|
||||
normal_display,
|
||||
summary_display,
|
||||
detail_display,
|
||||
sequential_display,
|
||||
longer_display,
|
||||
first_match_display
|
||||
};
|
||||
|
||||
extern enum vtysh_write_integrated vtysh_write_integrated;
|
||||
extern enum display_type display_type;
|
||||
|
||||
extern char frr_config[];
|
||||
extern char vtydir[];
|
||||
|
Loading…
Reference in New Issue
Block a user