1. Escribir el objeto Python "switches" en formato YAML 2. Transformar "switches" para que solo queden los conmutadores "cisco" 3. Usar el módulo estándar ipaddress para obtener la última dirección del host en la red "172.16.0.0/28" 4. Analizar "dhcp_snooping_table" en una lista de diccionarios con el siguiente formato: dhcp_snooping_table_parsed = [ { "mac": "00:E9:8C: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. Escribir una clase "NetworkSubnet" que tenga 2 métodos: get_subnet - devuelve la primera subred disponible de la longitud especificada como un objeto de la clase IPv4Network show_network_pool - devuelve una lista de subredes disponibles 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.0/30'), IPv4Network('172.16.0.72/29'), IPv4Network('172.16.0.80/28'), IPv4Network('172.16.0.96/27')]
sobes.tech AI
Respuesta de la IA
python import yaml from ipaddress import ip_network, IPv4Network
1. Записать Python объект "switches" в YAML формат
switches = [ {"vendor": "cisco", "model": "2960", "ip": "10.0.0.1"}, {"vendor": "juniper", "model": "ex2200", "ip": "10.0.0.2"}, {"vendor": "cisco", "model": "3750", "ip": "10.0.0.3"} ]
yaml_data = yaml.dump(switches, allow_unicode=True) print(yaml_data)
2. Преобразовать "switches" так, чтобы остались только "cisco" коммутаторы
cisco_switches = [sw for sw in switches if sw.get('vendor') == 'cisco'] print(cisco_switches)
3. С помощью ipaddress получить последний адрес хоста в сети "172.16.0.0/28"
network = ip_network('172.16.0.0/28') last_host = list(network.hosts())[-1] print(last_host) # 172.16.0.14
4. Распарсить dhcp_snooping_table в список словарей
dhcp_snooping_table = [ "00:E9:8C: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: mac, ip, interface = line.split() dhcp_snooping_table_parsed.append({"mac": mac, "ip": ip, "interface": interface})
print(dhcp_snooping_table_parsed)
5. Класс NetworkSubnet
from ipaddress import IPv4Network
class NetworkSubnet: def init(self, aggregate_network: str): self.aggregate = IPv4Network(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 and subnet.prefixlen <= length <= subnet.max_prefixlen:
# Разбиваем подсеть на более мелкие
subnets = list(subnet.subnets(new_prefix=length))
if subnets:
allocated = subnets[0]
# Обновляем пул доступных подсетей
# Удаляем выделенную подсеть
del self.available_subnets[i]
# Добавляем оставшиеся подсети
self.available_subnets.extend(subnets[1:])
return allocated
raise ValueError(f"No available subnet with prefix length {length}")
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=}") # IPv4Network('172.16.0.0/26') print(net.get_subnet(length=25)) # 172.16.0.64/25 или 172.16.0.128/25 в зависимости от реализации print(net.get_subnet(length=30)) # 172.16.0.128/30 или другая доступная подсеть print(net.show_network_pool()) # Список оставшихся подсетей
Обратите внимание, что в реализации класса NetworkSubnet метод get_subnet выделяет первую доступную подсеть нужной длины, обновляя пул доступных подсетей.