]> xenbits.xensource.com Git - libvirt.git/commitdiff
interface: introduce downscript element for interface
authorChen Hanxiao <chen_han_xiao@126.com>
Tue, 26 May 2020 00:40:59 +0000 (20:40 -0400)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 26 May 2020 13:56:11 +0000 (15:56 +0200)
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>
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h

index 05a1ed450938707145d578b91d18bfafb312eec2..33cec1e6dd9f75e187ff7e08e306949a42b18e9c 100644 (file)
     <p>
       After creating/opening the tap device, an optional shell script
       (given in the <code>path</code> attribute of
-      the <code>&lt;script&gt;</code> element) will be run; this can
-      be used to do whatever extra host network integration is
+      the <code>&lt;script&gt;</code> element) will be run.
+      <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.
     </p>
 
 &lt;devices&gt;
   &lt;interface type='ethernet'&gt;
     &lt;script path='/etc/qemu-ifup-mynet'/&gt;
+    &lt;downscript path='/etc/qemu-ifdown-mynet'/&gt;
   &lt;/interface&gt;
   ...
   &lt;interface type='ethernet'&gt;
index 9d60b090f3a63bfc07d1274eae373b99b711165f..6727cd743b7eb13177627d75955a591264a424c5 100644 (file)
           <empty/>
         </element>
       </optional>
+      <optional>
+        <element name="downscript">
+          <attribute name="path">
+            <ref name="filePath"/>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
       <optional>
         <element name="backenddomain">
           <attribute name="name">
index c201fc901d9f99790428dca31aff626a43e472f0..1406cf079e6c85d7167c785b577aa19329f7b8e7 100644 (file)
@@ -2520,6 +2520,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
     VIR_FREE(def->teaming.persistent);
     VIR_FREE(def->virtPortProfile);
     VIR_FREE(def->script);
+    VIR_FREE(def->downscript);
     VIR_FREE(def->domain_name);
     VIR_FREE(def->ifname);
     VIR_FREE(def->ifname_guest);
@@ -11977,6 +11978,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
     g_autofree char *ifname_guest = NULL;
     g_autofree char *ifname_guest_actual = NULL;
     g_autofree char *script = NULL;
+    g_autofree char *downscript = NULL;
     g_autofree char *address = NULL;
     g_autofree char *port = NULL;
     g_autofree char *localaddr = NULL;
@@ -12149,6 +12151,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
             } else if (!script &&
                        virXMLNodeNameEqual(cur, "script")) {
                 script = virXMLPropString(cur, "path");
+            } else if (!downscript &&
+                       virXMLNodeNameEqual(cur, "downscript")) {
+                downscript = virXMLPropString(cur, "path");
             } else if (!domain_name &&
                        virXMLNodeNameEqual(cur, "backenddomain")) {
                 domain_name = virXMLPropString(cur, "name");
@@ -12482,6 +12487,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 
     if (script != NULL)
         def->script = g_steal_pointer(&script);
+    if (downscript != NULL)
+        def->downscript = g_steal_pointer(&downscript);
     if (domain_name != NULL)
         def->domain_name = g_steal_pointer(&domain_name);
     if (ifname != NULL)
@@ -26567,6 +26574,8 @@ virDomainNetDefFormat(virBufferPtr buf,
 
     virBufferEscapeString(buf, "<script path='%s'/>\n",
                           def->script);
+    virBufferEscapeString(buf, "<downscript path='%s'/>\n",
+                          def->downscript);
     virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name);
 
     if (def->ifname &&
index ddc75d8de26706207ff72bc454978fc49b56809a..e152c599cac34ea5dbb8123ee7d5b16a105ca940 100644 (file)
@@ -1055,6 +1055,7 @@ struct _virDomainNetDef {
         unsigned long sndbuf;
     } tune;
     char *script;
+    char *downscript;
     char *domain_name; /* backend domain name */
     char *ifname; /* interface name on the host (<target dev='x'/>) */
     int managed_tap; /* enum virTristateBool - ABSENT == YES */