X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plnet.py;h=5b0c667256a1a70c52b438f734d7ae086770411f;hb=0603f3a71d3d109372b116ab2e443d283203f719;hp=dfb7fb69f71ac522763664abdcefb149bcaa73a6;hpb=bd8f483c4f4bc66f57ef201fc14510aacfde247c;p=pyplnet.git diff --git a/plnet.py b/plnet.py old mode 100644 new mode 100755 index dfb7fb6..5b0c667 --- a/plnet.py +++ b/plnet.py @@ -1,15 +1,27 @@ +#!/usr/bin/python /usr/bin/plcsh # $Id$ import os import socket import time import tempfile +import errno import sioc import modprobe -def InitInterfaces(logger, plc, data, root="", files_only=False): +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() @@ -22,6 +34,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): interfaces = {} interface = 1 hostname = data.get('hostname',socket.gethostname()) + gateway = None networks = data['networks'] failedToGetSettings = False for network in networks: @@ -47,14 +60,21 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): inter['USERCTL']='no' if network['mac']: inter['HWADDR'] = network['mac'] + if network['is_primary']: + inter['PRIMARY']='yes' if network['method'] == "static": 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" + inter['PERSISTENT_DHCLIENT'] = "yes" if network['hostname']: inter['DHCP_HOSTNAME'] = network['hostname'] else: @@ -62,10 +82,25 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): 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']) @@ -74,11 +109,15 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): 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'] 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: @@ -125,7 +164,10 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): interfaces[ifname] = inter m = modprobe.Modprobe() - m.input("%s/etc/modprobe.conf" % root) + try: + m.input("%s/etc/modprobe.conf" % root) + except: + pass for (dev, inter) in interfaces.iteritems(): # get the driver string "moduleName option1=a option2=b" driver=inter.get('DRIVER','') @@ -136,7 +178,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): 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 @@ -166,8 +208,9 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): for ifcfg in ifcfgs: dev = ifcfg[len('ifcfg-'):] path = "%s/ifcfg-%s" % (sysconfig,dev) - logger.verbose("net:InitInterfaces removing %s %s"%(dev,path)) - os.system("/sbin/ifdown %s" % dev) + if not files_only: + logger.verbose("net:InitInterfaces removing %s %s"%(dev,path)) + os.system("/sbin/ifdown %s" % dev) deletedSomething=True os.unlink(path) @@ -175,20 +218,27 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): 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: @@ -230,11 +280,12 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): elif not comparefiles(tmpnam,path): logger.verbose('net:InitInterfaces Configuration change for %s' % dev) - logger.verbose('net:InitInterfaces ifdown %s' % dev) - # invoke ifdown for the old configuration - os.system("/sbin/ifdown %s" % dev) - # wait a few secs for ifdown to complete - time.sleep(2) + if not files_only: + logger.verbose('net:InitInterfaces ifdown %s' % dev) + # invoke ifdown for the old configuration + os.system("/sbin/ifdown %s" % dev) + # wait a few secs for ifdown to complete + time.sleep(2) logger.log('replacing configuration for %s' % dev) # replace ifcfg-$dev configuration file @@ -275,6 +326,44 @@ def InitInterfaces(logger, plc, data, root="", files_only=False): # handle those correctly if getvar("SLAVE") == 'yes': continue - logger.verbose('net:InitInterfaces bringing up %s' % dev) - os.system("/sbin/ifup %s" % dev) - + if not files_only: + logger.verbose('net:InitInterfaces bringing up %s' % dev) + os.system("/sbin/ifup %s" % dev) + +if __name__ == "__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") + (options, args) = parser.parse_args() + if len(args) != 1 or options.root is None: + print >>sys.stderr, "Missing root or node_id" + parser.print_help() + sys.exit(1) + + node = shell.GetNodes({'node_id': [int(args[0])]}) + 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: + def __init__(self, verbose): + self.verbosity = verbose + def log(self, msg, loglevel=2): + if self.verbosity: + print msg + def verbose(self, msg): + self.log(msg, 1) + l = logger(options.verbose) + InitInterfaces(l, shell, data, options.root, options.files_only)