Check for the existence of the Internet2 clique iptables rule and add if absent.
[nodemanager.git] / net.py
diff --git a/net.py b/net.py
index 088f9a3..16953aa 100644 (file)
--- a/net.py
+++ b/net.py
@@ -1,4 +1,5 @@
 #
+# $Id$
 #
 """network configuration"""
 
@@ -7,6 +8,7 @@ import bwlimit
 import logger
 import string
 import iptables
+import os
 
 def GetSlivers(plc, data):
     InitNodeLimit(data)
@@ -59,9 +61,23 @@ def InitI2(plc, data):
         logger.log("This is an Internet2 node.  Setting rules.")
         i2nodes = []
         i2nodeids = plc.GetNodeGroups(["Internet2"])[0]['node_ids']
-        for node in plc.GetNodeNetworks({"node_id": i2nodeids}, ["ip"]):
+        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
@@ -84,7 +100,7 @@ def InitNAT(plc, data):
             continue
 
         try:
-            settings = plc.GetNodeNetworkSettings({'nodenetwork_setting_id': network['nodenetwork_setting_ids']})
+            settings = plc.GetInterfaceSettings({'interface_setting_id': network['interface_setting_ids']})
         except:
             continue
         # XXX arbitrary names