X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plnet.py;h=129e5bad09438c5da7351395403ae57b6f16ddfc;hb=b6b71094bb22b2ae358fb6e65396df9b151c3cdc;hp=b79f916158a45398f4dfafd4478b192e3ebb27c3;hpb=6d94bf40c5701a93b1c106818188dde351f4833f;p=pyplnet.git diff --git a/plnet.py b/plnet.py index b79f916..129e5ba 100755 --- a/plnet.py +++ b/plnet.py @@ -1,11 +1,11 @@ #!/usr/bin/python /usr/bin/plcsh -# $Id$ import os import socket import time import tempfile import errno +import struct import sioc import modprobe @@ -43,7 +43,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa failedToGetSettings = False # NOTE: GetInterfaces/NodeNetworks does not necessarily order the interfaces - # returned. Because 'interface'is decremented as each interface is processed, + # 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. @@ -89,6 +89,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa details['BOOTPROTO'] = "static" details['IPADDR'] = interface['ip'] details['NETMASK'] = interface['netmask'] + details['GATEWAY'] = interface['gateway'] if interface['is_primary']: gateway = interface['gateway'] if interface['dns1']: @@ -264,8 +265,8 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa # print the configuration values for (key, val) in details.iteritems(): - if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER'): - f.write('%s=%s\n' % (key, val)) + if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER','GATEWAY'): + f.write('%s="%s"\n' % (key, val)) # print the configuration specific option values (if any) if 'CFGOPTIONS' in details: @@ -297,6 +298,43 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa except IOError, e: return False + src_route_changed = False + if ('PRIMARY' not in details and 'GATEWAY' in details and + details['GATEWAY'] != ''): + i = len(dev) - 1 + while dev[i - 1].isdigit(): + i -= 1 + table = 10 + int(dev[i:]) + (fd, rule_tmpnam) = tempfile.mkstemp(dir=sysconfig) + os.write(fd, "from %s lookup %d\n" % (details['IPADDR'], table)) + os.close(fd) + rule_dest = "%s/rule-%s" % (sysconfig, dev) + if not comparefiles(rule_tmpnam, rule_dest): + os.rename(rule_tmpnam, rule_dest) + os.chmod(rule_dest, 0644) + src_route_changed = True + else: + os.unlink(rule_tmpnam) + (fd, route_tmpnam) = tempfile.mkstemp(dir=sysconfig) + netmask = struct.unpack("I", socket.inet_aton(details['NETMASK']))[0] + ip = struct.unpack("I", socket.inet_aton(details['IPADDR']))[0] + network = socket.inet_ntoa(struct.pack("I", (ip & netmask))) + netmask = socket.ntohl(netmask) + i = 0 + while (netmask & (1 << i)) == 0: + i += 1 + prefix = 32 - i + os.write(fd, "%s/%d dev %s table %d\n" % (network, prefix, dev, table)) + os.write(fd, "default via %s dev %s table %d\n" % (details['GATEWAY'], dev, table)) + os.close(fd) + route_dest = "%s/route-%s" % (sysconfig, dev) + if not comparefiles(route_tmpnam, route_dest): + os.rename(route_tmpnam, route_dest) + os.chmod(route_dest, 0644) + src_route_changed = True + else: + os.unlink(route_tmpnam) + path = "%s/ifcfg-%s" % (sysconfig,dev) if not os.path.exists(path): logger.verbose('net:InitInterfaces adding configuration for %s' % dev) @@ -305,7 +343,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa os.chmod(path,0644) newdevs.append(dev) - elif not comparefiles(tmpnam,path): + elif not comparefiles(tmpnam,path) or src_route_changed: logger.verbose('net:InitInterfaces Configuration change for %s' % dev) if not files_only: logger.verbose('net:InitInterfaces ifdown %s' % dev) @@ -371,6 +409,7 @@ if __name__ == "__main__": dest="program", default="plnet") (options, args) = parser.parse_args() if len(args) != 1 or options.root is None: + print sys.argv print >>sys.stderr, "Missing root or node_id" parser.print_help() sys.exit(1)