#!/usr/bin/python """ INET module. Defines an IPaddr class (Internet Protocol address). Exports helper functions: itodq(int) - return dotted quad string given an integer. dqtoi(string) - return and integer given a string in IP dotted-quad notation. The IPaddr class stores the IP address and mask. It also precomputes the network, host, and broadcast addresses. """ from types import * import string, socket class IPaddr: """ Store an IP addresss. Pre-compute the network, host, and broadcast and store that as well. ipaddress = IPaddr(address, [mask]) supply an address as either integer or string. A netmask may optionally be supplied. It defaults to a classful mask appropriate for its class. the netmask may be supplied as integer, dotted quad, or slash (e.g. /24) notation. Exports 'string' method that returns IP addresses as dotted quad string. Raises ValueError if the string representation is malformed, or is not an integer. """ def __init__(self, address, mask=None): # determine input type and convert if necessary if type(address) == StringType: self.address = dqtoi(socket.gethostbyname(address)) elif type(address) == IntType: self.address = address else: raise ValueError # handle the optional mask parameter. Default to classful mask. if mask == None: if self.address & 0x80000000 == 0: self.mask = 0xff000000 elif self.address & 0x40000000 == 0: self.mask = 0xffff0000 else: self.mask = 0xffffff00 elif type(mask) == StringType: if mask[0] == '/': bits = int(mask[1:]) if bits <= 32 and bits > 0: self.mask = 0xffffffff << (32 - bits) else: raise ValueError else: self.mask = dqtoi(mask) elif type(mask) == IntType: self.mask = mask else: raise ValueError # compute and store network, host, and broadcast address self.network = self.address & self.mask # check for host specific address if self.mask == 0xffffffff: self.host = self.address self.broadcast = 0xffffffff else: self.host = self.address & (~self.mask) self.broadcast = self.address | (~self.mask) def __repr__(self): return itodq(self.address) def dqtoi(dq): "Return an integer value given an IP address as dotted-quad string." octets = string.split(dq, ".") if len(octets) != 4: raise ValueError for octet in octets: if int(octet) > 255: raise ValueError return (int(octets[0]) << 24) + \ (int(octets[1]) << 16) + \ (int(octets[2]) << 8) + \ (int(octets[3])) def itodq(intval): "Return a dotted-quad string given an integer. " return "%u.%u.%u.%u" % ((intval >> 24) & 0x000000ff, ((intval & 0x00ff0000) >> 16), ((intval & 0x0000ff00) >> 8), (intval & 0x000000ff)) # vim:ts=4:sw=4