Source code for ldaptor.dns

"""DNS-related utilities."""

from socket import inet_aton, inet_ntoa

[docs]def aton_octets(ip): s=inet_aton(ip) octets=map(None, s) n=0L for o in octets: n=n<<8 n+=ord(o) return n
[docs]def aton_numbits(num): n=0L while num>0: n>>=1 n |= 2**31 num-=1 return n
[docs]def aton(ip): try: i=int(ip) except ValueError: return aton_octets(ip) else: return aton_numbits(i)
[docs]def ntoa(n): s=( chr((n>>24)&0xFF) + chr((n>>16)&0xFF) + chr((n>>8)&0xFF) + chr(n&0xFF) ) ip=inet_ntoa(s) return ip
[docs]def netmaskToNumbits(netmask): bits = aton(netmask) i = 2**31 n = 0 while bits and i > 0: if (bits & i) == 0: if bits: raise RuntimeError, "Invalid netmask: %s" % netmask n += 1 bits -= i i = i >> 1 return n
[docs]def ptrSoaName(ip, netmask): """ Convert an IP address and netmask to a CIDR delegation -style zone name. """ net = aton(ip) & aton(netmask) nmBits = netmaskToNumbits(netmask) bytes, bits = divmod(nmBits, 8) octets = ntoa(net).split('.') octets.reverse() if not bits: octets = octets[-bytes:] else: partial = octets[-bytes-1] octets = octets[-bytes:] octets.insert(0, '%s/%d' % (partial, nmBits)) return '.'.join(octets)+'.in-addr.arpa.'