netdev-dpdk: fix mbuf leaks
[cascardo/ovs.git] / xenserver / opt_xensource_libexec_interface-reconfigure
index a350952..3b5c861 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 #
 # Copyright (c) 2008,2009 Citrix Systems, Inc.
 #
@@ -33,6 +33,8 @@
     --pif               A PIF reference within the session.
     --pif-uuid          The UUID of a PIF.
     --force             An interface name.
+    --root-prefix=DIR   Use DIR as alternate root directory (for testing).
+    --no-syslog         Write log messages to stderr instead of system log.
 """
 
 # Notes:
@@ -48,6 +50,7 @@ import syslog
 import traceback
 import re
 import random
+import syslog
 
 management_pif = None
 
@@ -88,7 +91,7 @@ def check_allowed(pif):
 
     pifrec = db().get_pif_record(pif)
     try:
-        f = open("/proc/ardence")
+        f = open(root_prefix() + "/proc/ardence")
         macline = filter(lambda x: x.startswith("HWaddr:"), f.readlines())
         f.close()
         if len(macline) == 1:
@@ -121,20 +124,20 @@ def netdev_remap_name(pif, already_renamed=[]):
 
     def get_netdev_mac(device):
         try:
-            return read1("/sys/class/net/%s/address" % device)
+            return read1("%s/sys/class/net/%s/address" % (root_prefix(), device))
         except:
             # Probably no such device.
             return None
 
     def get_netdev_tx_queue_len(device):
         try:
-            return int(read1("/sys/class/net/%s/tx_queue_len" % device))
+            return int(read1("%s/sys/class/net/%s/tx_queue_len" % (root_prefix(), device)))
         except:
             # Probably no such device.
             return None
 
     def get_netdev_by_mac(mac):
-        for device in os.listdir("/sys/class/net"):
+        for device in os.listdir(root_prefix() + "/sys/class/net"):
             dev_mac = get_netdev_mac(device)
             if (dev_mac and mac.lower() == dev_mac.lower() and
                 get_netdev_tx_queue_len(device)):
@@ -142,10 +145,11 @@ def netdev_remap_name(pif, already_renamed=[]):
         return None
 
     def rename_netdev(old_name, new_name):
-        log("Changing the name of %s to %s" % (old_name, new_name))
-        run_command(['/sbin/ifconfig', old_name, 'down'])
-        if not run_command(['/sbin/ip', 'link', 'set', old_name, 'name', new_name]):
-            raise Error("Could not rename %s to %s" % (old_name, new_name))
+        raise Error("Trying to rename %s to %s - This functionality has been removed" % (old_name, new_name))
+        # log("Changing the name of %s to %s" % (old_name, new_name))
+        # run_command(['/sbin/ifconfig', old_name, 'down'])
+        # if not run_command(['/sbin/ip', 'link', 'set', old_name, 'name', new_name]):
+        #     raise Error("Could not rename %s to %s" % (old_name, new_name))
 
     pifrec = db().get_pif_record(pif)
     device = pifrec['device']
@@ -185,7 +189,7 @@ def ifdown(netdev):
     if not netdev_exists(netdev):
         log("ifdown: device %s does not exist, ignoring" % netdev)
         return
-    if not os.path.exists("/etc/sysconfig/network-scripts/ifcfg-%s" % netdev):
+    if not os.path.exists("%s/etc/sysconfig/network-scripts/ifcfg-%s" % (root_prefix(), netdev)):
         log("ifdown: device %s exists but ifcfg-%s does not" % (netdev,netdev))
         run_command(["/sbin/ifconfig", netdev, 'down'])
         return
@@ -193,15 +197,21 @@ def ifdown(netdev):
 
 def ifup(netdev):
     """Bring up a network interface"""
-    if not os.path.exists("/etc/sysconfig/network-scripts/ifcfg-%s" % netdev):
+    if not os.path.exists(root_prefix() + "/etc/sysconfig/network-scripts/ifcfg-%s" % netdev):
         raise Error("ifup: device %s exists but ifcfg-%s does not" % (netdev,netdev))
+    d = os.getenv("DHCLIENTARGS","")
+    if os.path.exists("/etc/firstboot.d/data/firstboot_in_progress"):
+        os.putenv("DHCLIENTARGS", d + " -T 240 " )
     run_command(["/sbin/ifup", netdev])
+    os.putenv("DHCLIENTARGS", d )
 
 #
 #
 #
 
 def pif_rename_physical_devices(pif):
+    if pif_is_tunnel(pif):
+        return
 
     if pif_is_vlan(pif):
         pif = pif_get_vlan_slave(pif)
@@ -232,13 +242,13 @@ def ipdev_configure_static_routes(interface, oc, f):
           172.18.0.0/16 via 192.168.0.4 dev xenbr1
     """
     if oc.has_key('static-routes'):
