modified some logic in the ipv6.py (bug fixing) and naming fix in the
authorGuilherme Sperb Machado <gsm@machados.org>
Thu, 18 Sep 2014 00:18:01 +0000 (02:18 +0200)
committerGuilherme Sperb Machado <gsm@machados.org>
Thu, 18 Sep 2014 00:18:01 +0000 (02:18 +0200)
tools.py

plugins/ipv6.py
tools.py

index b627b58..a9ab96e 100644 (file)
@@ -20,12 +20,13 @@ from xml.dom.minidom import parseString
 
 priority=4
 
 
 priority=4
 
-radvdConfFile = '/etc/radvd.conf'
+radvd_conf_file = '/etc/radvd.conf'
+sliversipv6prefixtag = 'sliversipv6prefix'
 
 def start():
     logger.log("ipv6: plugin starting up...")
 
 
 def start():
     logger.log("ipv6: plugin starting up...")
 
-def buildLibvirtDefaultNetConfig(dom):
+def build_libvirt_default_net_config(dom):
 
     # create the <network> element
     networkElem = dom.createElement("network")
 
     # create the <network> element
     networkElem = dom.createElement("network")
@@ -75,7 +76,7 @@ def buildLibvirtDefaultNetConfig(dom):
     networkElem.appendChild(ipElem0)
     return networkElem
 
     networkElem.appendChild(ipElem0)
     return networkElem
 
-def checkForIPv6(defaultNetworkConfig):
+def check_for_ipv6(defaultNetworkConfig):
     netnodes = defaultNetworkConfig.getElementsByTagName('network')
     hasIPv6 = False
     for netnode in netnodes:
     netnodes = defaultNetworkConfig.getElementsByTagName('network')
     hasIPv6 = False
     for netnode in netnodes:
@@ -88,7 +89,7 @@ def checkForIPv6(defaultNetworkConfig):
     return hasIPv6
 
 
     return hasIPv6
 
 
-def addIPv6(defaultNetworkConfig, ipv6addr, prefix):
+def add_ipv6(defaultNetworkConfig, ipv6addr, prefix):
 
     netnodes = defaultNetworkConfig.getElementsByTagName('network')
     for netnode in netnodes:
 
     netnodes = defaultNetworkConfig.getElementsByTagName('network')
     for netnode in netnodes:
@@ -108,7 +109,7 @@ def addIPv6(defaultNetworkConfig, ipv6addr, prefix):
         netnode.appendChild(ipElem2)
     return defaultNetworkConfig
 
         netnode.appendChild(ipElem2)
     return defaultNetworkConfig
 
-def changeIPv6(dom, ipv6addr, prefix):
+def change_ipv6(dom, ipv6addr, prefix):
     ips = dom.getElementsByTagName('ip')
     for ip in ips:
         if ip.getAttribute("family")=='ipv6' and not(re.match(r'fe80(.*)', ip.getAttribute("address"), re.I)):
     ips = dom.getElementsByTagName('ip')
     for ip in ips:
         if ip.getAttribute("family")=='ipv6' and not(re.match(r'fe80(.*)', ip.getAttribute("address"), re.I)):
@@ -117,7 +118,7 @@ def changeIPv6(dom, ipv6addr, prefix):
     return dom
 
 
     return dom
 
 
-def removeIPv6(dom):
+def remove_ipv6(dom):
     networks = dom.getElementsByTagName('network')
     for network in networks:
         ips = network.getElementsByTagName('ip')
     networks = dom.getElementsByTagName('network')
     for network in networks:
         ips = network.getElementsByTagName('ip')
@@ -127,7 +128,7 @@ def removeIPv6(dom):
     return dom
 
 
     return dom
 
 
-def checkIfIPv6IsDifferent(dom, ipv6addr, prefix):
+def check_if_ipv6_is_different(dom, ipv6addr, prefix):
     netnodes = dom.getElementsByTagName('network')
     for netnode in netnodes:
         ips = netnode.getElementsByTagName('ip')
     netnodes = dom.getElementsByTagName('network')
     for netnode in netnodes:
         ips = netnode.getElementsByTagName('ip')
@@ -140,14 +141,14 @@ def checkIfIPv6IsDifferent(dom, ipv6addr, prefix):
     return False
 
 
     return False
 
 
