-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunctions.py
61 lines (53 loc) · 2.12 KB
/
functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import ipaddress
def get_all_subnet_masks():
"""get list of all subnet masks"""
return [str(ipaddress.IPv4Network(f'0.0.0.0/{prefix_length}').netmask) for prefix_length in range(0,33)]
def get_subnet_info(network_str: str):
try:
network = ipaddress.ip_network(network_str, strict=False)
return {
"Subnet": str(network),
"Network Address": str(network.network_address),
"Broadcast Address": str(network.broadcast_address),
"Number of addresses": network.num_addresses,
"Number of usables addresses": (
network.num_addresses - 2
if network.num_addresses > 2
else network.num_addresses
),
"Network Range": [(
str(network.network_address),
str(network.broadcast_address),
)],
"Subnet Mask": str(network.netmask),
"Wildcard Mask": str(ipaddress.IPv4Address(~int(network.netmask) & 0xFFFFFFFF))
# "hosts": [str(host) for host in network.hosts()],
}
except ValueError:
return None
def generate_all_subnets(address: str, netmask: str):
"""generate all possible subnets within a prefix
Args:
prefix (str): network to generate subnets for
mask (str): subnet mask or CIDR
Example:
generate('192.168.1.0', 23)
"""
try:
network = ipaddress.IPv4Network(f"{address}/{netmask}", strict=False)
# Original prefix length
original_prefix_length = network.prefixlen
# List to store all subnets
all_subnets, all_hosts = [], []
# Generate subnets for all prefix lengths greater than the original prefix length
for new_prefix_length in range(original_prefix_length + 1, 33):
subnets = list(network.subnets(new_prefix=new_prefix_length))
hosts = list(network.hosts())
all_subnets.extend(subnets)
all_hosts.extend(hosts)
return {
'Subnets': all_subnets,
'Usable Hosts': all_hosts
}
except ValueError as e:
return str(e)