From: Thierry Parmentelat Date: Tue, 16 Sep 2014 09:48:14 +0000 (+0200) Subject: reviewed Guilherme's code X-Git-Tag: nodemanager-5.2-15~3^2~9 X-Git-Url: http://git.onelab.eu/?p=nodemanager.git;a=commitdiff_plain;h=b6ef770061128671bc199f62a25dca9bd480c5a5 reviewed Guilherme's code had to deeply modify indentations as these were coming with tabs and looked like nothing within my emacs fixed the issue in tools.py on f14/vs : logger was used before imported --- diff --git a/plugins/ipv6.py b/plugins/ipv6.py index cbc4ea1..b627b58 100644 --- a/plugins/ipv6.py +++ b/plugins/ipv6.py @@ -1,3 +1,5 @@ +# -*- python-indent: 4 -*- + """ Description: IPv6 Support and Management to Slices ipv6 nodemanager plugin @@ -25,145 +27,146 @@ def start(): def buildLibvirtDefaultNetConfig(dom): - # create the element - networkElem = dom.createElement("network") - # create element - nameElem = dom.createElement("name") - textName = dom.createTextNode("default") - nameElem.appendChild(textName) - # create element - uuidElem = dom.createElement("uuid") - textUUID = dom.createTextNode(str(uuid.uuid1())) - uuidElem.appendChild(textUUID) - # create element - forwardElem = dom.createElement("forward") - forwardElem.setAttribute("mode", "nat") - # create element - natElem = dom.createElement("nat") - # create element - portElem = dom.createElement("port") - portElem.setAttribute("end", "65535") - portElem.setAttribute("start", "1024") - # create the ipv4 element - ipElem0 = dom.createElement("ip") - ipElem0.setAttribute("address", "192.168.122.1") - ipElem0.setAttribute("netmask", "255.255.255.0") - # create the element - dhcpElem = dom.createElement("dhcp") - # create the element - rangeElem = dom.createElement("range") - rangeElem.setAttribute("end", "192.168.122.254") - rangeElem.setAttribute("start", "192.168.122.2") - # create the element - bridgeElem = dom.createElement("bridge") - bridgeElem.setAttribute("delay", "0") - bridgeElem.setAttribute("name", "virbr0") - bridgeElem.setAttribute("stp", "on") - - # build the whole thing - natElem.appendChild(portElem) - forwardElem.appendChild(natElem) - - dhcpElem.appendChild(rangeElem) - ipElem0.appendChild(dhcpElem) - networkElem.appendChild(nameElem) - networkElem.appendChild(uuidElem) - networkElem.appendChild(forwardElem) - networkElem.appendChild(bridgeElem) - networkElem.appendChild(ipElem0) - return networkElem + # create the element + networkElem = dom.createElement("network") + # create element + nameElem = dom.createElement("name") + textName = dom.createTextNode("default") + nameElem.appendChild(textName) + # create element + uuidElem = dom.createElement("uuid") + textUUID = dom.createTextNode(str(uuid.uuid1())) + uuidElem.appendChild(textUUID) + # create element + forwardElem = dom.createElement("forward") + forwardElem.setAttribute("mode", "nat") + # create element + natElem = dom.createElement("nat") + # create element + portElem = dom.createElement("port") + portElem.setAttribute("end", "65535") + portElem.setAttribute("start", "1024") + # create the ipv4 element + ipElem0 = dom.createElement("ip") + ipElem0.setAttribute("address", "192.168.122.1") + ipElem0.setAttribute("netmask", "255.255.255.0") + # create the element + dhcpElem = dom.createElement("dhcp") + # create the element + rangeElem = dom.createElement("range") + rangeElem.setAttribute("end", "192.168.122.254") + rangeElem.setAttribute("start", "192.168.122.2") + # create the element + bridgeElem = dom.createElement("bridge") + bridgeElem.setAttribute("delay", "0") + bridgeElem.setAttribute("name", "virbr0") + bridgeElem.setAttribute("stp", "on") + + # build the whole thing + natElem.appendChild(portElem) + forwardElem.appendChild(natElem) + + dhcpElem.appendChild(rangeElem) + ipElem0.appendChild(dhcpElem) + networkElem.appendChild(nameElem) + networkElem.appendChild(uuidElem) + networkElem.appendChild(forwardElem) + networkElem.appendChild(bridgeElem) + networkElem.appendChild(ipElem0) + return networkElem def checkForIPv6(defaultNetworkConfig): - netnodes = defaultNetworkConfig.getElementsByTagName('network') - hasIPv6 = False - for netnode in netnodes: - ips = netnode.getElementsByTagName('ip') - for ip in ips: - if ip.getAttribute('family')=='ipv6': - logger.log("ipv6: the configuration already have an IPv6 address/prefix set for the slivers! %s/%s" % (ip.getAttribute('address'), ip.getAttribute('prefix')) ) - hasIPv6 = True - return hasIPv6 - + netnodes = defaultNetworkConfig.getElementsByTagName('network') + hasIPv6 = False + for netnode in netnodes: + ips = netnode.getElementsByTagName('ip') + for ip in ips: + if ip.getAttribute('family')=='ipv6': + logger.log("ipv6: IPv6 address/prefix already set for slivers! %s/%s" % \ + (ip.getAttribute('address'), ip.getAttribute('prefix')) ) + hasIPv6 = True + return hasIPv6 def addIPv6(defaultNetworkConfig, ipv6addr, prefix): - netnodes = defaultNetworkConfig.getElementsByTagName('network') - for netnode in netnodes: - # create the ipv6 element 1 - ipElem1 = defaultNetworkConfig.createElement("ip") - ipElem1.setAttribute("family", "ipv6") - ipElem1.setAttribute("address", ipv6addr) - ipElem1.setAttribute("prefix", prefix) - # create the ipv6 element 2 - # it's ugly, I know, but we need a link-local address on the interface! - ipElem2 = defaultNetworkConfig.createElement("ip") - ipElem2.setAttribute("family", "ipv6") - ipElem2.setAttribute("address", "fe80:1234::1") - ipElem2.setAttribute("prefix", "64") - # adding to the 'defaultNetworkConfig' - netnode.appendChild(ipElem1) - netnode.appendChild(ipElem2) - return defaultNetworkConfig + netnodes = defaultNetworkConfig.getElementsByTagName('network') + for netnode in netnodes: + # create the ipv6 element 1 + ipElem1 = defaultNetworkConfig.createElement("ip") + ipElem1.setAttribute("family", "ipv6") + ipElem1.setAttribute("address", ipv6addr) + ipElem1.setAttribute("prefix", prefix) + # create the ipv6 element 2 + # it's ugly, I know, but we need a link-local address on the interface! + ipElem2 = defaultNetworkConfig.createElement("ip") + ipElem2.setAttribute("family", "ipv6") + ipElem2.setAttribute("address", "fe80:1234::1") + ipElem2.setAttribute("prefix", "64") + # adding to the 'defaultNetworkConfig' + netnode.appendChild(ipElem1) + netnode.appendChild(ipElem2) + return defaultNetworkConfig def changeIPv6(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)): - ip.setAttribute("address", ipv6addr) - ip.setAttribute("prefix", prefix) - return dom + ips = dom.getElementsByTagName('ip') + for ip in ips: + if ip.getAttribute("family")=='ipv6' and not(re.match(r'fe80(.*)', ip.getAttribute("address"), re.I)): + ip.setAttribute("address", ipv6addr) + ip.setAttribute("prefix", prefix) + return dom def removeIPv6(dom): - networks = dom.getElementsByTagName('network') - for network in networks: - ips = network.getElementsByTagName('ip') - for ip in ips: - if ip.getAttribute("family")=='ipv6': - network.removeChild(ip) - return dom + networks = dom.getElementsByTagName('network') + for network in networks: + ips = network.getElementsByTagName('ip') + for ip in ips: + if ip.getAttribute("family")=='ipv6': + network.removeChild(ip) + return dom def checkIfIPv6IsDifferent(dom, ipv6addr, prefix): - netnodes = dom.getElementsByTagName('network') - for netnode in netnodes: - ips = netnode.getElementsByTagName('ip') - for ip in ips: - if ip.getAttribute('family')=='ipv6' and not( re.match(r'fe80(.*)', ip.getAttribute("address"), re.I) ) and (ip.getAttribute('address')!=ipv6addr or ip.getAttribute('prefix')!=prefix): - logger.log("ipv6: the IPv6 address or prefix are different. Change detected!") - return True - - return False + netnodes = dom.getElementsByTagName('network') + for netnode in netnodes: + ips = netnode.getElementsByTagName('ip') + for ip in ips: + if ip.getAttribute('family')=='ipv6' and \ + not ( re.match(r'fe80(.*)', ip.getAttribute("address"), re.I) ) and \ + (ip.getAttribute('address')!=ipv6addr or ip.getAttribute('prefix')!=prefix) : + logger.log("ipv6: the IPv6 address or prefix are different. Change detected!") + return True + return False def setAutostart(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): - newXml = networkElem.toxml() - #logger.log(networkElem.toxml()) - #ret = dir(conn) - #for method in ret: - # logger.log(repr(method)) - networkLibvirt.undefine() - networkLibvirt.destroy() - connLibvirt.networkCreateXML(newXml) - networkDefault = connLibvirt.networkDefineXML(newXml) - setAutostart(networkDefault) - commandForwarding = ['sysctl', '-w', 'net.ipv6.conf.all.forwarding=1'] - logger.log_call(commandForwarding, timeout=15*60) - configRadvd = """ + newXml = networkElem.toxml() + #logger.log(networkElem.toxml()) + #ret = dir(conn) + #for method in ret: + # logger.log(repr(method)) + networkLibvirt.undefine() + networkLibvirt.destroy() + connLibvirt.networkCreateXML(newXml) + networkDefault = connLibvirt.networkDefineXML(newXml) + setAutostart(networkDefault) + commandForwarding = ['sysctl', '-w', 'net.ipv6.conf.all.forwarding=1'] + logger.log_call(commandForwarding, timeout=15*60) + configRadvd = """ interface virbr0 { AdvSendAdvert on; MinRtrAdvInterval 30; MaxRtrAdvInterval 100; - prefix %s + prefix %(ipv6addr)s/%(prefix)s { AdvOnLink on; AdvAutonomous on; @@ -171,13 +174,12 @@ interface virbr0 }; }; -""" % (ipv6addr+"/"+prefix) - f=open(radvdConfFile,'w') +""" % locals() + with open(radvdConfFile,'w') as f: f.write(configRadvd) - f.close() - killRadvd() - startRadvd() - logger.log("ipv6: set up process finalized. Enabled IPv6 address to the slivers!") + killRadvd() + startRadvd() + logger.log("ipv6: set up process finalized. Enabled IPv6 address to the slivers!") def cleanUp(networkLibvirt, connLibvirt, networkElem): dom = removeIPv6(networkElem) @@ -196,21 +198,11 @@ def killRadvd(): logger.log_call(commandKillRadvd, timeout=15*60) def startRadvd(): - commandRadvd = ['radvd'] - logger.log_call(commandRadvd, timeout=15*60) + commandRadvd = ['radvd'] + logger.log_call(commandRadvd, timeout=15*60) def GetSlivers(data, config, plc): - #return - #for sliver in data['slivers']: - #ipv6addr,prefixlen = tools.get_sliver_ipv6(sliver['name']) - #tools.add_ipv6addr_hosts_line(sliver['name'], data['hostname'], ipv6addr) - #result = tools.search_ipv6addr_hosts(sliver['name'], ipv6addr) - #logger.log("tools: result=%s" % (str(result)) ) - #tools.remove_all_ipv6addr_hosts(sliver['name'], data['hostname']) - #return - - type = 'sliver.LXC' interfaces = data['interfaces'] @@ -218,56 +210,57 @@ def GetSlivers(data, config, plc): for interface in interfaces: logger.log('ipv6: get interface 1: %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)) + #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: the tag 'sliversipv6prefix' was modified! Updating the configuration with the new one...") - networkElem = changeIPv6(dom, ipv6addr, prefix) - setUp(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix) - 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 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! " + + "Updating configuration with the new one...") + networkElem = changeIPv6(dom, ipv6addr, prefix) + setUp(networkLibvirt, connLibvirt, networkElem, ipv6addr, prefix) + 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') + # 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') logger.log("ipv6: all done!") diff --git a/plugins/update_ipv6addr_slivertag.py b/plugins/update_ipv6addr_slivertag.py index c10c83d..e96bb63 100644 --- a/plugins/update_ipv6addr_slivertag.py +++ b/plugins/update_ipv6addr_slivertag.py @@ -1,3 +1,5 @@ +# -*- python-indent: 4 -*- + """ Description: Update the IPv6 Address sliver tag accordingly to the IPv6 address set update_ipv6addr_slivertag nodemanager plugin @@ -25,15 +27,15 @@ def start(): def getSliverTagId(slivertags): - for slivertag in slivertags: - if slivertag['tagname']==ipv6addrtag: - return slivertag['slice_tag_id'] - return None + for slivertag in slivertags: + if slivertag['tagname']==ipv6addrtag: + return slivertag['slice_tag_id'] + return None def SetSliverTag(plc, data, tagname): for slice in data['slivers']: - logger.log("update_ipv6addr_slivertag: starting the update procedure for slice=%s" % (slice['name']) ) + logger.log("update_ipv6addr_slivertag: starting with slice=%s" % (slice['name']) ) # TODO: what about the prefixlen? should we add on it as well? # here, I'm just taking the ipv6addr (value) @@ -46,39 +48,45 @@ def SetSliverTag(plc, data, tagname): # logger.log(repr(str(tag))) ipv6addr = plc.GetSliceIPv6Address(slice['name']) - logger.log("update_ipv6addr_slivertag: slice=%s getSliceIPv6Address=%s" % (slice['name'],ipv6addr) ) - # if the value to set is null... + logger.log("update_ipv6addr_slivertag: slice=%s getSliceIPv6Address=%s" % \ + (slice['name'],ipv6addr) ) + # if the value to set is null... if value is None: - if ipv6addr is not None: - # then, let's remove the slice tag - slivertag_id = getSliverTagId(slivertags) - if slivertag_id: - try: - plc.DeleteSliceTag(slivertag_id) - logger.log("update_ipv6addr_slivertag: slice tag deleted for slice=%s" % (slice['name']) ) - except: - logger.log("update_ipv6addr_slivertag: slice tag not deleted for slice=%s" % (slice['name']) ) - # if there's no ipv6 address anymore, then remove everything from the /etc/hosts - tools.remove_all_ipv6addr_hosts(slice['name'], data['hostname']) + if ipv6addr is not None: + # then, let's remove the slice tag + slivertag_id = getSliverTagId(slivertags) + if slivertag_id: + try: + plc.DeleteSliceTag(slivertag_id) + logger.log("update_ipv6addr_slivertag: slice tag deleted for slice=%s" % \ + (slice['name']) ) + except: + logger.log("update_ipv6addr_slivertag: slice tag not deleted for slice=%s" % \ + (slice['name']) ) + # if there's no ipv6 address anymore, then remove everything from the /etc/hosts + tools.remove_all_ipv6addr_hosts(slice['name'], data['hostname']) else: - # if the ipv6 addr set on the slice does not exist yet, so, let's add it - if (ipv6addr is None) and len(value)>0: - try: - logger.log("update_ipv6addr_slivertag: slice name=%s" % (slice['name']) ) - slivertag_id=plc.AddSliceTag(slice['name'],tagname,value,node_id) - logger.log("update_ipv6addr_slivertag: slice tag added to slice %s" % (slice['name']) ) - except: - logger.log("update_ipv6addr_slivertag: could not set ipv6 addr tag to the sliver. slice=%s tag=%s node_id=%d" % (slice['name'],tagname,node_id) ) - # if the ipv6 addr set on the slice is different on the value provided, let's update it - if (ipv6addr is not None) and (len(value)>0) and (ipv6addr!=value): - slivertag_id = getSliverTagId(slivertags) - plc.UpdateSliceTag(slivertag_id,value) - # ipv6 entry on /etc/hosts of each slice - result = tools.search_ipv6addr_hosts(slice['name'], value) - if not result: - tools.remove_all_ipv6addr_hosts(slice['name'], data['hostname']) - tools.add_ipv6addr_hosts_line(slice['name'], data['hostname'], value) - logger.log("update_ipv6addr_slivertag: finishing the update process for slice=%s" % (slice['name']) ) + # if the ipv6 addr set on the slice does not exist yet, so, let's add it + if (ipv6addr is None) and len(value)>0: + try: + logger.log("update_ipv6addr_slivertag: slice name=%s" % (slice['name']) ) + slivertag_id=plc.AddSliceTag(slice['name'],tagname,value,node_id) + logger.log("update_ipv6addr_slivertag: slice tag added to slice %s" % \ + (slice['name']) ) + except: + logger.log("update_ipv6addr_slivertag: could not set ipv6 addr tag to sliver. "+ + "slice=%s tag=%s node_id=%d" % (slice['name'],tagname,node_id) ) + # if the ipv6 addr set on the slice is different on the value provided, let's update it + if (ipv6addr is not None) and (len(value)>0) and (ipv6addr!=value): + slivertag_id = getSliverTagId(slivertags) + plc.UpdateSliceTag(slivertag_id,value) + # ipv6 entry on /etc/hosts of each slice + result = tools.search_ipv6addr_hosts(slice['name'], value) + if not result: + tools.remove_all_ipv6addr_hosts(slice['name'], data['hostname']) + tools.add_ipv6addr_hosts_line(slice['name'], data['hostname'], value) + logger.log("update_ipv6addr_slivertag: finishing the update process for " + + "slice=%s" % (slice['name']) ) def GetSlivers(data, config, plc): diff --git a/tools.py b/tools.py index a0da5d2..d1bbbfd 100644 --- a/tools.py +++ b/tools.py @@ -1,3 +1,5 @@ +# -*- python-indent: 4 -*- + """A few things that didn't seem to fit anywhere else.""" import os, os.path @@ -11,24 +13,6 @@ import shutil import sys import signal -################################################### -# Added by Guilherme Sperb Machado -################################################### - -import re -import socket -import fileinput - -# TODO: is there anything better to do if the "libvirt", "sliver_libvirt", -# and "sliver_lxc" are not in place? -try: - import libvirt - from sliver_libvirt import Sliver_Libvirt - import sliver_lxc -except: - logger.log("Could not import sliver_lxc or libvirt or sliver_libvirt -- which is required here.") -################################################### - import logger PID_FILE = '/var/run/nodemanager.pid' @@ -87,7 +71,14 @@ def daemon(): os.dup2(crashlog, 2) 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 with arguments in the grandchild process. If is not None, set our group and user ids appropriately in the child 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 +with arguments in the grandchild process. +If is not None, set our group and user ids + appropriately in the child process. + """ child_pid = os.fork() if child_pid == 0: try: @@ -109,9 +100,11 @@ def fork_as(su, function, *args): #################### # manage files def pid_file(): - """We use a pid file to ensure that only one copy of NM is running at a given time. + """ +We use a pid file to ensure that only one copy of NM is running at a given time. If successful, this function will write a pid file containing the pid of the current process. -The return value is the pid of the other running process, or None otherwise.""" +The return value is the pid of the other running process, or None otherwise. + """ other_pid = None if os.access(PID_FILE, os.F_OK): # check for a pid file handle = open(PID_FILE) # pid file exists, read it @@ -128,7 +121,10 @@ The return value is the pid of the other running process, or None otherwise.""" return other_pid def write_file(filename, do_write, **kw_args): - """Write file atomically by opening a temporary file, using to write that file, and then renaming the temporary file.""" + """ +Write file atomically by opening a temporary file, +using to write that file, and then renaming the temporary file. + """ shutil.move(write_temp_file(do_write, **kw_args), filename) def write_temp_file(do_write, mode=None, uidgid=None): @@ -140,13 +136,16 @@ def write_temp_file(do_write, mode=None, uidgid=None): finally: f.close() return temporary_filename -# replace a target file with a new contents - checks for changes -# can handle chmod if requested -# can also remove resulting file if contents are void, if requested -# performs atomically: -# writes in a tmp file, which is then renamed (from sliverauth originally) -# returns True if a change occurred, or the file is deleted 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 +can handle chmod if requested +can also remove resulting file if contents are void, if requested +performs atomically: +writes in a tmp file, which is then renamed (from sliverauth originally) +returns True if a change occurred, or the file is deleted + """ try: current=file(target).read() except: @@ -170,7 +169,6 @@ def replace_file_with_string (target, new_contents, chmod=None, remove_if_empty= if chmod: os.chmod(target,chmod) return True - #################### # utilities functions to get (cached) information from the node @@ -255,10 +253,28 @@ def get_sliver_process(slice_name, process_cmdline): return (cgroup_fn, pid) +################################################### +# Added by Guilherme Sperb Machado +################################################### + +import re +import socket +import fileinput + +# TODO: is there anything better to do if the "libvirt", "sliver_libvirt", +# and "sliver_lxc" are not in place? +try: + import libvirt + from sliver_libvirt import Sliver_Libvirt + import sliver_lxc +except: + logger.log("Could not import sliver_lxc or libvirt or sliver_libvirt -- which is required here.") +################################################### + ################################################### # Author: Guilherme Sperb Machado ################################################### -# Basically this method is just a copy from "get_process()", just +# Basically this method is just a copy from "get_sliver_process()", just # adding one more split() to correctly parse the processes for LXC. # Only for LXC! # TODO: maybe merge both methods, and put the type as an argument, if @@ -282,29 +298,29 @@ def get_sliver_process_lxc(slice_name, process_cmdline): pid = None for e in output: try: - l = e.rstrip() - #logger.log("tools: l=%s" % (l) ) - path = l.split(':')[0] - #logger.log("tools: path=%s" % (path) ) - comp = l.rsplit(':')[-1] - #logger.log("tools: comp=%s" % (comp) ) - slice_name_check1 = comp.rsplit('/')[-1] - #logger.log("tools: slice_name_check1=%s" % (slice_name_check1) ) - slice_name_check2 = slice_name_check1.rsplit('.')[0] - #logger.log("tools: slice_name_check2=%s" % (slice_name_check2) ) + l = e.rstrip() + #logger.log("tools: l=%s" % (l) ) + path = l.split(':')[0] + #logger.log("tools: path=%s" % (path) ) + comp = l.rsplit(':')[-1] + #logger.log("tools: comp=%s" % (comp) ) + slice_name_check1 = comp.rsplit('/')[-1] + #logger.log("tools: slice_name_check1=%s" % (slice_name_check1) ) + slice_name_check2 = slice_name_check1.rsplit('.')[0] + #logger.log("tools: slice_name_check2=%s" % (slice_name_check2) ) if (slice_name_check2 == slice_name): - slice_path = path - pid = slice_path.split('/')[2] - #logger.log("tools: pid=%s" % (pid) ) - cmdline = open('/proc/%s/cmdline'%pid).read().rstrip('\n\x00') - #logger.log("tools: cmdline=%s" % (cmdline) ) - #logger.log("tools: process_cmdline=%s" % (process_cmdline) ) - if (cmdline == process_cmdline): - cgroup_fn = slice_path - break + slice_path = path + pid = slice_path.split('/')[2] + #logger.log("tools: pid=%s" % (pid) ) + cmdline = open('/proc/%s/cmdline'%pid).read().rstrip('\n\x00') + #logger.log("tools: cmdline=%s" % (cmdline) ) + #logger.log("tools: process_cmdline=%s" % (process_cmdline) ) + if (cmdline == process_cmdline): + cgroup_fn = slice_path + break except: - #logger.log("tools: break!") + #logger.log("tools: break!") break if (not cgroup_fn) or (not pid): @@ -430,11 +446,11 @@ def get_sliver_ipv6(slice_name): # example: 'inet6 2001:67c:16dc:1302:5054:ff:fea7:7882 prefixlen 64 scopeid 0x0' prog = re.compile(r'inet6\s+(.*)\s+prefixlen\s+(\d+)\s+scopeid\s+(.+)') for line in ifconfig.split("\n"): - search = prog.search(line) - if search: - ipv6addr = search.group(1) - prefixlen = search.group(2) - return (ipv6addr,prefixlen) + search = prog.search(line) + if search: + ipv6addr = search.group(1) + prefixlen = search.group(2) + return (ipv6addr,prefixlen) return None,None ################################################### @@ -443,11 +459,11 @@ def get_sliver_ipv6(slice_name): # Check if the address is a AF_INET6 family address ################################################### def isValidIPv6(ipv6addr): - try: - socket.inet_pton(socket.AF_INET6, ipv6addr) - except socket.error: - return False - return True + try: + socket.inet_pton(socket.AF_INET6, ipv6addr) + except socket.error: + return False + return True ### this returns the kind of virtualization on the node # either 'vs' or 'lxc' @@ -485,22 +501,22 @@ def has_systemctl (): # Only for LXC! ################################################### def reboot_sliver(name): - 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()) ) - domain.create() - logger.log("tools: %s created" % (domain.name()) ) - except: - logger.log("tools: %s could not be rebooted" % (domain.name()) ) + 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()) ) + domain.create() + logger.log("tools: %s created" % (domain.name()) ) + except: + logger.log("tools: %s could not be rebooted" % (domain.name()) ) ################################################### # Author: Guilherme Sperb Machado @@ -521,11 +537,11 @@ def search_ipv6addr_hosts(slicename, ipv6addr): hostsFilePath = get_hosts_file_path(slicename) found=False try: - for line in fileinput.input(r'%s' % (hostsFilePath)): - if re.search(r'%s' % (ipv6addr), line): - found=True - fileinput.close() - return found + for line in fileinput.input(r'%s' % (hostsFilePath)): + if re.search(r'%s' % (ipv6addr), line): + found=True + fileinput.close() + return found except: logger.log("tools: error when finding ipv6 address %s in the /etc/hosts file of slice=%s" % (ipv6addr, slicename) ) @@ -537,20 +553,20 @@ def search_ipv6addr_hosts(slicename, ipv6addr): def remove_all_ipv6addr_hosts(slicename, node): hostsFilePath = get_hosts_file_path(slicename) try: - for line in fileinput.input(r'%s' % (hostsFilePath), inplace=True): - logger.log("tools: line=%s" % (line) ) - search = re.search(r'^(.*)\s+(%s|%s)$' % (node,'localhost'), line) - if search: - ipv6candidate = search.group(1) - ipv6candidatestrip = ipv6candidate.strip() - logger.log("tools: group1=%s" % (ipv6candidatestrip) ) - valid = isValidIPv6(ipv6candidatestrip) - if not valid: - logger.log("tools: address=%s not valid" % (ipv6candidatestrip) ) - print line, - fileinput.close() + for line in fileinput.input(r'%s' % (hostsFilePath), inplace=True): + logger.log("tools: line=%s" % (line) ) + search = re.search(r'^(.*)\s+(%s|%s)$' % (node,'localhost'), line) + if search: + ipv6candidate = search.group(1) + ipv6candidatestrip = ipv6candidate.strip() + logger.log("tools: group1=%s" % (ipv6candidatestrip) ) + valid = isValidIPv6(ipv6candidatestrip) + if not valid: + logger.log("tools: address=%s not valid" % (ipv6candidatestrip) ) + print line, + fileinput.close() except: - logger.log("tools: could not delete the ipv6 address from the hosts file of slice=%s" % (slicename) ) + logger.log("tools: could not delete the ipv6 address from the hosts file of slice=%s" % (slicename) ) ################################################### # Author: Guilherme Sperb Machado @@ -564,13 +580,13 @@ def add_ipv6addr_hosts_line(slicename, node, ipv6addr): #string = "127.0.0.1\tlocalhost\n192.168.100.179\tmyplc-node1-vm.mgmt.local\n" #string = "127.0.0.1\tlocalhost\n" try: - with open(hostsFilePath, "a") as file: - # debugging purposes only: - #file.write(string) - file.write(ipv6addr + " " + node + "\n") - file.close() + with open(hostsFilePath, "a") as file: + # debugging purposes only: + #file.write(string) + file.write(ipv6addr + " " + node + "\n") + file.close() except: - logger.log("tools: could not add the IPv6 address to the hosts file of slice=%s" % (slicename) ) + logger.log("tools: could not add the IPv6 address to the hosts file of slice=%s" % (slicename) )