python import yaml from ipaddress import ipnetwork, IPv4Network
1. Записать Python объект "switches" в YAML формат
python import yaml from ipaddress import ipnetwork, IPv4Network
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
-
Записать Python объект "switches" в YAML формат
-
Преобразовать "switches" так, что бы в нём остались "cisco" коммутаторы
-
С помощью стандартного модуля ipaddress получить последний адрес хоста в сети "172.16.0.0/28"
-
Распарсить "dhcp_snooping_table" в список словарей вида:
dhcp_snooping_table_parsed = [
{
"mac": "00:E9:BC:3F:A6:50",
"ip": "100.1.1.6",
"interface": "FastEthernet0/20",
},
{
"mac": "00:E9:22:11:A6:50",
"ip": "100.1.1.7",
"interface": "FastEthernet0/21",
}
] -
Написать класс "NetworkSubnet" который имеет 2 метода:
- get_subnet - возвращает первую доступную подсеть указанной длины в виде объекта класса IPv4Network
- show_network_pool - возвращает список доступных подсетей
from ipaddress import IPv4Network
class NetworkSubnet:
def __init__(self, aggregate_network: str):
...
def get_subnet(self, length: int) -> IPv4Network:
...
def show_network_pool(self) -> list[IPv4Network]:
...
net = NetworkSubnet(aggregate_network="172.16.0.0/24")
net_1 = net.get_subnet(length=26)
print(f"{net_1=}")
net_1=IPv4Network('172.16.0.0/26')
print(net.get_subnet(length=25))
172.16.0.128/25
print(net.get_subnet(length=30))
172.16.0.64/30
print(net.show_network_pool())
[IPv4Network('172.16.0.64/30'), IPv4Network('172.16.0.72/29'), IPv4Network('172.16.0.80/28'), IPv4Network('172.16.0.96/27')]
Ответ
python import yaml from ipaddress import ip_network, IPv4Network
\1. Записать Python объект "switches" в YAML
switches = [ {"vendor": "cisco", "model": "2960"}, {"vendor": "juniper", "model": "ex2200"}, {"vendor": "cisco", "model": "3750"}, ]
with open("switches.yaml", "w") as f: yaml.dump(switches, f)
\2. Оставить только cisco коммутаторы
cisco_switches = [sw for sw in switches if sw["vendor"] == "cisco"]
\3. Получить последний адрес хоста в сети 172.16.0.0/28
network = ip_network("172.16.0.0/28") last_host = list(network.hosts())[-1]
\4. Парсинг dhcp_snooping_table
dhcp_snooping_table = """ 00:E9:BC:3F:A6:50 100.1.1.6 FastEthernet0/20 00:E9:22:11:A6:50 100.1.1.7 FastEthernet0/21 """
dhcp_snooping_table_parsed = [] for line in dhcp_snooping_table.strip().splitlines(): mac, ip, interface = line.split() dhcp_snooping_table_parsed.append({"mac": mac, "ip": ip, "interface": interface})
\5. Класс NetworkSubnet
class NetworkSubnet: def init(self, aggregate_network: str): self.aggregate = ip_network(aggregate_network) self.available_subnets = [self.aggregate]
def get_subnet(self, length: int) -> IPv4Network:
for i, subnet in enumerate(self.available_subnets):
if subnet.prefixlen <= length:
# Разбиваем подсеть на более мелкие
subnets = list(subnet.subnets(new_prefix=length))
# Берём первую подсеть
chosen = subnets[0]
# Обновляем пул доступных подсетей
self.available_subnets.pop(i)
self.available_subnets.extend(subnets[1:])
self.available_subnets.sort(key=lambda x: int(x.network_address))
return chosen
raise ValueError("Нет доступных подсетей нужной длины")
def show_network_pool(self) -> list[IPv4Network]:
return self.available_subnets
Пример использования
net = NetworkSubnet(aggregate_network="172.16.0.0/24") net_1 = net.get_subnet(length=26) print(f"{net_1=}") # 172.16.0.0/26 print(net.get_subnet(length=25)) # 172.16.0.64/25 print(net.get_subnet(length=30)) # 172.16.0.192/30 print(net.show_network_pool()) # Оставшиеся подсети