Overview

The PySubnetTree package provides a Python data structure SubnetTree which maps subnets given in CIDR notation to Python objects. Lookups are performed by longest-prefix matching.

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"
>>> t["10.2.0.0/16"] = "Network 2"
>>> print t["10.1.42.1"]
Network 1, Subnet 42
>>> print t["10.1.43.1"]
Network 1
>>> print "10.1.42.1" in t
True
>>> print "10.1.43.1" in t
True
>>> print "10.20.1.1" in t
False
>>> print t["10.20.1.1"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "SubnetTree.py", line 67, in __getitem__
    def __getitem__(*args): return _SubnetTree.SubnetTree___getitem__(*args)
KeyError: '10.20.1.1'

CIDR prefixes are given as strings. Single addresses can alternatively also be passed in as integers as, e.g., returned by socket.inet_aton.

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 for large number of prefixes.

PySubnetTree comes with BSD license.

Version History

Version 0.12 Better error handling. In particular, using None as an index now raises an IndexError.
Version 0.11 License changed from GPL to BSD-style.
Version 0.1 Initial release.

Download

Download pysubnettree-0.12.tar.gz.

Prerequisites

This packages requires Python 2.4 or newer.

Installation

Installation is pretty simple:

> python setup.py install