mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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: Chen Hanxiao <chen_han_xiao@126.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
1c425857fb
commit
61ba6f09b1
@ -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><script></code> element) will be run; this can
|
the <code><script></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><downscript></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 @@
|
|||||||
<devices>
|
<devices>
|
||||||
<interface type='ethernet'>
|
<interface type='ethernet'>
|
||||||
<script path='/etc/qemu-ifup-mynet'/>
|
<script path='/etc/qemu-ifup-mynet'/>
|
||||||
|
<downscript path='/etc/qemu-ifdown-mynet'/>
|
||||||
</interface>
|
</interface>
|
||||||
...
|
...
|
||||||
<interface type='ethernet'>
|
<interface type='ethernet'>
|
||||||
|
@ -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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
} 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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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 {
|
|||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user