4 """network configuration"""
12 def GetSlivers(plc, data):
17 def InitNodeLimit(data):
18 # query running network interfaces
20 ips = dict(zip(devs.values(), devs.keys()))
23 macs[sioc.gifhwaddr(dev).lower()] = dev
25 # XXX Exempt Internet2 destinations from node bwlimits
26 # bwlimit.exempt_init('Internet2', internet2_ips)
27 for network in data['networks']:
28 # Get interface name preferably from MAC address, falling
30 if macs.has_key(network['mac']):
31 dev = macs[network['mac'].lower()]
32 elif ips.has_key(network['ip']):
33 dev = ips[network['ip']]
35 logger.log('%s: no such interface with address %s/%s' % (network['hostname'], network['ip'], network['mac']))
38 # Get current node cap
40 old_bwlimit = bwlimit.get_bwcap(dev)
44 # Get desired node cap
45 if network['bwlimit'] is None or network['bwlimit'] < 0:
46 new_bwlimit = bwlimit.bwmax
48 new_bwlimit = network['bwlimit']
50 if old_bwlimit != new_bwlimit:
51 # Reinitialize bandwidth limits
52 bwlimit.init(dev, new_bwlimit)
54 # XXX This should trigger an rspec refresh in case
55 # some previously invalid sliver bwlimit is now valid
56 # again, or vice-versa.
58 def InitI2(plc, data):
59 if "Internet2" in data['groups']:
60 logger.log("This is an Internet2 node. Setting rules.")
62 i2nodeids = plc.GetNodeGroups(["Internet2"])[0]['node_ids']
63 for node in plc.GetInterfaces({"node_id": i2nodeids}, ["ip"]):
64 i2nodes.append(node['ip'])
65 bwlimit.exempt_init('Internet2', i2nodes)
67 def InitNAT(plc, data):
68 # query running network interfaces
70 ips = dict(zip(devs.values(), devs.keys()))
73 macs[sioc.gifhwaddr(dev).lower()] = dev
75 ipt = iptables.IPTables()
76 for network in data['networks']:
77 # Get interface name preferably from MAC address, falling
79 if macs.has_key(network['mac']):
80 dev = macs[network['mac'].lower()]
81 elif ips.has_key(network['ip']):
82 dev = ips[network['ip']]
84 logger.log('%s: no such interface with address %s/%s' % (network['hostname'], network['ip'], network['mac']))
88 settings = plc.GetInterfaceSettings({'interface_setting_id': network['interface_setting_ids']})
92 for setting in settings:
93 if setting['category'].upper() != 'FIREWALL':
95 if setting['name'].upper() == 'EXTERNAL':
96 # Enable NAT for this interface
98 elif setting['name'].upper() == 'INTERNAL':
100 elif setting['name'].upper() == 'PF': # XXX Uglier code is hard to find...
101 for pf in setting['value'].split("\n"):
103 for field in pf.split(","):
104 (key, val) = field.split("=", 2)
106 if 'new_dport' not in fields:
107 fields['new_dport'] = fields['dport']
108 if 'source' not in fields:
109 fields['source'] = "0.0.0.0/0"
113 def start(options, config):