Sobes.tech
Intern

1. YAML форматында "switches" деп аталатын Python объектісін жазу 2. "switches" объектісін өзгерту, сонда онда тек "cisco" коммутаторлары қалады 3. Стандартты ipaddress модулін пайдаланып, "172.16.0.0/28" желісіндегі соңғы хост адресін алу 4. "dhcp_snooping_table"-ды парсинг жасап, келесі форматтағы тізімге айналдыру: ```python 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" деген класс жазу, ол екі әдіске ие: - get_subnet - көрсетілген ұзындықтағы бірінші қол жетімді подсетьті IPv4Network класы объекті ретінде қайтару - show_network_pool - қол жетімді барлық подсетелердің тізімін қайтару ```python 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')] ```

sobes.tech AI

AI-дан жауап

  1. YAML форматында switches объектінің мысалы:
switches:
  - name: switch1
    vendor: cisco
    ip: 192.168.1.1
  - name: switch2
    vendor: juniper
    ip: 192.168.1.2
  - name: switch3
    vendor: cisco
    ip: 192.168.1.3
  1. Тек Cisco коммутаторларын қалдыру үшін түрлендіру:
import yaml

with open('switches.yaml') as f:
    data = yaml.safe_load(f)

cisco_switches = [sw for sw in data['switches'] if sw['vendor'].lower() == 'cisco']

print(cisco_switches)
  1. "172.16.0.0/28" желісіндегі соңғы хост мекенжайын алу:
import ipaddress

network = ipaddress.ip_network('172.16.0.0/28')
last_host = network.broadcast_address - 1
print(last_host)  # 172.16.0.14
  1. dhcp_snooping_table-ды сөздік тізіміне парсинг:
dhcp_snooping_table = '''
MacAddress          IpAddress        Interface
00:E9:BC:3F:A6:50  100.1.1.6       FastEthernet0/20
00:E9:22:11:A6:50  100.1.1.7       FastEthernet0/21
'''

lines = dhcp_snooping_table.strip().split('\n')[1:]  # тақырыпты өткізіп жіберу

parsed = []
for line in lines:
    mac, ip, interface = line.split()
    parsed.append({"mac": mac, "ip": ip, "interface": interface})

print(parsed)
  1. 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:
                # Подсетьті кішірейту
                subnets = list(subnet.subnets(new_prefix=length))
                if subnets:
                    allocated = subnets[0]
                    # Қол жетімді подсетелер пулын жаңарту
                    remaining = subnets[1:] + self.available_subnets[:i] + self.available_subnets[i+1:]
                    self.available_subnets = remaining
                    return allocated
        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())