-def setAutostart(network):
+def set_autostart(network):
     try:
         network.setAutostart(1)
     except:
         logger.log("ipv6: network could not set to autostart")
 
 
     try:
         network.setAutostart(1)
     except:
         logger.log("ipv6: network could not set to autostart")
 
 
-def setUp(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix):
+def set_up(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix):
     newXml = networkElem.toxml()
     #logger.log(networkElem.toxml())
     #ret = dir(conn)
     newXml = networkElem.toxml()
     #logger.log(networkElem.toxml())
     #ret = dir(conn)
@@ -157,7 +158,7 @@ def setUp(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix):
     networkLibvirt.destroy()
     connLibvirt.networkCreateXML(newXml)
     networkDefault = connLibvirt.networkDefineXML(newXml)
     networkLibvirt.destroy()
     connLibvirt.networkCreateXML(newXml)
     networkDefault = connLibvirt.networkDefineXML(newXml)
-    setAutostart(networkDefault)
+    set_autostart(networkDefault)
     commandForwarding = ['sysctl', '-w', 'net.ipv6.conf.all.forwarding=1']
     logger.log_call(commandForwarding, timeout=15*60)
     configRadvd = """
     commandForwarding = ['sysctl', '-w', 'net.ipv6.conf.all.forwarding=1']
     logger.log_call(commandForwarding, timeout=15*60)
     configRadvd = """
@@ -175,29 +176,29 @@ interface virbr0
 
 };
 """ % locals()
 
 };
 """ % locals()
-    with open(radvdConfFile,'w') as f:
+    with open(radvd_conf_file,'w') as f:
         f.write(configRadvd)
         f.write(configRadvd)
-    killRadvd()
-    startRadvd()
+    kill_radvd()
+    start_radvd()
     logger.log("ipv6: set up process finalized. Enabled IPv6 address to the slivers!")
 
     logger.log("ipv6: set up process finalized. Enabled IPv6 address to the slivers!")
 
-def cleanUp(networkLibvirt, connLibvirt, networkElem):
-    dom = removeIPv6(networkElem)
+def clean_up(networkLibvirt, connLibvirt, networkElem):
+    dom = remove_ipv6(networkElem)
     newXml = dom.toxml()
     networkLibvirt.undefine()
     networkLibvirt.destroy()
     # TODO: set autostart for the network
     connLibvirt.networkCreateXML(newXml)
     networkDefault = connLibvirt.networkDefineXML(newXml)
     newXml = dom.toxml()
     networkLibvirt.undefine()
     networkLibvirt.destroy()
     # TODO: set autostart for the network
     connLibvirt.networkCreateXML(newXml)
     networkDefault = connLibvirt.networkDefineXML(newXml)
-    setAutostart(networkDefault)
-    killRadvd()
+    set_autostart(networkDefault)
+    kill_radvd()
     logger.log("ipv6: cleanup process finalized. The IPv6 support on the slivers was removed.")
 
     logger.log("ipv6: cleanup process finalized. The IPv6 support on the slivers was removed.")
 
-def killRadvd():
-    commandKillRadvd = ['killall', 'radvd']
-    logger.log_call(commandKillRadvd, timeout=15*60)
+def kill_radvd():
+    command_kill_radvd = ['killall', 'radvd']
+    logger.log_call(command_kill_radvd, timeout=15*60)
 
 
-def startRadvd():
+def start_radvd():
     commandRadvd = ['radvd']
     logger.log_call(commandRadvd, timeout=15*60)
 
     commandRadvd = ['radvd']
     logger.log_call(commandRadvd, timeout=15*60)
 
@@ -208,59 +209,68 @@ def GetSlivers(data, config, plc):
     interfaces = data['interfaces']
     logger.log(repr(interfaces))
     for interface in interfaces:
     interfaces = data['interfaces']
     logger.log(repr(interfaces))
     for interface in interfaces:
-       logger.log('ipv6: get interface 1: %r'%(interface))
-       if 'interface_tag_ids' in interface:
+        logger.log('ipv6: get interface: %r'%(interface))
+        if 'interface_tag_ids' in interface:
             interface_tag_ids = "interface_tag_ids"
             interface_tag_ids = "interface_tag_ids"
