From 16c1674d7e1bae1fa32b8f4bf61f125f7c7e2191 Mon Sep 17 00:00:00 2001 From: Carlos Santos <125412989+CarlosSuporteISP@users.noreply.github.com> Date: Sat, 13 Sep 2025 00:17:00 -0300 Subject: [PATCH] Create mikrotik_normalize_input.py --- .../_builtin/mikrotik_normalize_input.py | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 hyperglass/plugins/_builtin/mikrotik_normalize_input.py diff --git a/hyperglass/plugins/_builtin/mikrotik_normalize_input.py b/hyperglass/plugins/_builtin/mikrotik_normalize_input.py new file mode 100644 index 0000000..a208c53 --- /dev/null +++ b/hyperglass/plugins/_builtin/mikrotik_normalize_input.py @@ -0,0 +1,64 @@ +# Standard Library +from ipaddress import ip_network, ip_address +import typing as t + +# Third Party +from pydantic import PrivateAttr + +# Project +from hyperglass.log import log +# REMOVIDA a importação direta de Query para evitar o erro circular +# from hyperglass.models.api.query import Query + +# Local +from .._input import InputPlugin, InputPluginValidationReturn + + +class MikrotikTargetNormalizerInput(InputPlugin): + """ + InputPlugin to normalize a target IP address to its network prefix. + This ensures that queries for different IPs within the same subnet + resolve to the same cache key. + """ + _hyperglass_builtin: bool = PrivateAttr(False) + name: str = "mikrotik_normalizer" + platforms: t.Sequence[str] = ("mikrotik_routeros", "mikrotik_switchos", "mikrotik") + + # ############################################################# + # INÍCIO DA MODIFICAÇÃO: Usar 't.Any' em vez de 'Query' + # ############################################################# + def validate(self, query: t.Any) -> InputPluginValidationReturn: + # ############################################################# + # FIM DA MODIFICAÇÃO + # ############################################################# + """ + Takes the query object and modifies the target if it's a BGP Route query. + """ + + # Acessamos os atributos normalmente, pois sabemos que o objeto 'query' os terá. + if query.query_type != "bgp_route": + return True, None + + try: + target_ip = ip_address(query.target) + + if target_ip.version == 4: + prefix_len = 24 + else: + prefix_len = 48 + + network = ip_network(f"{str(target_ip)}/{prefix_len}", strict=False) + + normalized_target = str(network.with_prefixlen) + + if query.target != normalized_target: + log.debug( + f"Normalizing target '{query.target}' to network prefix " + f"'{normalized_target}' for MikroTik cache key." + ) + query.target = normalized_target + + except ValueError: + pass + + return True, None