Source code for nettoolkit.compare_it.compare_config


# -----------------------------------------------------------------------------
# IMPORTS
# -----------------------------------------------------------------------------

from nettoolkit.facts_finder.generators.cisco_parser import CMD_LINE_START_WITH
from nettoolkit.compare_it import CompareText, get_string_diffs
from nettoolkit.nettoolkit_common import IO


# ----------------------------------------------------------------------------------
# Internal Common Functions
# ----------------------------------------------------------------------------------

[docs] def is_captureit_config(lines): capture_it_config = False for _ in lines: if _[2:].startswith(CMD_LINE_START_WITH): capture_it_config = True break return capture_it_config
[docs] def get_config_type(lines): for _ in lines: if _.startswith("#"): return 'juniper_junos' if _.startswith("!"): return 'cisco_ios' return None
[docs] def get_configuration(file): with open(file, 'r') as f: lines = f.readlines() if not lines: print(f"Missing config for {file}") quit() capture_it_config = is_captureit_config(lines) if not capture_it_config: print("Non capture it captures not supported for now..") quit() # config_type = get_config_type(lines) cmd_starter = 'show running-config' if config_type == 'cisco_ios' else 'show configuration' config_start = False config = [] for line in lines: if line[2:].startswith(CMD_LINE_START_WITH + cmd_starter ): config_start = True continue if config_start and line[2:].startswith(CMD_LINE_START_WITH): break if not config_start: continue config.append(line) config = [_.rstrip() for _ in config ] return config
# ---------------------------------------------------------------------------------- # Main Config comarator class # ----------------------------------------------------------------------------------
[docs] class CompareConfig(): def __init__(self, file1, file2): self.file1 = file1 self.file2 = file2
[docs] def get_config(self): self.config1 = get_configuration(self.file1) self.config2 = get_configuration(self.file2) self.tmp1 = IO.to_file(self.file1+'.tmp', self.config1) self.tmp2 = IO.to_file(self.file2+'.tmp', self.config2)
[docs] def get_differeces(self, on_screen_display=False): diff_files = self.file1 + ' v/s ' + self.file2 # Define output headers header = f"\n# {'-'*80} #\n" + f"# Difference : [{diff_files}]" + f"\n# {'-'*80} #\n" removal_header = f"\n# {'- '*20} #\n" + f"# {' '*15} REMOVALS" + f"\n# {'- '*20} #\n" addition_header = f"\n# {'+ '*20} #\n" + f"# {' '*15} ADDITIONS" + f"\n# {'+ '*20} #\n" # Compare two files for adds/removals usng "CompareText" diff = {} removals = CompareText(self.tmp1, self.tmp2, "- ") adds = CompareText(self.tmp2, self.tmp1, "+ ") diff[removal_header] = removals.CTObj.diff diff[addition_header] = adds.CTObj.diff # Convert dictionary to string format using "get_string_diffs" self.diff_str = get_string_diffs(diff, header=header) if on_screen_display: print("".join(self.diff_str)) return self.diff_str
[docs] def write_diff(self, file): IO.to_file(file, self.diff_str)
# ----------------------------------------------------------------------------------