From: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
To: netfilter-devel@vger.kernel.org
Cc: pablo@netfilter.org
Subject: [nftables tool PATCH v2] src: add support for listing the entire ruleset
Date: Thu, 10 Oct 2013 10:06:19 +0200 [thread overview]
Message-ID: <20131010080540.1198.84784.stgit@nfdev.cica.es> (raw)
This patch add the following operation:
:~# nft list ruleset
With this, you can backup your current ruleset and import later with '-f'.
Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
---
v2: delete double NFPROTO_UNSPEC assignement and useless memset.
include/rule.h | 1 +
src/parser.y | 17 +++++++++++++++--
src/rule.c | 18 ++++++++++++++++++
src/scanner.l | 1 +
4 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/include/rule.h b/include/rule.h
index 6ad8af3..28b45ce 100644
--- a/include/rule.h
+++ b/include/rule.h
@@ -234,6 +234,7 @@ enum cmd_obj {
CMD_OBJ_RULE,
CMD_OBJ_CHAIN,
CMD_OBJ_TABLE,
+ CMD_OBJ_RULESET,
};
/**
diff --git a/src/parser.y b/src/parser.y
index 074f075..e4dd44c 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -157,6 +157,7 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token HOOK "hook"
%token TABLE "table"
%token TABLES "tables"
+%token RULESET "ruleset"
%token CHAIN "chain"
%token RULE "rule"
%token SETS "sets"
@@ -340,8 +341,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%type <cmd> base_cmd add_cmd insert_cmd delete_cmd list_cmd flush_cmd rename_cmd
%destructor { cmd_free($$); } base_cmd add_cmd insert_cmd delete_cmd list_cmd flush_cmd rename_cmd
-%type <handle> table_spec tables_spec chain_spec chain_identifier ruleid_spec
-%destructor { handle_free(&$$); } table_spec tables_spec chain_spec chain_identifier ruleid_spec
+%type <handle> table_spec tables_spec ruleset_spec chain_spec chain_identifier ruleid_spec
+%destructor { handle_free(&$$); } table_spec tables_spec ruleset_spec chain_spec chain_identifier ruleid_spec
%type <handle> set_spec set_identifier
%destructor { handle_free(&$$); } set_spec set_identifier
%type <val> handle_spec family_spec position_spec
@@ -618,6 +619,10 @@ list_cmd : TABLE table_spec
{
$$ = cmd_alloc(CMD_LIST, CMD_OBJ_TABLE, &$2, &@$, NULL);
}
+ | RULESET ruleset_spec
+ {
+ $$ = cmd_alloc(CMD_LIST, CMD_OBJ_RULESET, &$2, &@$, NULL);
+ }
| CHAIN chain_spec
{
$$ = cmd_alloc(CMD_LIST, CMD_OBJ_CHAIN, &$2, &@$, NULL);
@@ -833,6 +838,14 @@ tables_spec : family_spec
}
;
+ruleset_spec :
+ {
+ memset(&$$, 0, sizeof($$));
+ $$.family = NFPROTO_UNSPEC;
+ $$.table = NULL;
+ }
+ ;
+
chain_spec : table_spec identifier
{
$$ = $1;
diff --git a/src/rule.c b/src/rule.c
index 39a66d7..229b67e 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -583,6 +583,7 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
struct chain *chain, *nchain;
struct rule *rule, *nrule;
struct set *set, *nset;
+ struct netlink_ctx ctx_index;
/* No need to allocate the table object when listing all tables */
if (cmd->handle.table != NULL) {
@@ -595,6 +596,23 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
}
switch (cmd->obj) {
+ case CMD_OBJ_RULESET:
+ if (netlink_list_tables(ctx, &cmd->handle, &cmd->location) < 0)
+ return -1;
+
+ init_list_head(&ctx_index.list);
+ ctx_index.msgs = ctx->msgs;
+ ctx_index.seqnum = cmd->seqnum;
+
+ cmd->obj = CMD_OBJ_TABLE;
+
+ list_for_each_entry(table, &ctx->list, list) {
+ cmd->handle.family = table->handle.family;
+ cmd->handle.table = table->handle.table;
+ if (do_command_list(&ctx_index, cmd) != 0)
+ return -1;
+ }
+ return 0;
case CMD_OBJ_TABLE:
if (!cmd->handle.table) {
/* List all existing tables */
diff --git a/src/scanner.l b/src/scanner.l
index cee6aa6..8035710 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -220,6 +220,7 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr})
"hook" { return HOOK; }
"table" { return TABLE; }
"tables" { return TABLES; }
+"ruleset" { return RULESET; }
"chain" { return CHAIN; }
"rule" { return RULE; }
"sets" { return SETS; }
reply other threads:[~2013-10-10 8:06 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131010080540.1198.84784.stgit@nfdev.cica.es \
--to=arturo.borrero.glez@gmail.com \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).