import time
import tempfile
import errno
+import struct
import sioc
import modprobe
interfaces.reverse()
for interface in interfaces:
- logger.verbose('net:InitInterfaces interface %d: %r'%(device_id,interface))
- logger.verbose('net:InitInterfaces macs = %r' % macs)
+ logger.verbose('net:InitInterfaces interface %d: %r'%(device_id,interface))
+ logger.verbose('net:InitInterfaces macs = %r' % macs)
logger.verbose('net:InitInterfaces ips = %r' % ips)
# Get interface name preferably from MAC address, falling back
# on IP address.
else:
orig_ifname = None
- if orig_ifname:
+ if orig_ifname:
logger.verbose('net:InitInterfaces orig_ifname = %s' % orig_ifname)
-
+
details = {}
details['ONBOOT']='yes'
details['USERCTL']='no'
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']:
if not interface['is_primary']:
details['DHCLIENTARGS'] = "-R subnet-mask"
- try:
- plc.GetInterfaceTags()
+ if 'interface_tag_ids' in interface:
version = 4.3
- except AttributeError:
- version = 4.2
-
- if 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:
try:
settings = plc.GetNodeNetworkSettings({interface_tag_id:interface[interface_tag_ids]})
except:
logger.log("net:InitInterfaces FATAL: failed call GetInterfaceTags({'interface_tag_id':{%s})"% \
- interface['interface_tag_ids'])
+ interface[interface_tag_ids])
failedToGetSettings = True
continue # on to the next interface
for setting in settings:
- # to explicitly set interface name
- name_key = "name"
- if version == 4.3:
- name_key = "tagname"
-
settingname = setting[name_key].upper()
if settingname in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER'):
details[settingname]=setting['value']
logger.log("net:InitInterfaces WARNING: interface alias (%s) not matched to an interface"% details['ALIAS'])
device_id -= 1
else:
- if ('IFNAME' not in details) and not orig_ifname:
- ifname="eth%d" % (device_id-1)
- # should check if $ifname is an eth already defines
+ if 'IFNAME' in details:
+ ifname = details['IFNAME']
+ device_id -= 1
+ elif orig_ifname:
+ ifname = orig_ifname
+ device_id -= 1
+ else:
+ while True:
+ ifname="eth%d" % (device_id-1)
+ if ifname not in devices_map:
+ break
+ device_id += 1
if os.path.exists("%s/ifcfg-%s"%(sysconfig,ifname)):
logger.log("net:InitInterfaces WARNING: possibly blowing away %s configuration"%ifname)
- else:
- if ('IFNAME' not in details) and orig_ifname:
- ifname = orig_ifname
- else:
- ifname = details['IFNAME']
- device_id -= 1
devices_map[ifname] = details
-
+ device_id += 1
m = modprobe.Modprobe()
try:
m.input("%s/etc/modprobe.conf" % root)
# Process ifcfg-$dev changes / additions
newdevs = []
+ table = 10
for (dev, details) in devices_map.iteritems():
(fd, tmpnam) = tempfile.mkstemp(dir=sysconfig)
f = os.fdopen(fd, "w")
# print the configuration values
for (key, val) in details.iteritems():
- if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER'):
+ if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER','GATEWAY'):
f.write('%s=%s\n' % (key, val))
# print the configuration specific option values (if any)
# compare whether two files are the same
def comparefiles(a,b):
try:
- logger.verbose("net:InitInterfaces comparing %s with %s" % (a,b))
+ logger.verbose("net:InitInterfaces comparing %s with %s" % (a,b))
if not os.path.exists(a): return False
fb = open(a)
buf_a = fb.read()
except IOError, e:
return False
+ src_route_changed = False
+ if ('PRIMARY' not in details and 'GATEWAY' in details and
+ details['GATEWAY'] != ''):
+ table += 1
+ (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)
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)
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)