PySubnetTree - A Python Module for CIDR Lookups
.. rst-class:: opening The PySubnetTree package provides a Python data structure ``SubnetTree`` which maps subnets given in `CIDR <http://tools.ietf.org/html/rfc4632>`_ notation (incl. corresponding IPv6 versions) to Python objects. Lookups are performed by longest-prefix matching.
You can find the latest PySubnetTree release for download at http://www.bro.org/download.
PySubnetTree's git repository is located at git://git.bro.org/pysubnettree.git. You can browse the repository here.
This document describes PySubnetTree 0.28. See the
file for version history.
A simple example which associates CIDR prefixes with strings:
>>> import SubnetTree >>> t = SubnetTree.SubnetTree() >>> t["10.1.0.0/16"] = "Network 1" >>> t["10.1.42.0/24"] = "Network 1, Subnet 42" >>> print("10.1.42.1" in t) True >>> print(t["10.1.42.1"]) Network 1, Subnet 42 >>> print(t["10.1.43.1"]) Network 1 >>> print("10.20.1.1" in t) False >>> try: ... print(t["10.20.1.1"]) ... except KeyError as err: ... print("Error: %s not found" % err) Error: '10.20.1.1' not found
PySubnetTree also supports IPv6 addresses and prefixes:
>>> import SubnetTree >>> t = SubnetTree.SubnetTree() >>> t["2001:db8::/32"] = "Company 1" >>> t["2001:db8:4000::/48"] = "Company 1, Site 1" >>> t["2001:db8:4000:abcd::"] Company 1, Site 1 >>> t["2001:db8:fe:1234::"] Company 1
By default, CIDR prefixes and IP addresses are given as strings.
SubnetTree object can be switched into binary
mode, in which single addresses are passed in the form of packed
binary strings as, e.g., returned by socket.inet_aton:
>>> t.get_binary_lookup_mode() False >>> t.set_binary_lookup_mode(True) >>> t.get_binary_lookup_mode() True >>> import socket >>> print(t[socket.inet_aton("10.1.42.1")]) Network 1, Subnet 42
A SubnetTree also provides methods
insert(prefix,object=None) for insertion
of prefixes (
object can be skipped to use the tree like a set), and
remove(prefix) for removing entries (
remove performs an _exact_ match
rather than longest-prefix).
Internally, the CIDR prefixes of a
SubnetTree are managed by a
Patricia tree data structure and lookups are therefore efficient
even with a large number of prefixes.
PySubnetTree comes with a BSD license.
This package requires Python 2.6 or newer.
Installation is pretty simple:
> python setup.py install