for a 'good python'
jak
nospam at please.ty
Wed Apr 12 06:29:59 EDT 2023
Hi everyone,
some time ago I wrote a class to determine if an ipv4 address belonged
to a subnet. Seldom using python I'm pretty sure it's not written in
'good python' nor too portable. Could you give me some advice to make it
better?
class calcip:
def __init__(self, psubnet: str):
ssubnet, scidr = psubnet.replace(' ', '').split('/')
subnet = int.from_bytes(tuple(
map(lambda n: (int(n)),
ssubnet.split('.'))),
'big')
cidr = int(scidr)
mask = ((2 ** cidr) - 1) << (32 - cidr)
self.__network = subnet & mask
self.__wildcard = ~mask & 0xffffffff
self.__broadcast = (subnet | self.__wildcard) & 0xffffffff
self.__tsubnet = tuple(subnet.to_bytes(4, 'big'))
self.__tnetwork = tuple(self.__network.to_bytes(4, 'big'))
self.__tbroadcast = tuple(self.__broadcast.to_bytes(4, 'big'))
self.__tmask = tuple(mask.to_bytes(4, 'big'))
self.__twildcard = tuple(self.__wildcard.to_bytes(4, 'big'))
self.__host_min = tuple((self.__network + 1).to_bytes(4, 'big'))
self.__host_max = tuple((self.__broadcast - 1).to_bytes(4, 'big'))
@staticmethod
def __to_str(val: tuple):
return '.'.join(str(v) for v in val)
@property
def subnet(self):
return self.__to_str(self.__tsubnet)
@property
def network(self):
return self.__to_str(self.__tnetwork)
@property
def broadcast(self):
return self.__to_str(self.__tbroadcast)
@property
def mask(self):
return self.__to_str(self.__tmask)
@property
def wildcard(self):
return self.__to_str(self.__twildcard)
@property
def host_min(self):
return self.__to_str(self.__host_min)
@property
def host_max(self):
return self.__to_str(self.__host_max)
@property
def hosts_num(self):
return self.__wildcard - 1
@property
def net_class(self):
tst = (self.__tnetwork[0] & 0xf0) >> 4
if (tst & 0x8) == 0:
clx = 'A'
elif (tst & 0xc) == 0x8:
clx = 'B'
elif (tst & 0xe) == 0xc:
clx = 'C'
elif (tst & 0xf) == 0xe:
clx = 'D'
elif (tst & 0xf) == 0xf:
clx = 'E'
return clx
def __contains__(self, item):
ret = True
row_hdr = None
try:
row_hdr = int.from_bytes(tuple(map(lambda n: (int(n)),
item.split('.'))), 'big')
except:
ret = False
if ret:
if not self.__network < row_hdr < self.__broadcast:
ret = False
return ret
def main():
sn = calcip('10.0.0.0/26')
print(f"subnet: {sn.subnet}")
print(f"network: {sn.network}")
print(f"broadcast: {sn.broadcast}")
print(f"mask: {sn.mask}")
print(f"wildcard: {sn.wildcard}")
print(f"host_min: {sn.host_min}")
print(f"host_max: {sn.host_max}")
print(f"Avaible hosts: {sn.hosts_num}")
print(f"Class: {sn.net_class}")
tst_hdr = '10.0.0.31'
is_not = 'is '
if not tst_hdr in sn:
is_not = 'is NOT '
print("hdr %s %sin range %s - %s" %
(tst_hdr, is_not, sn.host_min, sn.host_max))
if __name__ == '__main__':
main()
More information about the Python-list
mailing list