def generate_topology_from_cdp(list_of_files, save_to_file=True, topology_filename='topology.yaml'): ''' Параметрами функции generate_topology_from_cdp: * list_of_files - список файлов из которых надо считать вывод команды sh cdp neighbor * save_to_file - этот параметр управляет тем, будет ли записан в файл, итоговый словарь * значение по умолчанию - True * topology_filename - имя файла, в который сохранится топология. * по умолчанию, должно использоваться имя topology.yaml. * топология сохраняется только, если аргумент save_to_file указан равным True Функция возвращает словарь, который описывает топологию. Словарь должен быть в том же формате, что и в задании 17.2a. ''' topology = {} for file in list_of_files: with open(file) as show_command: parsed = parse_sh_cdp_neighbors(show_command.read()) for pk, pv in parsed.items(): if not pk in topology.values(): topology[pk] = pv if save_to_file: with open(topology_filename, 'w') as f: yaml.dump(topology, f, default_flow_style=False) print(topology)
def test_function_return_value(): with open('sh_cdp_n_sw1.txt') as f: sh_cdp_n_sw1 = f.read() correct_return_value = { 'SW1': { 'Eth 0/1': { 'R1': 'Eth 0/0' }, 'Eth 0/2': { 'R2': 'Eth 0/0' }, 'Eth 0/3': { 'R3': 'Eth 0/0' }, 'Eth 0/4': { 'R4': 'Eth 0/0' } } } return_value = task_17_2.parse_sh_cdp_neighbors(sh_cdp_n_sw1) assert return_value != None, "Функция ничего не возвращает" assert type(return_value) == dict, "Функция должна возвращать словарь" assert return_value == correct_return_value, "Функция возвращает неправильное значение"
def generate_topology_from_cdp(list_of_files, save_to_filename=None): topol = {} for filee in list_of_files: with open(filee) as f: topol.update(parse_sh_cdp_neighbors(f.read())) if save_to_filename: with open(save_to_filename, 'w') as f: yaml.dump(topol, f) return topol
def generate_topology_from_cdp(list_of_files, save_to_filename=None): result = {} for file in list_of_files: with open(file, 'r', encoding='utf-8') as f_source: result.update(parse_sh_cdp_neighbors(f_source.read())) if save_to_filename: with open(save_to_filename, 'w', encoding='utf-8') as f_destination: yaml.dump(result, f_destination) return result
def generate_topology_from_cdp(list_of_files, save_to_filename=None): res_dict = {} for filek in list_of_files: with open(filek) as f: res_dict.update(parse_sh_cdp_neighbors(f.read())) if save_to_filename: with open(save_to_filename, 'w') as f: yaml.dump(res_dict, f) return res_dict
def generate_topology_from_cdp(list_of_files, save_to_filename=None): result = {} for file in list_of_files: with open(file, 'r') as f: dic = parse_sh_cdp_neighbors(f.read()) result.update(dic) if save_to_filename: with open(save_to_filename, 'w') as dst: yaml.dump(result, dst) return result
def generate_topology_from_cd(list_of_files, save_to_file=True, topology_filename='topology.yaml'): topology = {} for filename in list_of_files: with open(filename) as f: topology.update(parse_sh_cdp_neighbors(f.read())) if save_to_file: with open(topology_filename, 'w') as f: yaml.dump(topology, f, default_flow_style=False) return topology
def generate_topology_from_cdp(list_of_files, save_to_file=True, topology_filename='topology.yaml'): topology_dict = {} for file_cdp in list_of_files: with open(file_cdp) as f: topology_dict.update(parse_sh_cdp_neighbors(f.read())) if save_to_file: with open(topology_filename, 'w') as f: yaml.dump(topology_dict, f) return topology_dict
def generate_topology_from_cdp(list_of_files, save_to_filename = None): for item in list_of_files: with open(item) as f: data = f.read().replace('\n', '') temp_dict = parse_sh_cdp_neighbors(data) for key in temp_dict: final_dict[key] = temp_dict[key] if save_to_filename != None: with open(save_to_filename, "w+") as f: f = yaml.dump(final_dict, f) return else: return final_dict
def generate_topology_from_cdp(list_of_files, save_to_file = True, topology_filename = 'topology.yaml'): # Объединить все словари, которые возвращает функция parse_sh_cdp_neighbors, #в один словарь topology topology = {} for i in list_of_files: with open(i, 'r') as f: topology.update(parse_sh_cdp_neighbors(f.read())) # записать его содержимое в файл topology.yaml if save_to_file: with open(topology_filename, 'w') as f: yaml.dump(topology, f) return topology
def generate_topology_from_cdp(list_of_files, save_to_file=True, topology_filename='topology_17_2b.yaml'): from task_17_2 import parse_sh_cdp_neighbors import yaml summary_dict = {} for l in list_of_files: with open(l, 'r') as f: show_out = f.read().rstrip() summary_dict.update(parse_sh_cdp_neighbors(show_out)) if save_to_file: with open(topology_filename, 'w') as f: yaml.dump(summary_dict, f) return summary_dict
* 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 ''' from task_17_2 import parse_sh_cdp_neighbors import glob sh_cdp = glob.glob('sh_cdp*') if __name__ == '__main__': for file in sh_cdp: with open(file) as f: print(parse_sh_cdp_neighbors(f.read()))
Не копировать код функции parse_sh_cdp_neighbors ''' from task_17_2 import parse_sh_cdp_neighbors import yaml infiles = [ '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 = {} for file in infiles: with open(file) as show_command: parsed = parse_sh_cdp_neighbors(show_command.read()) for pk, pv in parsed.items(): if not pk in topology.values(): topology[pk] = pv print(topology) def dict_to_yaml(file, indict): ''' ожидает словарь (indict) записыват в файл в формате yaml ''' with open(file, 'w') as f: yaml.dump(indict, f, default_flow_style=False)
{'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 ''' def read_file(file_name): with open(file_name, 'r') as f: show_out = f.read().rstrip() return show_out if __name__ == '__main__': from pprint import pprint from task_17_2 import parse_sh_cdp_neighbors import yaml import glob summary_dict = {} sh_cdp_files = glob.glob('sh_cdp_n_*') for f in sh_cdp_files: show_out_main = read_file(f) summary_dict.update(parse_sh_cdp_neighbors(show_out_main)) with open('topology.yaml', 'w') as f: yaml.dump(summary_dict, f) pprint(summary_dict)
Структура словаря 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 ''' from task_17_2 import parse_sh_cdp_neighbors import glob import yaml from pprint import pprint if __name__ == '__main__': files = glob.glob('sh_cdp_n_*.txt') topology = {} # Объединить все словари, которые возвращает функция parse_sh_cdp_neighbors, #в один словарь topology for i in files: with open(i, 'r') as f: topology.update(parse_sh_cdp_neighbors(f.read())) # записать его содержимое в файл topology.yaml with open('topology.yaml', 'w') as f: yaml.dump(topology, f)
Структура словаря 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 ''' sh_version_files = glob.glob('sh_cdp_n_*') topology = {} for ff in sh_version_files: with open(ff) as f: r = pcdp.parse_sh_cdp_neighbors(f.read()) for k in r.keys(): topology[k] = r[k] print(topology) with open('topology.yaml', 'w') as f: y = yaml.dump(topology, f) ''' ./task_17_2a.py {'SW1': {'Eth 0/1': {'R1': '2811'}, 'Eth 0/2': {'R2': '2811'}, 'Eth 0/3': {'R3': '2811'}, 'Eth 0/4': {'R4': '2811'}}, 'R1': {'Eth 0/0': {'SW1': 'WS-C3750-'}}, 'R4': {'Eth 0/0': {'SW1': 'WS-C3750-'}, 'Eth 0/1': {'R5': '2811'}}, 'R3': {'Eth 0/0': {'SW1': 'WS-C3750-'}}, 'R5': {'Eth 0/0': {'R2': '2811'}, 'Eth 0/1': {'R4': '2811'}}, 'R6': {'Eth 0/1': {'R2': '2811'}}, 'R2': {'Eth 0/0': {'SW1': 'WS-C3750-'}, 'Eth 0/1': {'R5': '2811'}, 'Eth 0/2': {'R6': '2811'}}} '''
* 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 ''' def create_dict_cdp(list_dict): dict_cdp = dict() for idict in list_dict: dict_cdp.update(idict) return dict_cdp if __name__ == "__main__": args = glob.glob('sh_cdp*.txt') pprint( create_dict_cdp( [parse_sh_cdp_neighbors(read_file(ifile)) for ifile in args]))
Объединить все словари, которые возвращает функция 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 ''' #### from task_17_2 import parse_sh_cdp_neighbors import glob import yaml sh_cdp_files = glob.glob('sh_cdp_n*') # print(sh_cdp_files) if __name__ == "__main__": final_dict = {} for f_name in sh_cdp_files: with open(f_name) as f: final_dict.update(parse_sh_cdp_neighbors(f.read())) with open('topology.yaml', 'w') as f: yaml.dump(final_dict, f)