-        interface_tag_id = "interface_tag_id"
-        settings = plc.GetInterfaceTags({interface_tag_id:interface[interface_tag_ids]})
-        isSliversIPv6PrefixSet = False
-        for setting in settings:
-            #logger.log(repr(setting))
-            # TODO: create a static variable to describe the "sliversipv6prefix" tag
-            if setting['tagname']=='sliversipv6prefix':
-                ipv6addrprefix = setting['value'].split('/', 1)
-                ipv6addr = ipv6addrprefix[0]
-                prefix = ipv6addrprefix[1]
-                logger.log("ipv6: %s" % (ipv6addr) )
-                validIPv6 = tools.isValidIPv6(ipv6addr)
-                if not(validIPv6):
-                    logger.log("ipv6: the 'sliversipv6prefix' tag presented a non-valid IPv6 address!")
-                else:
-                    # connecting to the libvirtd
-                    connLibvirt = Sliver_Libvirt.getConnection(type)
-                    list = connLibvirt.listAllNetworks()
-                    for networkLibvirt in list:
-                        xmldesc = networkLibvirt.XMLDesc()
-                        dom = parseString(xmldesc)
-                        hasIPv6 = checkForIPv6(dom)
-                        if hasIPv6:
-                            # let's first check if the IPv6 is different or is it the same...
-                            isDifferent = checkIfIPv6IsDifferent(dom, ipv6addr, prefix)
-                            if isDifferent:
-                                logger.log("ipv6: tag 'sliversipv6prefix' was modified! " + 
+            interface_tag_id = "interface_tag_id"
+            settings = plc.GetInterfaceTags({interface_tag_id:interface[interface_tag_ids]})
+            is_slivers_ipv6_prefix_set = False
+            for setting in settings:
+                if setting['tagname']==sliversipv6prefixtag:
+                    ipv6addrprefix = setting['value'].split('/', 1)
+                    ipv6addr = ipv6addrprefix[0]
+                    valid_prefix = False
+                    if len(ipv6addrprefix)>1:
+                        prefix = ipv6addrprefix[1]
+                        if prefix>0 and prefix<=64:
+                            valid_prefix = True
+                        else:
+                            valid_prefix = False
+                    else:
+                        valid_prefix = False
+                    logger.log("ipv6: '%s'=%s" % (sliversipv6prefixtag,ipv6addr) )
+                    valid_ipv6 = tools.is_valid_ipv6(ipv6addr)
+                    if not(valid_ipv6):
+                        logger.log("ipv6: the 'sliversipv6prefix' tag presented a non-valid IPv6 address!")
+                    elif not(valid_prefix):
+                            logger.log("ipv6: the '%s' tag does not present a valid prefix " +
+                                   "(e.g., '/64', '/58')!" % (sliversipv6prefixtag) )
+                    else:
+                        # connecting to the libvirtd
+                        connLibvirt = Sliver_Libvirt.getConnection(type)
+                        list = connLibvirt.listAllNetworks()
+                        for networkLibvirt in list:
+                            xmldesc = networkLibvirt.XMLDesc()
+                            dom = parseString(xmldesc)
+                            has_ipv6 = check_for_ipv6(dom)
+                            if has_ipv6:
+                                # let's first check if the IPv6 is different or is it the same...
+                                is_different = check_if_ipv6_is_different(dom, ipv6addr, prefix)
+                                if is_different:
+                                    logger.log("ipv6: tag 'sliversipv6prefix' was modified! " +
                                            "Updating configuration with the new one...")
                                            "Updating configuration with the new one...")
-                                networkElem = changeIPv6(dom, ipv6addr, prefix)
-                                setUp(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix)
+                                    network_elem = change_ipv6(dom, ipv6addr, prefix)
+                                    set_up(networkLibvirt, connLibvirt, network_elem, ipv6addr, prefix)
+                                    logger.log("ipv6: trying to reboot the slivers...")
+                                    tools.reboot_slivers()
+                            else:
+                                logger.log("ipv6: starting to redefine the virtual network...")
+                                #network_elem = buildLibvirtDefaultNetConfig(dom,ipv6addr,prefix)
+                                network_elem = add_ipv6(dom, ipv6addr, prefix)
+                                set_up(networkLibvirt, connLibvirt, network_elem, ipv6addr, prefix)
                                 logger.log("ipv6: trying to reboot the slivers...")
                                 logger.log("ipv6: trying to reboot the slivers...")