-        # The key is present - extract comma seperates entries
+        # The key is present - extract comma separates entries
         lines = oc['static-routes'].split(',')
     else:
         # The key is not present, i.e. there are no static routes
         lines = []
 
-    child = ConfigurationFile("/etc/sysconfig/network-scripts/route-%s" % interface)
+    child = ConfigurationFile("%s/etc/sysconfig/network-scripts/route-%s" % (root_prefix(), interface))
     child.write("# DO NOT EDIT: This file (%s) was autogenerated by %s\n" % \
             (os.path.basename(child.path()), os.path.basename(sys.argv[0])))
 
@@ -258,13 +268,14 @@ def ipdev_open_ifcfg(pif):
 
     log("Writing network configuration for %s" % ipdev)
 
-    f = ConfigurationFile("/etc/sysconfig/network-scripts/ifcfg-%s" % ipdev)
+    f = ConfigurationFile("%s/etc/sysconfig/network-scripts/ifcfg-%s" % (root_prefix(), ipdev))
 
     f.write("# DO NOT EDIT: This file (%s) was autogenerated by %s\n" % \
             (os.path.basename(f.path()), os.path.basename(sys.argv[0])))
     f.write("XEMANAGED=yes\n")
     f.write("DEVICE=%s\n" % ipdev)
     f.write("ONBOOT=no\n")
+    f.write("NOZEROCONF=yes\n")
 
     return f
 
