+ 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)
+