4 """network configuration"""
13 def GetSlivers(plc, data):
18 def InitNodeLimit(data):
19 # query running network interfaces
21 ips = dict(zip(devs.values(), devs.keys()))
24 macs[sioc.gifhwaddr(dev).lower()] = dev
26 for network in data['networks']:
27 # Get interface name preferably from MAC address, falling
29 if macs.has_key(network['mac'].lower()):
30 dev = macs[network['mac'].lower()]
31 elif ips.has_key(network['ip']):
32 dev = ips[network['ip']]
34 logger.log('%s: no such interface with address %s/%s' % (network['hostname'], network['ip'], network['mac']))
37 # Get current node cap
39 old_bwlimit = bwlimit.get_bwcap(dev)
43 # Get desired node cap
44 if network['bwlimit'] is None or network['bwlimit'] < 0:
45 new_bwlimit = bwlimit.bwmax
47 new_bwlimit = network['bwlimit']
49 if old_bwlimit != new_bwlimit:
50 # Reinitialize bandwidth limits
51 bwlimit.init(dev, new_bwlimit)
53 # XXX This should trigger an rspec refresh in case
54 # some previously invalid sliver bwlimit is now valid
55 # again, or vice-versa.
57 def InitI2(plc, data):
58 if "Internet2" in data['groups']:
59 logger.log("This is an Internet2 node. Setting rules.")
61 i2nodeids = plc.GetNodeGroups(["Internet2"])[0]['node_ids']
62 for node in plc.GetInterfaces({"node_id": i2nodeids}, ["ip"]):
64 i2nodes.append(node['ip'])
65 # this will create the set if it doesn't already exist
66 # and add IPs that don't exist in the set rather than
67 # just recreateing the set.
68 bwlimit.exempt_init('Internet2', i2nodes)
70 # set the iptables classification rule if it doesnt exist.
71 cmd = '-A POSTROUTING -m set --set Internet2 dst -j CLASSIFY --set-class 0001:2000 --add-mark'
73 ipt = os.popen("/sbin/iptables-save")
74 for line in ipt.readlines(): rules.append(line.strip(" \n"))
77 logger.verbose("net: Adding iptables rule for Internet2")
78 os.popen("/sbin/iptables -t mangle " + cmd)
80 def InitNAT(plc, data):
81 # query running network interfaces
83 ips = dict(zip(devs.values(), devs.keys()))
86 macs[sioc.gifhwaddr(dev).lower()] = dev
88 ipt = iptables.IPTables()
89 for network in data['networks']:
90 # Get interface name preferably from MAC address, falling
92 if macs.has_key(network['mac']):
93 dev = macs[network['mac'].lower()]
94 elif ips.has_key(network['ip']):
95 dev = ips[network['ip']]
97 logger.log('%s: no such interface with address %s/%s' % (network['hostname'], network['ip'], network['mac']))
101 settings = plc.GetInterfaceSettings({'interface_setting_id': network['interface_setting_ids']})
104 # XXX arbitrary names
105 for setting in settings:
106 if setting['category'].upper() != 'FIREWALL':
108 if setting['name'].upper() == 'EXTERNAL':
109 # Enable NAT for this interface
111 elif setting['name'].upper() == 'INTERNAL':
113 elif setting['name'].upper() == 'PF': # XXX Uglier code is hard to find...
114 for pf in setting['value'].split("\n"):
116 for field in pf.split(","):
117 (key, val) = field.split("=", 2)
119 if 'new_dport' not in fields:
120 fields['new_dport'] = fields['dport']
121 if 'source' not in fields:
122 fields['source'] = "0.0.0.0/0"
126 def start(options, config):