Use an incrementer instead of something based on the name.
[pyplnet.git] / plnet.py
index b79f916..a99add8 100755 (executable)
--- a/plnet.py
+++ b/plnet.py
@@ -6,6 +6,7 @@ import socket
 import time
 import tempfile
 import errno
+import struct
 
 import sioc
 import modprobe
@@ -89,6 +90,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']:
@@ -254,6 +256,7 @@ def InitInterfaces(logger, plc, data, root="", files_only=False, program="NodeMa
 
     # 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")
@@ -264,7 +267,7 @@ 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'):
+            if key not in ('IFNAME','ALIAS','CFGOPTIONS','DRIVER','GATEWAY'):
                 f.write('%s=%s\n' % (key, val))
 
         # print the configuration specific option values (if any)
@@ -297,6 +300,40 @@ 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'] != ''):
+            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)
@@ -305,7 +342,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 +408,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)