提交 61ba6f09 编写于 作者: C Chen Hanxiao 提交者: Michal Privoznik

interface: introduce downscript element for interface

https://gitlab.com/libvirt/libvirt/-/issues/13

Add support for downscript:

<interface type='ethernet'>
    <mac address='00:11:22:33:44:55'/>
    <script path='/etc/qemu-ifup'/>
    <downscript path='/path/to/my/downscript'/>
</interface>
Signed-off-by: NChen Hanxiao <chen_han_xiao@126.com>
Reviewed-by: NMichal Privoznik <mprivozn@redhat.com>
上级 1c425857
...@@ -5879,8 +5879,13 @@ ...@@ -5879,8 +5879,13 @@
<p> <p>
After creating/opening the tap device, an optional shell script After creating/opening the tap device, an optional shell script
(given in the <code>path</code> attribute of (given in the <code>path</code> attribute of
the <code>&lt;script&gt;</code> element) will be run; this can the <code>&lt;script&gt;</code> element) will be run.
be used to do whatever extra host network integration is <span class="since">Since 0.2.1</span>
Also, after detaching/closing the tap device, an optional shell
script (given in the <code>path</code> attribute of
the <code>&lt;downscript&gt;</code> element) will be run.
<span class="since">Since 5.1.0</span>
These can be used to do whatever extra host network integration is
required. required.
</p> </p>
...@@ -5889,6 +5894,7 @@ ...@@ -5889,6 +5894,7 @@
&lt;devices&gt; &lt;devices&gt;
&lt;interface type='ethernet'&gt; &lt;interface type='ethernet'&gt;
&lt;script path='/etc/qemu-ifup-mynet'/&gt; &lt;script path='/etc/qemu-ifup-mynet'/&gt;
&lt;downscript path='/etc/qemu-ifdown-mynet'/&gt;
&lt;/interface&gt; &lt;/interface&gt;
... ...
&lt;interface type='ethernet'&gt; &lt;interface type='ethernet'&gt;
......
...@@ -3191,6 +3191,14 @@ ...@@ -3191,6 +3191,14 @@
<empty/> <empty/>
</element> </element>
</optional> </optional>
<optional>
<element name="downscript">
<attribute name="path">
<ref name="filePath"/>
</attribute>
<empty/>
</element>
</optional>
<optional> <optional>
<element name="backenddomain"> <element name="backenddomain">
<attribute name="name"> <attribute name="name">
......
...@@ -2520,6 +2520,7 @@ virDomainNetDefClear(virDomainNetDefPtr def) ...@@ -2520,6 +2520,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
VIR_FREE(def->teaming.persistent); VIR_FREE(def->teaming.persistent);
VIR_FREE(def->virtPortProfile); VIR_FREE(def->virtPortProfile);
VIR_FREE(def->script); VIR_FREE(def->script);
VIR_FREE(def->downscript);
VIR_FREE(def->domain_name); VIR_FREE(def->domain_name);
VIR_FREE(def->ifname); VIR_FREE(def->ifname);
VIR_FREE(def->ifname_guest); VIR_FREE(def->ifname_guest);
...@@ -11977,6 +11978,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -11977,6 +11978,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
g_autofree char *ifname_guest = NULL; g_autofree char *ifname_guest = NULL;
g_autofree char *ifname_guest_actual = NULL; g_autofree char *ifname_guest_actual = NULL;
g_autofree char *script = NULL; g_autofree char *script = NULL;
g_autofree char *downscript = NULL;
g_autofree char *address = NULL; g_autofree char *address = NULL;
g_autofree char *port = NULL; g_autofree char *port = NULL;
g_autofree char *localaddr = NULL; g_autofree char *localaddr = NULL;
...@@ -12149,6 +12151,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -12149,6 +12151,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
} else if (!script && } else if (!script &&
virXMLNodeNameEqual(cur, "script")) { virXMLNodeNameEqual(cur, "script")) {
script = virXMLPropString(cur, "path"); script = virXMLPropString(cur, "path");
} else if (!downscript &&
virXMLNodeNameEqual(cur, "downscript")) {
downscript = virXMLPropString(cur, "path");
} else if (!domain_name && } else if (!domain_name &&
virXMLNodeNameEqual(cur, "backenddomain")) { virXMLNodeNameEqual(cur, "backenddomain")) {
domain_name = virXMLPropString(cur, "name"); domain_name = virXMLPropString(cur, "name");
...@@ -12482,6 +12487,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ...@@ -12482,6 +12487,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
if (script != NULL) if (script != NULL)
def->script = g_steal_pointer(&script); def->script = g_steal_pointer(&script);
if (downscript != NULL)
def->downscript = g_steal_pointer(&downscript);
if (domain_name != NULL) if (domain_name != NULL)
def->domain_name = g_steal_pointer(&domain_name); def->domain_name = g_steal_pointer(&domain_name);
if (ifname != NULL) if (ifname != NULL)
...@@ -26567,6 +26574,8 @@ virDomainNetDefFormat(virBufferPtr buf, ...@@ -26567,6 +26574,8 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferEscapeString(buf, "<script path='%s'/>\n", virBufferEscapeString(buf, "<script path='%s'/>\n",
def->script); def->script);
virBufferEscapeString(buf, "<downscript path='%s'/>\n",
def->downscript);
virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name); virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name);
if (def->ifname && if (def->ifname &&
...@@ -1055,6 +1055,7 @@ struct _virDomainNetDef { ...@@ -1055,6 +1055,7 @@ struct _virDomainNetDef {
unsigned long sndbuf; unsigned long sndbuf;
} tune; } tune;
char *script; char *script;
char *downscript;
char *domain_name; /* backend domain name */ char *domain_name; /* backend domain name */
char *ifname; /* interface name on the host (<target dev='x'/>) */ char *ifname; /* interface name on the host (<target dev='x'/>) */
int managed_tap; /* enum virTristateBool - ABSENT == YES */ int managed_tap; /* enum virTristateBool - ABSENT == YES */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册