]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
expression: print sets and maps in pretty format
authorArturo Borrero Gonzalez <arturo@debian.org>
Tue, 2 May 2017 09:47:02 +0000 (11:47 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 15 May 2017 17:10:46 +0000 (19:10 +0200)
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>
src/expression.c
src/netlink.c
tests/shell/testcases/maps/0003map_add_many_elements_0
tests/shell/testcases/maps/0004interval_map_create_once_0
tests/shell/testcases/maps/0005interval_map_add_many_elements_0

index 45f3ed8da33c00656340d57467cb787c0383431f..5defa63f4a5f43f9148f7430893a213714a651cd 100644 (file)
@@ -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(" }");
 }
 
index 6fbb67da7f76f2a334a5c6b16146b07f726bb0a9..59e8918d2ba0ceba5dfaf196d6dc4c17c7709fcc 100644 (file)
@@ -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);
index 36b1be25eb6649439836529f6be3661e5f1abae0..047f9497dff0df30cd589119ae5083e321a734e8 100755 (executable)
@@ -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)
index 1f043875729ee4cd7c6a68ca9012e7ba4443a952..58b399c116218e735c8426214d236eb251afe467 100755 (executable)
@@ -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)
index 4d4f708e3876053dbc92c59d43564606874ee14a..55f90555a3b9d6c9533592780b959ee0723f9b28 100755 (executable)
@@ -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)