X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plnet.py;h=84b0791102046c1b719f5b312626669452702233;hb=96f5dad22708ec95d4dacbf6f477c32a785b0b7c;hp=151cd2fdce7d5606fbb9d2db16f3270f2b55e14a;hpb=7e556f4fb8b3725244dde308ed0ed77f34966236;p=pyplnet.git diff --git a/plnet.py b/plnet.py index 151cd2f..84b0791 100755 --- a/plnet.py +++ b/plnet.py @@ -5,12 +5,23 @@ import os import socket import time import tempfile +import errno import sioc import modprobe +global version +version = 4.3 + def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeManager"): + global version + sysconfig = "%s/etc/sysconfig/network-scripts" % root + try: + os.makedirs(sysconfig) + except OSError, e: + if e.errno != errno.EEXIST: + raise e # query running network interfaces devs = sioc.gifconf() @@ -23,8 +34,27 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa interfaces = {} interface = 1 hostname = data.get('hostname',socket.gethostname()) + gateway = None networks = data['networks'] failedToGetSettings = False + + # NOTE: GetInterfaces/NodeNetworks 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%s" % interface, 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. + networks.sort( compare_by('is_primary') ) + networks.reverse() + for network in networks: logger.verbose('net:InitInterfaces interface %d: %s'%(interface,network)) logger.verbose('net:InitInterfaces macs = %s' % macs) @@ -55,6 +85,10 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa inter['BOOTPROTO'] = "static" inter['IPADDR'] = network['ip'] inter['NETMASK'] = network['netmask'] + inter['DNS1'] = network['dns1'] + inter['DNS2'] = network['dns2'] + if network['is_primary']: + gateway = network['gateway'] elif network['method'] == "dhcp": inter['BOOTPROTO'] = "dhcp" @@ -66,10 +100,25 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa if not network['is_primary']: inter['DHCLIENTARGS'] = "-R subnet-mask" - if len(network['interface_tag_ids']) > 0: + try: + plc.GetInterfaceTags() + version = 4.3 + except AttributeError: + version = 4.2 + + if version == 4.3: + interface_tag_ids = "interface_tag_ids" + interface_tag_id = "interface_tag_id" + else: + interface_tag_ids = "nodenetwork_setting_ids" + interface_tag_id = "nodenetwork_setting_id" + + if len(network[interface_tag_ids]) > 0: try: - settings = plc.GetInterfaceTags({'interface_tag_id': - network['interface_tag_ids']}) + if version == 4.3: + settings = plc.GetInterfaceTags({interface_tag_id:network[interface_tag_ids]}) + else: + settings = plc.GetNodeNetworkSettings({interface_tag_id:network[interface_tag_ids]}) except: logger.log("net:InitInterfaces FATAL: failed call GetInterfaceTags({'interface_tag_id':{%s})"% \ network['interface_tag_ids']) @@ -78,11 +127,22 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa for setting in settings: # to explicitly set interface name - settingname = setting['name'].upper() + name_key = "name" + if version == 4.3: + name_key = "tagname" + + settingname = setting[name_key].upper() if settingname in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER'): inter[settingname]=setting['value'] + # wireless settings + elif settingname in \ + [ "MODE", "ESSID", "NW", "FREQ", "CHANNEL", "SENS", "RATE", + "KEY", "KEY1", "KEY2", "KEY3", "KEY4", "SECURITYMODE", + "IWCONFIG", "IWPRIV" ] : + inter [settingname] = setting['value'] + inter ['TYPE']='Wireless' else: - logger.log("net:InitInterfaces WARNING: ignored setting named %s"%setting['name']) + logger.log("net:InitInterfaces WARNING: ignored setting named %s"%setting[name_key]) # support aliases to interfaces either by name or HWADDR if 'ALIAS' in inter: @@ -130,7 +190,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa m = modprobe.Modprobe() try: - m.input("%s/etc/modprobe.conf" % root, program) + m.input("%s/etc/modprobe.conf" % root) except: pass for (dev, inter) in interfaces.iteritems(): @@ -143,7 +203,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa options=" ".join(driver[1:]) if options <> '': m.optionsset(dev,options) - m.output("%s/etc/modprobe.conf" % root) + m.output("%s/etc/modprobe.conf" % root, program) # clean up after any ifcfg-$dev script that's no longer listed as # part of the NodeNetworks associated with this node @@ -183,20 +243,27 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa if deletedSomething: time.sleep(2) - # Process ifcg-$dev changes / additions + # Write network configuration file + networkconf = file("%s/etc/sysconfig/network" % root, "w") + networkconf.write("NETWORKING=yes\nHOSTNAME=%s\n" % hostname) + if gateway is not None: + networkconf.write("GATEWAY=%s\n" % gateway) + networkconf.close() + + # Process ifcfg-$dev changes / additions newdevs = [] for (dev, inter) in interfaces.iteritems(): (fd, tmpnam) = tempfile.mkstemp(dir=sysconfig) f = os.fdopen(fd, "w") - f.write("# Autogenerated by NodeManager/net.py.... do not edit!\n") + f.write("# Autogenerated by pyplnet... do not edit!\n") if 'DRIVER' in inter: f.write("# using %s driver for device %s\n" % (inter['DRIVER'],dev)) - f.write('DEVICE="%s"\n' % dev) + f.write('DEVICE=%s\n' % dev) # print the configuration values for (key, val) in inter.iteritems(): if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER'): - f.write('%s="%s"\n' % (key, val)) + f.write('%s=%s\n' % (key, val)) # print the configuration specific option values (if any) if 'CFGOPTIONS' in inter: @@ -307,7 +374,12 @@ if __name__ == "__main__": sys.exit(1) node = shell.GetNodes({'node_id': [int(args[0])]}) - networks = shell.GetInterfaces({'interface_id': node[0]['interface_ids']}) + try: + networks = shell.GetInterfaces({'interface_id': node[0]['interface_ids']}) + except AttributeError: + networks = shell.GetNodeNetworks({'nodenetwork_id':node[0]['nodenetwork_ids']}) + version = 4.2 + data = {'hostname': node[0]['hostname'], 'networks': networks} class logger: