Source code for ldaptor.dns

"""DNS-related utilities."""

from socket import inet_aton, inet_ntoa
import struct


[docs]def aton_octets(ip): s = inet_aton(ip) return struct.unpack('!I', s)[0]
[docs]def aton_numbits(num): n = 0 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 = struct.pack('!I', n) 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.'