From e02124cdcccfb016383126025eb0205009a55813 Mon Sep 17 00:00:00 2001 From: Martin Komon Date: Wed, 26 Jul 2023 00:21:11 +0200 Subject: [PATCH] move filters to single file, fix imports --- src/netom/__init__.py | 13 +++-- src/netom/filters.py | 47 ++++++++++++++++++- src/netom/j2_filters.py | 45 ------------------ tests/{test_j2_filters.py => test_filters.py} | 2 +- 4 files changed, 52 insertions(+), 55 deletions(-) delete mode 100644 src/netom/j2_filters.py rename tests/{test_j2_filters.py => test_filters.py} (97%) diff --git a/src/netom/__init__.py b/src/netom/__init__.py index 9b86995..f6d6224 100644 --- a/src/netom/__init__.py +++ b/src/netom/__init__.py @@ -9,7 +9,6 @@ from . import filters from .exception import NetomValidationError -from .j2_filters import address_to_mask, address_to_wildcard, line_to_mask, line_to_wildcard # TODO move out of this namespace from .models import BgpNeighbor @@ -43,12 +42,12 @@ def __init__(self, model_version, model_type, search_path=None): def set_search_path(self, search_path): self.engine = tmpl.get_engine("jinja2")(search_path=search_path) - self.engine.engine.filters["make_variable_name"] = make_variable_name - self.engine.engine.filters["ip_version"] = ip_version - self.engine.engine.filters["address_to_mask"] = address_to_mask - self.engine.engine.filters["address_to_wildcard"] = address_to_wildcard - self.engine.engine.filters["line_to_mask"] = line_to_mask - self.engine.engine.filters["line_to_wildcard"] = line_to_wildcard + self.engine.engine.filters["make_variable_name"] = filters.make_variable_name + self.engine.engine.filters["ip_version"] = filters.ip_version + self.engine.engine.filters["address_to_mask"] = filters.address_to_mask + self.engine.engine.filters["address_to_wildcard"] = filters.address_to_wildcard + self.engine.engine.filters["line_to_mask"] = filters.line_to_mask + self.engine.engine.filters["line_to_wildcard"] = filters.line_to_wildcard # self.engine.search_path = os.path.dirname(search_path) for name in filters.__all__: diff --git a/src/netom/filters.py b/src/netom/filters.py index 0e4342a..0914369 100644 --- a/src/netom/filters.py +++ b/src/netom/filters.py @@ -1,4 +1,10 @@ import ipaddress +import re +from ipaddress import IPv4Address +from jinja2 import pass_context + + +r_ip_nn = re.compile("[\d.]{7,15}/\d{1,2}") __all__ = [ "make_variable_name", @@ -8,8 +14,6 @@ "ip_version", ] -from jinja2 import pass_context - @pass_context def render_template(context, value): @@ -60,3 +64,42 @@ def ip_version(value): Returns version of passed IP address. """ return ipaddress.ip_interface(value).version + + +def address_to_mask(addr): + """ + Transform A.B.C.D/nn into A.B.C.D M.M.M.M subnet mask format. + """ + ipaddr4 = ipaddress.ip_interface(addr) + return f"{ipaddr4.ip} {ipaddr4.netmask}" + + +def address_to_wildcard(addr): + """ + Transform A.B.C.D/nn into A.B.C.D W.W.W.W subnet wildcard format. + + credit for the mask shenanigans to George Shuklin + https://medium.com/opsops/wildcard-masks-operations-in-python-16acf1c35683 + """ + ipnet4 = ipaddress.ip_network(addr) + wildcard = str(IPv4Address(int(IPv4Address(ipnet4.netmask))^(2**32-1))) + return f"{ipnet4.network_address} {wildcard}" + + +def line_to_mask(line): + """ + Search for any IPv4/nn tokens in the `line` argument and transform them into mask format. + E.g. `permit ip 10.0.0.0/8` any -> `permit ip 10.0.0.0 255.0.0.0 any` + """ + tokens = line.split() + return " ".join([address_to_mask(token) if r_ip_nn.match(token) else token for token in tokens]) + + +def line_to_wildcard(line): + """ + Search for any IPv4/nn tokens in the `line` argument and transform them into wildcard format. + E.g. `permit ip 10.0.0.0/8` any -> `permit ip 10.0.0.0 0.255.255.255 any` + """ + tokens = line.split() + return " ".join([address_to_wildcard(token) if r_ip_nn.match(token) else token for token in tokens]) + diff --git a/src/netom/j2_filters.py b/src/netom/j2_filters.py deleted file mode 100644 index 65cbef3..0000000 --- a/src/netom/j2_filters.py +++ /dev/null @@ -1,45 +0,0 @@ -import ipaddress -import re -from ipaddress import IPv4Address - - -r_ip_nn = re.compile("[\d.]{7,15}/\d{1,2}") - - -def address_to_mask(addr): - """ - Transform A.B.C.D/nn into A.B.C.D M.M.M.M subnet mask format. - """ - ipaddr4 = ipaddress.ip_interface(addr) - return f"{ipaddr4.ip} {ipaddr4.netmask}" - - -def address_to_wildcard(addr): - """ - Transform A.B.C.D/nn into A.B.C.D W.W.W.W subnet wildcard format. - - credit for the mask shenanigans to George Shuklin - https://medium.com/opsops/wildcard-masks-operations-in-python-16acf1c35683 - """ - ipnet4 = ipaddress.ip_network(addr) - wildcard = str(IPv4Address(int(IPv4Address(ipnet4.netmask))^(2**32-1))) - return f"{ipnet4.network_address} {wildcard}" - - -def line_to_mask(line): - """ - Search for any IPv4/nn tokens in the `line` argument and transform them into mask format. - E.g. `permit ip 10.0.0.0/8` any -> `permit ip 10.0.0.0 255.0.0.0 any` - """ - tokens = line.split() - return " ".join([address_to_mask(token) if r_ip_nn.match(token) else token for token in tokens]) - - -def line_to_wildcard(line): - """ - Search for any IPv4/nn tokens in the `line` argument and transform them into wildcard format. - E.g. `permit ip 10.0.0.0/8` any -> `permit ip 10.0.0.0 0.255.255.255 any` - """ - tokens = line.split() - return " ".join([address_to_wildcard(token) if r_ip_nn.match(token) else token for token in tokens]) - diff --git a/tests/test_j2_filters.py b/tests/test_filters.py similarity index 97% rename from tests/test_j2_filters.py rename to tests/test_filters.py index 9e9034d..91db311 100644 --- a/tests/test_j2_filters.py +++ b/tests/test_filters.py @@ -1,5 +1,5 @@ -from netom.j2_filters import address_to_mask, address_to_wildcard, line_to_mask, line_to_wildcard +from netom.filters import address_to_mask, address_to_wildcard, line_to_mask, line_to_wildcard import pytest