Skip to content
A Python Module for CIDR Lookups
Branch: master
Clone or download
Latest commit 07d8b41 Mar 19, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
cmake @ 0c1ee63 Updating submodule(s). Mar 18, 2019
testing
.gitignore Updated setup.py to work with setuptools (pypi). Apr 1, 2014
.gitmodules Update submodules to use github.com/zeek Dec 6, 2018
.travis.yml Configure Travis CI email recipients and build branches Feb 22, 2018
.update-changes.cfg
CHANGES
CMakeLists.txt
COPYING
MANIFEST.in
Makefile Add dist target to Makefile. May 8, 2015
README
README.rst
SubnetTree.cc Fix the prefixes() function to compile and work on Python 3 Oct 4, 2016
SubnetTree.h Added prefixes() method to return all prefixes in the tree as a set of Jan 23, 2016
SubnetTree.i Initial import Nov 4, 2010
SubnetTree.py
SubnetTree_wrap.cc Merge branch 'topic/jroyalty/prefixset' of https://github.com/jroyalt… Jan 25, 2016
VERSION Update github/download link Dec 7, 2018
btest
configure
patricia.c Fix some issues reported by coverity Mar 23, 2018
patricia.h
setup.py Update github/download link Dec 7, 2018

README.rst

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.


Download

You can find the latest PySubnetTree release for download at https://www.zeek.org/download.

PySubnetTree's git repository is located at https://github.com/zeek/pysubnettree

This document describes PySubnetTree 0.28-2. See the CHANGES file for version history.

Example

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. Alternatively, a 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.

Prerequisites

This package requires Python 2.6 or newer.

Installation

Installation is pretty simple:

> python setup.py install
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.