$ virsh nwfilter-binding-list
Port Dev Filter
--
vnet0 clean-traffic
vnet1 clean-traffic
$ virsh nwfilter-binding-dumpxml vnet1
f25arm7
12ac8b8c-4f23-4248-ae42-fdcd50c400fd
Signed-off-by: Daniel P. Berrangé
---
tools/virsh-completer.c | 45 ++
tools/virsh-completer.h | 4 +
tools/virsh-nwfilter.c | 317
tools/virsh-nwfilter.h | 8 +
4 files changed, 374 insertions(+)
diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c
index d3effe59ea..0dc6ae82e1 100644
--- a/tools/virsh-completer.c
+++ b/tools/virsh-completer.c
@@ -473,6 +473,51 @@ virshNWFilterNameCompleter(vshControl *ctl,
}
+char **
+virshNWFilterBindingNameCompleter(vshControl *ctl,
+ const vshCmd *cmd ATTRIBUTE_UNUSED,
+ unsigned int flags)
+{
+virshControlPtr priv = ctl->privData;
+virNWFilterBindingPtr *bindings = NULL;
+int nbindings = 0;
+size_t i = 0;
+char **ret = NULL;
+
+virCheckFlags(0, NULL);
+
+if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
+return NULL;
+
+if ((nbindings = virConnectListAllNWFilterBindings(priv->conn, &bindings,
flags)) < 0)
+return NULL;
+
+if (VIR_ALLOC_N(ret, nbindings + 1) < 0)
+goto error;
+
+for (i = 0; i < nbindings; i++) {
+const char *name = virNWFilterBindingGetPortDev(bindings[i]);
+
+if (VIR_STRDUP(ret[i], name) < 0)
+goto error;
+
+virNWFilterBindingFree(bindings[i]);
+}
+VIR_FREE(bindings);
+
+return ret;
+
+ error:
+for (; i < nbindings; i++)
+virNWFilterBindingFree(bindings[i]);
+VIR_FREE(bindings);
+for (i = 0; i < nbindings; i++)
+VIR_FREE(ret[i]);
+VIR_FREE(ret);
+return NULL;
+}
+
+
char **
virshSecretUUIDCompleter(vshControl *ctl,
const vshCmd *cmd ATTRIBUTE_UNUSED,
diff --git a/tools/virsh-completer.h b/tools/virsh-completer.h
index ee7eec68c5..fcff040135 100644
--- a/tools/virsh-completer.h
+++ b/tools/virsh-completer.h
@@ -66,6 +66,10 @@ char ** virshNWFilterNameCompleter(vshControl *ctl,
const vshCmd *cmd,
unsigned int flags);
+char ** virshNWFilterBindingNameCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
char ** virshSecretUUIDCompleter(vshControl *ctl,
const vshCmd *cmd,
unsigned int flags);
diff --git a/tools/virsh-nwfilter.c b/tools/virsh-nwfilter.c
index 06a002dffd..1cdbe5053a 100644
--- a/tools/virsh-nwfilter.c
+++ b/tools/virsh-nwfilter.c
@@ -443,6 +443,299 @@ cmdNWFilterEdit(vshControl *ctl, const vshCmd *cmd)
return ret;
}
+
+virNWFilterBindingPtr
+virshCommandOptNWFilterBindingBy(vshControl *ctl,
+ const vshCmd *cmd,
+ const char **name,
+ unsigned int flags)
+{
+virNWFilterBindingPtr binding = NULL;
+const char *n = NULL;
+const char *optname = "binding";
+virshControlPtr priv = ctl->privData;
+
+virCheckFlags(0, NULL);
+
+if (vshCommandOptStringReq(ctl, cmd, optname, &n) < 0)
+return NULL;
+
+vshDebug(ctl, VSH_ERR_INFO, "%s: found option <%s>: %s\n",
+ cmd->def->name, optname, n);
+
+if (name)
+*name = n;
+
+vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as nwfilter binding port
dev\n",
+ cmd->def->name, optname);
+binding = virNWFilterBindingLookupByPortDev(priv->conn, n);
+
+if (!binding)
+vshError(ctl, _("failed to get nwfilter binding '%s'"), n);
+
+return binding;
+}
+
+
+/*
+ * "nwfilter-binding-create" command
+ */
+static const vshCmdInfo info_nwfilter_binding_create[] = {
+{.name = "help",
+ .data = N_("create a network filter binding from an XML file")
+},
+{.name = "desc",
+ .data = N_("Create a new network filter binding.")
+},
+{.name = NULL}
+};
+
+static const vshCmdOptDef opts_nwfilter_binding_create[] = {
+VIRSH_COMMON_OPT_FILE(N_("file containing an XML network "
+ "filter binding description")),
+{.name = NULL}
+};
+
+static bool
+cmdNWFilterBindingCreate(vshControl *ctl, const vshCmd *cmd)
+{
+virNWFilterBindingPtr binding;
+const char *from = NULL;
+bool ret = true;
+char *buffer;
+virshControlPtr priv = ctl->privData;
+
+if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0)
+return false;
+
+if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0)
+return false;
+
+binding = virNWFilterBindingCreateXML(priv->conn, buffer, 0);
+VI