Source code for paradrop.lib.utils.addresses

###################################################################
# Copyright 2013-2014 All Rights Reserved
# Authors: The Paradrop Team
###################################################################

import socket
import struct

from paradrop.lib.utils import pdos


[docs]def isIpValid(ipaddr): """Return True if Valid, otherwise False.""" try: socket.inet_aton(ipaddr) return True except: return False
[docs]def isIpAvailable(ipaddr, chuteStor, name): """ Make sure this IP address is available. Checks the IP addresses of all zones on all other chutes, makes sure subnets are not the same. """ chList = chuteStor.getChuteList() for ch in chList: # Only look at other chutes if (name != ch.name): otherIPs = ch.getChuteIPs() if ipaddr in otherIPs: return False return True
[docs]def isWifiSSIDAvailable(ssid, chuteStor, name): """Make sure this SSID is available.""" chList = chuteStor.getChuteList() for ch in chList: # Only look at other chutes if (name != ch.name): otherSSIDs = ch.getChuteSSIDs() #print("chute: %s other SSIDs: %s" % (ch, otherSSIDs)) for o in otherSSIDs: if (o == ssid): return False return True
[docs]def isStaticIpAvailable(ipaddr, chuteStor, name): """ Make sure this static IP address is available. Checks the IP addresses of all zones on all other chutes, makes sure not equal.""" chList = chuteStor.getChuteList() for ch in chList: # Only look at other chutes if (name != ch.name): otherStaticIPs = ch.getChuteStaticIPs() if ipaddr in otherStaticIPs: return False return True
[docs]def checkPhyExists(radioid): """Check if this chute exists at all, a directory /sys/class/ieee80211/phyX must exist.""" #DFW: used to be this, but when netns runs this doesn't exist, so we switched to using the debug sysfs '/sys/class/ieee80211/phy%d' % radioid return pdos.exists('/sys/kernel/debug/ieee80211/phy%d' % radioid)
[docs]def incIpaddr(ipaddr, inc=1): """ Takes a quad dot format IP address string and adds the @inc value to it by converting it to a number. Returns: Incremented quad dot IP string or None if error """ try: val = struct.unpack("!I", socket.inet_aton(ipaddr))[0] val += inc return socket.inet_ntoa(struct.pack('!I', val)) except Exception: return None
[docs]def maxIpaddr(ipaddr, netmask): """ Takes a quad dot format IP address string and makes it the largest valid value still in the same subnet. Returns: Max quad dot IP string or None if error """ try: val = struct.unpack("!I", socket.inet_aton(ipaddr))[0] nm = struct.unpack("!I", socket.inet_aton(netmask))[0] inc = struct.unpack("!I", socket.inet_aton("0.0.0.254"))[0] val &= nm val |= inc return socket.inet_ntoa(struct.pack('!I', val)) except Exception: return None
[docs]def getSubnet(ipaddr, netmask): try: val1 = struct.unpack("!I", socket.inet_aton(ipaddr))[0] nm = struct.unpack("!I", socket.inet_aton(netmask))[0] res = val1 & nm return socket.inet_ntoa(struct.pack('!I', res)) except Exception: return None
[docs]def getInternalIntfList(ch): """ Takes a chute object and uses the key:networkInterfaces to return a list of the internal network interfaces that will exist in the chute (e.g., eth0, eth1, ...) Returns: A list of interface names None if networkInterfaces doesn't exist or there is an error """ intfs = ch.getCache('networkInterfaces') if(not intfs): return None l = [] for i in intfs: l.append(i['internalIntf']) return l
[docs]def getGatewayIntf(ch): """ Looks at the key:networkInterfaces for the chute and determines what the gateway should be including the IP address and the internal interface name. Returns: A tuple (gatewayIP, gatewayInterface) None if networkInterfaces doesn't exist or there is an error """ intfs = ch.getCache('networkInterfaces') if(not intfs): return (None, None) for i in intfs: if(i['type'] == 'wan'): return (i['externalIpaddr'], i['internalIntf']) return (None, None)
[docs]def getWANIntf(ch): """ Looks at the key:networkInterfaces for the chute and finds the WAN interface. Returns: The dict from networkInterfaces None """ intfs = ch.getCache('networkInterfaces') if(not intfs): return None for i in intfs: if(i['type'] == 'wan'): return i return None