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