Книга: PyNEng
Назад: Дополнительные материалы
Дальше: IV. Запись и передача данных

Задания

Задания

Все задания и вспомогательные файлы можно скачать в . Если в заданиях раздела есть задания с буквами (например, 5.2a), то лучше выполнить сначала задания без букв, а затем с буквами. Задания с буквами, как правило, немного сложнее заданий без букв и развивают или усложняют идею в соответствующем задании без буквы.

Например, в разделе есть задания 5.1, 5.2, 5.2a, 5.2b, 5.3, 5.3a. Сначала лучше выполнить задания 5.1, 5.2, 5.3, а затем 5.2a, 5.2b, 5.3a

Если задания с буквами получается сделать сразу, лучше делать их по порядку.

Задание 15.1

Создать скрипт, который будет ожидать два аргумента:

  1. имя файла, в котором находится вывод команды show
  2. регулярное выражение

В результате выполнения скрипта, на стандартный поток вывода должны быть выведены те строки из файла с выводом команды show, в которых было найдено совпадение с регулярным выражением.

Проверить работу скрипта на примере вывода команды sh ip int br (файл sh_ip_int_br.txt). Например, попробуйте вывести информацию только по интерфейсу FastEthernet0/1.

Пример работы скрипта:

$ python task_9_1.py sh_ip_int_br.txt "Fas" FastEthernet0/0            15.0.15.1       YES manual up                    up FastEthernet0/1            10.0.12.1       YES manual up                    up FastEthernet0/2            10.0.13.1       YES manual up                    up FastEthernet0/3            unassigned      YES unset  up                    down  $ python task_9_1.py sh_ip_int_br.txt "manual" FastEthernet0/0            15.0.15.1       YES manual up                    up FastEthernet0/1            10.0.12.1       YES manual up                    up FastEthernet0/2            10.0.13.1       YES manual up                    up Loopback0                  10.1.1.1        YES manual up                    up Loopback100                100.0.0.1       YES manual up                    up  $ python task_9_1.py sh_ip_int_br.txt "up +up" FastEthernet0/0            15.0.15.1       YES manual up                    up FastEthernet0/1            10.0.12.1       YES manual up                    up FastEthernet0/2            10.0.13.1       YES manual up                    up Loopback0                  10.1.1.1        YES manual up                    up Loopback100                100.0.0.1       YES manual up                    up 

В данном случае, скрипт будет работать как фильтр include в CLI Cisco. Вы можете попробовать использовать регулярные выражения для .

Задание 15.1a

Напишите регулярное выражение, которое отобразит строки с интерфейсами 0/1 и 0/3 из вывода sh ip int br.

Проверьте регулярное выражение, используя скрипт, который был создан в задании 15.1, и файл sh_ip_int_br.txt.

В файле задания нужно написать только регулярное выражение.

Задание 15.1b

Переделайте регулярное выражение из задания 15.1a таким образом, чтобы оно, по-прежнему, отображало строки с интерфейсами 0/1 и 0/3, но, при этом, в регулярном выражении было не более 7 символов (не считая кавычки вокруг регулярного выражения).

Проверьте регулярное выражение, используя скрипт, который был создан в задании 15.1, и файл sh_ip_int_br.txt.

В файле задания нужно написать только регулярное выражение.

Задание 15.1c

Проверить работу скрипта из задания 15.1 и регулярного выражения из задания 15.1a или 15.1b на выводе sh ip int br из файла sh_ip_int_br_switch.txt.

Если, в результате выполнения скрипта, были выведены не только строки с интерфейсами 0/1 и 0/3, исправить регулярное выражение. В результате, должны выводиться только строки с интерфейсами 0/1 и 0/3.

В файле задания нужно написать только регулярное выражение.

Задание 15.2

Создать функцию return_match, которая ожидает два аргумента:

  • имя файла, в котором находится вывод команды show
  • регулярное выражение

Функция должна обрабатывать вывод команды show построчно и возвращать список подстрок, которые совпали с регулярным выражением (не всю строку, где было найдено совпадение, а только ту подстроку, которая совпала с выражением).

Проверить работу функции на примере вывода команды sh ip int br (файл sh_ip_int_br.txt). Вывести список всех IP-адресов из вывода команды.

Соответственно, регулярное выражение должно описывать подстроку с IP-адресом (то есть, совпадением должен быть IP-адрес).

