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

Задания

Задания

Все задания и вспомогательные файлы можно скачать в . Если в заданиях раздела есть задания с буквами (например, 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

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

Задание 17.1

В этом задании нужно:

  • взять содержимое нескольких файлов с выводом команды sh version
  • распарсить вывод команды с помощью регулярных выражений и получить информацию об устройстве
  • записать полученную информацию в файл в CSV формате

Для выполнения задания нужно создать две функции.

Функция parse_sh_version:

  • ожидает аргумент output в котором находится вывод команды sh version (не имя файла)
  • обрабатывает вывод, с помощью регулярных выражений
  • возвращает кортеж из трёх элементов:
    • ios - в формате "12.4(5)T"
    • image - в формате "flash:c2800-advipservicesk9-mz.124-5.T.bin"
    • uptime - в формате "5 days, 3 hours, 3 minutes"

Функция write_to_csv:

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

Остальное содержимое скрипта может быть в скрипте, а может быть в ещё одной функции.

Скрипт должен:

  • обработать информацию из каждого файла с выводом sh version:
    • sh_version_r1.txt, sh_version_r2.txt, sh_version_r3.txt
  • с помощью функции parse_sh_version, из каждого вывода должна быть получена информация ios, image, uptime
  • из имени файла нужно получить имя хоста
  • после этого вся информация должна быть записана в файл routers_inventory.csv

В файле routers_inventory.csv должны быть такие столбцы:

  • hostname, ios, image, uptime

В скрипте, с помощью модуля glob, создан список файлов, имя которых начинается на sh_vers. Вы можете раскомментировать строку print(sh_version_files), чтобы посмотреть содержимое списка.

Кроме того, создан список заголовков (headers), который должен быть записан в CSV.

import glob  sh_version_files = glob.glob('sh_vers*') #print(sh_version_files)  headers = ['hostname', 'ios', 'image', 'uptime'] 

Задание 17.2

Создать функцию parse_sh_cdp_neighbors, которая обрабатывает вывод команды show cdp neighbors.

Функция ожидает, как аргумент, вывод команды одной строкой (не имя файла).

Функция должна возвращать словарь, который описывает соединения между устройствами.

Например, если как аргумент был передан такой вывод:

R4>show cdp neighbors  Device ID    Local Intrfce   Holdtme     Capability       Platform    Port ID R5           Fa 0/1          122           R S I           2811       Fa 0/1 R6           Fa 0/2          143           R S I           2811       Fa 0/0 

Функция должна вернуть такой словарь:

{'R4': {'Fa0/1': {'R5': 'Fa0/1'},         'Fa0/2': {'R6': 'Fa0/0'}}} 

При этом интерфейсы могут быть записаны с пробелом Fa 0/0 или без Fa0/0.

Проверить работу функции на содержимом файла sh_cdp_n_sw1.txt

Задание 17.2a

С помощью функции parse_sh_cdp_neighbors из задания 17.2, обработать вывод команды sh cdp neighbor из файлов:

  • sh_cdp_n_sw1.txt
  • sh_cdp_n_r1.txt
  • sh_cdp_n_r2.txt
  • sh_cdp_n_r3.txt
  • sh_cdp_n_r4.txt
  • sh_cdp_n_r5.txt
  • sh_cdp_n_r6.txt

Объединить все словари, которые возвращает функция parse_sh_cdp_neighbors, в один словарь topology и записать его содержимое в файл topology.yaml.

Структура словаря topology должна быть такой:

{'R4': {'Fa0/1': {'R5': 'Fa0/1'},         'Fa0/2': {'R6': 'Fa0/0'}},  'R5': {'Fa0/1': {'R4': 'Fa0/1'}},  'R6': {'Fa0/0': {'R4': 'Fa0/2'}}} 

При этом интерфейсы могут быть записаны с пробелом Fa 0/0 или без Fa0/0.

Не копировать код функции parse_sh_cdp_neighbors

Задание 17.2b

Переделать функциональность скрипта из задания 17.2a, в функцию generate_topology_from_cdp.

Функция generate_topology_from_cdp должна быть создана с параметрами:

  • list_of_files - список файлов из которых надо считать вывод команды sh cdp neighbor
  • save_to_file - этот параметр управляет тем, будет ли записан в файл, итоговый словарь
    • значение по умолчанию - True
  • topology_filename - имя файла, в который сохранится топология.
    • по умолчанию, должно использоваться имя topology.yaml.
    • топология сохраняется только, если аргумент save_to_file указан равным True

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

Проверить работу функции generate_topology_from_cdp на файлах:

  • sh_cdp_n_sw1.txt
  • sh_cdp_n_r1.txt
  • sh_cdp_n_r2.txt
  • sh_cdp_n_r3.txt
  • sh_cdp_n_r4.txt
  • sh_cdp_n_r5.txt
  • sh_cdp_n_r6.txt

Записать полученный словарь в файл topology.yaml.

Не копировать код функции parse_sh_cdp_neighbors

Задание 17.2c

С помощью функции draw_topology из файла draw_network_graph.py сгенерировать топологию, которая соответствует описанию в файле topology.yaml

Обратите внимание на то, какой формат данных ожидает функция draw_topology. Описание топологии из файла topology.yaml нужно преобразовать соответствующим образом, чтобы использовать функцию draw_topology.

Для решения задания можно создать любые вспомогательные функции.

Не копировать код функции draw_topology.

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

При этом:

  • Интерфейсы могут быть записаны с пробелом Fa 0/0 или без Fa0/0.
  • Расположение устройств на схеме может быть другим
  • Соединения должны соответствовать схеме

Для выполнения этого задания, должен быть установлен graphviz: apt-get install graphviz

И модуль python для работы с graphviz: pip install graphviz

Назад: Дополнительные материалы
Дальше: 18. Работа с базами данных