pstfileshare/addr.py

147 lines
3.6 KiB
Python

#!/usr/bin/env python
import string
from copy import deepcopy
class ipv4addr():
"""Class for IPv4 address manipulation.\n\n"""\
"""Initialization:\n"""\
"""\tfrom addr import ipv4addr\n"""\
"""\tmyAddress = ipv4addr(str, str) # for example: myAddress = ipv4addr("192.168.0.1", "255.255.255.0")\n"""\
"""or:\n"""\
"""\tmyAddress = ipv4addr(str, int) # for example: myAddress = ipv4addr("192.168.0.1", 24)\n\n"""\
"""Functions:\n"""\
"""\tnetwork() # returns subnet address\n"""\
"""\tinMyNet(ipv4addr) # returns True or False\n"""\
"""\t # True - if the specified ipv4addr object belongs to the network\n"""\
"""\t # False - if the specified ipv4addr object not belongs to the network\n\n"""\
"""Variables:\n"""\
"""\tcidr # Subnet mask in cidr notation\n\n"""\
"""ipv4addr class object is an iterator.\n"""\
"""Examples of use ipv4addr object as iterator:\n"""\
"""\t>>> myAddress = ipv4addr("192.168.0.1", 24)\n"""\
"""\t>>> print(myAddress[0])\n"""\
"""\t192\n"""\
"""\t>>> print(myAddress[1])\n"""\
"""\t168\n"""\
"""\t>>> myAddress[2] = 1\n"""\
"""\t>>> print(myAddress)\n"""\
"""\t192.168.1.1/24\n"""
def __init__(self, addrstr = '0.0.0.0', netmask = 32):
octets = addrstr.split('.')
self._addr = None
self._setAddr([int(octets[0]),
int(octets[1]),
int(octets[2]),
int(octets[3])])
if type(netmask) == str:
self.cidr = self._strToMask(netmask)
else:
self.cidr = netmask
self.printMask = True
def _strToMask(self, netmask):
octets = netmask.split('.')
cidr = 0
for i in octets:
octet = int(i)
if octet > 0:
while((octet & 128) / 128):
cidr += 1
octet<<=1
return(cidr)
def _setAddr(self, octets):
self._addr = octets[0] * pow(256, 3) + octets[1] * pow(256, 2) + octets[2] * pow(256, 1) + octets[3] * pow(256, 0)
def _getOctet(self, key):
octet = self._addr
for i in xrange(3 - key):
octet >>= 8
octet = octet % 256
return(octet)
def _setOctet(self, key, value):
octets=[]
for i in xrange(4):
if i == key:
octets.append(value)
else:
octets.append(self._getOctet(i))
self._setAddr(octets)
def _mask(self):
mask = 0
for i in xrange(self.cidr):
mask = (mask << 1) + 1
for i in xrange(32-self.cidr):
mask <<= 1
return(mask)
def __str__(self):
result = str(self._getOctet(0)) + '.' + str(self._getOctet(1)) + '.' + str(self._getOctet(2)) + '.' + str(self._getOctet(3))
if self.printMask == True:
result+='/%s' % self.cidr
return(result)
def __repr__(self):
return(self.__str__())
def __iter__(self):
return(self)
def __getitem__(self, key):
return(self._getOctet(key))
def __setitem__(self, key, value):
self._setOctet(key, value)
def __len__(self):
return(4)
def __lt__(self, other):
if self._addr < other._addr:
return True
else:
return False
def __le__(self, other):
if self._addr <= other._addr:
return True
else:
return False
def __eq__(self, other):
if self._addr == other._addr:
return True
else:
return False
def __ne__(self, other):
if self._addr != other._addr:
return True
else:
return False
def __gt__(self, other):
if self._addr > other._addr:
return True
else:
return False
def __ge__(self, other):
if self._addr >= other._addr:
return True
else:
return False
def network(self):
network = deepcopy(self)
network._addr = self._addr & self._mask()
network.cidr = self.cidr
return(network)
def inMyNet(self, address):
if (address._addr & self._mask()) == self.network()._addr:
return(True)
else:
return(False)