1. Записать Python объект "switches" в YAML формат

python import yaml from ipaddress import ipnetwork, IPv4Network

Короткий ответ

Что ответить на собеседовании

python import yaml from ipaddress import ipnetwork, IPv4Network

Подробный разбор

Ответ с пояснениями

Условие

  1. Записать Python объект "switches" в YAML формат

  2. Преобразовать "switches" так, что бы в нём остались "cisco" коммутаторы

  3. С помощью стандартного модуля ipaddress получить последний адрес хоста в сети "172.16.0.0/28"

  4. Распарсить "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",
    }
    ]

  5. Написать класс "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()) # Оставшиеся подсети

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее