Module netmiko.cli_tools.outputters

Functions

def highlight_regex(text, pattern, highlight_color='red')
Expand source code
def highlight_regex(text, pattern, highlight_color="red"):
    """
    Highlight text matching a regex pattern using Rich.
    """
    text_obj = Text(text)
    for match in re.finditer(pattern, text):
        start, end = match.span()
        text_obj.stylize(highlight_color, start, end)

    return text_obj

Highlight text matching a regex pattern using Rich.

def highlight_regex_with_context(text, pattern, highlight_color='red', context_lines=2)
Expand source code
def highlight_regex_with_context(text, pattern, highlight_color="red", context_lines=2):
    """
    Highlight text matching a regex pattern using Rich, showing only the matching lines
    with a specified number of context lines before and after.
    """
    lines = text.split("\n")
    text_obj = Text()
    pattern = re.compile(pattern)

    for i, line in enumerate(lines):
        if pattern.search(line):
            # Add context lines before
            start = max(0, i - context_lines)
            for j in range(start, i):
                text_obj.append(lines[j] + "\n")

            # Add the matching line with highlighting
            line_obj = Text(line + "\n")
            for match in pattern.finditer(line):
                line_obj.stylize(highlight_color, match.start(), match.end())
            text_obj.append(line_obj)

            # Add context lines after
            end = min(len(lines), i + context_lines + 1)
            for j in range(i + 1, end):
                text_obj.append(lines[j] + "\n")

            # Add a separator if this isn't the last match
            if i + context_lines + 1 < len(lines):
                text_obj.append("...\n\n")

    return text_obj

Highlight text matching a regex pattern using Rich, showing only the matching lines with a specified number of context lines before and after.

def output_dispatcher(out_format, results, pattern=None, hide_empty=False)
Expand source code
def output_dispatcher(out_format, results, pattern=None, hide_empty=False):

    # Sort the results dictionary by device_name
    results = dict(sorted(results.items()))

    if hide_empty:
        results = {device_name: output for device_name, output in results.items() if output}

    output_functions = {
        "text": output_text,
        "text_highlighted": output_text,
        "json": output_json,
        "yaml": output_yaml,
        "raw": output_raw,
        "json_raw": output_json,
    }
    kwargs = {}
    func = output_functions.get(out_format, output_text)
    if out_format == "text_highlighted":
        if pattern is None:
            raise ValueError("Regex search pattern must be set for!")
        kwargs["pattern"] = pattern
    elif out_format == "json_raw":
        kwargs["raw"] = True

    return func(results, **kwargs)
def output_failed_devices(failed_devices)
Expand source code
def output_failed_devices(failed_devices):
    if failed_devices:
        console = Console(theme=CUSTOM_THEME)

        # Sort the failed devices list
        failed_devices.sort()

        # Create the content for the panel
        content = "\n"
        for device_name in failed_devices:
            content += f"  {device_name}\n"

        # Create and print the panel
        panel = Panel(
            content,
            title="Failed devices",
            expand=False,
            border_style="failed_border",
            title_align="left",
            padding=(1, 1),
        )

        console.print()
        console.print(panel)
        console.print()
def output_json(results, raw=False)
Expand source code
def output_json(results, raw=False):
    console = Console(theme=CUSTOM_THEME)

    for device_name, output in results.items():
        try:
            json_data = json.loads(output)
            formatted_json = json.dumps(json_data, indent=2)
            banner = "-" * len(device_name)
            if raw:
                print()
                print(device_name)
                print(banner)
                print(formatted_json)
                print()
            else:
                theme = DEFAULT_THEME
                syntax = Syntax(formatted_json, "json", theme=theme)
                panel = Panel(
                    syntax,
                    border_style=Style(color=DEFAULT_BOX),
                    expand=False,
                    padding=(1, 1),
                )

                console.print()
                print(device_name)
                console.print(panel)
                console.print()

        except json.decoder.JSONDecodeError as e:
            msg = f"""

Error processing output for device: {device_name}

In order to use display the output in JSON (--json arg), you must provide the output in JSON
format (i.e. device supports '| json' or parse with TextFSM)

"""
            new_exception = json.decoder.JSONDecodeError(msg, e.doc, e.pos)
            # Raise the new exception, chaining it to the original one
            raise new_exception from e
def output_raw(results)
Expand source code
def output_raw(results):
    border_color = CUSTOM_THEME.styles.get("border").color.name

    if len(results) == 1:
        for device_name, output in results.items():
            print(output)
    else:
        for device_name, output in results.items():
            banner = "-" * len(device_name)
            rich.print(f"[bold {border_color}]{device_name}[/]")
            rich.print(f"[{border_color}]{banner}[/]")
            print(output)
            print()
def output_text(results, pattern=None)
Expand source code
def output_text(results, pattern=None):
    console = Console(theme=CUSTOM_THEME)

    for device_name, output in results.items():
        if pattern:
            # output = highlight_regex(output, pattern)
            output = highlight_regex_with_context(output, pattern)
        else:
            output = Text(output)

        panel = Panel(
            output,
            title=device_name,
            expand=False,
            border_style="border",
            title_align="left",
            padding=(1, 1),
        )
        console.print()
        console.print(panel)
        console.print()
def output_yaml(results)
Expand source code
def output_yaml(results):
    pass