X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plnet.py;h=782494aabc5886bc279216b41e2415e778518909;hb=refs%2Fheads%2Fmaster;hp=40d18622991b21cba196c8d21b35814a5bfc75c7;hpb=6db3e22f109d1f9d2f095f5250c2daa0bd4a4ddf;p=pyplnet.git diff --git a/plnet.py b/plnet.py index 40d1862..782494a 100755 --- a/plnet.py +++ b/plnet.py @@ -1,4 +1,6 @@ -#!/usr/bin/python /usr/bin/plcsh +#!/usr/bin/python3 /usr/bin/plcsh + +# pylint: disable=c0111, c0103, r0912, r0913, r0914, r0915 import os import socket @@ -11,26 +13,23 @@ import re import sioc import modprobe -global version -version = 4.3 - def ovs_check(logger): """ Return True if openvswitch is running, False otherwise. Try restarting it once. """ - rc = os.system("service openvswitch status") - if rc == 0: + retcod = os.system("service openvswitch status") + if retcod == 0: return True logger.log("net: restarting openvswitch") - rc = os.system("service openvswitch restart") - rc = os.system("service openvswitch status") - if rc == 0: + retcod = os.system("service openvswitch restart") + retcod = os.system("service openvswitch status") + if retcod == 0: return True logger.log("net: failed to restart openvswitch") return False -def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeManager"): - global version +def InitInterfaces(logger, plc, data, root="", + files_only=False, program="NodeManager"): sysconfig = "{}/etc/sysconfig/network-scripts".format(root) try: @@ -41,39 +40,29 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa # query running network interfaces devs = sioc.gifconf() - ips = dict(list(zip(list(devs.values()), list(devs.keys())))) + ips = {ip: interface for (ip, interface) in devs.items()} macs = {} for dev in devs: macs[sioc.gifhwaddr(dev).lower()] = dev devices_map = {} device_id = 1 - hostname = data.get('hostname',socket.gethostname()) + hostname = data.get('hostname', socket.gethostname()) gateway = None # assume data['interfaces'] contains this node's Interfaces - # can cope with 4.3 ('networks') or 5.0 ('interfaces') - try: - interfaces = data['interfaces'] - except: - interfaces = data['networks'] + interfaces = data['interfaces'] failedToGetSettings = False - # NOTE: GetInterfaces/NodeNetworks does not necessarily order the interfaces - # returned. Because 'interface' is decremented as each interface is processed, + # NOTE: GetInterfaces does not necessarily order the interfaces returned. + # Because 'interface' is decremented as each interface is processed, # by the time is_primary=True (primary) interface is reached, the device # "eth" is not eth0. But, something like eth-4, or eth-12. # This code sorts the interfaces, placing is_primary=True interfaces first. # There is a lot of room for improvement to how this # script handles interfaces and how it chooses the primary interface. - def compare_by (fieldname): - def compare_two_dicts (a, b): - return cmp(a[fieldname], b[fieldname]) - return compare_two_dicts - # NOTE: by sorting on 'is_primary' and then reversing (since False is sorted # before True) all 'is_primary' interfaces are at the beginning of the list. - interfaces.sort( compare_by('is_primary') ) - interfaces.reverse() + interfaces.sort(key=lambda d: d['is_primary'], reverse=True) # The names of the bridge devices bridgeDevices = [] @@ -84,8 +73,9 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa logger.verbose('net:InitInterfaces ips = {}'.format(ips)) # Get interface name preferably from MAC address, falling back # on IP address. - hwaddr=interface['mac'] - if hwaddr != None: hwaddr=hwaddr.lower() + hwaddr = interface['mac'] + if hwaddr is not None: + hwaddr = hwaddr.lower() if hwaddr in macs: orig_ifname = macs[hwaddr] elif interface['ip'] in ips: @@ -102,51 +92,44 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa gateway = interface['gateway'] if 'interface_tag_ids' in interface: - version = 4.3 interface_tag_ids = "interface_tag_ids" interface_tag_id = "interface_tag_id" name_key = "tagname" - else: - version = 4.2 - interface_tag_ids = "nodenetwork_setting_ids" - interface_tag_id = "nodenetwork_setting_id" - name_key = "name" - if len(interface[interface_tag_ids]) > 0: + if interface[interface_tag_ids]: + filter = {interface_tag_id : interface[interface_tag_ids]} try: - filter = { interface_tag_id : interface[interface_tag_ids] } - if version == 4.3: - settings = plc.GetInterfaceTags(filter) - else: - settings = plc.GetNodeNetworkSettings(filter) - except: - logger.log("net:InitInterfaces FATAL: failed call GetInterfaceTags({})" - .format(filter)) + settings = plc.GetInterfaceTags(filter) + except Exception: + logger.log("net:InitInterfaces FATAL: failed call " + "GetInterfaceTags({})".format(filter)) failedToGetSettings = True continue # on to the next interface for setting in settings: settingname = setting[name_key].upper() - if ((settingname in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER','VLAN','TYPE','DEVICETYPE')) or \ - (re.search('^IPADDR[0-9]+$|^NETMASK[0-9]+$', settingname))): + if (settingname in ('IFNAME', 'ALIAS', 'CFGOPTIONS', 'DRIVER', + 'VLAN', 'TYPE', 'DEVICETYPE') or + re.search('^IPADDR[0-9]+$|^NETMASK[0-9]+$', settingname)): # TD: Added match for secondary IPv4 configuration. - details[settingname]=setting['value'] + details[settingname] = setting['value'] # IPv6 support on IPv4 interface - elif settingname in ('IPV6ADDR','IPV6_DEFAULTGW','IPV6ADDR_SECONDARIES', 'IPV6_AUTOCONF'): + elif settingname in ('IPV6ADDR', 'IPV6_DEFAULTGW', + 'IPV6ADDR_SECONDARIES', 'IPV6_AUTOCONF'): # TD: Added IPV6_AUTOCONF. - details[settingname]=setting['value'] - details['IPV6INIT']='yes' + details[settingname] = setting['value'] + details['IPV6INIT'] = 'yes' # wireless settings elif settingname in \ - [ "MODE", "ESSID", "NW", "FREQ", "CHANNEL", "SENS", "RATE", - "KEY", "KEY1", "KEY2", "KEY3", "KEY4", "SECURITYMODE", - "IWCONFIG", "IWPRIV" ] : - details [settingname] = setting['value'] - details ['TYPE']='Wireless' + ("MODE", "ESSID", "NW", "FREQ", "CHANNEL", "SENS", + "RATE", "KEY", "KEY1", "KEY2", "KEY3", "KEY4", + "SECURITYMODE", "IWCONFIG", "IWPRIV"): + details[settingname] = setting['value'] + details['TYPE'] = 'Wireless' # Bridge setting - elif settingname in [ 'BRIDGE' ]: + elif settingname in ('BRIDGE',): details['BRIDGE'] = setting['value'] - elif settingname in [ 'OVS_BRIDGE' ]: + elif settingname in ('OVS_BRIDGE',): # If openvswitch isn't running, then we'll lose network # connectivity when we reconfigure eth0. if ovs_check(logger): @@ -154,7 +137,8 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa details['TYPE'] = "OVSPort" details['DEVICETYPE'] = "ovs" else: - logger.log("net:InitInterfaces ERROR: OVS_BRIDGE specified, yet ovs is not running") + logger.log("net:InitInterfaces ERROR: OVS_BRIDGE specified, " + "yet ovs is not running") else: logger.log("net:InitInterfaces WARNING: ignored setting named {}" .format(setting[name_key])) @@ -185,10 +169,12 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa if isValid: devices_map["{}:{}".format(details['IFNAME'], details['ALIAS'])] = details else: - logger.log("net:InitInterfaces WARNING: interface alias ({}) not a valid string for RH ifup-aliases" + logger.log("net:InitInterfaces WARNING: interface alias ({}) " + "is not a valid string for RH ifup-aliases" .format(details['ALIAS'])) else: - logger.log("net:InitInterfaces WARNING: interface alias ({}) not matched to an interface" + logger.log("net:InitInterfaces WARNING: interface alias ({}) " + " not matched to an interface" .format(details['ALIAS'])) device_id -= 1 elif ('BRIDGE' in details or 'OVS_BRIDGE' in details) and 'IFNAME' in details: @@ -210,13 +196,10 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa bridgeDetails = prepDetails(interface) # TD: Add configuration for secondary IPv4 and IPv6 addresses to the bridge. - if len(interface[interface_tag_ids]) > 0: - filter = { interface_tag_id : interface[interface_tag_ids] } + if interface[interface_tag_ids]: + filter = {interface_tag_id : interface[interface_tag_ids]} try: - if version == 4.3: - settings = plc.GetInterfaceTags(filter) - else: - settings = plc.GetNodeNetworkSettings(filter) + settings = plc.GetInterfaceTags(filter) except: logger.log("net:InitInterfaces FATAL: failed call GetInterfaceTags({})" .format(filter)) @@ -229,10 +212,11 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa # TD: Added match for secondary IPv4 configuration. bridgeDetails[settingname]=setting['value'] # IPv6 support on IPv4 interface - elif settingname in ('IPV6ADDR','IPV6_DEFAULTGW','IPV6ADDR_SECONDARIES', 'IPV6_AUTOCONF'): + elif settingname in ('IPV6ADDR', 'IPV6_DEFAULTGW', + 'IPV6ADDR_SECONDARIES', 'IPV6_AUTOCONF'): # TD: Added IPV6_AUTOCONF. - bridgeDetails[settingname]=setting['value'] - bridgeDetails['IPV6INIT']='yes' + bridgeDetails[settingname] = setting['value'] + bridgeDetails['IPV6INIT'] = 'yes' bridgeDevices.append(bridgeName) bridgeDetails['TYPE'] = bridgeType @@ -252,7 +236,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa device_id -= 1 else: while True: - ifname="eth{}".format(device_id - 1) + ifname = "eth{}".format(device_id - 1) if ifname not in devices_map: break device_id += 1 @@ -269,14 +253,14 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa pass for (dev, details) in devices_map.items(): # get the driver string "moduleName option1=a option2=b" - driver=details.get('DRIVER','') + driver = details.get('DRIVER', '') if driver != '': - driver=driver.split() - kernelmodule=driver[0] - m.aliasset(dev,kernelmodule) - options=" ".join(driver[1:]) + driver = driver.split() + kernelmodule = driver[0] + m.aliasset(dev, kernelmodule) + options = " ".join(driver[1:]) if options != '': - m.optionsset(dev,options) + m.optionsset(dev, options) m.output("{}/etc/modprobe.conf".format(root), program) # clean up after any ifcfg-$dev script that's no longer listed as @@ -286,19 +270,21 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa files = os.listdir(sysconfig) # filter out the ifcfg-* files - ifcfgs=[] + ifcfgs = [] for f in files: if f.find("ifcfg-") == 0: ifcfgs.append(f) # remove loopback (lo) from ifcfgs list lo = "ifcfg-lo" - if lo in ifcfgs: ifcfgs.remove(lo) + if lo in ifcfgs: + ifcfgs.remove(lo) # remove known devices from ifcfgs list for (dev, details) in devices_map.items(): ifcfg = 'ifcfg-'+dev - if ifcfg in ifcfgs: ifcfgs.remove(ifcfg) + if ifcfg in ifcfgs: + ifcfgs.remove(ifcfg) # delete the remaining ifcfgs from deletedSomething = False @@ -336,7 +322,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa # print the configuration values for (key, val) in details.items(): - if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER','GATEWAY'): + if key not in ('IFNAME', 'ALIAS', 'CFGOPTIONS', 'DRIVER', 'GATEWAY'): f.write('{}="{}"\n'.format(key, val)) # print the configuration specific option values (if any) @@ -420,8 +406,8 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa logger.log('replacing configuration for {}'.format(dev)) # replace ifcfg-$dev configuration file - os.rename(tmpnam,path) - os.chmod(path,0o644) + os.rename(tmpnam, path) + os.chmod(path, 0o644) newdevs.append(dev) else: # tmpnam & path are identical @@ -429,22 +415,23 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa for dev in newdevs: cfgvariables = {} - with file("{}/ifcfg-{}".format(sysconfig, dev), "r") as fb: + with open("{}/ifcfg-{}".format(sysconfig, dev), "r") as fb: for line in fb.readlines(): parts = line.split() - if parts[0][0]=="#":continue + if parts[0][0] == "#": + continue if parts[0].find('='): - name,value = parts[0].split('=') + name, value = parts[0].split('=') # clean up name & value name = name.strip() value = value.strip() value = value.strip("'") value = value.strip('"') - cfgvariables[name]=value + cfgvariables[name] = value def getvar(name): if name in cfgvariables: - value=cfgvariables[name] + value = cfgvariables[name] value = value.lower() return value return '' @@ -530,31 +517,31 @@ def removeBridgedIfaceDetails(details): return details -if __name__ == "__main__": +def main(): import optparse import sys - parser = optparse.OptionParser(usage="plnet [-v] [-f] [-p ] -r root node_id") - parser.add_option("-v", "--verbose", action="store_true", dest="verbose") - parser.add_option("-r", "--root", action="store", type="string", - dest="root", default=None) - parser.add_option("-f", "--files-only", action="store_true", - dest="files_only") - parser.add_option("-p", "--program", action="store", type="string", - dest="program", default="plnet") + usage = "plnet [-v] [-f] [-p ] -r root node_id" + + parser = optparse.OptionParser(usage=usage) + parser.add_option( + "-r", "--root", action="store", type="string", + dest="root", default=None) + parser.add_option( + "-v", "--verbose", action="store_true", dest="verbose") + parser.add_option( + "-f", "--files-only", action="store_true", + dest="files_only") + parser.add_option( + "-p", "--program", action="store", type="string", + dest="program", default="plnet") (options, args) = parser.parse_args() if len(args) != 1 or options.root is None: - print(sys.argv) - print("Missing root or node_id", file=sys.stderr) parser.print_help() sys.exit(1) node = shell.GetNodes({'node_id': [int(args[0])]}) - try: - interfaces = shell.GetInterfaces({'interface_id': node[0]['interface_ids']}) - except AttributeError: - interfaces = shell.GetNodeNetworks({'nodenetwork_id':node[0]['nodenetwork_ids']}) - version = 4.2 + interfaces = shell.GetInterfaces({'interface_id': node[0]['interface_ids']}) data = {'hostname': node[0]['hostname'], 'interfaces': interfaces} @@ -568,3 +555,6 @@ if __name__ == "__main__": self.log(msg, 1) l = logger(options.verbose) InitInterfaces(l, shell, data, options.root, options.files_only) + +if __name__ == "__main__": + main()