Skip to content

Commit

Permalink
move filters to single file, fix imports
Browse files Browse the repository at this point in the history
  • Loading branch information
mkomon committed Jul 25, 2023
1 parent b0b9ae7 commit e02124c
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 55 deletions.
13 changes: 6 additions & 7 deletions src/netom/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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__:
Expand Down
47 changes: 45 additions & 2 deletions src/netom/filters.py
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -8,8 +14,6 @@
"ip_version",
]

from jinja2 import pass_context


@pass_context
def render_template(context, value):
Expand Down Expand Up @@ -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])

45 changes: 0 additions & 45 deletions src/netom/j2_filters.py

This file was deleted.

2 changes: 1 addition & 1 deletion tests/test_j2_filters.py → tests/test_filters.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down

0 comments on commit e02124c

Please sign in to comment.