-                                tools.reboot_sliver('blah')
-                        else:
-                            logger.log("ipv6: starting to redefine the virtual network...")
-                            #networkElem = buildLibvirtDefaultNetConfig(dom,ipv6addr,prefix)
-                            networkElem = addIPv6(dom, ipv6addr, prefix)
-                            setUp(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix)
-                            logger.log("ipv6: trying to reboot the slivers...")
-                            tools.reboot_sliver('blah')
-            isSliversIPv6PrefixSet = True
-        if not(isSliversIPv6PrefixSet):
-            # connecting to the libvirtd
-            connLibvirt = Sliver_Libvirt.getConnection(type)
-            list = connLibvirt.listAllNetworks()
-            for networkLibvirt in list:
-                xmldesc = networkLibvirt.XMLDesc()
-                dom = parseString(xmldesc)
-                if checkForIPv6(dom):
-                    cleanUp(networkLibvirt, connLibvirt, dom)
-                    logger.log("ipv6: trying to reboot the slivers...")
-                    tools.reboot_sliver('blah')
+                                tools.reboot_slivers()
+                        is_slivers_ipv6_prefix_set = True
+            if not(is_slivers_ipv6_prefix_set):
+                # connecting to the libvirtd
+                connLibvirt = Sliver_Libvirt.getConnection(type)
+                list = connLibvirt.listAllNetworks()
+                for networkLibvirt in list:
+                    xmldesc = networkLibvirt.XMLDesc()
+                    dom = parseString(xmldesc)
+                    if check_for_ipv6(dom):
+                        clean_up(networkLibvirt, connLibvirt, dom)
+                        logger.log("ipv6: trying to reboot the slivers...")
+                        tools.reboot_slivers()
 
     logger.log("ipv6: all done!")
 
     logger.log("ipv6: all done!")
index d1bbbfd..4a658b8 100644 (file)
--- a/tools.py
+++ b/tools.py
@@ -72,10 +72,10 @@ def daemon():
 
 def fork_as(su, function, *args):
     """
 
 def fork_as(su, function, *args):
     """
-fork(), cd / to avoid keeping unused directories open, 
-close all nonstandard file descriptors (to avoid capturing open sockets), 
-fork() again (to avoid zombies) and call <function> 
-with arguments <args> in the grandchild process.  
+fork(), cd / to avoid keeping unused directories open,
+close all nonstandard file descriptors (to avoid capturing open sockets),
+fork() again (to avoid zombies) and call <function>
+with arguments <args> in the grandchild process.
 If <su> is not None, set our group and user ids
  appropriately in the child process.
     """
 If <su> is not None, set our group and user ids
  appropriately in the child process.
     """
@@ -139,7 +139,7 @@ def write_temp_file(do_write, mode=None, uidgid=None):
 def replace_file_with_string (target, new_contents, chmod=None, remove_if_empty=False):
     """
 Replace a target file with a new contents
 def replace_file_with_string (target, new_contents, chmod=None, remove_if_empty=False):
     """
 Replace a target file with a new contents
-checks for changes: does not do anything if previous state was already right 
+checks for changes: does not do anything if previous state was already right
 can handle chmod if requested
 can also remove resulting file if contents are void, if requested
 performs atomically:
 can handle chmod if requested
 can also remove resulting file if contents are void, if requested
 performs atomically:
@@ -442,7 +442,7 @@ def get_sliver_ipv6(slice_name):
     ifconfig = get_sliver_ifconfig_lxc(slice_name)
     if not ifconfig:
         return None,None
     ifconfig = get_sliver_ifconfig_lxc(slice_name)
     if not ifconfig:
         return None,None
-    
+
     # example: 'inet6 2001:67c:16dc:1302:5054:ff:fea7:7882  prefixlen 64  scopeid 0x0<global>'
     prog = re.compile(r'inet6\s+(.*)\s+prefixlen\s+(\d+)\s+scopeid\s+(.+)<global>')
     for line in ifconfig.split("\n"):
     # example: 'inet6 2001:67c:16dc:1302:5054:ff:fea7:7882  prefixlen 64  scopeid 0x0<global>'
     prog = re.compile(r'inet6\s+(.*)\s+prefixlen\s+(\d+)\s+scopeid\s+(.+)<global>')
     for line in ifconfig.split("\n"):
