47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
|
from ipaddress import IPv4Network, IPv4Address, AddressValueError, NetmaskValueError
|
||
|
from randmac import RandMac
|
||
|
|
||
|
|
||
|
def ipv4(prefix: str, ipl: [IPv4Address] = None, macl: [str] = None) -> [(IPv4Address, str, IPv4Address, int)]:
|
||
|
"""
|
||
|
This function generate a list of IPs and MACs to insert.
|
||
|
|
||
|
If a list is given, they avoid duplicated entry with list, for duplicated IP the MAC will be set to None.
|
||
|
|
||
|
:param prefix: The IPs prefix
|
||
|
:type prefix: IPv4Address
|
||
|
:param ipl: A list of IPs
|
||
|
:type ipl: [IPv4Address]
|
||
|
:param macl: A list of MACs
|
||
|
:type macl: [str]
|
||
|
:return: list of tuple with IP, MAC, subnet mask and cidr
|
||
|
:rtype: [(IPv4Address, str, IPv4Address, int)]
|
||
|
"""
|
||
|
|
||
|
if ipl is None:
|
||
|
ipl = []
|
||
|
if macl is None:
|
||
|
macl = []
|
||
|
out = []
|
||
|
|
||
|
# Check if prefix is valid
|
||
|
try:
|
||
|
ips = IPv4Network(prefix)
|
||
|
except (ValueError, AddressValueError, NetmaskValueError):
|
||
|
raise ValueError("Invalid prefix !")
|
||
|
subnet_mask = ips.netmask
|
||
|
cidr = ips.prefixlen
|
||
|
|
||
|
# For all ip in prefix
|
||
|
for ip in ips.hosts():
|
||
|
mac = None
|
||
|
if ip not in ipl:
|
||
|
ipl.append(ip)
|
||
|
mac = str(RandMac("00:00:00:00:00:00", True))
|
||
|
while mac in macl:
|
||
|
mac = str(RandMac("00:00:00:00:00:00", True))
|
||
|
macl.append(mac)
|
||
|
|
||
|
out.append((ip, mac, subnet_mask, cidr))
|
||
|
return out
|