Обратите внимание, что в данном случае, мы можем не проверять корректность IP-адреса, диапазоны адресов и так далее, так как мы обрабатываем вывод команды, а не ввод пользователя.

Задание 15.3

Создать функцию parse_cfg, которая ожидает как аргумент имя файла, в котором находится конфигурация устройства.

Функция должна обрабатывать конфигурацию и возвращать IP-адреса и маски, которые настроены на интерфейсах, в виде списка кортежей:

  • первый элемент кортежа - IP-адрес
  • второй элемент кортежа - маска

Например (взяты произвольные адреса):

[('10.0.1.1', '255.255.255.0'), ('10.0.2.1', '255.255.255.0')] 

Для получения такого результата, используйте регулярные выражения.

Проверить работу функции на примере файла config_r1.txt.

Обратите внимание, что в данном случае, мы можем не проверять корректность IP-адреса, диапазоны адресов и так далее, так как мы обрабатываем конфигурацию, а не ввод пользователя.

Задание 15.3a

Переделать функцию parse_cfg из задания 15.3 таким образом, чтобы она возвращала словарь:

  • ключ: имя интерфейса
  • значение: кортеж с двумя строками:
    • IP-адрес
    • маска

Например (взяты произвольные адреса):

{'FastEthernet0/1': ('10.0.1.1', '255.255.255.0'),  'FastEthernet0/2': ('10.0.2.1', '255.255.255.0')} 

Для получения такого результата, используйте регулярные выражения.

Проверить работу функции на примере файла config_r1.txt.

Задание 15.3b

Проверить работу функции parse_cfg из задания 15.3a на конфигурации config_r2.txt.

Обратите внимание, что на интерфейсе e0/1 назначены два IP-адреса:

interface Ethernet0/1  ip address 10.255.2.2 255.255.255.0  ip address 10.254.2.2 255.255.255.0 secondary 

А в словаре, который возвращает функция parse_cfg, интерфейсу Ethernet0/1 соответствует только один из них (второй).

Переделайте функцию parse_cfg из задания 15.3a таким образом, чтобы она возвращала список кортежей для каждого интерфейса. Если на интерфейсе назначен только один адрес, в списке будет один кортеж. Если же на интерфейсе настроены несколько IP-адресов, то в списке будет несколько кортежей.

Проверьте функцию на конфигурации config_r2.txt и убедитесь, что интерфейсу Ethernet0/1 соответствует список из двух кортежей.

Обратите внимание, что в данном случае, можно не проверять корректность IP-адреса, диапазоны адресов и так далее, так как обрабатывается вывод команды, а не ввод пользователя.

Задание 15.4

Создать функцию parse_sh_ip_int_br, которая ожидает как аргумент имя файла, в котором находится вывод команды show

Функция должна обрабатывать вывод команды show ip int br и возвращать такие поля:

  • Interface
  • IP-Address
  • Status
  • Protocol

Информация должна возвращаться в виде списка кортежей:

[('FastEthernet0/0', '10.0.1.1', 'up', 'up'),  ('FastEthernet0/1', '10.0.2.1', 'up', 'up'),  ('FastEthernet0/2', 'unassigned', 'up', 'up')] 

Для получения такого результата, используйте регулярные выражения.

Проверить работу функции на примере файла sh_ip_int_br_2.txt.

Задание 15.4a

Создать функцию convert_to_dict, которая ожидает два аргумента:

  • список с названиями полей
  • список кортежей с результатами отработки функции parse_sh_ip_int_br из задания 15.4

Функция возвращает результат в виде списка словарей (порядок полей может быть другой):

[{'interface': 'FastEthernet0/0', 'status': 'up', 'protocol': 'up', 'address': '10.0.1.1'},  {'interface': 'FastEthernet0/1', 'status': 'up', 'protocol': 'up', 'address': '10.0.2.1'}] 

Проверить работу функции на примере файла sh_ip_int_br_2.txt:

  • первый аргумент - список headers
  • второй аргумент - результат, который возвращает функции parse_show из прошлого задания.

Функцию parse_sh_ip_int_br не нужно копировать. Надо импортировать или саму функцию, и использовать то же регулярное выражение, что и в задании 9.4, или импортировать результат выполнения функции parse_show.

headers = ['interface', 'address', 'status', 'protocol'] 
Назад: Дополнительные материалы
Дальше: IV. Запись и передача данных