Use pyplnet.
[nodemanager.git] / net.py
diff --git a/net.py b/net.py
index 2bd220c..bb60f1f 100644 (file)
--- a/net.py
+++ b/net.py
@@ -8,8 +8,11 @@ import bwlimit
 import logger
 import string
 import iptables
+import os
+import plnet
 
 def GetSlivers(plc, data):
+    InitInterfaces(plc, data)
     InitNodeLimit(data)
     InitI2(plc, data)
     InitNAT(plc, data)
@@ -22,12 +25,10 @@ def InitNodeLimit(data):
     for dev in devs:
         macs[sioc.gifhwaddr(dev).lower()] = dev
 
-    # XXX Exempt Internet2 destinations from node bwlimits
-    # bwlimit.exempt_init('Internet2', internet2_ips)
     for network in data['networks']:
         # Get interface name preferably from MAC address, falling
         # back on IP address.
-        if macs.has_key(network['mac']):
+        if macs.has_key(network['mac'].lower()):
             dev = macs[network['mac'].lower()]
         elif ips.has_key(network['ip']):
             dev = ips[network['ip']]
@@ -61,8 +62,22 @@ def InitI2(plc, data):
         i2nodes = []
         i2nodeids = plc.GetNodeGroups(["Internet2"])[0]['node_ids']
         for node in plc.GetInterfaces({"node_id": i2nodeids}, ["ip"]):
+            # Get the IPs
             i2nodes.append(node['ip'])
+        # this will create the set if it doesn't already exist
+        # and add IPs that don't exist in the set rather than
+        # just recreateing the set.
         bwlimit.exempt_init('Internet2', i2nodes)
+        
+        # set the iptables classification rule if it doesnt exist.
+        cmd = '-A POSTROUTING -m set --set Internet2 dst -j CLASSIFY --set-class 0001:2000 --add-mark'
+        rules = []
+        ipt = os.popen("/sbin/iptables-save")
+        for line in ipt.readlines(): rules.append(line.strip(" \n"))
+        ipt.close()
+        if cmd not in rules:
+            logger.verbose("net:  Adding iptables rule for Internet2")
+            os.popen("/sbin/iptables -t mangle " + cmd)
 
 def InitNAT(plc, data):
     # query running network interfaces
@@ -85,7 +100,7 @@ def InitNAT(plc, data):
             continue
 
         try:
-            settings = plc.GetInterfaceSettings({'interface_setting_id': network['interface_setting_ids']})
+            settings = plc.GetInterfaceTags({'interface_tag_id': network['interface_tag_ids']})
         except:
             continue
         # XXX arbitrary names
@@ -110,5 +125,10 @@ def InitNAT(plc, data):
                     ipt.add_pf(fields)
     ipt.commit()
 
+def InitInterfaces(plc, data):
+    if not 'networks' in data:
+        return
+    plnet.InitInterfaces(logger, plc, data)
+
 def start(options, config):
     pass