#!/usr/local/bin/python class ip_addr: def __init__(self, x): if isinstance(x, ip_addr): self.ival = x.ival elif isinstance(x, int): self.ival = x elif isinstance(x, long): self.ival = (int(x & 0xffffffff)) elif isinstance(x, basestring): self.ival = 0 sh = 24 bytes = x.split(".", 4) for b in bytes: self.ival |= (int(b) << sh) sh -= 8 else: self.ival = 0 def __str__(self): return "%d.%d.%d.%d" % ((self.ival & 0xff000000) >> 24, (self.ival & 0x00ff0000) >> 16, (self.ival & 0x0000ff00) >> 8, self.ival & 0x000000ff) def __add__(self, i): if isinstance(i, int): return ip_addr(self.ival + i) elif isinstance(i, ip_addr): return ip_addr(self.ival + i.ival) else: raise ValueError("IP addrs must operate on IP addrs or ints") def __sub__(self, i): if isinstance(i, int): return ip_addr(self.ival - i) elif isinstance(i, ip_addr): return ip_addr(self.ival - i.ival) else: raise ValueError("IP addrs must operate on IP addrs or ints") def __and__(self, i): if isinstance(i, int): return ip_addr(self.ival & i) elif isinstance(i, ip_addr): return ip_addr(self.ival & i.ival) else: raise ValueError("IP addrs must operate on IP addrs or ints") def __or__(self, i): if isinstance(i, int): return ip_addr(self.ival | i) elif isinstance(i, ip_addr): return ip_addr(self.ival | i.ival) else: raise ValueError("IP addrs must operate on IP addrs or ints") def __xor__(self, i): if isinstance(i, int): return ip_addr(self.ival ^ i) elif isinstance(i, ip_addr): return ip_addr(self.ival ^ i.ival) else: raise ValueError("IP addrs must operate on IP addrs or ints") def __radd__(self, i): return self.__add__(i) def __rsub__(self, i): return self.__sub__(i) def __rand__(self, i): return self.__and__(i) def __ror__(self, i): return self.__or__(i) def __rxor__(self, i): return self.__xor__(i) def __int__(self): return self.ival def __oct__(self): return oct(self.ival) def __hex__(self): return hex(self.ival)