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."