summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArturo Borrero Gonzalez <arturo@debian.org>2017-05-02 11:47:02 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2017-05-15 19:10:46 +0200
commita9dc3ceabc10f3bf43c7e9edc6d4a35ef3aa2358 (patch)
treec58e110be6806e676deb20a69dd085bde4d7d1bb
parent723c4222b8771a5474307596dd4c09dbe428607b (diff)
expression: print sets and maps in pretty format
Print elements per line instead of all in a single line. The elements which can be 'short' are printed 5 per line, and others, like IPv4 addresses are printed 2 per line. Example: % nft list ruleset -nnn table ip t { set s { type inet_service elements = { 1, 2, 3, 4, 10, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 12345 } } map m { type inet_service . iface_index : verdict elements = { 123 . "lo" : accept, 1234 . "lo" : accept, 12345 . "lo" : accept, 12346 . "lo" : accept, 12347 . "lo" : accept } } set s3 { type ipv4_addr elements = { 1.1.1.1, 2.2.2.2, 3.3.3.3 } } } Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/expression.c58
-rw-r--r--src/netlink.c2
-rwxr-xr-xtests/shell/testcases/maps/0003map_add_many_elements_015
-rwxr-xr-xtests/shell/testcases/maps/0004interval_map_create_once_015
-rwxr-xr-xtests/shell/testcases/maps/0005interval_map_add_many_elements_015
5 files changed, 92 insertions, 13 deletions
diff --git a/src/expression.c b/src/expression.c
index 45f3ed8d..5defa63f 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -742,10 +742,66 @@ struct expr *list_expr_alloc(const struct location *loc)
return compound_expr_alloc(loc, &list_expr_ops);
}
+static const char *calculate_delim(const struct expr *expr, int *count)
+{
+ const char *newline = ",\n\t\t\t ";
+ const char *singleline = ", ";
+
+ if (expr->set_flags & NFT_SET_ANONYMOUS)
+ return singleline;
+
+ if (!expr->dtype)
+ return newline;
+
+ switch (expr->dtype->type) {
+ case TYPE_NFPROTO:
+ case TYPE_INTEGER:
+ case TYPE_ARPOP:
+ case TYPE_INET_PROTOCOL:
+ case TYPE_INET_SERVICE:
+ case TYPE_TCP_FLAG:
+ case TYPE_DCCP_PKTTYPE:
+ case TYPE_MARK:
+ case TYPE_IFINDEX:
+ case TYPE_CLASSID:
+ case TYPE_UID:
+ case TYPE_GID:
+ case TYPE_CT_DIR:
+ if (*count < 5)
+ return singleline;
+ *count = 0;
+ break;
+ case TYPE_IPADDR:
+ case TYPE_CT_STATE:
+ case TYPE_CT_STATUS:
+ case TYPE_PKTTYPE:
+ if (*count < 2)
+ return singleline;
+ *count = 0;
+ break;
+
+ default:
+ break;
+ }
+
+ return newline;
+}
+
static void set_expr_print(const struct expr *expr)
{
+ const struct expr *i;
+ const char *d = "";
+ int count = 0;
+
printf("{ ");
- compound_expr_print(expr, ", ");
+
+ list_for_each_entry(i, &expr->expressions, list) {
+ printf("%s", d);
+ expr_print(i);
+ count++;
+ d = calculate_delim(expr, &count);
+ }
+
printf(" }");
}
diff --git a/src/netlink.c b/src/netlink.c
index 6fbb67da..59e8918d 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -1730,6 +1730,8 @@ int netlink_get_setelems(struct netlink_ctx *ctx, const struct handle *h,
ctx->set = set;
set->init = set_expr_alloc(loc);
nftnl_set_elem_foreach(nls, list_setelem_cb, ctx);
+ set->init->set_flags = set->flags;
+ set->init->dtype = set->keytype;
if (!(set->flags & NFT_SET_INTERVAL))
list_expr_sort(&ctx->set->init->expressions);
diff --git a/tests/shell/testcases/maps/0003map_add_many_elements_0 b/tests/shell/testcases/maps/0003map_add_many_elements_0
index 36b1be25..047f9497 100755
--- a/tests/shell/testcases/maps/0003map_add_many_elements_0
+++ b/tests/shell/testcases/maps/0003map_add_many_elements_0
@@ -24,15 +24,22 @@ generate_add() {
}
generate_test() {
+ count=0
elements=""
for ((i=1; i<=HOWMANY; i++)) ; do
for ((j=1; j<=HOWMANY; j++)) ; do
- elements="$elements 10.0.${i}.${j} : 10.0.${i}.${j}"
+ ((count++))
+ elements="${elements}10.0.${i}.${j} : 10.0.${i}.${j}"
[ "$i" == "$HOWMANY" ] && [ "$j" == "$HOWMANY" ] && break
- elements="${elements}, "
+ if [ "$count" == "2" ] ; then
+ count=0
+ elements="${elements},\\n\\t\\t\\t "
+ else
+ elements="${elements}, "
+ fi
done
done
- echo $elements
+ echo -e "$elements"
}
echo "add table x
@@ -49,7 +56,7 @@ $NFT -f $tmpfile
EXPECTED="table ip x {
map y {
type ipv4_addr : ipv4_addr
- elements = { $(generate_test) }
+ elements = { "$(generate_test)" }
}
}"
GET=$($NFT list ruleset)
diff --git a/tests/shell/testcases/maps/0004interval_map_create_once_0 b/tests/shell/testcases/maps/0004interval_map_create_once_0
index 1f043875..58b399c1 100755
--- a/tests/shell/testcases/maps/0004interval_map_create_once_0
+++ b/tests/shell/testcases/maps/0004interval_map_create_once_0
@@ -26,15 +26,22 @@ generate_add() {
}
generate_test() {
+ count=0
elements=""
for ((i=1; i<=HOWMANY; i++)) ; do
for ((j=1; j<=HOWMANY; j++)) ; do
- elements="$elements 10.${i}.${j}.0/24 : 10.0.${i}.${j}"
+ ((count++))
+ elements="${elements}10.${i}.${j}.0/24 : 10.0.${i}.${j}"
[ "$i" == "$HOWMANY" ] && [ "$j" == "$HOWMANY" ] && break
- elements="${elements}, "
+ if [ "$count" == "2" ] ; then
+ count=0
+ elements="${elements},\\n\\t\\t\\t "
+ else
+ elements="${elements}, "
+ fi
done
done
- echo $elements
+ echo -e "$elements"
}
echo "add table x
@@ -48,7 +55,7 @@ EXPECTED="table ip x {
map y {
type ipv4_addr : ipv4_addr
flags interval
- elements = { $(generate_test) }
+ elements = { "$(generate_test)" }
}
}"
GET=$($NFT list ruleset)
diff --git a/tests/shell/testcases/maps/0005interval_map_add_many_elements_0 b/tests/shell/testcases/maps/0005interval_map_add_many_elements_0
index 4d4f708e..55f90555 100755
--- a/tests/shell/testcases/maps/0005interval_map_add_many_elements_0
+++ b/tests/shell/testcases/maps/0005interval_map_add_many_elements_0
@@ -27,15 +27,22 @@ generate_add() {
}
generate_test() {
+ count=0
elements=""
for ((i=1; i<=HOWMANY; i++)) ; do
for ((j=1; j<=HOWMANY; j++)) ; do
- elements="$elements 10.${i}.${j}.0/24 : 10.0.${i}.${j}"
+ ((count++))
+ elements="${elements}10.${i}.${j}.0/24 : 10.0.${i}.${j}"
[ "$i" == "$HOWMANY" ] && [ "$j" == "$HOWMANY" ] && break
- elements="${elements}, "
+ if [ "$count" == "2" ] ; then
+ count=0
+ elements="${elements},\\n\\t\\t\\t "
+ else
+ elements="${elements}, "
+ fi
done
done
- echo $elements
+ echo -e "$elements"
}
echo "add table x
@@ -54,7 +61,7 @@ EXPECTED="table ip x {
map y {
type ipv4_addr : ipv4_addr
flags interval
- elements = { $(generate_test) }
+ elements = { "$(generate_test)" }
}
}"
GET=$($NFT list ruleset)