2025-02-05 13:43:43 +01:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# coding: utf-8 -*-
|
|
|
|
# pylint: disable=no-value-for-parameter
|
|
|
|
# pylint: disable=too-many-arguments
|
|
|
|
# pylint: disable=line-too-long
|
|
|
|
# pylint: disable=duplicate-code
|
|
|
|
# flake8: noqa E501
|
|
|
|
|
|
|
|
"""
|
|
|
|
Commands for ARDL CLI to get data.
|
|
|
|
"""
|
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
# Standard library imports
|
2025-02-05 13:43:43 +01:00
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
from xml.dom import minidom
|
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
# Third party imports
|
2025-02-05 13:43:43 +01:00
|
|
|
import click
|
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
# Local imports
|
|
|
|
import eos_downloader.defaults
|
|
|
|
import eos_downloader.logics.arista_server
|
|
|
|
from eos_downloader.cli.utils import cli_logging
|
2025-02-05 13:43:43 +01:00
|
|
|
|
|
|
|
|
|
|
|
@click.command()
|
|
|
|
@click.pass_context
|
2025-02-05 13:48:40 +01:00
|
|
|
@click.option(
|
|
|
|
"--output",
|
|
|
|
default=str("arista.xml"),
|
|
|
|
help="Path to save XML file",
|
|
|
|
type=click.Path(),
|
|
|
|
show_default=True,
|
|
|
|
)
|
|
|
|
@click.option(
|
|
|
|
"--log-level",
|
|
|
|
"--log",
|
|
|
|
help="Logging level of the command",
|
2025-02-10 06:39:48 +01:00
|
|
|
default="INFO",
|
2025-02-05 13:48:40 +01:00
|
|
|
type=click.Choice(
|
|
|
|
["debug", "info", "warning", "error", "critical"], case_sensitive=False
|
|
|
|
),
|
|
|
|
)
|
2025-02-05 13:43:43 +01:00
|
|
|
def xml(ctx: click.Context, output: str, log_level: str) -> None:
|
2025-02-10 06:39:48 +01:00
|
|
|
"""Downloads and saves XML data from Arista EOS server.
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
This function authenticates with an Arista server, retrieves XML data,
|
|
|
|
and saves it to a file in a prettified format.
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
Args:
|
|
|
|
ctx (click.Context): Click context object containing authentication token
|
|
|
|
output (str): File path where the XML output should be saved
|
|
|
|
log_level (str): Logging level to use for output messages
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
Exception: If authentication with the server fails
|
|
|
|
|
|
|
|
Example:
|
|
|
|
>>> xml(ctx, "output.xml", "INFO")
|
|
|
|
INFO: connected to server aaa.bbb.ccc
|
|
|
|
INFO: XML file saved under output.xml
|
|
|
|
"""
|
2025-02-05 13:43:43 +01:00
|
|
|
|
2025-02-10 06:39:48 +01:00
|
|
|
log = cli_logging(log_level)
|
|
|
|
token = ctx.obj["token"]
|
|
|
|
server = eos_downloader.logics.arista_server.AristaServer(
|
|
|
|
token=token, session_server=eos_downloader.defaults.DEFAULT_SERVER_SESSION
|
|
|
|
)
|
|
|
|
try:
|
|
|
|
server.authenticate()
|
|
|
|
except Exception as error: # pylint: disable=W0703
|
|
|
|
log.error(f"Cant connect to server: {error}")
|
|
|
|
log.info(f"connected to server {eos_downloader.defaults.DEFAULT_SERVER_SESSION}")
|
|
|
|
xml_data = server.get_xml_data()
|
|
|
|
if xml_data is None:
|
|
|
|
log.error("No XML data received")
|
|
|
|
return
|
|
|
|
xml_object: ET.ElementTree = xml_data # pylint: disable=protected-access
|
2025-02-05 13:43:43 +01:00
|
|
|
xml_content = xml_object.getroot()
|
|
|
|
|
2025-02-05 13:48:40 +01:00
|
|
|
xmlstr = minidom.parseString(ET.tostring(xml_content)).toprettyxml(
|
|
|
|
indent=" ", newl=""
|
|
|
|
)
|
|
|
|
with open(output, "w", encoding="utf-8") as f:
|
2025-02-05 13:43:43 +01:00
|
|
|
f.write(str(xmlstr))
|
2025-02-10 06:39:48 +01:00
|
|
|
log.info(f"XML file saved under {output}")
|