@@ -284,7 +295,8 @@ def ipdev_configure_network(pif, dp):
     """
 
     pifrec = db().get_pif_record(pif)
-    nwrec = db().get_network_record(pifrec['network'])
+    nw = pifrec['network']
+    nwrec = db().get_network_record(nw)
 
     ipdev = pif_ipdev_name(pif)
 
@@ -319,12 +331,13 @@ def ipdev_configure_network(pif, dp):
         if len(offload):
             f.write("ETHTOOL_OFFLOAD_OPTS=\"%s\"\n" % str.join(" ", offload))
 
-        mtu = mtu_setting(nwrec['other_config'])
-        if mtu:
-            f.write("MTU=%s\n" % mtu)
-
         ipdev_configure_static_routes(ipdev, nwrec['other_config'], f)
 
+    mtu = mtu_setting(nw, "Network", nwrec['other_config'])
+    if mtu:
+        f.write("MTU=%s\n" % mtu)
+
+
     if pifrec.has_key('DNS') and pifrec['DNS'] != "":
         ServerList = pifrec['DNS'].split(",")
         for i in range(len(ServerList)): f.write("DNS%d=%s\n" % (i+1, ServerList[i]))
@@ -350,6 +363,10 @@ def ipdev_configure_network(pif, dp):
 
     pifs_on_host = [p for p in db().get_all_pifs() if not p in pif_get_bond_masters(pif)]
 
+    # now prune out bond slaves as they are not connected to the IP 
+    # stack and so cannot be used as gateway or DNS devices.
+    pifs_on_host = [ p for p in pifs_on_host if len(pif_get_bond_masters(p)) == 0]
+
     # loop through all the pifs on this host looking for one with
     #   other-config:peerdns = true, and one with
     #   other-config:default-route=true
@@ -382,7 +399,7 @@ def ipdev_configure_network(pif, dp):
     is_gatewaydev = defaultroute_pif == pif
 
     if is_dnsdev or is_gatewaydev:
-        fnetwork = ConfigurationFile("/etc/sysconfig/network")
+        fnetwork = ConfigurationFile(root_prefix() + "/etc/sysconfig/network")
         for line in fnetwork.readlines():
             if is_dnsdev and line.lstrip().startswith('DNSDEV='):
                 fnetwork.write('DNSDEV=%s\n' % ipdev)
@@ -411,7 +428,7 @@ def action_up(pif, force):
     pifrec = db().get_pif_record(pif)
 
     ipdev = pif_ipdev_name(pif)
-    dp = DatapathFactory(pif)
+    dp = DatapathFactory()(pif)
 
     log("action_up: %s" % ipdev)
 
@@ -441,7 +458,7 @@ def action_up(pif, force):
         dp.post()
 
         # Update /etc/issue (which contains the IP address of the management interface)
-        os.system("/sbin/update-issue")
+        os.system(root_prefix() + "/sbin/update-issue")
 
         f.commit()
     except Error, e:
@@ -451,7 +468,7 @@ def action_up(pif, force):
 
 def action_down(pif):
     ipdev = pif_ipdev_name(pif)
-    dp = DatapathFactory(pif)
+    dp = DatapathFactory()(pif)
 
     log("action_down: %s" % ipdev)
 
@@ -459,6 +476,9 @@ def action_down(pif):
 
     dp.bring_down()
 
+def action_rewrite():
+    DatapathFactory().rewrite()
+    
 # This is useful for reconfiguring the mgmt interface after having lost connectivity to the pool master
 def action_force_rewrite(bridge, config):
     def getUUID():
@@ -502,7 +522,7 @@ def action_force_rewrite(bridge, config):
 
     log("Configuring %s using %s configuration" % (bridge, mode))
 
-    f = ConfigurationFile(dbcache_file)
+    f = ConfigurationFile(root_prefix() + dbcache_file)
 
     pif_uuid = getUUID()
     network_uuid = getUUID()
@@ -518,6 +538,8 @@ def action_force_rewrite(bridge, config):
     f.write('\t\t<VLAN_slave_of/>\n')
     f.write('\t\t<VLAN_master_of>OpaqueRef:NULL</VLAN_master_of>\n')
     f.write('\t\t<VLAN>-1</VLAN>\n')
+    f.write('\t\t<tunnel_access_PIF_of/>\n')
+    f.write('\t\t<tunnel_transport_PIF_of/>\n')
     f.write('\t\t<device>%s</device>\n' % interface)
     f.write('\t\t<MAC>%s</MAC>\n' % mac)
     f.write('\t\t<other_config/>\n')
@@ -580,6 +602,8 @@ def main(argv=None):
                         "force-interface=",
                         "management",
                         "mac=", "device=", "mode=", "ip=", "netmask=", "gateway=",
+                        "root-prefix=",
+                        "no-syslog",
                         "help" ]
             arglist, args = getopt.gnu_getopt(argv[1:], shortops, longops)
         except getopt.GetoptError, msg:
@@ -600,12 +624,17 @@ def main(argv=None):
                 force_management = True
             elif o in ["--mac", "--device", "--mode", "--ip", "--netmask", "--gateway"]:
                 force_rewrite_config[o[2:]] = a
+            elif o == "--root-prefix":
+                set_root_prefix(a)
+            elif o == "--no-syslog":
+                set_log_destination("stderr")
             elif o == "-h" or o == "--help":
                 print __doc__ % {'command-name': os.path.basename(argv[0])}
                 return 0
 
-        syslog.openlog(os.path.basename(argv[0]))
-        log("Called as " + str.join(" ", argv))
+        if get_log_destination() == "syslog":
+            syslog.openlog(os.path.basename(argv[0]))
+            log("Called as " + str.join(" ", argv))
 
         if len(args) < 1:
             raise Usage("Required option <action> not present")
@@ -655,7 +684,7 @@ def main(argv=None):
                 pif = db().get_pif_by_uuid(pif_uuid)
 
             if action == "rewrite":
-                pass
+                action_rewrite()
             else:
                 if not pif:
                     raise Usage("No PIF given")