@@ -453,12 +453,12 @@ def get_sliver_ipv6(slice_name):
             return (ipv6addr,prefixlen)
     return None,None
 
             return (ipv6addr,prefixlen)
     return None,None
 
-################################################### 
+###################################################
 # Author: Guilherme Sperb Machado <gsm@machados.org>
 ###################################################
 # Check if the address is a AF_INET6 family address
 ###################################################
 # Author: Guilherme Sperb Machado <gsm@machados.org>
 ###################################################
 # Check if the address is a AF_INET6 family address
 ###################################################
-def isValidIPv6(ipv6addr):
+def is_valid_ipv6(ipv6addr):
     try:
         socket.inet_pton(socket.AF_INET6, ipv6addr)
     except socket.error:
     try:
         socket.inet_pton(socket.AF_INET6, ipv6addr)
     except socket.error:
@@ -476,9 +476,9 @@ def get_node_virt ():
     except:
         pass
     logger.log("Computing virt..")
     except:
         pass
     logger.log("Computing virt..")
-    try: 
+    try:
         if subprocess.call ([ 'vserver', '--help' ]) ==0: virt='vs'
         if subprocess.call ([ 'vserver', '--help' ]) ==0: virt='vs'
-        else:                                             virt='lxc'      
+        else:                                             virt='lxc'
     except:
         virt='lxc'
     with file(virt_stamp,"w") as f:
     except:
         virt='lxc'
     with file(virt_stamp,"w") as f:
@@ -500,16 +500,12 @@ def has_systemctl ():
 # This method was developed to support the ipv6 plugin
 # Only for LXC!
 ###################################################
 # This method was developed to support the ipv6 plugin
 # Only for LXC!
 ###################################################
-def reboot_sliver(name):
+def reboot_slivers():
     type = 'sliver.LXC'
     # connecting to the libvirtd
     connLibvirt = Sliver_Libvirt.getConnection(type)
     domains = connLibvirt.listAllDomains()
     for domain in domains:
     type = 'sliver.LXC'
     # connecting to the libvirtd
     connLibvirt = Sliver_Libvirt.getConnection(type)
     domains = connLibvirt.listAllDomains()
     for domain in domains:
-        #ret = dir(domain)
-        #for method in ret:
-        #       logger.log("ipv6: " + repr(method))
-        #logger.log("tools: " + str(domain.name()) )
         try:
             domain.destroy()
             logger.log("tools: %s destroyed" % (domain.name()) )
         try:
             domain.destroy()
             logger.log("tools: %s destroyed" % (domain.name()) )
@@ -560,7 +556,7 @@ def remove_all_ipv6addr_hosts(slicename, node):
                 ipv6candidate = search.group(1)
                 ipv6candidatestrip = ipv6candidate.strip()
                 logger.log("tools: group1=%s" % (ipv6candidatestrip) )
                 ipv6candidate = search.group(1)
                 ipv6candidatestrip = ipv6candidate.strip()
                 logger.log("tools: group1=%s" % (ipv6candidatestrip) )
-                valid = isValidIPv6(ipv6candidatestrip)
+                valid = is_valid_ipv6(ipv6candidatestrip)
                 if not valid:
                     logger.log("tools: address=%s not valid" % (ipv6candidatestrip) )
                     print line,
                 if not valid:
                     logger.log("tools: address=%s not valid" % (ipv6candidatestrip) )
                     print line,
@@ -597,7 +593,7 @@ def add_ipv6addr_hosts_line(slicename, node, ipv6addr):
 # bottom line is, what actually needs to be called is
 # vs:  vserver exec slicename command and its arguments
 # lxc: lxcsu slicename "command and its arguments"
 # bottom line is, what actually needs to be called is
 # vs:  vserver exec slicename command and its arguments
 # lxc: lxcsu slicename "command and its arguments"
-# which, OK, is no big deal as long as the command is simple enough, 
+# which, OK, is no big deal as long as the command is simple enough,
 # but do not stretch it with arguments that have spaces or need quoting as that will become a nightmare
 def command_in_slice (slicename, argv):
     virt=get_node_virt()
 # but do not stretch it with arguments that have spaces or need quoting as that will become a nightmare
 def command_in_slice (slicename, argv):
     virt=get_node_virt()